chahinebrini 9ccd0bd334 feat(settings): Theme + Language + Lyra-Voice Picker; Dropdown-width 280→170pt
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>
2026-05-07 21:22:32 +02:00

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 });
},
}));