import 'dart:convert'; import 'package:contacts_plus_plus/models/sem_ver.dart'; import 'package:contacts_plus_plus/models/users/online_status.dart'; import 'package:flutter/material.dart'; import 'package:uuid/uuid.dart'; class SettingsEntry { final T? value; final T deflt; const SettingsEntry({this.value, required this.deflt}); factory SettingsEntry.fromMap(Map map) { return SettingsEntry( value: jsonDecode(map["value"]) as T?, deflt: map["default"], ); } Map toMap() { return { "value": jsonEncode(value), "default": deflt, }; } T get valueOrDefault => value ?? deflt; SettingsEntry withValue({required T newValue}) => SettingsEntry(value: newValue, deflt: deflt); SettingsEntry passThrough(T? newValue) { return newValue == null ? this : this.withValue(newValue: newValue); } } class Settings { final SettingsEntry notificationsDenied; final SettingsEntry lastOnlineStatus; final SettingsEntry lastDismissedVersion; final SettingsEntry machineId; final SettingsEntry themeMode; Settings({ SettingsEntry? notificationsDenied, SettingsEntry? lastOnlineStatus, SettingsEntry? themeMode, SettingsEntry? lastDismissedVersion, SettingsEntry? machineId }) : notificationsDenied = notificationsDenied ?? const SettingsEntry(deflt: false), lastOnlineStatus = lastOnlineStatus ?? SettingsEntry(deflt: OnlineStatus.online.index), themeMode = themeMode ?? SettingsEntry(deflt: ThemeMode.dark.index), lastDismissedVersion = lastDismissedVersion ?? SettingsEntry(deflt: SemVer.zero().toString()), machineId = machineId ?? SettingsEntry(deflt: const Uuid().v4()); factory Settings.fromMap(Map map) { return Settings( notificationsDenied: retrieveEntryOrNull(map["notificationsDenied"]), lastOnlineStatus: retrieveEntryOrNull(map["lastOnlineStatus"]), themeMode: retrieveEntryOrNull(map["themeMode"]), lastDismissedVersion: retrieveEntryOrNull(map["lastDismissedVersion"]), machineId: retrieveEntryOrNull(map["machineId"]), ); } static SettingsEntry? retrieveEntryOrNull(Map? map) { if (map == null) return null; try { return SettingsEntry.fromMap(map); } catch (_) { return null; } } Map toMap() { return { "notificationsDenied": notificationsDenied.toMap(), "lastOnlineStatus": lastOnlineStatus.toMap(), "themeMode": themeMode.toMap(), "lastDismissedVersion": lastDismissedVersion.toMap(), "machineId": machineId.toMap(), }; } Settings copy() => copyWith(); Settings copyWith({ bool? notificationsDenied, int? lastOnlineStatus, int? themeMode, String? lastDismissedVersion, String? machineId, }) { return Settings( notificationsDenied: this.notificationsDenied.passThrough(notificationsDenied), lastOnlineStatus: this.lastOnlineStatus.passThrough(lastOnlineStatus), themeMode: this.themeMode.passThrough(themeMode), lastDismissedVersion: this.lastDismissedVersion.passThrough(lastDismissedVersion), machineId: this.machineId.passThrough(machineId), ); } }