import 'dart:convert'; import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../gradeAverages/gradeAveragesSettings.dart'; import '../talk/talkSettings.dart'; import '../timetable/timetableSettings.dart'; import 'settings.dart'; class SettingsProvider extends ChangeNotifier { static const String _fieldName = "settings"; late SharedPreferences _storage; late Settings _settings = _defaults(); Settings val({bool write = false}) { if(write) { notifyListeners(); Future.delayed(const Duration(milliseconds: 300)).then((_) => update()); } return _settings; } SettingsProvider() { init(); } void init({bool resetConfig = false}) async { _storage = await SharedPreferences.getInstance(); if(resetConfig) _storage.remove(_fieldName); try { _settings = Settings.fromJson(jsonDecode(_storage.getString(_fieldName)!)); } catch(e) { log("Settings are defective, using defaults: ${e.toString()}"); _settings = _defaults(); } notifyListeners(); } void update() async { await _storage.setString(_fieldName, jsonEncode(_settings.toJson())); } Settings _defaults() { return Settings( appTheme: ThemeMode.system, devToolsEnabled: false, gradeAveragesSettings: GradeAveragesSettings( useGradeSystem: true, inputs: [] ), timetableSettings: TimetableSettings( zoom: 40, ), talkSettings: TalkSettings( sortFavoritesToTop: true, sortUnreadToTop: false, ), ); } }