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,28 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "CollapsedItem", {
enumerable: true,
get: function () {
return _DrawerCollapsedItem.default;
}
});
Object.defineProperty(exports, "Item", {
enumerable: true,
get: function () {
return _DrawerItem.default;
}
});
Object.defineProperty(exports, "Section", {
enumerable: true,
get: function () {
return _DrawerSection.default;
}
});
var _DrawerItem = _interopRequireDefault(require("./DrawerItem"));
var _DrawerCollapsedItem = _interopRequireDefault(require("./DrawerCollapsedItem"));
var _DrawerSection = _interopRequireDefault(require("./DrawerSection"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
//# sourceMappingURL=Drawer.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["_DrawerItem","_interopRequireDefault","require","_DrawerCollapsedItem","_DrawerSection","e","__esModule","default"],"sourceRoot":"../../../../src","sources":["components/Drawer/Drawer.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AACA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAGA,IAAAC,oBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAGA,IAAAE,cAAA,GAAAH,sBAAA,CAAAC,OAAA;AAAqD,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}

View File

@@ -0,0 +1,190 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var React = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _theming = require("../../core/theming");
var _Badge = _interopRequireDefault(require("../Badge"));
var _Icon = _interopRequireDefault(require("../Icon"));
var _Text = _interopRequireDefault(require("../Typography/Text"));
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); }
const badgeSize = 8;
const iconSize = 24;
const itemSize = 56;
const outlineHeight = 32;
/**
* Note: Available in v5.x with theme version 3
*
* Collapsed component used to show an action item with an icon and optionally label in a navigation drawer.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { Drawer } from 'react-native-paper';
*
* const MyComponent = () => (
* <Drawer.CollapsedItem
* focusedIcon="inbox"
* unfocusedIcon="inbox-outline"
* label="Inbox"
* />
* );
*
* export default MyComponent;
* ```
*/
const DrawerCollapsedItem = ({
focusedIcon,
unfocusedIcon,
label,
active,
theme: themeOverrides,
style,
onPress,
disabled,
accessibilityLabel,
badge = false,
testID = 'drawer-collapsed-item',
labelMaxFontSizeMultiplier,
...rest
}) => {
const theme = (0, _theming.useInternalTheme)(themeOverrides);
const {
isV3
} = theme;
const {
scale
} = theme.animation;
const [numOfLines, setNumOfLines] = React.useState(1);
const {
current: animScale
} = React.useRef(new _reactNative.Animated.Value(active ? 1 : 0.5));
React.useEffect(() => {
if (!active) {
animScale.setValue(0.5);
}
}, [animScale, active]);
if (!isV3) {
return null;
}
const handlePressOut = () => {
_reactNative.Animated.timing(animScale, {
toValue: 1,
duration: 150 * scale,
useNativeDriver: true
}).start();
};
const iconPadding = ((!label ? itemSize : outlineHeight) - iconSize) / 2;
const backgroundColor = active ? theme.colors.secondaryContainer : 'transparent';
const labelColor = active ? theme.colors.onSurface : theme.colors.onSurfaceVariant;
const iconColor = active ? theme.colors.onSecondaryContainer : theme.colors.onSurfaceVariant;
const onTextLayout = ({
nativeEvent
}) => {
setNumOfLines(nativeEvent.lines.length);
};
// Label is cut off on Android, when centered "labelMedium" text
// has more than 4 lines, so there is a need to decrease the letter spacing.
const androidLetterSpacingStyle = _reactNative.Platform.OS === 'android' && numOfLines > 4 && styles.letterSpacing;
const labelTextStyle = {
color: labelColor,
...(isV3 ? theme.fonts.labelMedium : {})
};
const icon = !active && unfocusedIcon !== undefined ? unfocusedIcon : focusedIcon;
return /*#__PURE__*/React.createElement(_reactNative.View, rest, /*#__PURE__*/React.createElement(_reactNative.Pressable, {
onPress: onPress,
onPressOut: onPress ? handlePressOut : undefined,
disabled: disabled
// @ts-expect-error We keep old a11y props for backwards compat with old RN versions
,
accessibilityTraits: active ? ['button', 'selected'] : 'button',
accessibilityComponentType: "button",
accessibilityRole: "button",
accessibilityState: {
selected: active
},
accessibilityLabel: accessibilityLabel,
testID: testID
}, /*#__PURE__*/React.createElement(_reactNative.View, {
style: styles.wrapper
}, /*#__PURE__*/React.createElement(_reactNative.Animated.View, {
style: [styles.outline, !label && styles.roundedOutline, {
transform: [label ? {
scaleX: animScale
} : {
scale: animScale
}],
backgroundColor
}, style],
testID: `${testID}-outline`
}), /*#__PURE__*/React.createElement(_reactNative.View, {
style: [styles.icon, {
top: iconPadding
}],
testID: `${testID}-container`
}, badge !== false && /*#__PURE__*/React.createElement(_reactNative.View, {
style: styles.badgeContainer
}, typeof badge === 'boolean' ? /*#__PURE__*/React.createElement(_Badge.default, {
visible: badge,
size: badgeSize
}) : /*#__PURE__*/React.createElement(_Badge.default, {
visible: badge != null,
size: 2 * badgeSize
}, badge)), /*#__PURE__*/React.createElement(_Icon.default, {
source: icon,
size: iconSize,
color: iconColor
})), label ? /*#__PURE__*/React.createElement(_Text.default, {
variant: "labelMedium",
selectable: false,
numberOfLines: 2,
onTextLayout: onTextLayout,
style: [styles.label, androidLetterSpacingStyle, labelTextStyle],
maxFontSizeMultiplier: labelMaxFontSizeMultiplier
}, label) : null)));
};
DrawerCollapsedItem.displayName = 'Drawer.CollapsedItem';
const styles = _reactNative.StyleSheet.create({
wrapper: {
width: 80,
marginBottom: 12,
minHeight: itemSize,
alignItems: 'center'
},
outline: {
width: itemSize,
height: outlineHeight,
borderRadius: itemSize / 2,
alignItems: 'center',
justifyContent: 'center'
},
roundedOutline: {
height: itemSize
},
icon: {
position: 'absolute'
},
letterSpacing: {
letterSpacing: 0.3,
alignSelf: 'stretch'
},
label: {
marginHorizontal: 12,
marginTop: 4,
textAlign: 'center'
},
badgeContainer: {
position: 'absolute',
left: 20,
bottom: 20,
zIndex: 2
}
});
var _default = exports.default = DrawerCollapsedItem;
//# sourceMappingURL=DrawerCollapsedItem.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,134 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var React = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _color = _interopRequireDefault(require("color"));
var _theming = require("../../core/theming");
var _Icon = _interopRequireDefault(require("../Icon"));
var _TouchableRipple = _interopRequireDefault(require("../TouchableRipple/TouchableRipple"));
var _Text = _interopRequireDefault(require("../Typography/Text"));
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); }
/**
* A component used to show an action item with an icon and a label in a navigation drawer.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { Drawer } from 'react-native-paper';
*
* const MyComponent = () => (
* <Drawer.Item
* style={{ backgroundColor: '#64ffda' }}
* icon="star"
* label="First Item"
* />
* );
*
* export default MyComponent;
* ```
*/
const DrawerItem = ({
icon,
label,
active,
disabled,
theme: themeOverrides,
rippleColor: customRippleColor,
style,
onPress,
background,
accessibilityLabel,
right,
labelMaxFontSizeMultiplier,
hitSlop,
...rest
}) => {
const theme = (0, _theming.useInternalTheme)(themeOverrides);
const {
roundness,
isV3
} = theme;
const backgroundColor = active ? isV3 ? theme.colors.secondaryContainer : (0, _color.default)(theme.colors.primary).alpha(0.12).rgb().string() : undefined;
const contentColor = active ? isV3 ? theme.colors.onSecondaryContainer : theme.colors.primary : isV3 ? theme.colors.onSurfaceVariant : (0, _color.default)(theme.colors.text).alpha(0.68).rgb().string();
const labelMargin = icon ? isV3 ? 12 : 32 : 0;
const borderRadius = (isV3 ? 7 : 1) * roundness;
const rippleColor = isV3 ? (0, _color.default)(contentColor).alpha(0.12).rgb().string() : undefined;
const font = isV3 ? theme.fonts.labelLarge : theme.fonts.medium;
return /*#__PURE__*/React.createElement(_reactNative.View, rest, /*#__PURE__*/React.createElement(_TouchableRipple.default, {
borderless: true,
disabled: disabled,
background: background,
onPress: onPress,
style: [styles.container, {
backgroundColor,
borderRadius
}, isV3 && styles.v3Container, style],
accessibilityRole: "button",
accessibilityState: {
selected: active
},
accessibilityLabel: accessibilityLabel,
rippleColor: customRippleColor || rippleColor,
theme: theme,
hitSlop: hitSlop
}, /*#__PURE__*/React.createElement(_reactNative.View, {
style: [styles.wrapper, isV3 && styles.v3Wrapper]
}, /*#__PURE__*/React.createElement(_reactNative.View, {
style: styles.content
}, icon ? /*#__PURE__*/React.createElement(_Icon.default, {
source: icon,
size: 24,
color: contentColor
}) : null, /*#__PURE__*/React.createElement(_Text.default, {
variant: "labelLarge",
selectable: false,
numberOfLines: 1,
style: [styles.label, {
color: contentColor,
marginLeft: labelMargin,
...font
}],
maxFontSizeMultiplier: labelMaxFontSizeMultiplier
}, label)), right === null || right === void 0 ? void 0 : right({
color: contentColor
}))));
};
DrawerItem.displayName = 'Drawer.Item';
const styles = _reactNative.StyleSheet.create({
container: {
marginHorizontal: 10,
marginVertical: 4
},
v3Container: {
justifyContent: 'center',
height: 56,
marginLeft: 12,
marginRight: 12,
marginVertical: 0
},
wrapper: {
flexDirection: 'row',
alignItems: 'center',
padding: 8
},
v3Wrapper: {
marginLeft: 16,
marginRight: 24,
padding: 0
},
content: {
flex: 1,
flexDirection: 'row',
alignItems: 'center'
},
label: {
marginRight: 32
}
});
var _default = exports.default = DrawerItem;
//# sourceMappingURL=DrawerItem.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,104 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var React = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _color = _interopRequireDefault(require("color"));
var _theming = require("../../core/theming");
var _tokens = require("../../styles/themes/v3/tokens");
var _Divider = _interopRequireDefault(require("../Divider"));
var _Text = _interopRequireDefault(require("../Typography/Text"));
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); }
/**
* A component to group content inside a navigation drawer.
*
* ## Usage
* ```js
* import * as React from 'react';
* import { Drawer } from 'react-native-paper';
*
* const MyComponent = () => {
* const [active, setActive] = React.useState('');
*
* return (
* <Drawer.Section title="Some title">
* <Drawer.Item
* label="First Item"
* active={active === 'first'}
* onPress={() => setActive('first')}
* />
* <Drawer.Item
* label="Second Item"
* active={active === 'second'}
* onPress={() => setActive('second')}
* />
* </Drawer.Section>
* );
* };
*
* export default MyComponent;
* ```
*/
const DrawerSection = ({
children,
title,
theme: themeOverrides,
style,
showDivider = true,
titleMaxFontSizeMultiplier,
...rest
}) => {
const theme = (0, _theming.useInternalTheme)(themeOverrides);
const {
isV3
} = theme;
const titleColor = isV3 ? theme.colors.onSurfaceVariant : (0, _color.default)(theme.colors.text).alpha(0.54).rgb().string();
const titleMargin = isV3 ? 28 : 16;
const font = isV3 ? theme.fonts.titleSmall : theme.fonts.medium;
return /*#__PURE__*/React.createElement(_reactNative.View, _extends({
style: [styles.container, style]
}, rest), title && /*#__PURE__*/React.createElement(_reactNative.View, {
style: [styles.titleContainer, isV3 && styles.v3TitleContainer]
}, title && /*#__PURE__*/React.createElement(_Text.default, {
variant: "titleSmall",
numberOfLines: 1,
style: [{
color: titleColor,
marginLeft: titleMargin,
...font
}],
maxFontSizeMultiplier: titleMaxFontSizeMultiplier
}, title)), children, showDivider && /*#__PURE__*/React.createElement(_Divider.default, _extends({}, isV3 && {
horizontalInset: true,
bold: true
}, {
style: [styles.divider, isV3 && styles.v3Divider],
theme: theme
})));
};
DrawerSection.displayName = 'Drawer.Section';
const styles = _reactNative.StyleSheet.create({
container: {
marginBottom: 4
},
titleContainer: {
height: 40,
justifyContent: 'center'
},
v3TitleContainer: {
height: 56
},
divider: {
marginTop: 4
},
v3Divider: {
backgroundColor: _tokens.MD3Colors.neutralVariant50
}
});
var _default = exports.default = DrawerSection;
//# sourceMappingURL=DrawerSection.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["React","_interopRequireWildcard","require","_reactNative","_color","_interopRequireDefault","_theming","_tokens","_Divider","_Text","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","DrawerSection","children","title","theme","themeOverrides","style","showDivider","titleMaxFontSizeMultiplier","rest","useInternalTheme","isV3","titleColor","colors","onSurfaceVariant","color","text","alpha","rgb","string","titleMargin","font","fonts","titleSmall","medium","createElement","View","styles","container","titleContainer","v3TitleContainer","variant","numberOfLines","marginLeft","maxFontSizeMultiplier","horizontalInset","bold","divider","v3Divider","displayName","StyleSheet","create","marginBottom","height","justifyContent","marginTop","backgroundColor","MD3Colors","neutralVariant50","_default","exports"],"sourceRoot":"../../../../src","sources":["components/Drawer/DrawerSection.tsx"],"mappings":"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","ignoreList":[]}