- 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
84 lines
1.8 KiB
JavaScript
84 lines
1.8 KiB
JavaScript
/*!
|
|
* shallow-clone <https://github.com/jonschlinkert/shallow-clone>
|
|
*
|
|
* Copyright (c) 2015-present, Jon Schlinkert.
|
|
* Released under the MIT License.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const valueOf = Symbol.prototype.valueOf;
|
|
const typeOf = require('kind-of');
|
|
|
|
function clone(val, deep) {
|
|
switch (typeOf(val)) {
|
|
case 'array':
|
|
return val.slice();
|
|
case 'object':
|
|
return Object.assign({}, val);
|
|
case 'date':
|
|
return new val.constructor(Number(val));
|
|
case 'map':
|
|
return new Map(val);
|
|
case 'set':
|
|
return new Set(val);
|
|
case 'buffer':
|
|
return cloneBuffer(val);
|
|
case 'symbol':
|
|
return cloneSymbol(val);
|
|
case 'arraybuffer':
|
|
return cloneArrayBuffer(val);
|
|
case 'float32array':
|
|
case 'float64array':
|
|
case 'int16array':
|
|
case 'int32array':
|
|
case 'int8array':
|
|
case 'uint16array':
|
|
case 'uint32array':
|
|
case 'uint8clampedarray':
|
|
case 'uint8array':
|
|
return cloneTypedArray(val);
|
|
case 'regexp':
|
|
return cloneRegExp(val);
|
|
case 'error':
|
|
return Object.create(val);
|
|
default: {
|
|
return val;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cloneRegExp(val) {
|
|
const flags = val.flags !== void 0 ? val.flags : (/\w+$/.exec(val) || void 0);
|
|
const re = new val.constructor(val.source, flags);
|
|
re.lastIndex = val.lastIndex;
|
|
return re;
|
|
}
|
|
|
|
function cloneArrayBuffer(val) {
|
|
const res = new val.constructor(val.byteLength);
|
|
new Uint8Array(res).set(new Uint8Array(val));
|
|
return res;
|
|
}
|
|
|
|
function cloneTypedArray(val, deep) {
|
|
return new val.constructor(val.buffer, val.byteOffset, val.length);
|
|
}
|
|
|
|
function cloneBuffer(val) {
|
|
const len = val.length;
|
|
const buf = Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : Buffer.from(len);
|
|
val.copy(buf);
|
|
return buf;
|
|
}
|
|
|
|
function cloneSymbol(val) {
|
|
return valueOf ? Object(valueOf.call(val)) : {};
|
|
}
|
|
|
|
/**
|
|
* Expose `clone`
|
|
*/
|
|
|
|
module.exports = clone;
|