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/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/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';
void main() {
runApp(const LibraryApp());
}
class LibraryApp extends StatelessWidget {
class LibraryApp extends StatefulWidget {
const LibraryApp({super.key});
@override
State<LibraryApp> createState() => _LibraryApp();
}
class _LibraryApp extends State<LibraryApp> {
@override
Widget build(BuildContext context) {
const title = 'Library App';
......@@ -36,9 +44,16 @@ class LibraryApp extends StatelessWidget {
),
home: Consumer<AuthProvider>(
builder: (context, authProvider, child) {
return authProvider.isLoggedIn
? const ListScreen()
: const LoginScreen();
final user = authProvider.user;
final isAuthenticated = authProvider.isAuthenticated;
if (user != null && user.isStaff) {
return isAuthenticated
? const AdminListScreen()
: const AdminLoginScreen();
}
return isAuthenticated ? const ListScreen() : const LoginScreen();
},
),
scrollBehavior: AdaptiveScrollBehavior(),
......
......@@ -12,7 +12,7 @@ class AuthProvider with ChangeNotifier {
String baseUrl = 'http://localhost:8000/api/v1';
User? user;
bool isLoggedIn = false;
bool isAuthenticated = false;
bool invalidUsernameOrPassword = false;
List<dynamic>? memberLoans;
......@@ -31,6 +31,15 @@ class AuthProvider with ChangeNotifier {
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 {
try {
final response = await http.post(
......@@ -45,7 +54,7 @@ class AuthProvider with ChangeNotifier {
final token = await getAccessToken();
if (token != null) {
isLoggedIn = true;
validateToken();
}
debugPrint("Login successful $token");
......@@ -78,7 +87,7 @@ class AuthProvider with ChangeNotifier {
final token = await getAccessToken();
if (token != null) {
isLoggedIn = true;
validateToken();
}
debugPrint("Login successful $token");
......@@ -111,7 +120,8 @@ class AuthProvider with ChangeNotifier {
if (response.statusCode == 200) {
await storage.delete(key: 'token');
isLoggedIn = false;
isAuthenticated = false;
user = null;
} else {
debugPrint("Logout failed: ${response.statusCode} ${response.body}");
}
......@@ -141,7 +151,7 @@ class AuthProvider with ChangeNotifier {
final token = await getAccessToken();
if (token != null) {
isLoggedIn = true;
validateToken();
}
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> {
Widget build(BuildContext context) {
const title = "Home";
return Consumer<NavigationsProvider>(
builder: (context, navProvider, child) {
return Consumer2<NavigationsProvider, AuthProvider>(
builder: (context, navProvider, authProvider, child) {
return NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return [
......@@ -42,17 +42,29 @@ class _HomePage extends State<HomePage> {
child: Text("Shortcut"),
),
Shortcut(
icon: Icons.book_rounded,
title: "Books",
subtitle: "Discover many amazing books.",
icon: authProvider.user!.isStaff
? Icons.timer_outlined
: 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: () {
navProvider.navigate(1);
},
),
Shortcut(
icon: Icons.date_range_rounded,
title: "Book Loans",
subtitle: "Manage your book loan very easy.",
icon: authProvider.user!.isStaff
? Icons.timer_off_rounded
: 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: () {
navProvider.navigate(2);
},
......
......@@ -54,7 +54,7 @@ class _LoanList extends State<LoanList> {
return [const TopAppBar(title: "Book Loans")];
},
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