import { ApiError, unwrap } from '@pipu/core'; import { useState, useSyncExternalStore } from 'react'; import { useTranslation } from 'react-i18next'; import { Text, View } from 'react-native'; import { QUALITIES, qualityPrefs, type Quality, type QualityPrefs } from '../lib/prefs'; import { useSession } from '../lib/session'; import { useColors } from '../theme'; import { Button, ErrorBox, Field, Segmented, Sheet, useErrorText } from './kit'; export function useQualityPrefs(): QualityPrefs { return useSyncExternalStore(qualityPrefs.subscribe, qualityPrefs.get); } /** Лист «Качество звука»: Wi-Fi / сотовая / загрузки. */ export function QualitySheet({ visible, onClose }: { visible: boolean; onClose: () => void }) { const { t } = useTranslation(); const colors = useColors(); const prefs = useQualityPrefs(); const row = (key: keyof QualityPrefs) => ( {t(`mobile.quality_${key}`)} value={prefs[key]} options={QUALITIES.map((q) => ({ value: q, label: t(`mobile.q_${q}`) }))} onChange={(q) => void qualityPrefs.set({ [key]: q })} /> ); return ( {row('wifi')} {row('cellular')} {row('download')} {t('mobile.quality_hint')} ); } /** Лист смены пароля: после смены сервер выдаёт новую пару токенов, остальные сессии завершаются. */ export function PasswordSheet({ visible, onClose }: { visible: boolean; onClose: () => void }) { const { t } = useTranslation(); const colors = useColors(); const session = useSession(); const errorText = useErrorText(); const [current, setCurrent] = useState(''); const [next, setNext] = useState(''); const [repeat, setRepeat] = useState(''); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const [done, setDone] = useState(false); const mismatch = repeat !== '' && repeat !== next; const fieldErr = (f: string) => (error instanceof ApiError && error.fieldCode(f) ? errorText(error) : undefined); const close = () => { setCurrent(''); setNext(''); setRepeat(''); setError(null); setDone(false); onClose(); }; const submit = async () => { setBusy(true); setError(null); try { const tokens = unwrap(await session.client.POST('/api/v1/me/password', { body: { current_password: current, new_password: next } })); await session.apply(tokens); setDone(true); setCurrent(''); setNext(''); setRepeat(''); } catch (e) { setError(e); } finally { setBusy(false); } }; return ( {done ? ( <> {t('settings.password_changed')}