- App.tsx: full navigation (Auth stack + Main tabs with 5 screens) - Auth: LoginScreen, RegisterScreen, ForgotPasswordScreen - HomeScreen: dashboard with IoT metrics, weather widget, alerts, quick actions, sensors - MapScreen: interactive map with layer toggles (6 layers) - MarketplaceScreen: categories (6), products (5), search - ChatScreen: AI chat with quick prompts (4), bot responses - ProfileScreen: user info, stats, menu (9 items), logout - AlertsScreen: alert list with severity, acknowledge - SensorsScreen: sensor list with type filters (6 types), search - ZonesScreen: zone cards with stats - SettingsScreen: language picker (FR/EN/ES/DE), privacy, about - Stores: iotStore (sensors, zones, alerts), notificationStore, uiStore + i18n - Hooks: useSensors, useAlerts, useNotifications, useLocation - Components: Card, Button, LoadingSpinner, ErrorBoundary, Header - Services: iotService, notificationService (with axios API client) - Utils: formatters (temp, AQI, noise, dates), validators (email, password, IBAN) - Theme: colors.ts with full design system (Blue Ocean palette) - Ditto: fixed MongoDB connection, new JWT secrets, official gateway image
127 lines
4.1 KiB
Plaintext
127 lines
4.1 KiB
Plaintext
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import "RCTComponentViewRegistry.h"
|
|
|
|
#import <Foundation/NSMapTable.h>
|
|
#import <React/RCTAssert.h>
|
|
#import <React/RCTConstants.h>
|
|
|
|
#import <React/RCTImageComponentView.h>
|
|
#import <React/RCTParagraphComponentView.h>
|
|
#import <React/RCTViewComponentView.h>
|
|
#import <unordered_map>
|
|
|
|
using namespace facebook;
|
|
using namespace facebook::react;
|
|
|
|
const NSInteger RCTComponentViewRegistryRecyclePoolMaxSize = 1024;
|
|
|
|
@implementation RCTComponentViewRegistry {
|
|
std::unordered_map<Tag, RCTComponentViewDescriptor> _registry;
|
|
std::unordered_map<ComponentHandle, std::vector<RCTComponentViewDescriptor>> _recyclePool;
|
|
}
|
|
|
|
- (instancetype)init
|
|
{
|
|
if (self = [super init]) {
|
|
_componentViewFactory = [RCTComponentViewFactory currentComponentViewFactory];
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(handleApplicationDidReceiveMemoryWarningNotification)
|
|
name:UIApplicationDidReceiveMemoryWarningNotification
|
|
object:nil];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (const RCTComponentViewDescriptor &)dequeueComponentViewWithComponentHandle:(ComponentHandle)componentHandle
|
|
tag:(Tag)tag
|
|
{
|
|
RCTAssertMainQueue();
|
|
|
|
RCTAssert(
|
|
_registry.find(tag) == _registry.end(),
|
|
@"RCTComponentViewRegistry: Attempt to dequeue already registered component.");
|
|
|
|
auto componentViewDescriptor = [self _dequeueComponentViewWithComponentHandle:componentHandle];
|
|
componentViewDescriptor.view.tag = tag;
|
|
auto it = _registry.insert({tag, componentViewDescriptor});
|
|
return it.first->second;
|
|
}
|
|
|
|
- (void)enqueueComponentViewWithComponentHandle:(ComponentHandle)componentHandle
|
|
tag:(Tag)tag
|
|
componentViewDescriptor:(RCTComponentViewDescriptor)componentViewDescriptor
|
|
{
|
|
RCTAssertMainQueue();
|
|
|
|
RCTAssert(
|
|
_registry.find(tag) != _registry.end(), @"RCTComponentViewRegistry: Attempt to enqueue unregistered component.");
|
|
|
|
_registry.erase(tag);
|
|
componentViewDescriptor.view.tag = 0;
|
|
[self _enqueueComponentViewWithComponentHandle:componentHandle componentViewDescriptor:componentViewDescriptor];
|
|
}
|
|
|
|
- (const RCTComponentViewDescriptor &)componentViewDescriptorWithTag:(Tag)tag
|
|
{
|
|
RCTAssertMainQueue();
|
|
auto iterator = _registry.find(tag);
|
|
RCTAssert(iterator != _registry.end(), @"RCTComponentViewRegistry: Attempt to query unregistered component.");
|
|
return iterator->second;
|
|
}
|
|
|
|
- (nullable UIView<RCTComponentViewProtocol> *)findComponentViewWithTag:(Tag)tag
|
|
{
|
|
RCTAssertMainQueue();
|
|
auto iterator = _registry.find(tag);
|
|
if (iterator == _registry.end()) {
|
|
return nil;
|
|
}
|
|
return iterator->second.view;
|
|
}
|
|
|
|
- (RCTComponentViewDescriptor)_dequeueComponentViewWithComponentHandle:(ComponentHandle)componentHandle
|
|
{
|
|
RCTAssertMainQueue();
|
|
auto &recycledViews = _recyclePool[componentHandle];
|
|
|
|
if (recycledViews.empty()) {
|
|
return [self.componentViewFactory createComponentViewWithComponentHandle:componentHandle];
|
|
}
|
|
|
|
auto componentViewDescriptor = recycledViews.back();
|
|
recycledViews.pop_back();
|
|
return componentViewDescriptor;
|
|
}
|
|
|
|
- (void)_enqueueComponentViewWithComponentHandle:(ComponentHandle)componentHandle
|
|
componentViewDescriptor:(RCTComponentViewDescriptor)componentViewDescriptor
|
|
{
|
|
RCTAssertMainQueue();
|
|
auto &recycledViews = _recyclePool[componentHandle];
|
|
|
|
if (recycledViews.size() > RCTComponentViewRegistryRecyclePoolMaxSize || !componentViewDescriptor.shouldBeRecycled) {
|
|
return;
|
|
}
|
|
|
|
RCTAssert(
|
|
componentViewDescriptor.view.superview == nil, @"RCTComponentViewRegistry: Attempt to recycle a mounted view.");
|
|
[componentViewDescriptor.view prepareForRecycle];
|
|
|
|
recycledViews.push_back(componentViewDescriptor);
|
|
}
|
|
|
|
- (void)handleApplicationDidReceiveMemoryWarningNotification
|
|
{
|
|
_recyclePool.clear();
|
|
}
|
|
|
|
@end
|