Skip to content

Commit

Permalink
feat(home): Delete legacy v0 data
Browse files Browse the repository at this point in the history
  • Loading branch information
realth000 committed Aug 10, 2024
1 parent 361a1ea commit 0fafa26
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 59 deletions.
37 changes: 37 additions & 0 deletions lib/features/home/cubit/init_cubit.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import 'dart:io';

import 'package:bloc/bloc.dart';
import 'package:dart_mappable/dart_mappable.dart';
import 'package:path_provider/path_provider.dart';

part '../../../generated/features/home/cubit/init_cubit.mapper.dart';
part 'init_state.dart';

/// Cubit to do some initializing work during app start.
final class InitCubit extends Cubit<InitState> {
/// Constructor.
InitCubit() : super(const InitState());

/// Delete legacy data used in version v0.x.
Future<void> deleteV0LegacyData() async {
final v0IsarDb =
File('${(await getApplicationSupportDirectory()).path}/db/main.isar');
if (!v0IsarDb.existsSync()) {
return;
}
await v0IsarDb.delete();

final v0IsarDbLock = File('${v0IsarDb.path}-lck');
if (v0IsarDbLock.existsSync()) {
await v0IsarDbLock.delete();
}

final v0ImageCacheDir =
Directory('${(await getApplicationCacheDirectory()).path}/images');
if (v0ImageCacheDir.existsSync()) {
await v0ImageCacheDir.list(recursive: true).forEach((e) => e.delete());
}

emit(state.copyWith(v0LegacyDataDeleted: true));
}
}
18 changes: 18 additions & 0 deletions lib/features/home/cubit/init_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
part of 'init_cubit.dart';

/// Empty state placeholder.
@MappableClass()
final class InitState with InitStateMappable {
/// Constructor.
const InitState({
this.v0LegacyDataDeleted = false,
});

/// Flag indicating legacy data used before v1.0 found and deleted.
///
/// Those data are not usable because we migrated our storage database from
/// isar to drift in version 1.0.
///
/// So delete those data and also image cache.
final bool v0LegacyDataDeleted;
}
140 changes: 81 additions & 59 deletions lib/features/home/view/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ import 'package:go_router/go_router.dart';
import 'package:responsive_framework/responsive_framework.dart';
import 'package:tsdm_client/constants/layout.dart';
import 'package:tsdm_client/features/home/cubit/home_cubit.dart';
import 'package:tsdm_client/features/home/cubit/init_cubit.dart';
import 'package:tsdm_client/features/home/widgets/widgets.dart';
import 'package:tsdm_client/features/settings/repositories/settings_repository.dart';
import 'package:tsdm_client/generated/i18n/strings.g.dart';
import 'package:tsdm_client/instance.dart';
import 'package:tsdm_client/shared/repositories/forum_home_repository/forum_home_repository.dart';
import 'package:tsdm_client/utils/show_dialog.dart';
import 'package:tsdm_client/utils/show_toast.dart';

const _drawerWidth = 250.0;
Expand Down Expand Up @@ -92,71 +94,91 @@ class _HomePageState extends State<HomePage> {
),
);

Widget _buildContent(BuildContext context) {
final Widget child;
if (ResponsiveBreakpoints.of(context)
.largerThan(WindowSize.expanded.name)) {
child = _buildDrawerBody(context);
} else if (ResponsiveBreakpoints.of(context)
.largerThan(WindowSize.compact.name)) {
child = Scaffold(
body: Row(
children: [
if (widget.showNavigationBar) const HomeNavigationRail(),
Expanded(child: widget.child),
],
),
);
} else {
child = Scaffold(
body: widget.child,
bottomNavigationBar:
widget.showNavigationBar ? const HomeNavigationBar() : null,
);
}

return RepositoryProvider.value(
value: widget._forumHomeRepository,
child: BackButtonListener(
onBackButtonPressed: () async {
final doublePressExit =
getIt.get<SettingsRepository>().currentSettings.doublePressExit;
if (!doublePressExit) {
// Do NOT handle pop events on double press check is disabled.
return false;
}
if (!context.mounted) {
return false;
}

if (context.canPop()) {
// Do NOT handle pop events on other pages.
return false;
}
final tr = context.t.home;
final currentTime = DateTime.now();
if (lastPopTime == null ||
currentTime.difference(lastPopTime!).inMilliseconds >
exitConfirmDuration.inMilliseconds) {
lastPopTime = currentTime;
ScaffoldMessenger.of(context).hideCurrentSnackBar();
showSnackBar(context: context, message: tr.confirmExit);
return true;
}
return false;
},
child: child,
),
);
}

