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,73 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var React = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _utils = require("./utils");
var _theming = require("../../core/theming");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
const version = _reactNative.NativeModules.PlatformConstants ? _reactNative.NativeModules.PlatformConstants.reactNativeVersion : undefined;
/**
* Switch is a visual toggle between two mutually exclusive states — on and off.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { Switch } from 'react-native-paper';
*
* const MyComponent = () => {
* const [isSwitchOn, setIsSwitchOn] = React.useState(false);
*
* const onToggleSwitch = () => setIsSwitchOn(!isSwitchOn);
*
* return <Switch value={isSwitchOn} onValueChange={onToggleSwitch} />;
* };
*
* export default MyComponent;
* ```
*/
const Switch = ({
value,
disabled,
onValueChange,
color,
theme: themeOverrides,
...rest
}) => {
const theme = (0, _theming.useInternalTheme)(themeOverrides);
const {
checkedColor,
onTintColor,
thumbTintColor
} = (0, _utils.getSwitchColor)({
theme,
disabled,
value,
color
});
const props = version && version.major === 0 && version.minor <= 56 ? {
onTintColor,
thumbTintColor
} : _reactNative.Platform.OS === 'web' ? {
activeTrackColor: onTintColor,
thumbColor: thumbTintColor,
activeThumbColor: checkedColor
} : {
thumbColor: thumbTintColor,
trackColor: {
true: onTintColor,
false: onTintColor
}
};
return /*#__PURE__*/React.createElement(_reactNative.Switch, _extends({
value: value,
disabled: disabled,
onValueChange: disabled ? undefined : onValueChange
}, props, rest));
};
var _default = exports.default = Switch;
//# sourceMappingURL=Switch.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["React","_interopRequireWildcard","require","_reactNative","_utils","_theming","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","version","NativeModules","PlatformConstants","reactNativeVersion","undefined","Switch","value","disabled","onValueChange","color","theme","themeOverrides","rest","useInternalTheme","checkedColor","onTintColor","thumbTintColor","getSwitchColor","props","major","minor","Platform","OS","activeTrackColor","thumbColor","activeThumbColor","trackColor","true","false","createElement","_default","exports"],"sourceRoot":"../../../../src","sources":["components/Switch/Switch.tsx"],"mappings":"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","ignoreList":[]}

View File

@@ -0,0 +1,101 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getSwitchColor = void 0;
var _reactNative = require("react-native");
var _color = _interopRequireDefault(require("color"));
var _colors = require("../../styles/themes/v2/colors");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const getCheckedColor = ({
theme,
color
}) => {
if (color) {
return color;
}
if (theme.isV3) {
return theme.colors.primary;
}
return theme.colors.accent;
};
const getThumbTintColor = ({
theme,
disabled,
value,
checkedColor
}) => {
const isIOS = _reactNative.Platform.OS === 'ios';
if (isIOS) {
return undefined;
}
if (disabled) {
if (theme.dark) {
return _colors.grey800;
}
return _colors.grey400;
}
if (value) {
return checkedColor;
}
if (theme.dark) {
return _colors.grey400;
}
return _colors.grey50;
};
const getOnTintColor = ({
theme,
disabled,
value,
checkedColor
}) => {
const isIOS = _reactNative.Platform.OS === 'ios';
if (isIOS) {
return checkedColor;
}
if (disabled) {
if (theme.dark) {
if (theme.isV3) {
return (0, _color.default)(_colors.white).alpha(0.06).rgb().string();
}
return (0, _color.default)(_colors.white).alpha(0.1).rgb().string();
}
return (0, _color.default)(_colors.black).alpha(0.12).rgb().string();
}
if (value) {
return (0, _color.default)(checkedColor).alpha(0.5).rgb().string();
}
if (theme.dark) {
return _colors.grey700;
}
return 'rgb(178, 175, 177)';
};
const getSwitchColor = ({
theme,
disabled,
value,
color
}) => {
const checkedColor = getCheckedColor({
theme,
color
});
return {
onTintColor: getOnTintColor({
theme,
disabled,
value,
checkedColor
}),
thumbTintColor: getThumbTintColor({
theme,
disabled,
value,
checkedColor
}),
checkedColor
};
};
exports.getSwitchColor = getSwitchColor;
//# sourceMappingURL=utils.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_reactNative","require","_color","_interopRequireDefault","_colors","e","__esModule","default","getCheckedColor","theme","color","isV3","colors","primary","accent","getThumbTintColor","disabled","value","checkedColor","isIOS","Platform","OS","undefined","dark","grey800","grey400","grey50","getOnTintColor","setColor","white","alpha","rgb","string","black","grey700","getSwitchColor","onTintColor","thumbTintColor","exports"],"sourceRoot":"../../../../src","sources":["components/Switch/utils.ts"],"mappings":"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","ignoreList":[]}