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 @@
import './runtime';
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/winter/index.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAC"}

View File

@@ -0,0 +1,2 @@
import './runtime';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/winter/index.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAC","sourcesContent":["import './runtime';\n"]}

View File

@@ -0,0 +1 @@
//# sourceMappingURL=runtime.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/winter/runtime.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1 @@
//# sourceMappingURL=runtime.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/winter/runtime.ts"],"names":[],"mappings":"","sourcesContent":[""]}

View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=runtime.native.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"runtime.native.d.ts","sourceRoot":"","sources":["../../src/winter/runtime.native.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,23 @@
// This file configures the runtime environment to increase compatibility with WinterCG.
// https://wintercg.org/
import { polyfillGlobal as installGlobal } from 'react-native/Libraries/Utilities/PolyfillFunctions';
// Add a well-known shared symbol that doesn't show up in iteration or inspection
// this can be used to detect if the global object abides by the Expo team's documented
// built-in requirements.
const BUILTIN_SYMBOL = Symbol.for('expo.builtin');
function addBuiltinSymbol(obj) {
Object.defineProperty(obj, BUILTIN_SYMBOL, {
value: true,
enumerable: false,
configurable: false,
});
return obj;
}
function install(name, getValue) {
installGlobal(name, () => addBuiltinSymbol(getValue()));
}
// https://url.spec.whatwg.org/#url
install('URL', () => require('./url').URL);
// https://url.spec.whatwg.org/#urlsearchparams
install('URLSearchParams', () => require('./url').URLSearchParams);
//# sourceMappingURL=runtime.native.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"runtime.native.js","sourceRoot":"","sources":["../../src/winter/runtime.native.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,wBAAwB;AACxB,OAAO,EAAE,cAAc,IAAI,aAAa,EAAE,MAAM,oDAAoD,CAAC;AAErG,iFAAiF;AACjF,uFAAuF;AACvF,yBAAyB;AACzB,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAElD,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE;QACzC,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,QAAmB;IAChD,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,mCAAmC;AACnC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;AAC3C,+CAA+C;AAC/C,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC","sourcesContent":["// This file configures the runtime environment to increase compatibility with WinterCG.\n// https://wintercg.org/\nimport { polyfillGlobal as installGlobal } from 'react-native/Libraries/Utilities/PolyfillFunctions';\n\n// Add a well-known shared symbol that doesn't show up in iteration or inspection\n// this can be used to detect if the global object abides by the Expo team's documented\n// built-in requirements.\nconst BUILTIN_SYMBOL = Symbol.for('expo.builtin');\n\nfunction addBuiltinSymbol(obj: object) {\n Object.defineProperty(obj, BUILTIN_SYMBOL, {\n value: true,\n enumerable: false,\n configurable: false,\n });\n return obj;\n}\n\nfunction install(name: string, getValue: () => any) {\n installGlobal(name, () => addBuiltinSymbol(getValue()));\n}\n\n// https://url.spec.whatwg.org/#url\ninstall('URL', () => require('./url').URL);\n// https://url.spec.whatwg.org/#urlsearchparams\ninstall('URLSearchParams', () => require('./url').URLSearchParams);\n"]}

View File

@@ -0,0 +1,10 @@
/**
* Copyright © 2023-present 650 Industries, Inc. (aka Expo)
* Copyright © 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.
*/
import { URL, URLSearchParams } from 'whatwg-url-without-unicode';
export { URL, URLSearchParams };
//# sourceMappingURL=url.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/winter/url.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAkElE,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC"}

View File

@@ -0,0 +1,66 @@
/**
* Copyright © 2023-present 650 Industries, Inc. (aka Expo)
* Copyright © 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.
*/
// This file should not import `react-native` in order to remain self-contained.
import { URL, URLSearchParams } from 'whatwg-url-without-unicode';
let isSetup = false;
let BLOB_URL_PREFIX = null;
function getBlobUrlPrefix() {
if (isSetup)
return BLOB_URL_PREFIX;
isSetup = true;
// if iOS: let BLOB_URL_PREFIX = 'blob:'
// Pull the blob module without importing React Native.
const BlobModule = global.RN$Bridgeless !== true
? // Legacy RN implementation
global.nativeModuleProxy['BlobModule']
: // Newer RN implementation
global.__turboModuleProxy('BlobModule');
const constants = 'BLOB_URI_SCHEME' in BlobModule ? BlobModule : BlobModule.getConstants();
if (constants && typeof constants.BLOB_URI_SCHEME === 'string') {
BLOB_URL_PREFIX = encodeURIComponent(constants.BLOB_URI_SCHEME) + ':';
if (typeof constants.BLOB_URI_HOST === 'string') {
BLOB_URL_PREFIX += `//${encodeURIComponent(constants.BLOB_URI_HOST)}/`;
}
}
return BLOB_URL_PREFIX;
}
/**
* To allow Blobs be accessed via `content://` URIs,
* you need to register `BlobProvider` as a ContentProvider in your app's `AndroidManifest.xml`:
*
* ```xml
* <manifest>
* <application>
* <provider
* android:name="com.facebook.react.modules.blob.BlobProvider"
* android:authorities="@string/blob_provider_authority"
* android:exported="false"
* />
* </application>
* </manifest>
* ```
* And then define the `blob_provider_authority` string in `res/values/strings.xml`.
* Use a dotted name that's entirely unique to your app:
*
* ```xml
* <resources>
* <string name="blob_provider_authority">your.app.package.blobs</string>
* </resources>
* ```
*/
URL.createObjectURL = function createObjectURL(blob) {
if (getBlobUrlPrefix() == null) {
throw new Error('Cannot create URL for blob');
}
return `${getBlobUrlPrefix()}${encodeURIComponent(blob.data.blobId)}?offset=${encodeURIComponent(blob.data.offset)}&size=${encodeURIComponent(blob.size)}`;
};
URL.revokeObjectURL = function revokeObjectURL(url) {
// Do nothing.
};
export { URL, URLSearchParams };
//# sourceMappingURL=url.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/winter/url.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,gFAAgF;AAEhF,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB,IAAI,eAAe,GAAkB,IAAI,CAAC;AAE1C,SAAS,gBAAgB;IACvB,IAAI,OAAO;QAAE,OAAO,eAAe,CAAC;IACpC,OAAO,GAAG,IAAI,CAAC;IACf,wCAAwC;IAExC,uDAAuD;IACvD,MAAM,UAAU,GACd,MAAM,CAAC,aAAa,KAAK,IAAI;QAC3B,CAAC,CAAC,2BAA2B;YAC3B,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC;QACxC,CAAC,CAAC,0BAA0B;YAC1B,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAE9C,MAAM,SAAS,GAAG,iBAAiB,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;IAE3F,IAAI,SAAS,IAAI,OAAO,SAAS,CAAC,eAAe,KAAK,QAAQ,EAAE;QAC9D,eAAe,GAAG,kBAAkB,CAAC,SAAS,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC;QACtE,IAAI,OAAO,SAAS,CAAC,aAAa,KAAK,QAAQ,EAAE;YAC/C,eAAe,IAAI,KAAK,kBAAkB,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC;SACxE;KACF;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,GAAG,CAAC,eAAe,GAAG,SAAS,eAAe,CAAC,IAAI;IACjD,IAAI,gBAAgB,EAAE,IAAI,IAAI,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;KAC/C;IACD,OAAO,GAAG,gBAAgB,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,kBAAkB,CAC9F,IAAI,CAAC,IAAI,CAAC,MAAM,CACjB,SAAS,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF,GAAG,CAAC,eAAe,GAAG,SAAS,eAAe,CAAC,GAAG;IAChD,cAAc;AAChB,CAAC,CAAC;AAEF,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC","sourcesContent":["/**\n * Copyright © 2023-present 650 Industries, Inc. (aka Expo)\n * Copyright © Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This file should not import `react-native` in order to remain self-contained.\n\nimport { URL, URLSearchParams } from 'whatwg-url-without-unicode';\n\nlet isSetup = false;\nlet BLOB_URL_PREFIX: string | null = null;\n\nfunction getBlobUrlPrefix() {\n if (isSetup) return BLOB_URL_PREFIX;\n isSetup = true;\n // if iOS: let BLOB_URL_PREFIX = 'blob:'\n\n // Pull the blob module without importing React Native.\n const BlobModule =\n global.RN$Bridgeless !== true\n ? // Legacy RN implementation\n global.nativeModuleProxy['BlobModule']\n : // Newer RN implementation\n global.__turboModuleProxy('BlobModule');\n\n const constants = 'BLOB_URI_SCHEME' in BlobModule ? BlobModule : BlobModule.getConstants();\n\n if (constants && typeof constants.BLOB_URI_SCHEME === 'string') {\n BLOB_URL_PREFIX = encodeURIComponent(constants.BLOB_URI_SCHEME) + ':';\n if (typeof constants.BLOB_URI_HOST === 'string') {\n BLOB_URL_PREFIX += `//${encodeURIComponent(constants.BLOB_URI_HOST)}/`;\n }\n }\n return BLOB_URL_PREFIX;\n}\n\n/**\n * To allow Blobs be accessed via `content://` URIs,\n * you need to register `BlobProvider` as a ContentProvider in your app's `AndroidManifest.xml`:\n *\n * ```xml\n * <manifest>\n * <application>\n * <provider\n * android:name=\"com.facebook.react.modules.blob.BlobProvider\"\n * android:authorities=\"@string/blob_provider_authority\"\n * android:exported=\"false\"\n * />\n * </application>\n * </manifest>\n * ```\n * And then define the `blob_provider_authority` string in `res/values/strings.xml`.\n * Use a dotted name that's entirely unique to your app:\n *\n * ```xml\n * <resources>\n * <string name=\"blob_provider_authority\">your.app.package.blobs</string>\n * </resources>\n * ```\n */\nURL.createObjectURL = function createObjectURL(blob) {\n if (getBlobUrlPrefix() == null) {\n throw new Error('Cannot create URL for blob');\n }\n return `${getBlobUrlPrefix()}${encodeURIComponent(blob.data.blobId)}?offset=${encodeURIComponent(\n blob.data.offset\n )}&size=${encodeURIComponent(blob.size)}`;\n};\n\nURL.revokeObjectURL = function revokeObjectURL(url) {\n // Do nothing.\n};\n\nexport { URL, URLSearchParams };\n"]}