import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shared_preferences/shared_preferences.dart'; const _kServerUrl = 'server_url'; const _kThemeMode = 'theme_mode'; const _kForgejoRepoUrl = 'forgejo_repo_url'; final sharedPreferencesProvider = Provider((ref) { throw UnimplementedError('Override in ProviderScope'); }); final cookiesPathProvider = Provider((ref) { throw UnimplementedError('Override in ProviderScope'); }); final themeModeProvider = StateNotifierProvider((ref) { final prefs = ref.watch(sharedPreferencesProvider); return ThemeModeNotifier(prefs); }); class ThemeModeNotifier extends StateNotifier { final SharedPreferences _prefs; ThemeModeNotifier(this._prefs) : super(_fromString(_prefs.getString(_kThemeMode))); static ThemeMode _fromString(String? value) => switch (value) { 'light' => ThemeMode.light, 'dark' => ThemeMode.dark, _ => ThemeMode.system, }; Future setMode(ThemeMode mode) async { final value = switch (mode) { ThemeMode.light => 'light', ThemeMode.dark => 'dark', _ => 'system', }; await _prefs.setString(_kThemeMode, value); state = mode; } } final forgejoRepoUrlProvider = StateNotifierProvider((ref) { return ForgejoRepoUrlNotifier(ref.watch(sharedPreferencesProvider)); }); class ForgejoRepoUrlNotifier extends StateNotifier { final SharedPreferences _prefs; ForgejoRepoUrlNotifier(this._prefs) : super(_prefs.getString(_kForgejoRepoUrl) ?? 'https://git.fabledsword.com/bvandeusen/FabledApp'); Future setUrl(String url) async { final clean = url.endsWith('/') ? url.substring(0, url.length - 1) : url; await _prefs.setString(_kForgejoRepoUrl, clean); state = clean; } } final serverUrlProvider = StateNotifierProvider((ref) { final prefs = ref.watch(sharedPreferencesProvider); return ServerUrlNotifier(prefs); }); class ServerUrlNotifier extends StateNotifier { final SharedPreferences _prefs; ServerUrlNotifier(this._prefs) : super(_prefs.getString(_kServerUrl)); Future setUrl(String url) async { // Strip trailing slash final clean = url.endsWith('/') ? url.substring(0, url.length - 1) : url; await _prefs.setString(_kServerUrl, clean); state = clean; } Future clear() async { await _prefs.remove(_kServerUrl); state = null; } }