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 = NotifierProvider(ThemeModeNotifier.new); class ThemeModeNotifier extends Notifier { @override ThemeMode build() { final prefs = ref.watch(sharedPreferencesProvider); return _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 ref.read(sharedPreferencesProvider).setString(_kThemeMode, value); state = mode; } } final forgejoRepoUrlProvider = NotifierProvider( ForgejoRepoUrlNotifier.new); class ForgejoRepoUrlNotifier extends Notifier { @override String? build() { final prefs = ref.watch(sharedPreferencesProvider); return 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 ref.read(sharedPreferencesProvider).setString(_kForgejoRepoUrl, clean); state = clean; } } final serverUrlProvider = NotifierProvider(ServerUrlNotifier.new); class ServerUrlNotifier extends Notifier { @override String? build() { final prefs = ref.watch(sharedPreferencesProvider); return prefs.getString(_kServerUrl); } Future setUrl(String url) async { // Strip trailing slash final clean = url.endsWith('/') ? url.substring(0, url.length - 1) : url; await ref.read(sharedPreferencesProvider).setString(_kServerUrl, clean); state = clean; } Future clear() async { await ref.read(sharedPreferencesProvider).remove(_kServerUrl); state = null; } }