Settings-Page (alles auf einen Rutsch):
- Theme-Picker (System/Hell/Dunkel) — neuer useThemeStore (Zustand) mit
AsyncStorage @rebreak/theme persist; init-call in app/_layout.tsx
parallel zu auth-init
- Language-Picker (DE/EN) — neuer useLanguageStore mit i18n.changeLanguage
+ AsyncStorage @rebreak/language persist; init beim App-Start
- Lyra-Voice-Picker (Legend-only) — UI live, lokal selectable. BACKEND-GAP:
PATCH /api/profile/me/lyra-voice fehlt (demographics.patch akzeptiert
Voice-ID nicht via zod). UI bleibt funktional, Persist erst wenn
Endpoint da ist.
- Logout neutral (kein style:'destructive' am Alert-Button)
- Coming-Soon-Banner entfernt (war veraltet, Settings ist live)
Dropdown:
- HeaderDropdownMenu minWidth 280→170, Item-Labels numberOfLines={1}
ellipsize bei langen Strings
Locales:
- 11 neue Keys fuer Theme/Lang/Voice-Picker (DE+EN gepflegt)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
31 lines
883 B
TypeScript
31 lines
883 B
TypeScript
import { create } from 'zustand';
|
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
import i18n from '../lib/i18n';
|
|
|
|
export type AppLanguage = 'de' | 'en';
|
|
|
|
const STORAGE_KEY = '@rebreak/language';
|
|
|
|
type LanguageState = {
|
|
language: AppLanguage;
|
|
setLanguage: (lang: AppLanguage) => Promise<void>;
|
|
init: () => Promise<void>;
|
|
};
|
|
|
|
export const useLanguageStore = create<LanguageState>((set) => ({
|
|
language: (i18n.language === 'de' ? 'de' : 'en') as AppLanguage,
|
|
|
|
init: async () => {
|
|
const stored = await AsyncStorage.getItem(STORAGE_KEY);
|
|
const lang: AppLanguage = stored === 'de' || stored === 'en' ? stored : 'en';
|
|
await i18n.changeLanguage(lang);
|
|
set({ language: lang });
|
|
},
|
|
|
|
setLanguage: async (lang) => {
|
|
await AsyncStorage.setItem(STORAGE_KEY, lang);
|
|
await i18n.changeLanguage(lang);
|
|
set({ language: lang });
|
|
},
|
|
}));
|