actions-test/lib/backend/themes.dart

87 lines
1.8 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
import 'package:localstore/localstore.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class AppTheme {
ThemeMode mode;
AppTheme(this.mode);
String name(BuildContext context) {
final trans = AppLocalizations.of(context);
if (mode == ThemeMode.light) {
return trans!.themeLight;
}
if (mode == ThemeMode.dark) {
return trans!.themeDark;
}
return trans!.themeSystem;
}
IconData get icon {
if (mode == ThemeMode.light) {
return Icons.light_mode;
}
if (mode == ThemeMode.dark) {
return Icons.dark_mode;
}
return Icons.brightness_auto;
}
static get auto {
return AppTheme(ThemeMode.system);
}
static get light {
return AppTheme(ThemeMode.light);
}
static get dark {
return AppTheme(ThemeMode.dark);
}
static List<AppTheme> list() {
return [AppTheme.auto, AppTheme.light, AppTheme.dark];
}
static listen(Function(Map<String, dynamic>) cb) {
final db = Localstore.instance;
final stream = db.collection('settings').stream;
stream.listen(cb);
}
Future<void> toDisk() async {
final db = Localstore.instance;
await db.collection('settings').doc('ui').set({'theme': mode.index});
}
static Future<AppTheme> fromDisk() async {
final db = Localstore.instance;
final doc = await db.collection('settings').doc('ui').get();
try {
final index = doc?['theme'];
final mode = ThemeMode.values[index];
return AppTheme(mode);
} catch (_) {
return AppTheme(ThemeMode.system);
}
}
@override
bool operator ==(other) {
if (other.runtimeType == runtimeType) {
if (other.hashCode == hashCode) {
return true;
}
}
return false;
}
@override
int get hashCode => mode.index;
}