From 80eabdd65ff9bd18c446924e94267c9b6769ec50 Mon Sep 17 00:00:00 2001 From: sindhu Date: Fri, 28 Feb 2025 12:23:52 +0700 Subject: [PATCH] step 26 : fix navigasi ganda di no_login_screen, dan start dari login screen --- lib/main.dart | 2 +- .../no-login/no_login_auth_repository.dart | 6 +- .../no_login_splash_screen.dart | 64 +++++------ lib/screen/no-login/no_login_provider.dart | 100 +----------------- lib/screen/no-login/no_login_screen.dart | 61 ++++++++++- 5 files changed, 97 insertions(+), 136 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index ee618d0..56b7be2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -31,7 +31,7 @@ class MyApp extends StatelessWidget { }, ), debugShowCheckedModeBanner: false, - initialRoute: noLoginSplashRoute, + initialRoute: noLoginRoute, onGenerateRoute: AppRoute.generateRoute, ); } diff --git a/lib/repository/no-login/no_login_auth_repository.dart b/lib/repository/no-login/no_login_auth_repository.dart index a33a889..367b0d6 100644 --- a/lib/repository/no-login/no_login_auth_repository.dart +++ b/lib/repository/no-login/no_login_auth_repository.dart @@ -11,7 +11,11 @@ class NoLoginAuthRepository extends BaseRepository { required String host, required String password, }) async { - final param = {"client_id": client_id, "password": password, "host":host}; + final param = { + "client_id": client_id, + "password": password, + "host": host, + }; final service = "http://$host/one-api/scan-ktpv2-no-login/Scanktpv2/loginF"; final resp = await post(param: param, service: service); diff --git a/lib/screen/no-login-splash/no_login_splash_screen.dart b/lib/screen/no-login-splash/no_login_splash_screen.dart index fa90a69..da68ef9 100644 --- a/lib/screen/no-login-splash/no_login_splash_screen.dart +++ b/lib/screen/no-login-splash/no_login_splash_screen.dart @@ -21,43 +21,43 @@ class NoLoginSplashScreen extends HookConsumerWidget { SystemUiOverlay.bottom, ]); - useEffect(() { - WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { - final shared = await SharedPreferences.getInstance(); - final bearerString = shared.getString(Constant.bearerName); + // useEffect(() { + // WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + // final shared = await SharedPreferences.getInstance(); + // final bearerString = shared.getString(Constant.bearerName); - if (bearerString == null || bearerString == "null") { - Timer(const Duration(seconds: 3), () { - Navigator.of(context).pushNamedAndRemoveUntil( - noLoginRoute, - (route) => false, - ); - }); - return; - } + // if (bearerString == null || bearerString == "null") { + // Timer(const Duration(seconds: 3), () { + // Navigator.of(context).pushNamedAndRemoveUntil( + // noLoginRoute, + // (route) => false, + // ); + // }); + // return; + // } - final xmodel = jsonDecode(bearerString); - if (xmodel == null) return; + // final xmodel = jsonDecode(bearerString); + // if (xmodel == null) return; - final authModel = NoLoginAuthModel( - host: xmodel["host"], - token: xmodel["token"], - client_id: xmodel['client_id'], - expire_date: xmodel['expire_date'], - isLogin: xmodel['isLogin'], - ); + // final authModel = NoLoginAuthModel( + // host: xmodel["host"], + // token: xmodel["token"], + // client_id: xmodel['client_id'], + // expire_date: xmodel['expire_date'], + // isLogin: xmodel['isLogin'], + // ); - ref.read(noLoginCurrentUserProvider.notifier).state = authModel; + // ref.read(noLoginCurrentUserProvider.notifier).state = authModel; - Timer(const Duration(seconds: 2), () { - Navigator.of(context).pushNamedAndRemoveUntil( - noLoginHomeRoute, - (route) => false, - ); - }); - }); - return () {}; - }, []); + // Timer(const Duration(seconds: 2), () { + // Navigator.of(context).pushNamedAndRemoveUntil( + // noLoginHomeRoute, + // (route) => false, + // ); + // }); + // }); + // return () {}; + // }, []); return Scaffold( backgroundColor: Constant.textWhite, diff --git a/lib/screen/no-login/no_login_provider.dart b/lib/screen/no-login/no_login_provider.dart index 598c31c..0ab0f13 100644 --- a/lib/screen/no-login/no_login_provider.dart +++ b/lib/screen/no-login/no_login_provider.dart @@ -8,104 +8,6 @@ import '../../app/constant.dart'; import '../../provider/no-login/no_login_current_user_provider.dart'; import '../../repository/no-login/no_login_auth_repository.dart'; import '../../provider/dio_provider.dart'; -import '../../repository/base_repository.dart'; - -// // 3. state provider -// final noLoginProvider = StateNotifierProvider( -// (ref) => NoLoginNotifier(ref: ref)); - -// // 2. notifier -// class NoLoginNotifier extends StateNotifier { -// final Ref ref; -// NoLoginNotifier({required this.ref}) : super(NoLoginStateInit()); -// void prosesLoginF({ -// required String client_id, -// required String host, -// required String password, -// }) async { -// try { -// state = NoLoginStateLoading(); -// final resp = await NoLoginAuthRepository( -// dio: ref.read(dioProvider), -// ).loginF( -// client_id: client_id, -// host: host, -// password: password, -// ); - -// // print(resp); -// state = NoLoginStateDone(model: resp); - -// final shared = await SharedPreferences.getInstance(); -// String expireDateStr = resp.expire_date; -// if (!expireDateStr.contains("T")) { -// expireDateStr = expireDateStr.replaceFirst(" ", "T"); -// } - -// final token = jsonEncode({ -// "host": host, -// "date": DateTime.now().toString(), -// "token": resp.token, -// "client_id": resp.client_id, -// // "expire_date": resp.expire_date, -// "expire_date": expireDateStr, -// "isLogin": resp.isLogin, -// }); -// await shared.setString(Constant.bearerName, token); -// ref.read(noLoginCurrentUserProvider.notifier).state = resp; -// } catch (e) { -// if (e is BaseRepositoryException) { -// state = NoLoginStateError(message: e.message); -// } else { -// state = NoLoginStateError(message: e.toString()); -// } -// } -// } -// } - -// // 1. state -// abstract class NoLoginState extends Equatable { -// final DateTime date; -// const NoLoginState(this.date); -// @override -// List get props => [date]; -// } - -// class NoLoginStateInit extends NoLoginState { -// NoLoginStateInit() : super(DateTime.now()); -// } - -// class NoLoginStateLoading extends NoLoginState { -// NoLoginStateLoading() : super(DateTime.now()); -// } - -// class NoLoginStateError extends NoLoginState { -// final String message; -// NoLoginStateError({ -// required this.message, -// }) : super(DateTime.now()); -// } - -// class NoLoginStateDone extends NoLoginState { -// // final String pesan; -// final NoLoginAuthModel model; -// NoLoginStateDone({ -// required this.model, -// }) : super(DateTime.now()); -// } - -// new -import 'dart:convert'; - -import 'package:equatable/equatable.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:scanktpflutter/model/no-login/no_login_auth_model.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import '../../app/constant.dart'; -import '../../provider/no-login/no_login_current_user_provider.dart'; -import '../../repository/no-login/no_login_auth_repository.dart'; -import '../../provider/dio_provider.dart'; -import '../../repository/base_repository.dart'; // 3. state provider final noLoginProvider = StateNotifierProvider( @@ -138,7 +40,7 @@ class NoLoginNotifier extends StateNotifier { // Simpan token dalam format JSON final token = jsonEncode({ "expire_date": resp.expire_date, - "host": host, + "host": resp.host, "date": DateTime.now().toIso8601String(), "token": resp.token, "client_id": resp.client_id, diff --git a/lib/screen/no-login/no_login_screen.dart b/lib/screen/no-login/no_login_screen.dart index 08b65e6..d84c19f 100644 --- a/lib/screen/no-login/no_login_screen.dart +++ b/lib/screen/no-login/no_login_screen.dart @@ -1,10 +1,16 @@ +import 'dart:async'; +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import '../../app/route.dart'; import '../../app/constant.dart'; +import '../../model/no-login/no_login_auth_model.dart'; +import '../../provider/no-login/no_login_current_user_provider.dart'; import '../../widget/customsnackbarwidget.dart'; import 'no_login_provider.dart'; @@ -31,6 +37,46 @@ class NoLoginScreen extends HookConsumerWidget { final isLoading = useState(false); final isSuccess = useState(false); + final hasNavigated = useState(false); + + useEffect(() { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + final shared = await SharedPreferences.getInstance(); + final bearerString = shared.getString(Constant.bearerName); + + if (bearerString == null || bearerString.isEmpty) return; + + final xmodel = jsonDecode(bearerString); + if (xmodel == null) return; + + final authModel = NoLoginAuthModel( + host: xmodel["host"], + token: xmodel["token"], + client_id: xmodel['client_id'], + expire_date: xmodel['expire_date'], + isLogin: xmodel['isLogin'], + ); + + ref.read(noLoginCurrentUserProvider.notifier).state = authModel; + + if (!hasNavigated.value) { + hasNavigated.value = true; + Timer(const Duration(seconds: 2), () { + Navigator.of(context).pushNamedAndRemoveUntil( + noLoginHomeRoute, + (route) => false, + ); + }); + } + // Timer(const Duration(seconds: 2), () { + // Navigator.of(context).pushNamedAndRemoveUntil( + // noLoginHomeRoute, + // (route) => false, + // ); + // }); + }); + return () {}; + }, []); // loginF ref.listen(noLoginProvider, (prev, next) { @@ -38,7 +84,10 @@ class NoLoginScreen extends HookConsumerWidget { isLoading.value = true; } else if (next is NoLoginStateError) { isLoading.value = false; - // errorMessage.value = next.message; + final errorMessage = next.message.isNotEmpty + ? next.message + : "Terjadi kesalahan, silakan coba lagi."; + print('ERROR: $errorMessage'); snackbarWidget( context, next.message, @@ -48,8 +97,14 @@ class NoLoginScreen extends HookConsumerWidget { } else if (next is NoLoginStateDone) { isLoading.value = false; isSuccess.value = true; - Navigator.of(context) - .pushNamedAndRemoveUntil(noLoginHomeRoute, (route) => false); + + if (!hasNavigated.value) { + hasNavigated.value = true; + Navigator.of(context) + .pushNamedAndRemoveUntil(noLoginHomeRoute, (route) => false); + } + // Navigator.of(context) + // .pushNamedAndRemoveUntil(noLoginHomeRoute, (route) => false); } });