diff --git a/lib/core/sync.dart b/lib/core/sync.dart index abda0c89..67aa26b0 100644 --- a/lib/core/sync.dart +++ b/lib/core/sync.dart @@ -4,16 +4,16 @@ import 'package:fl_lib/fl_lib.dart'; import 'package:server_box/data/model/app/backup.dart'; import 'package:server_box/data/store/no_backup.dart'; -const sync = Sync._(); +const bakSync = BakSyncer._(); -final class Sync extends SyncCfg { - const Sync._() : super(); +final class BakSyncer extends SyncIface { + const BakSyncer._() : super(); @override Future saveToFile() => Backup.backup(); @override - Future fromFile(String path) async { + Future fromFile(String path) async { final content = await File(path).readAsString(); return Backup.fromJsonString(content); } diff --git a/lib/data/provider/private_key.dart b/lib/data/provider/private_key.dart index 3015c063..4a44ba87 100644 --- a/lib/data/provider/private_key.dart +++ b/lib/data/provider/private_key.dart @@ -1,4 +1,5 @@ import 'package:fl_lib/fl_lib.dart'; +import 'package:server_box/core/sync.dart'; import 'package:server_box/data/model/server/private_key_info.dart'; import 'package:server_box/data/res/store.dart'; @@ -18,12 +19,14 @@ class PrivateKeyProvider extends Provider { pkis.value.add(info); pkis.notify(); Stores.key.put(info); + bakSync.sync(milliDelay: 1000); } static void delete(PrivateKeyInfo info) { pkis.value.removeWhere((e) => e.id == info.id); pkis.notify(); Stores.key.delete(info); + bakSync.sync(milliDelay: 1000); } static void update(PrivateKeyInfo old, PrivateKeyInfo newInfo) { @@ -37,5 +40,6 @@ class PrivateKeyProvider extends Provider { Stores.key.put(newInfo); } pkis.notify(); + bakSync.sync(milliDelay: 1000); } } diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index 9c4c2775..54e0e982 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -5,6 +5,7 @@ import 'package:computer/computer.dart'; import 'package:dartssh2/dartssh2.dart'; import 'package:fl_lib/fl_lib.dart'; import 'package:server_box/core/extension/ssh_client.dart'; +import 'package:server_box/core/sync.dart'; import 'package:server_box/core/utils/ssh_auth.dart'; import 'package:server_box/data/model/app/error.dart'; import 'package:server_box/data/model/app/shell_func.dart'; @@ -190,6 +191,7 @@ class ServerProvider extends Provider { Stores.setting.serverOrder.put(serverOrder.value); _updateTags(); refresh(spi: spi); + bakSync.sync(milliDelay: 1000); } static void delServer(String id) { @@ -199,6 +201,7 @@ class ServerProvider extends Provider { Stores.setting.serverOrder.put(serverOrder.value); Stores.server.delete(id); _updateTags(); + bakSync.sync(milliDelay: 1000); } static void deleteAll() { @@ -234,6 +237,7 @@ class ServerProvider extends Provider { } } _updateTags(); + bakSync.sync(); } static void _setServerState(VNode s, ServerConn ss) { diff --git a/lib/data/provider/snippet.dart b/lib/data/provider/snippet.dart index 373805c3..87e312f5 100644 --- a/lib/data/provider/snippet.dart +++ b/lib/data/provider/snippet.dart @@ -1,4 +1,5 @@ import 'package:fl_lib/fl_lib.dart'; +import 'package:server_box/core/sync.dart'; import 'package:server_box/data/model/server/snippet.dart'; import 'package:server_box/data/res/store.dart'; @@ -44,6 +45,7 @@ class SnippetProvider extends Provider { snippets.notify(); Stores.snippet.put(snippet); _updateTags(); + bakSync.sync(milliDelay: 1000); } static void del(Snippet snippet) { @@ -51,6 +53,7 @@ class SnippetProvider extends Provider { snippets.notify(); Stores.snippet.delete(snippet); _updateTags(); + bakSync.sync(milliDelay: 1000); } static void update(Snippet old, Snippet newOne) { @@ -60,6 +63,7 @@ class SnippetProvider extends Provider { Stores.snippet.delete(old); Stores.snippet.put(newOne); _updateTags(); + bakSync.sync(milliDelay: 1000); } static void renameTag(String old, String newOne) { @@ -71,5 +75,6 @@ class SnippetProvider extends Provider { } } _updateTags(); + bakSync.sync(milliDelay: 1000); } } diff --git a/lib/data/res/store.dart b/lib/data/res/store.dart index a9eb3209..af36fa4f 100644 --- a/lib/data/res/store.dart +++ b/lib/data/res/store.dart @@ -1,35 +1,38 @@ import 'package:fl_lib/fl_lib.dart'; import 'package:server_box/data/store/container.dart'; import 'package:server_box/data/store/history.dart'; +import 'package:server_box/data/store/no_backup.dart'; import 'package:server_box/data/store/private_key.dart'; import 'package:server_box/data/store/server.dart'; import 'package:server_box/data/store/setting.dart'; import 'package:server_box/data/store/snippet.dart'; abstract final class Stores { - static final setting = SettingStore(); - static final server = ServerStore(); - static final container = ContainerStore(); - static final history = HistoryStore(); - static final key = PrivateKeyStore(); - static final snippet = SnippetStore(); + static final setting = SettingStore.instance; + static final server = ServerStore.instance; + static final container = ContainerStore.instance; + static final key = PrivateKeyStore.instance; + static final snippet = SnippetStore.instance; + static final history = HistoryStore.instance; - static final List all = [ - setting, - server, - container, - history, - key, - snippet, + /// All stores that need backup + static final List _allBackup = [ + SettingStore.instance, + ServerStore.instance, + ContainerStore.instance, + PrivateKeyStore.instance, + SnippetStore.instance, + HistoryStore.instance, ]; static Future init() async { - await Future.wait(all.map((store) => store.init())); + await Future.wait(_allBackup.map((store) => store.init())); + await NoBackupStore.instance.init(); } static int? get lastModTime { int? lastModTime = 0; - for (final store in all) { + for (final store in _allBackup) { final last = store.box.lastModified ?? 0; if (last > (lastModTime ?? 0)) { lastModTime = last; diff --git a/lib/data/store/container.dart b/lib/data/store/container.dart index 82797cf4..8de8f728 100644 --- a/lib/data/store/container.dart +++ b/lib/data/store/container.dart @@ -5,7 +5,9 @@ import 'package:server_box/data/res/store.dart'; const _keyConfig = 'providerConfig'; class ContainerStore extends PersistentStore { - ContainerStore() : super('docker'); + ContainerStore._() : super('docker'); + + static final instance = ContainerStore._(); String? fetch(String? id) { return box.get(id); diff --git a/lib/data/store/history.dart b/lib/data/store/history.dart index 9dd76f9c..cf973466 100644 --- a/lib/data/store/history.dart +++ b/lib/data/store/history.dart @@ -46,7 +46,9 @@ class _MapHistory { } class HistoryStore extends PersistentStore { - HistoryStore() : super('history'); + HistoryStore._() : super('history'); + + static final instance = HistoryStore._(); /// Paths that user has visited by 'Locate' button late final sftpGoPath = _ListHistory(box: box, name: 'sftpPath'); diff --git a/lib/data/store/private_key.dart b/lib/data/store/private_key.dart index e70badfd..4ef9ccc3 100644 --- a/lib/data/store/private_key.dart +++ b/lib/data/store/private_key.dart @@ -3,7 +3,9 @@ import 'package:fl_lib/fl_lib.dart'; import 'package:server_box/data/model/server/private_key_info.dart'; class PrivateKeyStore extends PersistentStore { - PrivateKeyStore() : super('key'); + PrivateKeyStore._() : super('key'); + + static final instance = PrivateKeyStore._(); void put(PrivateKeyInfo info) { box.put(info.id, info); diff --git a/lib/data/store/server.dart b/lib/data/store/server.dart index 0bbd4e1b..f4cf8ae8 100644 --- a/lib/data/store/server.dart +++ b/lib/data/store/server.dart @@ -3,7 +3,9 @@ import 'package:fl_lib/fl_lib.dart'; import 'package:server_box/data/model/server/server_private_info.dart'; class ServerStore extends PersistentStore { - ServerStore() : super('server'); + ServerStore._() : super('server'); + + static final instance = ServerStore._(); void put(Spi info) { box.put(info.id, info); diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index 45799e34..8ee2cd69 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -7,7 +7,9 @@ import 'package:server_box/data/model/app/net_view.dart'; import 'package:server_box/data/res/default.dart'; class SettingStore extends PersistentStore { - SettingStore() : super('setting'); + SettingStore._() : super('setting'); + + static final instance = SettingStore._(); // ------BEGIN------ // diff --git a/lib/data/store/snippet.dart b/lib/data/store/snippet.dart index 004b81ca..0b0d146c 100644 --- a/lib/data/store/snippet.dart +++ b/lib/data/store/snippet.dart @@ -3,7 +3,9 @@ import 'package:fl_lib/fl_lib.dart'; import 'package:server_box/data/model/server/snippet.dart'; class SnippetStore extends PersistentStore { - SnippetStore() : super('snippet'); + SnippetStore._() : super('snippet'); + + static final instance = SnippetStore._(); void put(Snippet snippet) { box.put(snippet.name, snippet); diff --git a/lib/main.dart b/lib/main.dart index 077a8119..4eb06750 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -122,7 +122,7 @@ void _doPlatformRelated() async { // Plus 1 to avoid 0. Computer.shared.turnOn(workersCount: (serversCount / 3).round() + 1); - sync.sync(); + bakSync.sync(); } // It may contains some async heavy funcs. diff --git a/lib/view/page/backup.dart b/lib/view/page/backup.dart index b6ae3f47..3ee858bb 100644 --- a/lib/view/page/backup.dart +++ b/lib/view/page/backup.dart @@ -104,7 +104,7 @@ class BackupPage extends StatelessWidget { callback: (val) async { if (val) { icloudLoading.value = true; - await sync.sync(rs: icloud); + await bakSync.sync(rs: icloud); icloudLoading.value = false; } }, @@ -147,7 +147,7 @@ class BackupPage extends StatelessWidget { callback: (val) async { if (val) { webdavLoading.value = true; - await sync.sync(rs: webdav); + await bakSync.sync(rs: webdav); webdavLoading.value = false; } }, diff --git a/lib/view/page/home/appbar.dart b/lib/view/page/home/appbar.dart index f1da3877..389846fe 100644 --- a/lib/view/page/home/appbar.dart +++ b/lib/view/page/home/appbar.dart @@ -15,7 +15,7 @@ final class _AppBar extends CustomAppBar { @override Widget build(BuildContext context) { final placeholder = SizedBox( - height: CustomAppBar.barHeight ?? 0 + MediaQuery.of(context).padding.top, + height: CustomAppBar.sysStatusBarHeight ?? 0 + MediaQuery.of(context).padding.top, ); return selectIndex.listenVal( (idx) { diff --git a/lib/view/page/ssh/page.dart b/lib/view/page/ssh/page.dart index 88b18e25..c3e81c9b 100644 --- a/lib/view/page/ssh/page.dart +++ b/lib/view/page/ssh/page.dart @@ -137,7 +137,7 @@ class SSHPageState extends State _media.padding.top, child: Padding( padding: EdgeInsets.only( - top: widget.notFromTab ? CustomAppBar.barHeight ?? 0 : 0, + top: widget.notFromTab ? CustomAppBar.sysStatusBarHeight ?? 0 : 0, left: _horizonPadding, right: _horizonPadding, ), @@ -155,7 +155,7 @@ class SSHPageState extends State showToolbar: isMobile, viewOffset: Offset( 2 * _horizonPadding, - CustomAppBar.barHeight ?? _media.padding.top, + CustomAppBar.sysStatusBarHeight ?? _media.padding.top, ), hideScrollBar: false, focusNode: widget.focusNode, diff --git a/pubspec.lock b/pubspec.lock index ecde61ce..d39b6d68 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -470,8 +470,8 @@ packages: dependency: "direct main" description: path: "." - ref: "v1.0.150" - resolved-ref: "53c92f43fff4cf643fc03e186a22268b64085e86" + ref: "v1.0.167" + resolved-ref: "655787d3766c3795c8185e261c15fae620f0e7f6" url: "https://github.com/lppcg/fl_lib" source: git version: "0.0.1" @@ -575,14 +575,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" - functions_client: - dependency: transitive - description: - name: functions_client - sha256: e63f49cd3b41727f47b3bde284a11a4ac62839e0604f64077d4257487510e484 - url: "https://pub.dev" - source: hosted - version: "2.3.2" glob: dependency: transitive description: @@ -591,14 +583,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" - gotrue: - dependency: transitive - description: - name: gotrue - sha256: "8703db795511f69194fe77125a0c838bbb6befc2f95717b6e40331784a8bdecb" - url: "https://pub.dev" - source: hosted - version: "2.8.4" graphs: dependency: transitive description: @@ -751,14 +735,6 @@ packages: url: "https://pub.dev" source: hosted version: "6.8.0" - jwt_decode: - dependency: transitive - description: - name: jwt_decode - sha256: d2e9f68c052b2225130977429d30f187aa1981d789c76ad104a32243cfdebfbb - url: "https://pub.dev" - source: hosted - version: "0.3.1" leak_tracker: dependency: transitive description: @@ -899,10 +875,10 @@ packages: dependency: transitive description: name: mime - sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.6" nested: dependency: transitive description: @@ -1056,14 +1032,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" - postgrest: - dependency: transitive - description: - name: postgrest - sha256: c4197238601c7c3103b03a4bb77f2050b17d0064bf8b968309421abdebbb7f0e - url: "https://pub.dev" - source: hosted - version: "2.1.4" pretty_qr_code: dependency: transitive description: @@ -1120,30 +1088,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.1" - realtime_client: - dependency: transitive - description: - name: realtime_client - sha256: d897a65ee3b1b5ddc1cf606f0b83792262d38fd5679c2df7e38da29c977513da - url: "https://pub.dev" - source: hosted - version: "2.2.1" - retry: - dependency: transitive - description: - name: retry - sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc" - url: "https://pub.dev" - source: hosted - version: "3.1.2" - rxdart: - dependency: transitive - description: - name: rxdart - sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" - url: "https://pub.dev" - source: hosted - version: "0.28.0" screen_retriever: dependency: transitive description: @@ -1293,14 +1237,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.11.1" - storage_client: - dependency: transitive - description: - name: storage_client - sha256: "28c147c805304dbc2b762becd1fc26ee0cb621ace3732b9ae61ef979aab8b367" - url: "https://pub.dev" - source: hosted - version: "2.0.3" stream_channel: dependency: transitive description: @@ -1325,22 +1261,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - supabase: - dependency: transitive - description: - name: supabase - sha256: "4ed1cf3298f39865c05b2d8557f92eb131a9b9af70e32e218672a0afce01a6bc" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - supabase_flutter: - dependency: transitive - description: - name: supabase_flutter - sha256: ff6ba3048fd47d831fdc0027d3efb99346d99b95becfcb406562454bd9b229c5 - url: "https://pub.dev" - source: hosted - version: "2.6.0" term_glyph: dependency: transitive description: @@ -1664,14 +1584,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" - yet_another_json_isolate: - dependency: transitive - description: - name: yet_another_json_isolate - sha256: "47ed3900e6b0e4dfe378811a4402e85b7fc126a7daa94f840fef65ea9c8e46f4" - url: "https://pub.dev" - source: hosted - version: "2.0.2" zmodem: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5719e0a6..d730e105 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -59,7 +59,7 @@ dependencies: fl_lib: git: url: https://github.com/lppcg/fl_lib - ref: v1.0.150 + ref: v1.0.167 dependency_overrides: # dartssh2: