- 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
107 lines
2.3 KiB
Objective-C
107 lines
2.3 KiB
Objective-C
#import <RNReanimated/REAScreensHelper.h>
|
|
|
|
@implementation REAScreensHelper
|
|
|
|
#if LOAD_SCREENS_HEADERS
|
|
|
|
+ (REAUIView *)getScreenForView:(REAUIView *)view
|
|
{
|
|
REAUIView *screen = view;
|
|
while (![screen isKindOfClass:[RNSScreenView class]] && screen.superview != nil) {
|
|
screen = screen.superview;
|
|
}
|
|
if ([screen isKindOfClass:[RNSScreenView class]]) {
|
|
return screen;
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
+ (REAUIView *)getStackForView:(REAUIView *)view
|
|
{
|
|
if ([view isKindOfClass:[RNSScreenView class]]) {
|
|
if (view.reactSuperview != nil) {
|
|
if ([view.reactSuperview isKindOfClass:[RNSScreenStackView class]]) {
|
|
return view.reactSuperview;
|
|
}
|
|
}
|
|
}
|
|
while (view != nil && ![view isKindOfClass:[RNSScreenStackView class]] && view.superview != nil) {
|
|
view = view.superview;
|
|
}
|
|
if ([view isKindOfClass:[RNSScreenStackView class]]) {
|
|
return view;
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
+ (bool)isScreenModal:(REAUIView *)uiViewScreen
|
|
{
|
|
if ([uiViewScreen isKindOfClass:[RNSScreenView class]]) {
|
|
RNSScreenView *screen = (RNSScreenView *)uiViewScreen;
|
|
bool isModal = [screen isModal];
|
|
if (!isModal) {
|
|
// case for modal with header
|
|
RNSScreenView *parentScreen = (RNSScreenView *)[REAScreensHelper getScreenForView:screen.reactSuperview];
|
|
if (parentScreen != nil) {
|
|
isModal = [parentScreen isModal];
|
|
}
|
|
}
|
|
return isModal;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
+ (REAUIView *)getScreenWrapper:(REAUIView *)view
|
|
{
|
|
REAUIView *screen = [REAScreensHelper getScreenForView:view];
|
|
REAUIView *stack = [REAScreensHelper getStackForView:screen];
|
|
REAUIView *screenWrapper = [REAScreensHelper getScreenForView:stack];
|
|
return screenWrapper;
|
|
}
|
|
|
|
+ (int)getScreenType:(REAUIView *)screen;
|
|
{
|
|
return [[screen valueForKey:@"stackPresentation"] intValue];
|
|
}
|
|
|
|
+ (bool)isRNSScreenType:(REAUIView *)view
|
|
{
|
|
return [view isKindOfClass:[RNSScreen class]] == YES;
|
|
}
|
|
|
|
#else
|
|
|
|
+ (REAUIView *)getScreenForView:(REAUIView *)view
|
|
{
|
|
return nil;
|
|
}
|
|
|
|
+ (REAUIView *)getStackForView:(REAUIView *)view
|
|
{
|
|
return nil;
|
|
}
|
|
|
|
+ (bool)isScreenModal:(REAUIView *)screen
|
|
{
|
|
return false;
|
|
}
|
|
|
|
+ (REAUIView *)getScreenWrapper:(REAUIView *)view
|
|
{
|
|
return nil;
|
|
}
|
|
|
|
+ (int)getScreenType:(REAUIView *)screen;
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
+ (bool)isRNSScreenType:(REAUIView *)screen
|
|
{
|
|
return false;
|
|
}
|
|
|
|
#endif // LOAD_SCREENS_HEADERS
|
|
|
|
@end
|