71 lines
2.5 KiB
Dart
71 lines
2.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:miaoji_zhang/shared/api/api_client.dart';
|
|
import 'package:miaoji_zhang/shared/services/guest_merge_service.dart';
|
|
import 'package:miaoji_zhang/shared/services/session_store.dart';
|
|
import 'package:miaoji_zhang/shared/widgets/app_controls.dart';
|
|
|
|
Future<void> offerLocalDataRecovery(
|
|
BuildContext context, {
|
|
Map<String, dynamic>? guestSnapshot,
|
|
}) async {
|
|
final session = SessionStore.instance;
|
|
Map<String, dynamic>? accountSnapshot;
|
|
try {
|
|
accountSnapshot = await session.pendingAccountSnapshot();
|
|
} catch (error) {
|
|
if (context.mounted) {
|
|
_showMessage(context, '本机历史数据读取失败:${apiErrorMessage(error)}');
|
|
}
|
|
}
|
|
if (accountSnapshot != null && context.mounted) {
|
|
final shouldMerge = await showJzConfirmSheet(
|
|
context,
|
|
title: '发现本机历史数据',
|
|
message:
|
|
'检测到旧账号或旧后端留下的本地账单。为防止不同服务器的数据互相覆盖,这些数据已单独保留。是否导入当前账号的“本机历史数据”账本?',
|
|
confirmLabel: '导入数据',
|
|
);
|
|
if (shouldMerge) {
|
|
try {
|
|
final result = await GuestMergeService.merge(
|
|
accountSnapshot,
|
|
ledgerName: '本机历史数据',
|
|
);
|
|
await session.clearPendingAccountSnapshot();
|
|
if (context.mounted) {
|
|
_showMessage(context, '已导入 ${result.transactionCount} 笔本机历史账单');
|
|
}
|
|
} catch (error) {
|
|
if (context.mounted) {
|
|
_showMessage(context, '本机历史数据暂未导入:${apiErrorMessage(error)}');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (guestSnapshot?['hasData'] == true && context.mounted) {
|
|
final shouldMerge = await showJzConfirmSheet(
|
|
context,
|
|
title: '发现游客数据',
|
|
message: '是否将本机游客账单、分类和预算导入当前账号?数据会放入独立的“游客数据”账本,原游客数据仍保留在本机。',
|
|
confirmLabel: '导入数据',
|
|
);
|
|
if (shouldMerge) {
|
|
try {
|
|
final result = await GuestMergeService.merge(guestSnapshot!);
|
|
if (context.mounted) {
|
|
_showMessage(context, '已导入 ${result.transactionCount} 笔游客账单');
|
|
}
|
|
} catch (error) {
|
|
if (context.mounted) {
|
|
_showMessage(context, '游客数据暂未导入:${apiErrorMessage(error)}');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void _showMessage(BuildContext context, String message) {
|
|
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(message)));
|
|
}
|