- 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
66 lines
1.7 KiB
JavaScript
66 lines
1.7 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.
|
|
*
|
|
* @flow strict
|
|
* @format
|
|
*/
|
|
|
|
import type {SymbolicatedStackTrace} from '../../Core/Devtools/symbolicateStackTrace';
|
|
import type {StackFrame} from '../../Core/NativeExceptionsManager';
|
|
|
|
import symbolicateStackTrace from '../../Core/Devtools/symbolicateStackTrace';
|
|
|
|
export type Stack = Array<StackFrame>;
|
|
|
|
const cache: Map<Stack, Promise<SymbolicatedStackTrace>> = new Map();
|
|
|
|
/**
|
|
* Sanitize because sometimes, `symbolicateStackTrace` gives us invalid values.
|
|
*/
|
|
const sanitize = ({
|
|
stack: maybeStack,
|
|
codeFrame,
|
|
}: SymbolicatedStackTrace): SymbolicatedStackTrace => {
|
|
if (!Array.isArray(maybeStack)) {
|
|
throw new Error('Expected stack to be an array.');
|
|
}
|
|
const stack: Array<StackFrame> = [];
|
|
for (const maybeFrame of maybeStack) {
|
|
let collapse = false;
|
|
if ('collapse' in maybeFrame) {
|
|
if (typeof maybeFrame.collapse !== 'boolean') {
|
|
throw new Error('Expected stack frame `collapse` to be a boolean.');
|
|
}
|
|
collapse = maybeFrame.collapse;
|
|
}
|
|
stack.push({
|
|
column: maybeFrame.column,
|
|
file: maybeFrame.file,
|
|
lineNumber: maybeFrame.lineNumber,
|
|
methodName: maybeFrame.methodName,
|
|
collapse,
|
|
});
|
|
}
|
|
return {stack, codeFrame};
|
|
};
|
|
|
|
export function deleteStack(stack: Stack): void {
|
|
cache.delete(stack);
|
|
}
|
|
|
|
export function symbolicate(
|
|
stack: Stack,
|
|
extraData?: mixed,
|
|
): Promise<SymbolicatedStackTrace> {
|
|
let promise = cache.get(stack);
|
|
if (promise == null) {
|
|
promise = symbolicateStackTrace(stack, extraData).then(sanitize);
|
|
cache.set(stack, promise);
|
|
}
|
|
|
|
return promise;
|
|
}
|