-
-
Notifications
You must be signed in to change notification settings - Fork 47
/
main_tab_page.dart
153 lines (135 loc) · 4.79 KB
/
main_tab_page.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:rate_my_app/rate_my_app.dart';
import 'package:responsive_builder/responsive_builder.dart';
import 'package:shiori/application/bloc.dart';
import 'package:shiori/domain/enums/enums.dart';
import 'package:shiori/generated/l10n.dart';
import 'package:shiori/presentation/desktop_tablet_scaffold.dart';
import 'package:shiori/presentation/mobile_scaffold.dart';
import 'package:shiori/presentation/shared/dialogs/changelog_dialog.dart';
import 'package:shiori/presentation/shared/utils/toast_utils.dart';
class MainTabPage extends StatefulWidget {
final bool showChangelog;
final AppResourceUpdateResultType? updateResult;
const MainTabPage({
super.key,
required this.showChangelog,
this.updateResult,
});
@override
_MainTabPageState createState() => _MainTabPageState();
}
class _MainTabPageState extends State<MainTabPage> with SingleTickerProviderStateMixin {
bool _didChangeDependencies = false;
late TabController _tabController;
final _defaultIndex = 2;
DateTime? backButtonPressTime;
@override
void initState() {
_tabController = TabController(
initialIndex: _defaultIndex,
length: 5,
vsync: this,
);
super.initState();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
if (_didChangeDependencies) return;
_didChangeDependencies = true;
context.read<HomeBloc>().add(const HomeEvent.init());
context.read<CharactersBloc>().add(const CharactersEvent.init(force: true));
context.read<WeaponsBloc>().add(const WeaponsEvent.init(force: true));
context.read<ArtifactsBloc>().add(const ArtifactsEvent.init(force: true));
context.read<SettingsBloc>().add(const SettingsEvent.init());
if (widget.showChangelog) {
WidgetsBinding.instance.addPostFrameCallback((_) {
showDialog(context: context, builder: (ctx) => const ChangelogDialog());
});
}
if (widget.updateResult != null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
final toast = ToastUtils.of(context);
final s = S.of(context);
switch (widget.updateResult) {
case AppResourceUpdateResultType.unknownError:
ToastUtils.showErrorToast(toast, s.unknownErrorWhileUpdating);
break;
case AppResourceUpdateResultType.needsLatestAppVersion:
ToastUtils.showInfoToast(toast, s.newAppVersionInStore);
break;
case AppResourceUpdateResultType.updated:
ToastUtils.showSucceedToast(toast, s.resourceUpdateCompleted);
break;
case AppResourceUpdateResultType.updatesAvailable:
case AppResourceUpdateResultType.noUpdatesAvailable:
case AppResourceUpdateResultType.noInternetConnectionForFirstInstall:
default:
break;
}
});
}
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final child = WillPopScope(
onWillPop: () => handleWillPop(),
child: ResponsiveBuilder(
builder: (ctx, size) => size.isDesktop || size.isTablet
? DesktopTabletScaffold(defaultIndex: _defaultIndex, tabController: _tabController)
: MobileScaffold(defaultIndex: _defaultIndex, tabController: _tabController),
),
);
//TODO: RATE THE APP ON WINDOWS
if (Platform.isWindows || Platform.isMacOS || Platform.isLinux) {
return child;
}
return RateMyAppBuilder(
rateMyApp: RateMyApp(minDays: 7, minLaunches: 10, remindDays: 7, remindLaunches: 10),
onInitialized: (ctx, rateMyApp) {
if (!rateMyApp.shouldOpenDialog) {
return;
}
final s = S.of(ctx);
rateMyApp.showRateDialog(
ctx,
title: s.rateThisApp,
message: s.rateMsg,
rateButton: s.rate,
laterButton: s.maybeLater,
noButton: s.noThanks,
);
},
builder: (ctx) => child,
);
}
void _gotoTab(int newIndex) => context.read<MainTabBloc>().add(MainTabEvent.goToTab(index: newIndex));
Future<bool> handleWillPop() async {
if (_tabController.index != _defaultIndex) {
_gotoTab(_defaultIndex);
return false;
}
final settings = context.read<SettingsBloc>();
if (!settings.doubleBackToClose()) {
return true;
}
final s = S.of(context);
final now = DateTime.now();
final mustWait = backButtonPressTime == null || now.difference(backButtonPressTime!) > ToastUtils.toastDuration;
if (mustWait) {
backButtonPressTime = now;
final fToast = ToastUtils.of(context);
ToastUtils.showInfoToast(fToast, s.pressOnceAgainToExit);
return false;
}
return true;
}
}