new: manual icloud sync

This commit is contained in:
lollipopkit
2023-09-12 14:02:31 +08:00
parent 700322c603
commit 9ce7138d9b
5 changed files with 28 additions and 19 deletions

View File

@@ -7,6 +7,7 @@ import 'package:logging/logging.dart';
import '../../data/model/app/error.dart'; import '../../data/model/app/error.dart';
import '../../data/model/app/json.dart'; import '../../data/model/app/json.dart';
import '../../data/res/path.dart'; import '../../data/res/path.dart';
import 'platform.dart';
final _logger = Logger('iCloud'); final _logger = Logger('iCloud');
@@ -173,3 +174,14 @@ class ICloud {
} }
} }
} }
Future<void> syncApple() async {
if (!isIOS && !isMacOS) return;
final docPath = await docDir;
final dir = Directory(docPath);
final files = await dir.list().toList();
// filter out non-hive(db) files
files.removeWhere((e) => !e.path.endsWith('.hive'));
final paths = files.map((e) => e.path.replaceFirst('$docPath/', ''));
await ICloud.sync(relativePaths: paths);
}

View File

@@ -56,6 +56,7 @@ const participants = <GhId>{
'yuchen1204', 'yuchen1204',
'xgzxmytx', 'xgzxmytx',
'wind057', 'wind057',
'a1564471347',
}; };
const jsonEncoder = JsonEncoder.withIndent(' '); const jsonEncoder = JsonEncoder.withIndent(' ');

View File

@@ -1,5 +1,4 @@
const backendUrl = 'https://res.lolli.tech'; const baseResUrl = 'https://res.lolli.tech/serverbox';
const baseResUrl = '$backendUrl/serverbox';
const myGithub = 'https://github.com/lollipopkit'; const myGithub = 'https://github.com/lollipopkit';
const appHelpUrl = '$myGithub/flutter_server_box#-help'; const appHelpUrl = '$myGithub/flutter_server_box#-help';
const appWikiUrl = '$myGithub/flutter_server_box/wiki'; const appWikiUrl = '$myGithub/flutter_server_box/wiki';

View File

@@ -1,5 +1,4 @@
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
@@ -28,7 +27,6 @@ import 'data/provider/snippet.dart';
import 'data/provider/virtual_keyboard.dart'; import 'data/provider/virtual_keyboard.dart';
import 'data/res/color.dart'; import 'data/res/color.dart';
import 'data/res/misc.dart'; import 'data/res/misc.dart';
import 'data/res/path.dart';
import 'data/store/setting.dart'; import 'data/store/setting.dart';
import 'locator.dart'; import 'locator.dart';
import 'view/widget/custom_appbar.dart'; import 'view/widget/custom_appbar.dart';
@@ -96,7 +94,8 @@ Future<void> initApp() async {
loadFontFile(settings.fontPath.fetch()); loadFontFile(settings.fontPath.fetch());
primaryColor = Color(settings.primaryColor.fetch()); primaryColor = Color(settings.primaryColor.fetch());
if (settings.icloudSync.fetch()) _syncApple(); // Don't call it via `await`, it will block the main thread.
if (settings.icloudSync.fetch()) syncApple();
if (isAndroid) { if (isAndroid) {
// Only start service when [bgRun] is true. // Only start service when [bgRun] is true.
@@ -149,15 +148,3 @@ Future<void> _initMacOSWindow() async {
WindowManipulator.hideTitle(); WindowManipulator.hideTitle();
await CustomAppBar.updateTitlebarHeight(); await CustomAppBar.updateTitlebarHeight();
} }
// Don't call it via `await`, it will block the main thread.
void _syncApple() async {
if (!isIOS && !isMacOS) return;
final docPath = await docDir;
final dir = Directory(docPath);
final files = await dir.list().toList();
// filter out non-hive(db) files
files.removeWhere((e) => !e.path.endsWith('.hive'));
final paths = files.map((e) => e.path.replaceFirst('$docPath/', ''));
await ICloud.sync(relativePaths: paths);
}

View File

@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:toolbox/core/extension/context.dart'; import 'package:toolbox/core/extension/context.dart';
import 'package:toolbox/core/utils/backup.dart'; import 'package:toolbox/core/utils/backup.dart';
import 'package:toolbox/core/utils/icloud.dart';
import 'package:toolbox/core/utils/platform.dart'; import 'package:toolbox/core/utils/platform.dart';
import 'package:toolbox/view/widget/round_rect_card.dart'; import 'package:toolbox/view/widget/round_rect_card.dart';
@@ -36,7 +37,7 @@ class BackupPage extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
if (isMacOS || isIOS) _buildIcloudSync(context), if (isMacOS || isIOS) _buildIcloudSync(context, s),
height13, height13,
Padding( Padding(
padding: const EdgeInsets.all(37), padding: const EdgeInsets.all(37),
@@ -93,7 +94,7 @@ class BackupPage extends StatelessWidget {
); );
} }
Widget _buildIcloudSync(BuildContext context) { Widget _buildIcloudSync(BuildContext context, S s) {
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
@@ -102,6 +103,15 @@ class BackupPage extends StatelessWidget {
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
width13, width13,
IconButton(
onPressed: () async {
showLoadingDialog(context);
await syncApple();
context.pop();
showRestartSnackbar(context, btn: s.restart, msg: s.icloudSynced);
},
icon: const Icon(Icons.sync)),
width13,
buildSwitch(context, _setting.icloudSync) buildSwitch(context, _setting.icloudSync)
], ],
); );