- 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
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import spawnAsync, { SpawnOptions, SpawnResult } from '@expo/spawn-async';
|
|
import { spawnSync } from 'child_process';
|
|
import { join } from 'path';
|
|
|
|
export const AUTOLINKINNG_CLI = join(__dirname, '../bin/expo-modules-autolinking.js');
|
|
|
|
function isSpawnResult(errorOrResult: Error): errorOrResult is Error & SpawnResult {
|
|
return 'pid' in errorOrResult && 'stdout' in errorOrResult && 'stderr' in errorOrResult;
|
|
}
|
|
|
|
export async function autolinkingRunAsync(
|
|
args: string[],
|
|
options?: SpawnOptions
|
|
): Promise<SpawnResult> {
|
|
const promise = spawnAsync(AUTOLINKINNG_CLI, args, {
|
|
...options,
|
|
env: { ...process.env, EXPO_SHOULD_USE_LEGACY_PACKAGE_INTERFACE: '1' },
|
|
});
|
|
|
|
try {
|
|
return await promise;
|
|
} catch (error) {
|
|
if (isSpawnResult(error)) {
|
|
if (error.stdout) error.message += `\n------\nSTDOUT:\n${error.stdout}`;
|
|
if (error.stderr) error.message += `\n------\nSTDERR:\n${error.stderr}`;
|
|
}
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// For some reason, it can't be async, cause otherwise we will get `yarn did not print valid JSON:` error
|
|
export function yarnSync(options?: SpawnOptions) {
|
|
spawnSync('yarn', ['install', '--silent'], options);
|
|
}
|
|
|
|
export function combinations<T, U>(
|
|
aKey: string,
|
|
a: T[],
|
|
bKey: string,
|
|
b: U[]
|
|
): { [key: string]: T | U }[] {
|
|
const result = [];
|
|
a.forEach(aValue => {
|
|
b.forEach(bValue => {
|
|
result.push({
|
|
[aKey]: aValue,
|
|
[bKey]: bValue,
|
|
});
|
|
});
|
|
});
|
|
|
|
return result;
|
|
}
|