import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:sxchnge_wallet/sxchnge_wallet.dart'; class LocaleProvider extends ChangeNotifier { static const storageKey = 'sxchnge_last_locale'; LocaleProvider({Locale initialLocale = const Locale('en'), this.preferences}) : _locale = resolve(initialLocale.languageCode, const []); Locale _locale; bool _disposed = false; final SharedPreferences? preferences; Future _pendingSave = Future.value(true); Locale get locale => _locale; static Locale resolve(String? saved, List systemLocales) { final code = saved?.split(RegExp('[-_]')).first ?? (systemLocales.isEmpty ? 'en' : systemLocales.first.languageCode); return Locale(code == 'ru' ? 'ru' : 'en'); } static Future load(List systemLocales) async { try { final prefs = await SharedPreferences.getInstance(); return LocaleProvider( initialLocale: resolve(prefs.getString(storageKey), systemLocales), preferences: prefs, ); } catch (_) { return LocaleProvider(initialLocale: resolve(null, systemLocales)); } } Future loadAccount(WalletProvider wallet) async { await wallet.loadProfile(); if (_disposed) return; if (wallet.preferredLocale != null && !wallet.profileFailed) { _locale = resolve(wallet.preferredLocale, const []); notifyListeners(); } } Future saveAccountLocale(WalletProvider wallet, Locale value) async { if (_disposed || wallet.saving) return; _locale = resolve(value.languageCode, const []); notifyListeners(); await wallet.saveLocale(_locale.languageCode); } Future setLocale(Locale value) { final next = resolve(value.languageCode, const []); if (next == _locale) return _pendingSave; _locale = next; notifyListeners(); // Serialize writes so rapid language changes persist the last selection. _pendingSave = _pendingSave.then((_) async { try { return await preferences?.setString(storageKey, next.languageCode) ?? false; } catch (_) { return false; } }); return _pendingSave; } @override void dispose() { _disposed = true; super.dispose(); } }