- 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
108 lines
3.5 KiB
JavaScript
108 lines
3.5 KiB
JavaScript
/**
|
|
* 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.
|
|
*
|
|
* @format
|
|
* @flow strict-local
|
|
*/
|
|
|
|
import NativeEventEmitter from '../EventEmitter/NativeEventEmitter';
|
|
import Platform from '../Utilities/Platform';
|
|
import EventEmitter, {
|
|
type EventSubscription,
|
|
} from '../vendor/emitter/EventEmitter';
|
|
import {isAsyncDebugging} from './DebugEnvironment';
|
|
import NativeAppearance, {
|
|
type AppearancePreferences,
|
|
type ColorSchemeName,
|
|
} from './NativeAppearance';
|
|
import invariant from 'invariant';
|
|
|
|
type AppearanceListener = (preferences: AppearancePreferences) => void;
|
|
const eventEmitter = new EventEmitter<{
|
|
change: [AppearancePreferences],
|
|
}>();
|
|
|
|
type NativeAppearanceEventDefinitions = {
|
|
appearanceChanged: [AppearancePreferences],
|
|
};
|
|
|
|
if (NativeAppearance) {
|
|
const nativeEventEmitter =
|
|
new NativeEventEmitter<NativeAppearanceEventDefinitions>(
|
|
// T88715063: NativeEventEmitter only used this parameter on iOS. Now it uses it on all platforms, so this code was modified automatically to preserve its behavior
|
|
// If you want to use the native module on other platforms, please remove this condition and test its behavior
|
|
Platform.OS !== 'ios' ? null : NativeAppearance,
|
|
);
|
|
nativeEventEmitter.addListener(
|
|
'appearanceChanged',
|
|
(newAppearance: AppearancePreferences) => {
|
|
const {colorScheme} = newAppearance;
|
|
invariant(
|
|
colorScheme === 'dark' ||
|
|
colorScheme === 'light' ||
|
|
colorScheme == null,
|
|
"Unrecognized color scheme. Did you mean 'dark' or 'light'?",
|
|
);
|
|
eventEmitter.emit('change', {colorScheme});
|
|
},
|
|
);
|
|
}
|
|
|
|
module.exports = {
|
|
/**
|
|
* Note: Although color scheme is available immediately, it may change at any
|
|
* time. Any rendering logic or styles that depend on this should try to call
|
|
* this function on every render, rather than caching the value (for example,
|
|
* using inline styles rather than setting a value in a `StyleSheet`).
|
|
*
|
|
* Example: `const colorScheme = Appearance.getColorScheme();`
|
|
*
|
|
* @returns {?ColorSchemeName} Value for the color scheme preference.
|
|
*/
|
|
getColorScheme(): ?ColorSchemeName {
|
|
if (__DEV__) {
|
|
if (isAsyncDebugging) {
|
|
// Hard code light theme when using the async debugger as
|
|
// sync calls aren't supported
|
|
return 'light';
|
|
}
|
|
}
|
|
|
|
// TODO: (hramos) T52919652 Use ?ColorSchemeName once codegen supports union
|
|
const nativeColorScheme: ?string =
|
|
NativeAppearance == null
|
|
? null
|
|
: NativeAppearance.getColorScheme() || null;
|
|
invariant(
|
|
nativeColorScheme === 'dark' ||
|
|
nativeColorScheme === 'light' ||
|
|
nativeColorScheme == null,
|
|
"Unrecognized color scheme. Did you mean 'dark' or 'light'?",
|
|
);
|
|
return nativeColorScheme;
|
|
},
|
|
|
|
setColorScheme(colorScheme: ?ColorSchemeName): void {
|
|
const nativeColorScheme = colorScheme == null ? 'unspecified' : colorScheme;
|
|
|
|
invariant(
|
|
colorScheme === 'dark' || colorScheme === 'light' || colorScheme == null,
|
|
"Unrecognized color scheme. Did you mean 'dark', 'light' or null?",
|
|
);
|
|
|
|
if (NativeAppearance != null && NativeAppearance.setColorScheme != null) {
|
|
NativeAppearance.setColorScheme(nativeColorScheme);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Add an event handler that is fired when appearance preferences change.
|
|
*/
|
|
addChangeListener(listener: AppearanceListener): EventSubscription {
|
|
return eventEmitter.addListener('change', listener);
|
|
},
|
|
};
|