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,112 @@
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); }
import * as React from 'react';
import { Animated, StyleSheet } from 'react-native';
import { getTextColor } from './utils';
import { useInternalTheme } from '../../core/theming';
import AnimatedText from '../Typography/AnimatedText';
/**
* 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 = useInternalTheme(themeOverrides);
const {
current: shown
} = React.useRef(new 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
Animated.timing(shown, {
toValue: 1,
duration: 150 * scale,
useNativeDriver: true
}).start();
} else {
// hide text
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 = getTextColor({
theme,
disabled,
type
});
return /*#__PURE__*/React.createElement(AnimatedText, _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 = StyleSheet.create({
text: {
fontSize: 12,
paddingVertical: 4
},
padding: {
paddingHorizontal: 12
}
});
export default HelperText;
//# sourceMappingURL=HelperText.js.map

View File

@@ -0,0 +1 @@
{"version":3,"names":["React","Animated","StyleSheet","getTextColor","useInternalTheme","AnimatedText","HelperText","style","type","visible","theme","themeOverrides","onLayout","padding","disabled","rest","current","shown","useRef","Value","textHeight","scale","animation","maxFontSizeMultiplier","useEffect","timing","toValue","duration","useNativeDriver","start","handleTextLayout","e","nativeEvent","layout","height","textColor","createElement","_extends","styles","text","color","opacity","transform","translateY","interpolate","inputRange","outputRange","children","create","fontSize","paddingVertical","paddingHorizontal"],"sourceRoot":"../../../../src","sources":["components/HelperText/HelperText.tsx"],"mappings":"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","ignoreList":[]}

View File

@@ -0,0 +1,24 @@
import color from 'color';
export 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 color(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","getTextColor","theme","disabled","type","_theme$colors","colors","dark","error","isV3","onSurfaceDisabled","onSurfaceVariant","text","alpha","rgb","string"],"sourceRoot":"../../../../src","sources":["components/HelperText/utils.ts"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAUzB,OAAO,SAASC,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,OAAOX,KAAK,CAACE,KAAK,aAALA,KAAK,gBAAAG,aAAA,GAALH,KAAK,CAAEI,MAAM,cAAAD,aAAA,uBAAbA,aAAA,CAAeO,IAAI,CAAC,CAC9BC,KAAK,CAACN,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,CACxBO,GAAG,CAAC,CAAC,CACLC,MAAM,CAAC,CAAC;AACb","ignoreList":[]}