@override
Widget build(BuildContext context) {
Translations.of(context);
return BlocProvider(
create: (_) => HomeCubit(),
child: Builder(
builder: (context) {
final Widget child;
if (ResponsiveBreakpoints.of(context)
.largerThan(WindowSize.expanded.name)) {
child = _buildDrawerBody(context);
} else if (ResponsiveBreakpoints.of(context)
.largerThan(WindowSize.compact.name)) {
child = Scaffold(
body: Row(
children: [
if (widget.showNavigationBar) const HomeNavigationRail(),
Expanded(child: widget.child),
],
),
);
} else {
child = Scaffold(
body: widget.child,
bottomNavigationBar:
widget.showNavigationBar ? const HomeNavigationBar() : null,
);
return MultiBlocProvider(
providers: [
BlocProvider(
create: (_) => HomeCubit(),
),
BlocProvider(
create: (context) => InitCubit()..deleteV0LegacyData(),
),
],
child: BlocListener<InitCubit, InitState>(
listenWhen: (prev, curr) =>
prev.v0LegacyDataDeleted != curr.v0LegacyDataDeleted,
listener: (context, state) {
if (state.v0LegacyDataDeleted != true) {
return;
}

return RepositoryProvider.value(
value: widget._forumHomeRepository,
child: BackButtonListener(
onBackButtonPressed: () async {
final doublePressExit = getIt
.get<SettingsRepository>()
.currentSettings
.doublePressExit;
if (!doublePressExit) {
// Do NOT handle pop events on double press check is disabled.
return false;
}
if (!context.mounted) {
return false;
}

if (context.canPop()) {
// Do NOT handle pop events on other pages.
return false;
}
final tr = context.t.home;
final currentTime = DateTime.now();
if (lastPopTime == null ||
currentTime.difference(lastPopTime!).inMilliseconds >
exitConfirmDuration.inMilliseconds) {
lastPopTime = currentTime;
ScaffoldMessenger.of(context).hideCurrentSnackBar();
showSnackBar(context: context, message: tr.confirmExit);
return true;
}
return false;
},
child: child,
),
final tr = context.t.init.v1DeleteLegacyData;
showMessageSingleButtonDialog(
context: context,
title: tr.title,
message: tr.detail,
);
},
child: _buildContent(context),
),
);
}
Expand Down
6 changes: 6 additions & 0 deletions lib/i18n/strings.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -558,5 +558,11 @@
"copyImageUrl": "Copy image url",
"reloadImage": "ReloadImage",
"openLink": "Open link"
},
"init": {
"v1DeleteLegacyData": {
"title": "Legacy data deleted",
"detail": "Seems this app have just upgraded from version older than 1.0, user login data and preferences are deleted because they are not usable any more.\nYou may need to login and set preferences once more. Sorry for inconvenience."
}
}
}
6 changes: 6 additions & 0 deletions lib/i18n/strings_zh-CN.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -558,5 +558,11 @@
"copyImageUrl": "复制图片链接",
"reloadImage": "重新加载图片",
"openLink": "打开链接"
},
"init": {
"v1DeleteLegacyData": {
"title": "旧数据已清除",
"detail": "此应用似乎刚从低于1.0的版本升级上来,用户登录数据和设置偏好已不可使用,现已清除。\n您可能需要再登录一次并重新设置偏好,抱歉给您带来不便。"
}
}
}
6 changes: 6 additions & 0 deletions lib/i18n/strings_zh-TW.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -558,5 +558,11 @@
"copyImageUrl": "複製圖片連結",
"reloadImage": "重新載入圖片",
"openLink": "開啟連結"
},
"init": {
"v1DeleteLegacyData": {
"title": "舊資料已清除",
"detail": "此應用程式似乎剛從低於1.0的版本升級上來,使用者登入資料和設定偏好已不可用,現已清除。\n您可能需要再登入一次並重新設定偏好,抱歉給您帶來不便。"
}
}
}

0 comments on commit 0fafa26

Please sign in to comment.