Commit 116aba53 authored by Ilham Maulana's avatar Ilham Maulana 💻

fix: common bug

parent ca074a22
...@@ -19,10 +19,10 @@ class AuthProvider with ChangeNotifier { ...@@ -19,10 +19,10 @@ class AuthProvider with ChangeNotifier {
bool filterByUpcoming = false; bool filterByUpcoming = false;
bool filterByOverdued = false; bool filterByOverdued = false;
int? userIdResetPw;
bool isLoading = false; bool isLoading = false;
bool resetPasswordTokenSended = false; bool resetPasswordTokenSended = false;
bool resetPasswordSucced = false; bool resetPasswordSucced = false;
bool loanBookSuccess = false;
List<dynamic>? loans; List<dynamic>? loans;
List<dynamic>? nearOutstandingLoans; List<dynamic>? nearOutstandingLoans;
...@@ -38,6 +38,7 @@ class AuthProvider with ChangeNotifier { ...@@ -38,6 +38,7 @@ class AuthProvider with ChangeNotifier {
void setLoading(bool value) { void setLoading(bool value) {
isLoading = value; isLoading = value;
notifyListeners();
} }
Future<void> signIn(String username, String password) async { Future<void> signIn(String username, String password) async {
...@@ -66,7 +67,7 @@ class AuthProvider with ChangeNotifier { ...@@ -66,7 +67,7 @@ class AuthProvider with ChangeNotifier {
debugPrint("Login failed $code"); debugPrint("Login failed $code");
} }
setLoading(false); setLoading(true);
notifyListeners(); notifyListeners();
} catch (error) { } catch (error) {
debugPrint("Login failed $error"); debugPrint("Login failed $error");
...@@ -90,6 +91,17 @@ class AuthProvider with ChangeNotifier { ...@@ -90,6 +91,17 @@ class AuthProvider with ChangeNotifier {
await storage.delete(key: 'token'); await storage.delete(key: 'token');
isAuthenticated = false; isAuthenticated = false;
user = null; user = null;
filterByUpcoming = false;
filterByOverdued = false;
memberLoans = null;
isLoading = false;
resetPasswordTokenSended = false;
resetPasswordSucced = false;
loans = null;
nearOutstandingLoans = null;
overduedLoans = null;
} else { } else {
debugPrint("Logout failed: ${response.statusCode} ${response.body}"); debugPrint("Logout failed: ${response.statusCode} ${response.body}");
} }
...@@ -102,9 +114,8 @@ class AuthProvider with ChangeNotifier { ...@@ -102,9 +114,8 @@ class AuthProvider with ChangeNotifier {
} }
Future<void> signUp(String username, String email, String password) async { Future<void> signUp(String username, String email, String password) async {
isLoading = true;
try { try {
setLoading(true);
final body = { final body = {
"username": username, "username": username,
"email": email, "email": email,
...@@ -128,7 +139,7 @@ class AuthProvider with ChangeNotifier { ...@@ -128,7 +139,7 @@ class AuthProvider with ChangeNotifier {
"Error: sign up failed, ${response.statusCode}: ${response.body}"); "Error: sign up failed, ${response.statusCode}: ${response.body}");
} }
isLoading = false; setLoading(false);
notifyListeners(); notifyListeners();
} catch (error) { } catch (error) {
debugPrint("Error: sign up failed, $error"); debugPrint("Error: sign up failed, $error");
...@@ -136,11 +147,11 @@ class AuthProvider with ChangeNotifier { ...@@ -136,11 +147,11 @@ class AuthProvider with ChangeNotifier {
} }
Future<void> getUserDetail() async { Future<void> getUserDetail() async {
isLoading = true;
final token = await getAccessToken(); final token = await getAccessToken();
if (token != null) { if (token != null) {
try { try {
setLoading(true);
final response = await http.get( final response = await http.get(
Uri.parse('$baseUrl/user'), Uri.parse('$baseUrl/user'),
headers: { headers: {
...@@ -156,7 +167,7 @@ class AuthProvider with ChangeNotifier { ...@@ -156,7 +167,7 @@ class AuthProvider with ChangeNotifier {
debugPrint('Error fetching user details: ${response.statusCode}'); debugPrint('Error fetching user details: ${response.statusCode}');
} }
isLoading = true; setLoading(false);
notifyListeners(); notifyListeners();
} catch (error) { } catch (error) {
debugPrint('Error user details: $error'); debugPrint('Error user details: $error');
...@@ -172,7 +183,7 @@ class AuthProvider with ChangeNotifier { ...@@ -172,7 +183,7 @@ class AuthProvider with ChangeNotifier {
String? lastName, String? lastName,
bool isStaff, bool isStaff,
) async { ) async {
isLoading = true; setLoading(true);
final token = await getAccessToken(); final token = await getAccessToken();
if (token != null) { if (token != null) {
...@@ -200,7 +211,7 @@ class AuthProvider with ChangeNotifier { ...@@ -200,7 +211,7 @@ class AuthProvider with ChangeNotifier {
'Error update user details: ${response.statusCode}, ${response.body}'); 'Error update user details: ${response.statusCode}, ${response.body}');
} }
isLoading = false; setLoading(false);
notifyListeners(); notifyListeners();
} catch (error) { } catch (error) {
debugPrint("Error update user details: $error"); debugPrint("Error update user details: $error");
...@@ -209,9 +220,8 @@ class AuthProvider with ChangeNotifier { ...@@ -209,9 +220,8 @@ class AuthProvider with ChangeNotifier {
} }
Future<void> resetPassword(String email) async { Future<void> resetPassword(String email) async {
isLoading = true;
try { try {
setLoading(true);
final response = await http.post( final response = await http.post(
Uri.parse('$baseUrl/reset-password/request-token'), Uri.parse('$baseUrl/reset-password/request-token'),
body: jsonEncode({"email": email}), body: jsonEncode({"email": email}),
...@@ -219,15 +229,13 @@ class AuthProvider with ChangeNotifier { ...@@ -219,15 +229,13 @@ class AuthProvider with ChangeNotifier {
); );
if (response.statusCode == 200) { if (response.statusCode == 200) {
final data = jsonDecode(response.body);
resetPasswordTokenSended = true; resetPasswordTokenSended = true;
userIdResetPw = data["user_id_reset_pw"];
} else { } else {
debugPrint( debugPrint(
'Error reset user password: ${response.statusCode}, ${response.body}'); 'Error reset user password: ${response.statusCode}, ${response.body}');
} }
isLoading = false; setLoading(false);
notifyListeners(); notifyListeners();
} catch (error) { } catch (error) {
debugPrint("Error reset user password: $error"); debugPrint("Error reset user password: $error");
...@@ -236,7 +244,7 @@ class AuthProvider with ChangeNotifier { ...@@ -236,7 +244,7 @@ class AuthProvider with ChangeNotifier {
Future<void> confirmResetPassword( Future<void> confirmResetPassword(
int pin, String password1, String password2) async { int pin, String password1, String password2) async {
isLoading = true; setLoading(true);
final body = jsonEncode({ final body = jsonEncode({
"pin": pin, "pin": pin,
"password1": password1, "password1": password1,
...@@ -257,7 +265,7 @@ class AuthProvider with ChangeNotifier { ...@@ -257,7 +265,7 @@ class AuthProvider with ChangeNotifier {
'Error confirm reset user password: ${response.statusCode}, ${response.body}'); 'Error confirm reset user password: ${response.statusCode}, ${response.body}');
} }
isLoading = false; setLoading(false);
notifyListeners(); notifyListeners();
} catch (error) { } catch (error) {
debugPrint("Error confirm reset user password: $error"); debugPrint("Error confirm reset user password: $error");
...@@ -265,7 +273,7 @@ class AuthProvider with ChangeNotifier { ...@@ -265,7 +273,7 @@ class AuthProvider with ChangeNotifier {
} }
Future<void> getMemberLoan() async { Future<void> getMemberLoan() async {
isLoading = true; setLoading(true);
final token = await getAccessToken(); final token = await getAccessToken();
String url = '$baseUrl/members/${user?.accountId}/loans/'; String url = '$baseUrl/members/${user?.accountId}/loans/';
...@@ -294,7 +302,7 @@ class AuthProvider with ChangeNotifier { ...@@ -294,7 +302,7 @@ class AuthProvider with ChangeNotifier {
"Failed to get member loan. ${response.statusCode}: ${response.body}"); "Failed to get member loan. ${response.statusCode}: ${response.body}");
} }
isLoading = false; setLoading(false);
notifyListeners(); notifyListeners();
} catch (error) { } catch (error) {
debugPrint("Failed to get member loan. $error"); debugPrint("Failed to get member loan. $error");
...@@ -302,21 +310,20 @@ class AuthProvider with ChangeNotifier { ...@@ -302,21 +310,20 @@ class AuthProvider with ChangeNotifier {
} }
void setFilterUpcoming() { void setFilterUpcoming() {
isLoading = true; setLoading(true);
filterByUpcoming = !filterByUpcoming; filterByUpcoming = !filterByUpcoming;
isLoading = false; setLoading(false);
notifyListeners(); notifyListeners();
} }
void setFilterOverdued() { void setFilterOverdued() {
isLoading = true; setLoading(true);
filterByOverdued = !filterByOverdued; filterByOverdued = !filterByOverdued;
setLoading(false);
notifyListeners(); notifyListeners();
isLoading = false;
} }
Future<void> createMemberLoan(int memberId, int bookId, int loanDay) async { Future<void> createMemberLoan(int memberId, int bookId, int loanDay) async {
isLoading = true;
final token = await getAccessToken(); final token = await getAccessToken();
final now = DateTime.now(); final now = DateTime.now();
...@@ -329,6 +336,7 @@ class AuthProvider with ChangeNotifier { ...@@ -329,6 +336,7 @@ class AuthProvider with ChangeNotifier {
}; };
try { try {
setLoading(true);
final response = await http.post( final response = await http.post(
Uri.parse('$baseUrl/members/$memberId/loans/'), Uri.parse('$baseUrl/members/$memberId/loans/'),
body: jsonEncode(body), body: jsonEncode(body),
...@@ -346,7 +354,8 @@ class AuthProvider with ChangeNotifier { ...@@ -346,7 +354,8 @@ class AuthProvider with ChangeNotifier {
"Failed to create member loan. ${response.statusCode}: ${response.body}"); "Failed to create member loan. ${response.statusCode}: ${response.body}");
} }
isLoading = false; loanBookSuccess = true;
setLoading(false);
notifyListeners(); notifyListeners();
} catch (error) { } catch (error) {
debugPrint("Failed to create member loan. $error"); debugPrint("Failed to create member loan. $error");
...@@ -355,7 +364,6 @@ class AuthProvider with ChangeNotifier { ...@@ -355,7 +364,6 @@ class AuthProvider with ChangeNotifier {
// for admin or librarian // for admin or librarian
Future<void> getLoans(String? type) async { Future<void> getLoans(String? type) async {
isLoading = true;
final token = await storage.read(key: 'access_token'); final token = await storage.read(key: 'access_token');
String url = baseUrl; String url = baseUrl;
if (type == "upcoming") { if (type == "upcoming") {
...@@ -368,6 +376,7 @@ class AuthProvider with ChangeNotifier { ...@@ -368,6 +376,7 @@ class AuthProvider with ChangeNotifier {
if (token != null) { if (token != null) {
try { try {
setLoading(true);
final response = await http.get( final response = await http.get(
Uri.parse(url), Uri.parse(url),
headers: { headers: {
...@@ -390,7 +399,7 @@ class AuthProvider with ChangeNotifier { ...@@ -390,7 +399,7 @@ class AuthProvider with ChangeNotifier {
debugPrint("Error: Fetch upcoming loans failed, $code"); debugPrint("Error: Fetch upcoming loans failed, $code");
} }
isLoading = false; setLoading(false);
notifyListeners(); notifyListeners();
} catch (error) { } catch (error) {
debugPrint("Error: Fetch upcoming loans failed, $error"); debugPrint("Error: Fetch upcoming loans failed, $error");
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:library_app/src/providers/auth_provider.dart'; import 'package:library_app/src/providers/auth_provider.dart';
import 'package:library_app/src/screens/list/list_screen.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class LoanBookForm extends StatefulWidget { class LoanBookForm extends StatefulWidget {
...@@ -24,6 +25,20 @@ class _LoanBookForm extends State<LoanBookForm> { ...@@ -24,6 +25,20 @@ class _LoanBookForm extends State<LoanBookForm> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<AuthProvider>(builder: (context, authProvider, child) { return Consumer<AuthProvider>(builder: (context, authProvider, child) {
if (authProvider.loanBookSuccess) {
return AlertDialog(
title: const Text(
'Loan book succed!',
style: TextStyle(fontSize: 20.0),
),
content: FilledButton(
onPressed: () {
Navigator.of(context).pop();
},
child: const Text('Continue'),
),
);
}
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
child: FilledButton( child: FilledButton(
......
...@@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; ...@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:library_app/src/providers/auth_provider.dart'; import 'package:library_app/src/providers/auth_provider.dart';
import 'package:library_app/src/screens/form_screen.dart'; import 'package:library_app/src/screens/form_screen.dart';
import 'package:library_app/src/widgets/loading.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class ResetPasswordForm extends StatefulWidget { class ResetPasswordForm extends StatefulWidget {
...@@ -101,7 +102,9 @@ class _ResetPasswordForm extends State<ResetPasswordForm> { ...@@ -101,7 +102,9 @@ class _ResetPasswordForm extends State<ResetPasswordForm> {
}, },
); );
}, },
child: const Text("Submit"), child: authProvider.isLoading
? const Loading()
: const Text("Submit"),
), ),
), ),
], ],
...@@ -139,6 +142,12 @@ class _ConfirmResetPasswordForm extends State<ConfirmResetPasswordForm> { ...@@ -139,6 +142,12 @@ class _ConfirmResetPasswordForm extends State<ConfirmResetPasswordForm> {
const String formText = "Enter the pin that we just sent to your email"; const String formText = "Enter the pin that we just sent to your email";
return Consumer<AuthProvider>(builder: (context, authProvider, child) { return Consumer<AuthProvider>(builder: (context, authProvider, child) {
if (authProvider.isLoading) {
return const Center(
child: CircularProgressIndicator(),
);
}
return Column( return Column(
children: [ children: [
Container( Container(
......
...@@ -26,8 +26,13 @@ class _AdminLoanList extends State<AdminLoanList> { ...@@ -26,8 +26,13 @@ class _AdminLoanList extends State<AdminLoanList> {
@override @override
void initState() { void initState() {
super.initState(); Future.delayed(
Duration.zero,
() {
Provider.of<AuthProvider>(context, listen: false).getLoans(type); Provider.of<AuthProvider>(context, listen: false).getLoans(type);
},
);
super.initState();
} }
@override @override
......
...@@ -17,8 +17,13 @@ class LoanList extends StatefulWidget { ...@@ -17,8 +17,13 @@ class LoanList extends StatefulWidget {
class _LoanList extends State<LoanList> { class _LoanList extends State<LoanList> {
@override @override
void initState() { void initState() {
super.initState(); Future.delayed(
Duration.zero,
() {
Provider.of<AuthProvider>(context, listen: false).getMemberLoan(); Provider.of<AuthProvider>(context, listen: false).getMemberLoan();
},
);
super.initState();
} }
@override @override
......
...@@ -18,7 +18,11 @@ class _Profile extends State<Profile> { ...@@ -18,7 +18,11 @@ class _Profile extends State<Profile> {
super.initState(); super.initState();
Future.delayed( Future.delayed(
Duration.zero, Duration.zero,
() => Provider.of<AuthProvider>(context, listen: false).getUserDetail(), () {
if (Provider.of<AuthProvider>(context, listen: false).user == null) {
Provider.of<AuthProvider>(context, listen: false).getUserDetail();
}
},
); );
} }
...@@ -26,13 +30,16 @@ class _Profile extends State<Profile> { ...@@ -26,13 +30,16 @@ class _Profile extends State<Profile> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<AuthProvider>( return Consumer<AuthProvider>(
builder: (context, authProvider, child) { builder: (context, authProvider, child) {
final isLoading = authProvider.isLoading;
final user = authProvider.user; final user = authProvider.user;
final firstName = user?.firstName ?? ""; final firstName = user?.firstName ?? "";
final lastName = user?.lastName ?? ""; final lastName = user?.lastName ?? "";
final fullName = "$firstName $lastName"; final fullName = "$firstName $lastName";
if (user == null) { if (user == null) {
return const Center(child: CircularProgressIndicator()); return const Center(child: Text("Failed to fetch user data"));
} else if (isLoading) {
return const Center(child: CircularProgressIndicator.adaptive());
} else { } else {
return NestedScrollView( return NestedScrollView(
headerSliverBuilder: headerSliverBuilder:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment