import 'package:collection/collection.dart'; import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/database/database.dart'; import 'package:fl_clash/models/models.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'generated/database.g.dart'; @riverpod Stream> profilesStream(Ref ref) { return database.profilesDao.all().watch(); } @riverpod Stream> addedRuleStream(Ref ref, int profileId) { return database.rulesDao.allAddedRules(profileId).watch(); } @Riverpod(keepAlive: true) class Profiles extends _$Profiles { @override List build() { return ref.watch(profilesStreamProvider).value ?? []; } void put(Profile profile) { final vm2 = state.copyAndAddProfile(profile); final nextProfiles = vm2.a; final newProfile = vm2.b; state = nextProfiles; database.profiles.put(newProfile.toCompanion()); } void del(int id) { final newProfiles = state.where((element) => element.id != id).toList(); state = newProfiles; database.profiles.remove((t) => t.id.equals(id)); } void updateProfile(int profileId, Profile Function(Profile profile) builder) { final index = state.indexWhere((element) => element.id == profileId); if (index == -1) { return; } final List profilesTemp = List.from(state); final newProfile = builder(profilesTemp[index]); profilesTemp[index] = newProfile; state = profilesTemp; database.profiles.put(newProfile.toCompanion()); } void setAndReorder(List profiles) { final newProfiles = List.from(profiles); state = newProfiles; database.profilesDao.setAll(profiles); } void reorder(List profiles) { final newProfiles = List.from(profiles); state = newProfiles; final List needUpdateProfiles = []; newProfiles.forEachIndexed((index, item) { if (item.order != index) { needUpdateProfiles.add(item.toCompanion(index)); } }); database.profilesDao.putAll(needUpdateProfiles); } @override bool updateShouldNotify(List previous, List next) { return !profileListEquality.equals(previous, next); } } @riverpod class Scripts extends _$Scripts with AsyncNotifierMixin { @override Stream> build() { return database.scriptsDao.all().watch(); } @override List