- 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
97 lines
3.0 KiB
JavaScript
97 lines
3.0 KiB
JavaScript
'use strict';
|
|
|
|
var identity = require('../../nodes/identity.js');
|
|
var Pair = require('../../nodes/Pair.js');
|
|
var YAMLMap = require('../../nodes/YAMLMap.js');
|
|
|
|
class YAMLSet extends YAMLMap.YAMLMap {
|
|
constructor(schema) {
|
|
super(schema);
|
|
this.tag = YAMLSet.tag;
|
|
}
|
|
add(key) {
|
|
let pair;
|
|
if (identity.isPair(key))
|
|
pair = key;
|
|
else if (key &&
|
|
typeof key === 'object' &&
|
|
'key' in key &&
|
|
'value' in key &&
|
|
key.value === null)
|
|
pair = new Pair.Pair(key.key, null);
|
|
else
|
|
pair = new Pair.Pair(key, null);
|
|
const prev = YAMLMap.findPair(this.items, pair.key);
|
|
if (!prev)
|
|
this.items.push(pair);
|
|
}
|
|
/**
|
|
* If `keepPair` is `true`, returns the Pair matching `key`.
|
|
* Otherwise, returns the value of that Pair's key.
|
|
*/
|
|
get(key, keepPair) {
|
|
const pair = YAMLMap.findPair(this.items, key);
|
|
return !keepPair && identity.isPair(pair)
|
|
? identity.isScalar(pair.key)
|
|
? pair.key.value
|
|
: pair.key
|
|
: pair;
|
|
}
|
|
set(key, value) {
|
|
if (typeof value !== 'boolean')
|
|
throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`);
|
|
const prev = YAMLMap.findPair(this.items, key);
|
|
if (prev && !value) {
|
|
this.items.splice(this.items.indexOf(prev), 1);
|
|
}
|
|
else if (!prev && value) {
|
|
this.items.push(new Pair.Pair(key));
|
|
}
|
|
}
|
|
toJSON(_, ctx) {
|
|
return super.toJSON(_, ctx, Set);
|
|
}
|
|
toString(ctx, onComment, onChompKeep) {
|
|
if (!ctx)
|
|
return JSON.stringify(this);
|
|
if (this.hasAllNullValues(true))
|
|
return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep);
|
|
else
|
|
throw new Error('Set items must all have null values');
|
|
}
|
|
static from(schema, iterable, ctx) {
|
|
const { replacer } = ctx;
|
|
const set = new this(schema);
|
|
if (iterable && Symbol.iterator in Object(iterable))
|
|
for (let value of iterable) {
|
|
if (typeof replacer === 'function')
|
|
value = replacer.call(iterable, value, value);
|
|
set.items.push(Pair.createPair(value, null, ctx));
|
|
}
|
|
return set;
|
|
}
|
|
}
|
|
YAMLSet.tag = 'tag:yaml.org,2002:set';
|
|
const set = {
|
|
collection: 'map',
|
|
identify: value => value instanceof Set,
|
|
nodeClass: YAMLSet,
|
|
default: false,
|
|
tag: 'tag:yaml.org,2002:set',
|
|
createNode: (schema, iterable, ctx) => YAMLSet.from(schema, iterable, ctx),
|
|
resolve(map, onError) {
|
|
if (identity.isMap(map)) {
|
|
if (map.hasAllNullValues(true))
|
|
return Object.assign(new YAMLSet(), map);
|
|
else
|
|
onError('Set items must all have null values');
|
|
}
|
|
else
|
|
onError('Expected a mapping for this tag');
|
|
return map;
|
|
}
|
|
};
|
|
|
|
exports.YAMLSet = YAMLSet;
|
|
exports.set = set;
|