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
This commit is contained in:
Eric FELIXINE
2026-06-01 18:00:35 -04:00
parent 08ca495bde
commit e30ae8ed09
35578 changed files with 3703534 additions and 43 deletions

View File

@@ -0,0 +1,2 @@
export declare function AppEntryNotFound(): JSX.Element;
//# sourceMappingURL=AppEntryNotFound.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"AppEntryNotFound.d.ts","sourceRoot":"","sources":["../../src/errors/AppEntryNotFound.tsx"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,gBAW/B"}

View File

@@ -0,0 +1,32 @@
import { StyleSheet, Text, View } from 'react-native';
export function AppEntryNotFound() {
return (<View style={styles.container}>
<Text style={styles.errorTitle}>App entry not found</Text>
<Text style={styles.errorDescription}>
The app entry point named "main" was not registered. This may be due to an uncaught error
thrown from a module's top-level code. Refer to the CLI logs and the native device logs for
more detail.
</Text>
</View>);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
padding: 20,
backgroundColor: '#f2f2f2',
},
errorTitle: {
fontSize: 24,
fontWeight: 'bold',
color: '#d32f2f',
textAlign: 'center',
marginBottom: 24,
},
errorDescription: {
fontSize: 16,
color: '#333',
textAlign: 'center',
},
});
//# sourceMappingURL=AppEntryNotFound.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"AppEntryNotFound.js","sourceRoot":"","sources":["../../src/errors/AppEntryNotFound.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAC5B;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,mBAAmB,EAAE,IAAI,CACzD;MAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACnC;;;;MAGF,EAAE,IAAI,CACR;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,IAAI,EAAE,CAAC;QACP,cAAc,EAAE,QAAQ;QACxB,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,SAAS;KAC3B;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,EAAE;KACjB;IACD,gBAAgB,EAAE;QAChB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,QAAQ;KACpB;CACF,CAAC,CAAC","sourcesContent":["import { StyleSheet, Text, View } from 'react-native';\n\nexport function AppEntryNotFound() {\n return (\n <View style={styles.container}>\n <Text style={styles.errorTitle}>App entry not found</Text>\n <Text style={styles.errorDescription}>\n The app entry point named \"main\" was not registered. This may be due to an uncaught error\n thrown from a module's top-level code. Refer to the CLI logs and the native device logs for\n more detail.\n </Text>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n padding: 20,\n backgroundColor: '#f2f2f2',\n },\n errorTitle: {\n fontSize: 24,\n fontWeight: 'bold',\n color: '#d32f2f',\n textAlign: 'center',\n marginBottom: 24,\n },\n errorDescription: {\n fontSize: 16,\n color: '#333',\n textAlign: 'center',\n },\n});\n"]}

View File

@@ -0,0 +1,3 @@
export declare function createErrorHandler(originalHandler: any): (error: any, isFatal: any) => any;
export declare function disableErrorHandling(): void;
//# sourceMappingURL=ExpoErrorManager.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ExpoErrorManager.d.ts","sourceRoot":"","sources":["../../src/errors/ExpoErrorManager.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,eAAe,KAAA,qCAEjD;AAED,wBAAgB,oBAAoB,SAAK"}

View File

@@ -0,0 +1,5 @@
export function createErrorHandler(originalHandler) {
return (error, isFatal) => originalHandler(error, isFatal);
}
export function disableErrorHandling() { }
//# sourceMappingURL=ExpoErrorManager.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ExpoErrorManager.js","sourceRoot":"","sources":["../../src/errors/ExpoErrorManager.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,eAAe;IAChD,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,oBAAoB,KAAI,CAAC","sourcesContent":["export function createErrorHandler(originalHandler) {\n return (error, isFatal) => originalHandler(error, isFatal);\n}\n\nexport function disableErrorHandling() {}\n"]}

View File

@@ -0,0 +1,3 @@
export declare function createErrorHandler(originalHandler: any): (error: any, isFatal: any) => void;
export declare function disableErrorHandling(): void;
//# sourceMappingURL=ExpoErrorManager.native.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ExpoErrorManager.native.d.ts","sourceRoot":"","sources":["../../src/errors/ExpoErrorManager.native.ts"],"names":[],"mappings":"AAmCA,wBAAgB,kBAAkB,CAAC,eAAe,KAAA,sCASjD;AAED,wBAAgB,oBAAoB,SAEnC"}

View File

