Commit ff094e41 authored by Ilham Maulana's avatar Ilham Maulana 💻

feat: main screen for admin only

parent 53a5db26
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:library_app/src/providers/book_provider.dart';
import 'package:library_app/src/screens/form_screen.dart';
import 'package:provider/provider.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:library_app/src/screens/admin_list_screen.dart';
import 'package:provider/provider.dart';
import 'package:library_app/src/providers/auth_provider.dart'; import 'package:library_app/src/providers/auth_provider.dart';
import 'package:library_app/src/providers/navigations_provider.dart'; import 'package:library_app/src/providers/navigations_provider.dart';
import 'package:library_app/src/providers/book_provider.dart';
import 'package:library_app/src/screens/form_screen.dart';
import 'package:library_app/src/screens/list_screen.dart'; import 'package:library_app/src/screens/list_screen.dart';
void main() { void main() {
runApp(const LibraryApp()); runApp(const LibraryApp());
} }
class LibraryApp extends StatelessWidget { class LibraryApp extends StatefulWidget {
const LibraryApp({super.key}); const LibraryApp({super.key});
@override
State<LibraryApp> createState() => _LibraryApp();
}
class _LibraryApp extends State<LibraryApp> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
const title = 'Library App'; const title = 'Library App';
...@@ -36,9 +44,16 @@ class LibraryApp extends StatelessWidget { ...@@ -36,9 +44,16 @@ class LibraryApp extends StatelessWidget {
), ),
home: Consumer<AuthProvider>( home: Consumer<AuthProvider>(
builder: (context, authProvider, child) { builder: (context, authProvider, child) {
return authProvider.isLoggedIn final user = authProvider.user;
? const ListScreen() final isAuthenticated = authProvider.isAuthenticated;
: const LoginScreen();
if (user != null && user.isStaff) {
return isAuthenticated
? const AdminListScreen()
: const AdminLoginScreen();
}
return isAuthenticated ? const ListScreen() : const LoginScreen();
}, },
), ),
scrollBehavior: AdaptiveScrollBehavior(), scrollBehavior: AdaptiveScrollBehavior(),
......
...@@ -12,7 +12,7 @@ class AuthProvider with ChangeNotifier { ...@@ -12,7 +12,7 @@ class AuthProvider with ChangeNotifier {
String baseUrl = 'http://localhost:8000/api/v1'; String baseUrl = 'http://localhost:8000/api/v1';
User? user; User? user;
bool isLoggedIn = false; bool isAuthenticated = false;
bool invalidUsernameOrPassword = false; bool invalidUsernameOrPassword = false;
List<dynamic>? memberLoans; List<dynamic>? memberLoans;
...@@ -31,6 +31,15 @@ class AuthProvider with ChangeNotifier { ...@@ -31,6 +31,15 @@ class AuthProvider with ChangeNotifier {
return await storage.read(key: 'access_token'); return await storage.read(key: 'access_token');
} }
Future<void> validateToken() async {
String? token = await getAccessToken();
bool isValid = token != null;
if (isValid) {
isAuthenticated = true;
}
}
Future<void> signIn(String username, String password) async { Future<void> signIn(String username, String password) async {
try { try {
final response = await http.post( final response = await http.post(
...@@ -45,7 +54,7 @@ class AuthProvider with ChangeNotifier { ...@@ -45,7 +54,7 @@ class AuthProvider with ChangeNotifier {
final token = await getAccessToken(); final token = await getAccessToken();
if (token != null) { if (token != null) {
isLoggedIn = true; validateToken();
} }
debugPrint("Login successful $token"); debugPrint("Login successful $token");
...@@ -78,7 +87,7 @@ class AuthProvider with ChangeNotifier { ...@@ -78,7 +87,7 @@ class AuthProvider with ChangeNotifier {
final token = await getAccessToken(); final token = await getAccessToken();
if (token != null) { if (token != null) {
isLoggedIn = true; validateToken();
} }
debugPrint("Login successful $token"); debugPrint("Login successful $token");
...@@ -111,7 +120,8 @@ class AuthProvider with ChangeNotifier { ...@@ -111,7 +120,8 @@ class AuthProvider with ChangeNotifier {
if (response.statusCode == 200) { if (response.statusCode == 200) {
await storage.delete(key: 'token'); await storage.delete(key: 'token');
isLoggedIn = false; isAuthenticated = false;
user = null;
} else { } else {
debugPrint("Logout failed: ${response.statusCode} ${response.body}"); debugPrint("Logout failed: ${response.statusCode} ${response.body}");
} }
...@@ -141,7 +151,7 @@ class AuthProvider with ChangeNotifier { ...@@ -141,7 +151,7 @@ class AuthProvider with ChangeNotifier {
final token = await getAccessToken(); final token = await getAccessToken();
if (token != null) { if (token != null) {
isLoggedIn = true; validateToken();
} }
debugPrint(response.body); debugPrint(response.body);
......
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:library_app/src/providers/auth_provider.dart';
import 'package:library_app/src/providers/book_provider.dart';
import 'package:library_app/src/providers/navigations_provider.dart';
import 'package:library_app/src/widgets/home.dart';
import 'package:library_app/src/widgets/loans/loan_list.dart';
import 'package:library_app/src/widgets/profile.dart';
class AdminListScreen extends StatefulWidget {
const AdminListScreen({super.key});
@override
State<AdminListScreen> createState() => _AdminListScreen();
}
class _AdminListScreen extends State<AdminListScreen> {
@override
void initState() {
super.initState();
Provider.of<BookProvider>(context, listen: false).getCategories();
}
@override
Widget build(BuildContext context) {
return Consumer2<NavigationsProvider, AuthProvider>(
builder: (context, navProvider, authProvider, child) {
return Scaffold(
bottomNavigationBar: NavigationBar(
onDestinationSelected: (int index) {
navProvider.navigate(index);
},
selectedIndex: navProvider.currentPageIndex,
destinations: const <Widget>[
NavigationDestination(
icon: Icon(Icons.home_outlined),
label: 'Home',
tooltip: 'Home Page',
),
NavigationDestination(
icon: Icon(Icons.timer_outlined),
label: 'Upcoming',
tooltip: 'Book List',
),
NavigationDestination(
icon: Icon(Icons.timer_off_rounded),
label: 'Overdued',
tooltip: 'Loan List',
),
NavigationDestination(
icon: Icon(Icons.person_2_sharp),
label: 'Profile',
tooltip: 'Profile',
),
],
),
body: <Widget>[
// Home
const HomePage(),
// Books
LoanList(
memberId: authProvider.user?.accountId ?? 0,
),
// Loans
LoanList(
memberId: authProvider.user?.accountId ?? 0,
),
// Profile
const Profile(),
][navProvider.currentPageIndex],
);
},
);
}
}
...@@ -27,8 +27,8 @@ class _HomePage extends State<HomePage> { ...@@ -27,8 +27,8 @@ class _HomePage extends State<HomePage> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
const title = "Home"; const title = "Home";
return Consumer<NavigationsProvider>( return Consumer2<NavigationsProvider, AuthProvider>(
builder: (context, navProvider, child) { builder: (context, navProvider, authProvider, child) {
return NestedScrollView( return NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return [ return [
...@@ -42,17 +42,29 @@ class _HomePage extends State<HomePage> { ...@@ -42,17 +42,29 @@ class _HomePage extends State<HomePage> {
child: Text("Shortcut"), child: Text("Shortcut"),
), ),
Shortcut( Shortcut(
icon: Icons.book_rounded, icon: authProvider.user!.isStaff
title: "Books", ? Icons.timer_outlined
subtitle: "Discover many amazing books.", : Icons.book_rounded,
title: authProvider.user!.isStaff
? "Near Outstanding Loans"
: "Books",
subtitle: authProvider.user!.isStaff
? "Discover near outstanding users loans."
: "Discover many amazing books.",
onTap: () { onTap: () {
navProvider.navigate(1); navProvider.navigate(1);
}, },
), ),
Shortcut( Shortcut(
icon: Icons.date_range_rounded, icon: authProvider.user!.isStaff
title: "Book Loans", ? Icons.timer_off_rounded
subtitle: "Manage your book loan very easy.", : Icons.date_range_rounded,
title: authProvider.user!.isStaff
? "Overdued Loans"
: "Book Loans",
subtitle: authProvider.user!.isStaff
? "Discover Overdued users loans."
: "Manage your book loan very easy.",
onTap: () { onTap: () {
navProvider.navigate(2); navProvider.navigate(2);
}, },
......
...@@ -54,7 +54,7 @@ class _LoanList extends State<LoanList> { ...@@ -54,7 +54,7 @@ class _LoanList extends State<LoanList> {
return [const TopAppBar(title: "Book Loans")]; return [const TopAppBar(title: "Book Loans")];
}, },
body: const Center( body: const Center(
child: CircularProgressIndicator(), child: Text("the loan is currently empty"),
), ),
); );
} }
......
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