- 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
83 lines
1.9 KiB
JavaScript
83 lines
1.9 KiB
JavaScript
import {
|
|
INPUT_START,
|
|
INPUT_MOVE,
|
|
INPUT_END,
|
|
INPUT_CANCEL,
|
|
INPUT_TYPE_TOUCH
|
|
} from '../inputjs/input-consts';
|
|
import Input from '../inputjs/input-constructor';
|
|
import toArray from '../utils/to-array';
|
|
import uniqueArray from '../utils/unique-array';
|
|
|
|
const SINGLE_TOUCH_INPUT_MAP = {
|
|
touchstart: INPUT_START,
|
|
touchmove: INPUT_MOVE,
|
|
touchend: INPUT_END,
|
|
touchcancel: INPUT_CANCEL
|
|
};
|
|
|
|
const SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';
|
|
const SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';
|
|
|
|
/**
|
|
* @private
|
|
* Touch events input
|
|
* @constructor
|
|
* @extends Input
|
|
*/
|
|
export default class SingleTouchInput extends Input {
|
|
constructor() {
|
|
var proto = SingleTouchInput.prototype;
|
|
proto.evTarget = SINGLE_TOUCH_TARGET_EVENTS;
|
|
proto.evWin = SINGLE_TOUCH_WINDOW_EVENTS;
|
|
|
|
super(...arguments);
|
|
this.started = false;
|
|
}
|
|
|
|
handler(ev) {
|
|
let type = SINGLE_TOUCH_INPUT_MAP[ev.type];
|
|
|
|
// should we handle the touch events?
|
|
if (type === INPUT_START) {
|
|
this.started = true;
|
|
}
|
|
|
|
if (!this.started) {
|
|
return;
|
|
}
|
|
|
|
let touches = normalizeSingleTouches.call(this, ev, type);
|
|
|
|
// when done, reset the started state
|
|
if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {
|
|
this.started = false;
|
|
}
|
|
|
|
this.callback(this.manager, type, {
|
|
pointers: touches[0],
|
|
changedPointers: touches[1],
|
|
pointerType: INPUT_TYPE_TOUCH,
|
|
srcEvent: ev
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
* @this {TouchInput}
|
|
* @param {Object} ev
|
|
* @param {Number} type flag
|
|
* @returns {undefined|Array} [all, changed]
|
|
*/
|
|
function normalizeSingleTouches(ev, type) {
|
|
let all = toArray(ev.touches);
|
|
let changed = toArray(ev.changedTouches);
|
|
|
|
if (type & (INPUT_END | INPUT_CANCEL)) {
|
|
all = uniqueArray(all.concat(changed), 'identifier', true);
|
|
}
|
|
|
|
return [all, changed];
|
|
}
|