@@ -0,0 +1,39 @@
let isErrorHandlingEnabled = true;
const developmentBuildMessage = `If you're trying to use a module that is not supported in Expo Go, you need to create a development build of your app. See https://docs.expo.dev/development/introduction/ for more info.`;
function customizeUnavailableMessage(error) {
error.message += '\n\n' + developmentBuildMessage;
}
function customizeModuleIsMissingMessage(error) {
error.message = `Your JavaScript code tried to access a native module that doesn't exist.
${developmentBuildMessage}`;
}
function customizeError(error) {
if ('code' in error && error.code === 'ERR_UNAVAILABLE') {
customizeUnavailableMessage(error);
}
else if (error.message.includes('Native module cannot be null') || // RN 0.64 and below message
error.message.includes('`new NativeEventEmitter()` requires a non-null argument.') // RN 0.65+ message
) {
customizeModuleIsMissingMessage(error);
}
}
function errorHandler(originalHandler, error, isFatal) {
if (error instanceof Error) {
customizeError(error);
}
originalHandler(error, isFatal);
}
export function createErrorHandler(originalHandler) {
return (error, isFatal) => {
if (isErrorHandlingEnabled) {
errorHandler(originalHandler, error, isFatal);
return;
}
originalHandler(error, isFatal);
};
}
export function disableErrorHandling() {
isErrorHandlingEnabled = false;
}
//# sourceMappingURL=ExpoErrorManager.native.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ExpoErrorManager.native.js","sourceRoot":"","sources":["../../src/errors/ExpoErrorManager.native.ts"],"names":[],"mappings":"AAGA,IAAI,sBAAsB,GAAG,IAAI,CAAC;AAElC,MAAM,uBAAuB,GAAG,2LAA2L,CAAC;AAE5N,SAAS,2BAA2B,CAAC,KAAiB;IACpD,KAAK,CAAC,OAAO,IAAI,MAAM,GAAG,uBAAuB,CAAC;AACpD,CAAC;AAED,SAAS,+BAA+B,CAAC,KAAY;IACnD,KAAK,CAAC,OAAO,GAAG;;EAEhB,uBAAuB,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE;QACvD,2BAA2B,CAAC,KAAK,CAAC,CAAC;KACpC;SAAM,IACL,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAAC,IAAI,4BAA4B;QACtF,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,0DAA0D,CAAC,CAAC,mBAAmB;MACtG;QACA,+BAA+B,CAAC,KAAK,CAAC,CAAC;KACxC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO;IACnD,IAAI,KAAK,YAAY,KAAK,EAAE;QAC1B,cAAc,CAAC,KAAK,CAAC,CAAC;KACvB;IACD,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,eAAe;IAChD,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,sBAAsB,EAAE;YAC1B,YAAY,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO;SACR;QAED,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,sBAAsB,GAAG,KAAK,CAAC;AACjC,CAAC","sourcesContent":["// Similar interface to the one used in expo modules.\ntype CodedError = Error & { code?: string };\n\nlet isErrorHandlingEnabled = true;\n\nconst developmentBuildMessage = `If you're trying to use a module that is not supported in Expo Go, you need to create a development build of your app. See https://docs.expo.dev/development/introduction/ for more info.`;\n\nfunction customizeUnavailableMessage(error: CodedError) {\n error.message += '\\n\\n' + developmentBuildMessage;\n}\n\nfunction customizeModuleIsMissingMessage(error: Error) {\n error.message = `Your JavaScript code tried to access a native module that doesn't exist. \n\n${developmentBuildMessage}`;\n}\n\nfunction customizeError(error: Error | CodedError) {\n if ('code' in error && error.code === 'ERR_UNAVAILABLE') {\n customizeUnavailableMessage(error);\n } else if (\n error.message.includes('Native module cannot be null') || // RN 0.64 and below message\n error.message.includes('`new NativeEventEmitter()` requires a non-null argument.') // RN 0.65+ message\n ) {\n customizeModuleIsMissingMessage(error);\n }\n}\n\nfunction errorHandler(originalHandler, error, isFatal) {\n if (error instanceof Error) {\n customizeError(error);\n }\n originalHandler(error, isFatal);\n}\n\nexport function createErrorHandler(originalHandler) {\n return (error, isFatal) => {\n if (isErrorHandlingEnabled) {\n errorHandler(originalHandler, error, isFatal);\n return;\n }\n\n originalHandler(error, isFatal);\n };\n}\n\nexport function disableErrorHandling() {\n isErrorHandlingEnabled = false;\n}\n"]}