feat: Phase 3 — services, stores, navigation, design system

Services: ws.service, api.service, simulation.service, rssi.service (android+ios)
Stores: poseStore, settingsStore, matStore (Zustand)
Types: sensing, mat, api, navigation
Hooks: usePoseStream, useRssiScanner, useServerReachability
Theme: colors, typography, spacing, ThemeContext
Navigation: MainTabs (5 tabs), RootNavigator, types
Components: GaugeArc, SparklineChart, OccupancyGrid, StatusDot, ConnectionBanner, SignalBar, +more
Utils: ringBuffer, colorMap, formatters, urlValidator

Verified: tsc 0 errors, jest passes
This commit is contained in:
Yossi Elkrief
2026-03-02 12:53:45 +02:00
parent fbd7d837c7
commit 779bf8ff43
45 changed files with 2290 additions and 19 deletions

View File

@@ -0,0 +1,47 @@
import AsyncStorage from '@react-native-async-storage/async-storage';
import { create } from 'zustand';
import { createJSONStorage, persist } from 'zustand/middleware';
export type Theme = 'light' | 'dark' | 'system';
export interface SettingsState {
serverUrl: string;
rssiScanEnabled: boolean;
theme: Theme;
alertSoundEnabled: boolean;
setServerUrl: (url: string) => void;
setRssiScanEnabled: (value: boolean) => void;
setTheme: (theme: Theme) => void;
setAlertSoundEnabled: (value: boolean) => void;
}
export const useSettingsStore = create<SettingsState>()(
persist(
(set) => ({
serverUrl: 'http://192.168.1.100:8080',
rssiScanEnabled: false,
theme: 'system',
alertSoundEnabled: true,
setServerUrl: (url) => {
set({ serverUrl: url });
},
setRssiScanEnabled: (value) => {
set({ rssiScanEnabled: value });
},
setTheme: (theme) => {
set({ theme });
},
setAlertSoundEnabled: (value) => {
set({ alertSoundEnabled: value });
},
}),
{
name: 'wifi-densepose-settings',
storage: createJSONStorage(() => AsyncStorage),
},
),
);