Files
Eric FELIXINE e30ae8ed09 feat(smart-app): implement complete mobile app MVP
- 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
2026-06-01 18:00:35 -04:00

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