mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
fix: sync will refresh the entire app (#877)
This commit is contained in:
@@ -4,6 +4,9 @@ import 'dart:io';
|
||||
import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:server_box/data/provider/private_key.dart';
|
||||
import 'package:server_box/data/provider/server/all.dart';
|
||||
import 'package:server_box/data/provider/snippet.dart';
|
||||
import 'package:server_box/data/res/misc.dart';
|
||||
import 'package:server_box/data/res/store.dart';
|
||||
|
||||
@@ -44,17 +47,17 @@ abstract class BackupV2 with _$BackupV2 implements Mergeable {
|
||||
Future<void> merge({bool force = false}) async {
|
||||
_loggerV2.info('Merging...');
|
||||
|
||||
// Merge each store
|
||||
await Mergeable.mergeStore(backupData: spis, store: Stores.server, force: force);
|
||||
await Mergeable.mergeStore(backupData: snippets, store: Stores.snippet, force: force);
|
||||
await Mergeable.mergeStore(backupData: keys, store: Stores.key, force: force);
|
||||
// Merge each store and check if changes were made
|
||||
final serverChanged = await Mergeable.mergeStore(backupData: spis, store: Stores.server, force: force);
|
||||
final snippetChanged = await Mergeable.mergeStore(backupData: snippets, store: Stores.snippet, force: force);
|
||||
final keyChanged = await Mergeable.mergeStore(backupData: keys, store: Stores.key, force: force);
|
||||
await Mergeable.mergeStore(backupData: container, store: Stores.container, force: force);
|
||||
await Mergeable.mergeStore(backupData: history, store: Stores.history, force: force);
|
||||
await Mergeable.mergeStore(backupData: settings, store: Stores.setting, force: force);
|
||||
|
||||
// Reload providers and notify listeners
|
||||
Provider.reload();
|
||||
RNodes.app.notify();
|
||||
if (serverChanged) GlobalRef.gRef?.read(serversNotifierProvider.notifier).reload();
|
||||
if (snippetChanged) GlobalRef.gRef?.read(snippetNotifierProvider.notifier).reload();
|
||||
if (keyChanged) GlobalRef.gRef?.read(privateKeyNotifierProvider.notifier).reload();
|
||||
|
||||
_loggerV2.info('Merge completed');
|
||||
}
|
||||
|
||||
@@ -9,17 +9,25 @@ part 'private_key.g.dart';
|
||||
|
||||
@freezed
|
||||
abstract class PrivateKeyState with _$PrivateKeyState {
|
||||
const factory PrivateKeyState({
|
||||
@Default(<PrivateKeyInfo>[]) List<PrivateKeyInfo> keys,
|
||||
}) = _PrivateKeyState;
|
||||
const factory PrivateKeyState({@Default(<PrivateKeyInfo>[]) List<PrivateKeyInfo> keys}) = _PrivateKeyState;
|
||||
}
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
class PrivateKeyNotifier extends _$PrivateKeyNotifier {
|
||||
@override
|
||||
PrivateKeyState build() {
|
||||
return _load();
|
||||
}
|
||||
|
||||
void reload() {
|
||||
final newState = _load();
|
||||
if (newState == state) return;
|
||||
state = newState;
|
||||
}
|
||||
|
||||
PrivateKeyState _load() {
|
||||
final keys = Stores.key.fetch();
|
||||
return PrivateKeyState(keys: keys);
|
||||
return stateOrNull?.copyWith(keys: keys) ?? PrivateKeyState(keys: keys);
|
||||
}
|
||||
|
||||
void add(PrivateKeyInfo info) {
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:fl_lib/fl_lib.dart';
|
||||
@@ -30,12 +29,17 @@ abstract class ServersState with _$ServersState {
|
||||
class ServersNotifier extends _$ServersNotifier {
|
||||
@override
|
||||
ServersState build() {
|
||||
// Initialize with empty state, load data asynchronously
|
||||
Future.microtask(() => _load());
|
||||
return const ServersState();
|
||||
return _load();
|
||||
}
|
||||
|
||||
Future<void> _load() async {
|
||||
Future<void> reload() async {
|
||||
final newState = _load();
|
||||
if (newState == state) return;
|
||||
state = newState;
|
||||
await refresh();
|
||||
}
|
||||
|
||||
ServersState _load() {
|
||||
final spis = Stores.server.fetch();
|
||||
final newServers = <String, Spi>{};
|
||||
final newServerOrder = <String>[];
|
||||
@@ -59,7 +63,8 @@ class ServersNotifier extends _$ServersNotifier {
|
||||
|
||||
final newTags = _calculateTags(newServers);
|
||||
|
||||
state = state.copyWith(servers: newServers, serverOrder: newServerOrder, tags: newTags);
|
||||
return stateOrNull?.copyWith(servers: newServers, serverOrder: newServerOrder, tags: newTags) ??
|
||||
ServersState(servers: newServers, serverOrder: newServerOrder, tags: newTags);
|
||||
}
|
||||
|
||||
Set<String> _calculateTags(Map<String, Spi> servers) {
|
||||
@@ -270,4 +275,4 @@ class ServersNotifier extends _$ServersNotifier {
|
||||
}
|
||||
bakSync.sync(milliDelay: 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,24 +20,32 @@ abstract class SnippetState with _$SnippetState {
|
||||
class SnippetNotifier extends _$SnippetNotifier {
|
||||
@override
|
||||
SnippetState build() {
|
||||
return _load();
|
||||
}
|
||||
|
||||
void reload() {
|
||||
final newState = _load();
|
||||
if (newState == state) return;
|
||||
state = newState;
|
||||
}
|
||||
|
||||
SnippetState _load() {
|
||||
final snippets = Stores.snippet.fetch();
|
||||
final order = Stores.setting.snippetOrder.fetch();
|
||||
|
||||
|
||||
List<Snippet> orderedSnippets = snippets;
|
||||
if (order.isNotEmpty) {
|
||||
final surplus = snippets.reorder(
|
||||
order: order,
|
||||
finder: (n, name) => n.name == name,
|
||||
);
|
||||
final surplus = snippets.reorder(order: order, finder: (n, name) => n.name == name);
|
||||
order.removeWhere((e) => surplus.any((ele) => ele == e));
|
||||
if (order != Stores.setting.snippetOrder.fetch()) {
|
||||
Stores.setting.snippetOrder.put(order);
|
||||
}
|
||||
orderedSnippets = snippets;
|
||||
}
|
||||
|
||||
final tags = _computeTags(orderedSnippets);
|
||||
return SnippetState(snippets: orderedSnippets, tags: tags);
|
||||
|
||||
final newTags = _computeTags(orderedSnippets);
|
||||
return stateOrNull?.copyWith(snippets: orderedSnippets, tags: newTags) ??
|
||||
SnippetState(snippets: orderedSnippets, tags: newTags);
|
||||
}
|
||||
|
||||
Set<String> _computeTags(List<Snippet> snippets) {
|
||||
|
||||
Reference in New Issue
Block a user