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,120 @@
"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");
var _AnimatedText = _interopRequireDefault(require("../Typography/AnimatedText"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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); }
/**
* Helper text is used in conjuction with input elements to provide additional hints for the user.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { View } from 'react-native';
* import { HelperText, TextInput } from 'react-native-paper';
*
* const MyComponent = () => {
* const [text, setText] = React.useState('');
*
* const onChangeText = text => setText(text);
*
* const hasErrors = () => {
* return !text.includes('@');
* };
*
* return (
* <View>
* <TextInput label="Email" value={text} onChangeText={onChangeText} />
* <HelperText type="error" visible={hasErrors()}>
* Email address is invalid!
* </HelperText>
* </View>
* );
* };
*
* export default MyComponent;
* ```
*/
const HelperText = ({
style,
type = 'info',
visible = true,
theme: themeOverrides,
onLayout,
padding = 'normal',
disabled,
...rest
}) => {
const theme = (0, _theming.useInternalTheme)(themeOverrides);
const {
current: shown
} = React.useRef(new _reactNative.Animated.Value(visible ? 1 : 0));
let {
current: textHeight
} = React.useRef(0);
const {
scale
} = theme.animation;
const {
maxFontSizeMultiplier = 1.5
} = rest;
React.useEffect(() => {
if (visible) {
// show text
_reactNative.Animated.timing(shown, {
toValue: 1,
duration: 150 * scale,
useNativeDriver: true
}).start();
} else {
// hide text
_reactNative.Animated.timing(shown, {
toValue: 0,
duration: 180 * scale,
useNativeDriver: true
}).start();
}
}, [visible, scale, shown]);
const handleTextLayout = e => {
onLayout === null || onLayout === void 0 || onLayout(e);
textHeight = e.nativeEvent.layout.height;
};
const textColor = (0, _utils.getTextColor)({
theme,
disabled,
type
});
return /*#__PURE__*/React.createElement(_AnimatedText.default, _extends({
onLayout: handleTextLayout,
style: [styles.text, padding !== 'none' ? styles.padding : {}, {
color: textColor,
opacity: shown,
transform: visible && type === 'error' ? [{
translateY: shown.interpolate({
inputRange: [0, 1],
outputRange: [-textHeight / 2, 0]
})
}] : []
}, style],
maxFontSizeMultiplier: maxFontSizeMultiplier
}, rest), rest.children);
};
const styles = _reactNative.StyleSheet.create({
text: {
fontSize: 12,
paddingVertical: 4
},
padding: {
paddingHorizontal: 12
}
});
var _default = exports.default = HelperText;
//# sourceMappingURL=HelperText.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["React","_interopRequireWildcard","require","_reactNative","_utils","_theming","_AnimatedText","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","HelperText","style","type","visible","theme","themeOverrides","onLayout","padding","disabled","rest","useInternalTheme","current","shown","useRef","Animated","Value","textHeight","scale","animation","maxFontSizeMultiplier","useEffect","timing","toValue","duration","useNativeDriver","start","handleTextLayout","nativeEvent","layout","height","textColor","getTextColor","createElement","styles","text","color","opacity","transform","translateY","interpolate","inputRange","outputRange","children","StyleSheet","create","fontSize","paddingVertical","paddingHorizontal","_default","exports"],"sourceRoot":"../../../../src","sources":["components/HelperText/HelperText.tsx"],"mappings":"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","ignoreList":[]}

View File

@@ -0,0 +1,31 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getTextColor = getTextColor;
var _color = _interopRequireDefault(require("color"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function getTextColor({
theme,
disabled,
type
}) {
var _theme$colors;
const {
colors,
dark
} = theme;
if (type === 'error') {
return colors === null || colors === void 0 ? void 0 : colors.error;
}
if (theme.isV3) {
if (disabled) {
return theme.colors.onSurfaceDisabled;
} else {
return theme.colors.onSurfaceVariant;
}
}
return (0, _color.default)(theme === null || theme === void 0 || (_theme$colors = theme.colors) === null || _theme$colors === void 0 ? void 0 : _theme$colors.text).alpha(dark ? 0.7 : 0.54).rgb().string();
}
//# sourceMappingURL=utils.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_color","_interopRequireDefault","require","e","__esModule","default","getTextColor","theme","disabled","type","_theme$colors","colors","dark","error","isV3","onSurfaceDisabled","onSurfaceVariant","color","text","alpha","rgb","string"],"sourceRoot":"../../../../src","sources":["components/HelperText/utils.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA0B,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAUnB,SAASG,YAAYA,CAAC;EAAEC,KAAK;EAAEC,QAAQ;EAAEC;AAAgB,CAAC,EAAE;EAAA,IAAAC,aAAA;EACjE,MAAM;IAAEC,MAAM;IAAEC;EAAK,CAAC,GAAGL,KAAK;EAE9B,IAAIE,IAAI,KAAK,OAAO,EAAE;IACpB,OAAOE,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEE,KAAK;EACtB;EAEA,IAAIN,KAAK,CAACO,IAAI,EAAE;IACd,IAAIN,QAAQ,EAAE;MACZ,OAAOD,KAAK,CAACI,MAAM,CAACI,iBAAiB;IACvC,CAAC,MAAM;MACL,OAAOR,KAAK,CAACI,MAAM,CAACK,gBAAgB;IACtC;EACF;EAEA,OAAO,IAAAC,cAAK,EAACV,KAAK,aAALA,KAAK,gBAAAG,aAAA,GAALH,KAAK,CAAEI,MAAM,cAAAD,aAAA,uBAAbA,aAAA,CAAeQ,IAAI,CAAC,CAC9BC,KAAK,CAACP,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,CACxBQ,GAAG,CAAC,CAAC,CACLC,MAAM,CAAC,CAAC;AACb","ignoreList":[]}