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

117
smart-app-city/frontend/node_modules/js-yaml/bin/js-yaml.js generated vendored Executable file
View File

@@ -0,0 +1,117 @@
#!/usr/bin/env node
'use strict'
const fs = require('fs')
const argparse = require('argparse')
const yaml = require('..')
/// /////////////////////////////////////////////////////////////////////////////
const cli = new argparse.ArgumentParser({
prog: 'js-yaml',
add_help: true
})
cli.add_argument('-v', '--version', {
action: 'version',
version: require('../package.json').version
})
cli.add_argument('-c', '--compact', {
help: 'Display errors in compact mode',
action: 'store_true'
})
// deprecated (not needed after we removed output colors)
// option suppressed, but not completely removed for compatibility
cli.add_argument('-j', '--to-json', {
help: argparse.SUPPRESS,
dest: 'json',
action: 'store_true'
})
cli.add_argument('-t', '--trace', {
help: 'Show stack trace on error',
action: 'store_true'
})
cli.add_argument('file', {
help: 'File to read, utf-8 encoded without BOM',
nargs: '?',
default: '-'
})
/// /////////////////////////////////////////////////////////////////////////////
const options = cli.parse_args()
/// /////////////////////////////////////////////////////////////////////////////
function readFile (filename, encoding, callback) {
if (options.file === '-') {
// read from stdin
const chunks = []
process.stdin.on('data', function (chunk) {
chunks.push(chunk)
})
process.stdin.on('end', function () {
return callback(null, Buffer.concat(chunks).toString(encoding))
})
} else {
fs.readFile(filename, encoding, callback)
}
}
readFile(options.file, 'utf8', function (error, input) {
let output
let isYaml
if (error) {
if (error.code === 'ENOENT') {
console.error('File not found: ' + options.file)
process.exit(2)
}
console.error(
(options.trace && error.stack) ||
error.message ||
String(error))
process.exit(1)
}
try {
output = JSON.parse(input)
isYaml = false
} catch (err) {
if (err instanceof SyntaxError) {
try {
output = []
yaml.loadAll(input, function (doc) { output.push(doc) }, {})
isYaml = true
if (output.length === 0) output = null
else if (output.length === 1) output = output[0]
} catch (e) {
if (options.trace && err.stack) console.error(e.stack)
else console.error(e.toString(options.compact))
process.exit(1)
}
} else {
console.error(
(options.trace && err.stack) ||
err.message ||
String(err))
process.exit(1)
}
}
if (isYaml) console.log(JSON.stringify(output, null, ' '))
else console.log(yaml.dump(output))
})