@@ -4,20 +4,24 @@ import 'package:sentry_flutter/sentry_flutter.dart';
44import 'package:vikunja_app/core/di/network_provider.dart' ;
55import 'package:vikunja_app/core/di/repository_provider.dart' ;
66import 'package:vikunja_app/core/network/response.dart' ;
7+ import 'package:vikunja_app/core/utils/constants.dart' ;
78import 'package:vikunja_app/domain/entities/auth_model.dart' ;
89import 'package:vikunja_app/domain/entities/server.dart' ;
10+ import 'package:vikunja_app/domain/entities/user.dart' ;
11+ import 'package:vikunja_app/domain/entities/version.dart' ;
12+ import 'package:vikunja_app/l10n/gen/app_localizations.dart' ;
913import 'package:vikunja_app/main.dart' ;
1014import 'package:vikunja_app/presentation/pages/error_widget.dart' ;
1115import 'package:vikunja_app/presentation/pages/loading_widget.dart' ;
12- import 'package:vikunja_app/l10n/gen/app_localizations .dart' ;
16+ import 'package:vikunja_app/presentation/widgets/version_mismatch_dialog .dart' ;
1317
1418class InitPage extends ConsumerWidget {
1519 const InitPage ({super .key});
1620
1721 @override
1822 Widget build (BuildContext context, WidgetRef ref) {
1923 return FutureBuilder (
20- future: checkLogin (ref),
24+ future: checkLoginToken (ref),
2125 builder: (context, asyncSnapshot) {
2226 if (asyncSnapshot.connectionState == ConnectionState .done &&
2327 asyncSnapshot.data != null ) {
@@ -31,57 +35,90 @@ class InitPage extends ConsumerWidget {
3135 );
3236 }
3337
34- Future <Object ?> checkLogin (WidgetRef ref) async {
38+ Future <Object ?> checkLoginToken (WidgetRef ref) async {
3539 var server = await ref.read (settingsRepositoryProvider).getServer ();
3640 var token = await ref.read (settingsRepositoryProvider).getUserToken ();
3741
3842 if (server != null && token != null ) {
39- ref.read (authDataProvider.notifier).set (AuthModel (server, token));
40-
41- Response <Server > info = await ref
42- .read (serverRepositoryProvider)
43- .getInfo ();
44- if (info.isSuccessful) {
45- Sentry .configureScope (
46- (scope) => scope.setTag (
47- 'server.version' ,
48- info.toSuccess ().body.version ?? "-" ,
49- ),
50- );
51- }
52-
53- var userResponse = await ref
54- .read (userRepositoryProvider)
55- .getCurrentUser ();
56- if (userResponse.isSuccessful) {
57- ref
58- .read (currentUserProvider.notifier)
59- .set (userResponse.toSuccess ().body);
60-
61- globalNavigatorKey.currentState? .pushReplacementNamed ("/home" );
62- } else if (userResponse.isError) {
63- if (userResponse.toError ().statusCode == 401 ) {
64- ref.read (settingsRepositoryProvider).saveUserToken (null );
65-
66- ScaffoldMessenger .of (ref.context).showSnackBar (
67- SnackBar (
68- content: Text (
69- AppLocalizations .of (ref.context).loginExpiredMessage,
70- ),
71- ),
72- );
43+ return checkServer (ref, server, token);
44+ }
7345
74- globalNavigatorKey.currentState? .pushReplacementNamed ("/login" );
75- } else {
76- return userResponse.toError ().error["message" ];
77- }
78- } else {
79- return userResponse.toException ().exception;
80- }
46+ globalNavigatorKey.currentState? .pushReplacementNamed ("/login" );
47+ return null ;
48+ }
49+
50+ Future <Object ?> checkServer (
51+ WidgetRef ref,
52+ String server,
53+ String token,
54+ ) async {
55+ ref.read (authDataProvider.notifier).set (AuthModel (server, token));
56+
57+ Version ? serverVersion;
58+
59+ Response <Server > info = await ref.read (serverRepositoryProvider).getInfo ();
60+ if (info.isSuccessful) {
61+ Sentry .configureScope (
62+ (scope) => scope.setTag (
63+ 'server.version' ,
64+ info.toSuccess ().body.version ?? "-" ,
65+ ),
66+ );
67+
68+ serverVersion = Version .fromServerString (
69+ info.toSuccess ().body.version ?? "-" ,
70+ );
71+ }
72+
73+ return checkUser (ref, serverVersion);
74+ }
75+
76+ Future <Object ?> checkUser (WidgetRef ref, Version ? serverVersion) async {
77+ var userResponse = await ref.read (userRepositoryProvider).getCurrentUser ();
78+ if (userResponse.isSuccessful) {
79+ ref.read (currentUserProvider.notifier).set (userResponse.toSuccess ().body);
80+
81+ onLoginSuccess (ref, serverVersion);
82+ } else if (userResponse.isError) {
83+ onLoginError (ref, userResponse.toError ());
8184 } else {
82- globalNavigatorKey.currentState ? . pushReplacementNamed ( "/login" ) ;
85+ return userResponse. toException ().exception ;
8386 }
8487
8588 return null ;
8689 }
90+
91+ Future <void > onLoginSuccess (WidgetRef ref, Version ? serverVersion) async {
92+ if (serverVersion != null && serverVersion != supportedServerVersion) {
93+ await showDialog <void >(
94+ context: ref.context,
95+ barrierDismissible: false ,
96+ builder: (BuildContext context) {
97+ return VersionMismatchDialog (serverVersion: serverVersion);
98+ },
99+ );
100+ }
101+
102+ globalNavigatorKey.currentState? .pushReplacementNamed ("/home" );
103+ }
104+
105+ Future <Object ?> onLoginError (
106+ WidgetRef ref,
107+ ErrorResponse <User > userResponse,
108+ ) async {
109+ if (userResponse.statusCode == 401 ) {
110+ ref.read (settingsRepositoryProvider).saveUserToken (null );
111+
112+ ScaffoldMessenger .of (ref.context).showSnackBar (
113+ SnackBar (
114+ content: Text (AppLocalizations .of (ref.context).loginExpiredMessage),
115+ ),
116+ );
117+
118+ globalNavigatorKey.currentState? .pushReplacementNamed ("/login" );
119+ return null ;
120+ }
121+
122+ return userResponse.error["message" ];
123+ }
87124}
0 commit comments