import { useEffect, useMemo, useState } from 'react'; import { Linking, ScrollView, View } from 'react-native'; import { ThemedText } from '@/components/ThemedText'; import { ThemedView } from '@/components/ThemedView'; import { colors } from '@/theme/colors'; import { spacing } from '@/theme/spacing'; import { WS_PATH } from '@/constants/websocket'; import { apiService } from '@/services/api.service'; import { wsService } from '@/services/ws.service'; import { useSettingsStore } from '@/stores/settingsStore'; import { Alert, Pressable, Platform } from 'react-native'; import { ThemePicker } from './ThemePicker'; import { RssiToggle } from './RssiToggle'; import { ServerUrlInput } from './ServerUrlInput'; type GlowCardProps = { title: string; children: React.ReactNode; }; const GlowCard = ({ title, children }: GlowCardProps) => { return ( {title} {children} ); }; const ScanIntervalPicker = ({ value, onChange, }: { value: number; onChange: (value: number) => void; }) => { const options = [1, 2, 5]; return ( {options.map((interval) => { const isActive = interval === value; return ( onChange(interval)} style={{ flex: 1, borderWidth: 1, borderColor: isActive ? colors.accent : colors.border, borderRadius: 8, backgroundColor: isActive ? `${colors.accent}20` : colors.surface, alignItems: 'center', }} > {interval}s ); })} ); }; export const SettingsScreen = () => { const serverUrl = useSettingsStore((state) => state.serverUrl); const rssiScanEnabled = useSettingsStore((state) => state.rssiScanEnabled); const theme = useSettingsStore((state) => state.theme); const setServerUrl = useSettingsStore((state) => state.setServerUrl); const setRssiScanEnabled = useSettingsStore((state) => state.setRssiScanEnabled); const setTheme = useSettingsStore((state) => state.setTheme); const [draftUrl, setDraftUrl] = useState(serverUrl); const [scanInterval, setScanInterval] = useState(2); useEffect(() => { setDraftUrl(serverUrl); }, [serverUrl]); const intervalSummary = useMemo(() => `${scanInterval}s`, [scanInterval]); const handleSaveUrl = () => { setServerUrl(draftUrl); apiService.setBaseUrl(draftUrl); wsService.disconnect(); wsService.connect(draftUrl); }; const handleOpenGitHub = async () => { const handled = await Linking.canOpenURL('https://github.com'); if (!handled) { Alert.alert('Unable to open link', 'Please open https://github.com manually in your browser.'); return; } await Linking.openURL('https://github.com'); }; return ( Scan interval Active interval: {intervalSummary} {Platform.OS === 'ios' && ( iOS: RSSI scanning uses stubbed telemetry in this build. )} WiFi-DensePose Mobile v1.0.0 View on GitHub WebSocket: {WS_PATH} Triage priority mapping: Immediate/Delayed/Minor/Deceased/Unknown ); }; export default SettingsScreen;