diff --git a/app_petty_cash/images/logo_sismedika_landscape.png b/app_petty_cash/images/logo_sismedika_landscape.png new file mode 100644 index 0000000..d814aee Binary files /dev/null and b/app_petty_cash/images/logo_sismedika_landscape.png differ diff --git a/app_petty_cash/lib/main.dart b/app_petty_cash/lib/main.dart index 2000ead..2b48963 100644 --- a/app_petty_cash/lib/main.dart +++ b/app_petty_cash/lib/main.dart @@ -40,8 +40,8 @@ class MyApp extends StatelessWidget { }, ), debugShowCheckedModeBanner: false, - initialRoute: loginRoute, - // initialRoute: splashScreen, + // initialRoute: loginRoute, + initialRoute: splashScreen, // initialRoute: transaksiRoute, // initialRoute: reportRoute, // initialRoute: testFilePickerRoute, diff --git a/app_petty_cash/lib/screen/login/login_screen.dart b/app_petty_cash/lib/screen/login/login_screen.dart index 7c8f448..c204b85 100644 --- a/app_petty_cash/lib/screen/login/login_screen.dart +++ b/app_petty_cash/lib/screen/login/login_screen.dart @@ -55,22 +55,22 @@ class LoginScreen extends HookConsumerWidget { onTap: () => FocusManager.instance.primaryFocus?.unfocus(), child: Scaffold( resizeToAvoidBottomInset: true, - backgroundColor: Constant.backgroundColor, + // backgroundColor: Colors.transparent, body: SafeArea( child: Center( child: Container( width: Constant.getActualXPhone(context: context, x: 390), height: Constant.getActualYPhone(context: context, y: 844), - decoration: BoxDecoration( - gradient: LinearGradient( - colors: [ - Color(0xffdadae6), - Color(0xfff6f7fb), - ], - begin: Alignment.centerLeft, - end: Alignment.centerRight, - ), - ), + // decoration: BoxDecoration( + // gradient: LinearGradient( + // colors: [ + // Color(0xffdadae6), + // Color(0xfff6f7fb), + // ], + // begin: Alignment.centerLeft, + // end: Alignment.centerRight, + // ), + // ), // child: BlockBodyV2(), child: LoginFormScreen(), ), diff --git a/app_petty_cash/lib/widget/custom_drawer.dart b/app_petty_cash/lib/widget/custom_drawer.dart index d1e2ae6..c2bf587 100644 --- a/app_petty_cash/lib/widget/custom_drawer.dart +++ b/app_petty_cash/lib/widget/custom_drawer.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -12,9 +13,11 @@ import '../provider/current_user_provider.dart'; import '../screen/login/logout_provider.dart'; class CustomDrawer extends HookConsumerWidget { + // final String userCompany; const CustomDrawer({ - super.key, - }); + Key? key, + // required this.userCompany, + }) : super(key: key); @override Widget build(BuildContext context, WidgetRef ref) { @@ -22,6 +25,26 @@ class CustomDrawer extends HookConsumerWidget { final isLoading = useState(false); final errorMessage = useState(""); final successMessage = useState(""); + final M_CompanyName = useState("-"); + + Future getCompanyName() async { + final shared = await SharedPreferences.getInstance(); + String M_CompanyName = "-"; + + if (shared != null) { + final bearerString = shared.get(Constant.bearerName).toString(); + final xmodel = jsonDecode(bearerString); + if (xmodel != null) { + M_CompanyName = xmodel["model"]["M_CompanyName"]; + } + } + + if (M_CompanyName == "0") { + // throw BaseRepositoryException(message: 'Invalid Company ID'); + } + + return M_CompanyName; + } useEffect(() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { @@ -34,6 +57,7 @@ class CustomDrawer extends HookConsumerWidget { // Navigator.popAndPushNamed(context, loginRoute); return; } + M_CompanyName.value = await getCompanyName(); }); return () {}; }, []); @@ -56,7 +80,6 @@ class CustomDrawer extends HookConsumerWidget { shared.remove(bearerString); shared.clear(); // Navigator.popAndPushNamed(context, loginRoute); - Navigator.of(context) .pushNamedAndRemoveUntil(loginRoute, (route) => false); } @@ -69,152 +92,236 @@ class CustomDrawer extends HookConsumerWidget { final currentMenu = ref.read(currentPageProvider); return Drawer( - child: ListView( - // padding: EdgeInsets.only( - // top: Constant.getActualYPhone(context: context, y: 10), - // ), - children: [ - DrawerHeader( - decoration: BoxDecoration( - color: Colors.blue, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(0))), + child: Container( + child: ListView( + // padding: EdgeInsets.only( + // top: Constant.getActualYPhone(context: context, y: 10), + // ), + children: [ + Container( + // decoration: BoxDecoration( + // border: Border(bottom: BorderSide(color: Colors.transparent)) // <--- use the global theme to change the dividerColor property + // ), + child: Image( + image: AssetImage('images/logo_sismedika_landscape.png')), ), - child: Text( - 'Drawer Header', - style: TextStyle( - color: Colors.white, - fontSize: 24, + + SizedBox( + height: Constant.getActualYPhone(context: context, y: 8), + ), + + Padding( + padding: EdgeInsets.only( + top: Constant.getActualYPhone(context: context, y: 10), + bottom: Constant.getActualYPhone(context: context, y: 10), + right: Constant.getActualXPhone(context: context, x: 24), + left: Constant.getActualXPhone(context: context, x: 24), + ), + child: Container( + width: Constant.getActualXPhone(context: context, x: 300), ), ), - ), - ListTile( - title: Text( - 'Home', - style: TextStyle( + + // Expanded( + // child: Padding( + // padding: EdgeInsets.only( + // left: Constant.getActualXPhone(context: context, x: 24), + // right: Constant.getActualXPhone(context: context, x: 71), + // ), + // child: Container( + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(6), + // color: Constant.textGrey.withOpacity(0.16), + // ), + // child: Padding( + // padding: EdgeInsets.only( + // left: Constant.getActualXPhone(context: context, x: 8), + // right: Constant.getActualXPhone(context: context, x: 8), + // ), + // child: Text( + // M_CompanyName.value, + // style: Constant.body3(context: context).copyWith( + // fontWeight: FontWeight.w700, + // color: Constant.textGreyv2, + // backgroundColor: Constant.textGrey.withOpacity(0.16), + // ), + // ), + // ), + // ), + // ), + // ), + + Chip( + backgroundColor: Constant.textGrey.withOpacity(0.16), + label: Text( + M_CompanyName.value, + style: TextStyle( + color: Constant.textGreyv2, + ), + ), + ), + + ListTile( + leading: Icon( + Icons.home, color: (currentMenu == 0) - ? Constant.textWhite - : Constant.textBlack, + ? Constant.pcBtnBackgroundColor + : Constant.textGreyv2, ), + title: Text( + 'Home', + style: TextStyle( + color: (currentMenu == 0) + ? Constant.pcBtnBackgroundColor + : Constant.textGreyv2, + ), + ), + // tileColor: (currentMenu == 0) + // ? Constant.pcBtnBackgroundColor + // : Colors.transparent, + onTap: () { + // Handle navigation to Home screen + Navigator.pop(context); + ref.read(currentPageProvider.state).update((state) => 0); + Navigator.pushNamed(context, homeRoute); + }, ), - tileColor: (currentMenu == 0) - ? Constant.pcBtnBackgroundColor - : Colors.transparent, - onTap: () { - // Handle navigation to Home screen - Navigator.pop(context); - ref.read(currentPageProvider.state).update((state) => 0); - Navigator.pushNamed(context, homeRoute); - }, - ), - ListTile( - title: Text( - 'Transaksi', - style: TextStyle( + ListTile( + leading: Icon( + Icons.money, color: (currentMenu == 1) - ? Constant.textWhite - : Constant.textBlack, + ? Constant.pcBtnBackgroundColor + : Constant.textGreyv2, ), + title: Text( + 'Transaksi', + style: TextStyle( + color: (currentMenu == 1) + ? Constant.pcBtnBackgroundColor + : Constant.textGreyv2, + ), + ), + // tileColor: (currentMenu == 1) + // ? Constant.pcBtnBackgroundColor + // : Colors.transparent, + onTap: () { + // Handle navigation to Transaksi screen + Navigator.pop(context); + ref.read(currentPageProvider.state).update((state) => 1); + Navigator.pushNamed(context, transaksiRoute); + }, ), - tileColor: (currentMenu == 1) - ? Constant.pcBtnBackgroundColor - : Colors.transparent, - onTap: () { - // Handle navigation to Transaksi screen - Navigator.pop(context); - ref.read(currentPageProvider.state).update((state) => 1); - Navigator.pushNamed(context, transaksiRoute); - }, - ), - ListTile( - title: Text( - 'History Transaksi', - style: TextStyle( + ListTile( + leading: Icon( + Icons.history, color: (currentMenu == 2) - ? Constant.textWhite - : Constant.textBlack, + ? Constant.pcBtnBackgroundColor + : Constant.textGreyv2, ), + title: Text( + 'History Transaksi', + style: TextStyle( + color: (currentMenu == 2) + ? Constant.pcBtnBackgroundColor + : Constant.textGreyv2, + ), + ), + // tileColor: (currentMenu == 2) + // ? Constant.pcBtnBackgroundColor + // : Colors.transparent, + onTap: () { + // Handle navigation to User screen + Navigator.pop(context); + ref.read(currentPageProvider.state).update((state) => 2); + Navigator.pushNamed(context, historyTransaksiRoute); + }, ), - tileColor: (currentMenu == 2) - ? Constant.pcBtnBackgroundColor - : Colors.transparent, - onTap: () { - // Handle navigation to User screen - Navigator.pop(context); - ref.read(currentPageProvider.state).update((state) => 2); - Navigator.pushNamed(context, historyTransaksiRoute); - }, - ), - ListTile( - title: Text( - 'Report', - style: TextStyle( + ListTile( + leading: Icon( + Icons.feed, color: (currentMenu == 3) - ? Constant.textWhite - : Constant.textBlack, + ? Constant.pcBtnBackgroundColor + : Constant.textGreyv2, ), + title: Text( + 'Report', + style: TextStyle( + color: (currentMenu == 3) + ? Constant.pcBtnBackgroundColor + : Constant.textGreyv2, + ), + ), + // tileColor: (currentMenu == 3) + // ? Constant.pcBtnBackgroundColor + // : Colors.transparent, + onTap: () { + // Handle navigation to Transaksi screen + Navigator.pop(context); + ref.read(currentPageProvider.state).update((state) => 3); + Navigator.pushNamed(context, reportRoute); + }, ), - tileColor: (currentMenu == 3) - ? Constant.pcBtnBackgroundColor - : Colors.transparent, - onTap: () { - // Handle navigation to Transaksi screen - Navigator.pop(context); - ref.read(currentPageProvider.state).update((state) => 3); - Navigator.pushNamed(context, reportRoute); - }, - ), - // ListTile( - // title: Text( - // 'User', - // style: TextStyle( - // color: (currentMenu == 4) - // ? Constant.textWhite - // : Constant.textBlack, - // ), - // ), - // tileColor: (currentMenu == 4) - // ? Constant.pcBtnBackgroundColor - // : Colors.transparent, - // onTap: () { - // // Handle navigation to User screen - // Navigator.pop(context); - // ref.read(currentPageProvider.state).update((state) => 4); - // Navigator.pushNamed(context, userRoute); - // }, - // ), - // ListTile( - // title: Text( - // 'Change Company', - // style: TextStyle( - // color: (currentMenu == 5) - // ? Constant.textWhite - // : Constant.textBlack, - // ), - // ), - // tileColor: (currentMenu == 5) - // ? Constant.pcBtnBackgroundColor - // : Colors.transparent, - // onTap: () { - // // Handle navigation to User screen - // Navigator.pop(context); - // ref.read(currentPageProvider.state).update((state) => 5); - // Navigator.pushNamed(context, changeCompanyRoute); - // }, - // ), - ListTile( - title: Text( - 'Logout', - // style: TextStyle(color: Constant.textWhite), + // ListTile( + // title: Text( + // 'User', + // style: TextStyle( + // color: (currentMenu == 4) + // ? Constant.textWhite + // : Constant.textBlack, + // ), + // ), + // tileColor: (currentMenu == 4) + // ? Constant.pcBtnBackgroundColor + // : Colors.transparent, + // onTap: () { + // // Handle navigation to User screen + // Navigator.pop(context); + // ref.read(currentPageProvider.state).update((state) => 4); + // Navigator.pushNamed(context, userRoute); + // }, + // ), + // ListTile( + // title: Text( + // 'Change Company', + // style: TextStyle( + // color: (currentMenu == 5) + // ? Constant.textWhite + // : Constant.textBlack, + // ), + // ), + // tileColor: (currentMenu == 5) + // ? Constant.pcBtnBackgroundColor + // : Colors.transparent, + // onTap: () { + // // Handle navigation to User screen + // Navigator.pop(context); + // ref.read(currentPageProvider.state).update((state) => 5); + // Navigator.pushNamed(context, changeCompanyRoute); + // }, + // ), + ListTile( + leading: Icon( + Icons.logout, + color: Constant.textGreyv2, + ), + title: Text( + 'Logout', + style: TextStyle(color: Constant.textGreyv2), + ), + onTap: () { + // di set ke 0 lagi + ref.read(currentPageProvider.state).update((state) => 0); + ref.read(logoutProvider.notifier).logout( + M_UserID: selectedUser?.model.M_UserID ?? "", + M_UserUsername: selectedUser?.model.M_UserUsername ?? "", + ); + }, ), - onTap: () { - // di set ke 0 lagi - ref.read(currentPageProvider.state).update((state) => 0); - ref.read(logoutProvider.notifier).logout( - M_UserID: selectedUser?.model.M_UserID ?? "", - M_UserUsername: selectedUser?.model.M_UserUsername ?? "", - ); - }, - ), - ], + ], + ), ), ); } diff --git a/app_petty_cash/lib/widget/custom_drawer_v1.dart b/app_petty_cash/lib/widget/custom_drawer_v1.dart new file mode 100644 index 0000000..3280776 --- /dev/null +++ b/app_petty_cash/lib/widget/custom_drawer_v1.dart @@ -0,0 +1,221 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../app/constant.dart'; +import '../app/route.dart'; +import '../provider/current_menu_provider.dart'; +import '../provider/current_user_provider.dart'; +import '../screen/login/logout_provider.dart'; + +class CustomDrawerV1 extends HookConsumerWidget { + const CustomDrawerV1({ + super.key, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final selectedUser = ref.read(currentUserProvider); + final isLoading = useState(false); + final errorMessage = useState(""); + final successMessage = useState(""); + + useEffect(() { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + final userID = ref.read(currentUserProvider)?.model.M_UserID ?? "0"; + if (userID == "0") { + //not login + Navigator.of(context) + .pushNamedAndRemoveUntil(loginRoute, (route) => true); + + // Navigator.popAndPushNamed(context, loginRoute); + return; + } + }); + return () {}; + }, []); + + ref.listen(logoutProvider, (prev, next) async { + if (next is LogoutStateLoading) { + isLoading.value = true; + } else if (next is LogoutStateError) { + isLoading.value = false; + errorMessage.value = next.message; + Timer(const Duration(seconds: 3), () { + errorMessage.value = ""; + }); + } else if (next is LogoutStateDone) { + isLoading.value = false; + final shared = await SharedPreferences.getInstance(); + final bearerString = shared.get(Constant.bearerName).toString(); + // print(bearerString); + if (bearerString.isNotEmpty) { + shared.remove(bearerString); + shared.clear(); + // Navigator.popAndPushNamed(context, loginRoute); + + Navigator.of(context) + .pushNamedAndRemoveUntil(loginRoute, (route) => false); + } + Timer(const Duration(seconds: 3), () async { + successMessage.value = ""; + }); + } + }); + + final currentMenu = ref.read(currentPageProvider); + + return Drawer( + child: ListView( + // padding: EdgeInsets.only( + // top: Constant.getActualYPhone(context: context, y: 10), + // ), + children: [ + DrawerHeader( + decoration: BoxDecoration( + color: Colors.blue, + ), + child: Text( + 'Drawer Header', + style: TextStyle( + color: Colors.white, + fontSize: 24, + ), + ), + ), + ListTile( + title: Text( + 'Home', + style: TextStyle( + color: (currentMenu == 0) + ? Constant.textWhite + : Constant.textBlack, + ), + ), + tileColor: (currentMenu == 0) + ? Constant.pcBtnBackgroundColor + : Colors.transparent, + onTap: () { + // Handle navigation to Home screen + Navigator.pop(context); + ref.read(currentPageProvider.state).update((state) => 0); + Navigator.pushNamed(context, homeRoute); + }, + ), + ListTile( + title: Text( + 'Transaksi', + style: TextStyle( + color: (currentMenu == 1) + ? Constant.textWhite + : Constant.textBlack, + ), + ), + tileColor: (currentMenu == 1) + ? Constant.pcBtnBackgroundColor + : Colors.transparent, + onTap: () { + // Handle navigation to Transaksi screen + Navigator.pop(context); + ref.read(currentPageProvider.state).update((state) => 1); + Navigator.pushNamed(context, transaksiRoute); + }, + ), + ListTile( + title: Text( + 'History Transaksi', + style: TextStyle( + color: (currentMenu == 2) + ? Constant.textWhite + : Constant.textBlack, + ), + ), + tileColor: (currentMenu == 2) + ? Constant.pcBtnBackgroundColor + : Colors.transparent, + onTap: () { + // Handle navigation to User screen + Navigator.pop(context); + ref.read(currentPageProvider.state).update((state) => 2); + Navigator.pushNamed(context, historyTransaksiRoute); + }, + ), + ListTile( + title: Text( + 'Report', + style: TextStyle( + color: (currentMenu == 3) + ? Constant.textWhite + : Constant.textBlack, + ), + ), + tileColor: (currentMenu == 3) + ? Constant.pcBtnBackgroundColor + : Colors.transparent, + onTap: () { + // Handle navigation to Transaksi screen + Navigator.pop(context); + ref.read(currentPageProvider.state).update((state) => 3); + Navigator.pushNamed(context, reportRoute); + }, + ), + // ListTile( + // title: Text( + // 'User', + // style: TextStyle( + // color: (currentMenu == 4) + // ? Constant.textWhite + // : Constant.textBlack, + // ), + // ), + // tileColor: (currentMenu == 4) + // ? Constant.pcBtnBackgroundColor + // : Colors.transparent, + // onTap: () { + // // Handle navigation to User screen + // Navigator.pop(context); + // ref.read(currentPageProvider.state).update((state) => 4); + // Navigator.pushNamed(context, userRoute); + // }, + // ), + // ListTile( + // title: Text( + // 'Change Company', + // style: TextStyle( + // color: (currentMenu == 5) + // ? Constant.textWhite + // : Constant.textBlack, + // ), + // ), + // tileColor: (currentMenu == 5) + // ? Constant.pcBtnBackgroundColor + // : Colors.transparent, + // onTap: () { + // // Handle navigation to User screen + // Navigator.pop(context); + // ref.read(currentPageProvider.state).update((state) => 5); + // Navigator.pushNamed(context, changeCompanyRoute); + // }, + // ), + ListTile( + title: Text( + 'Logout', + // style: TextStyle(color: Constant.textWhite), + ), + onTap: () { + // di set ke 0 lagi + ref.read(currentPageProvider.state).update((state) => 0); + ref.read(logoutProvider.notifier).logout( + M_UserID: selectedUser?.model.M_UserID ?? "", + M_UserUsername: selectedUser?.model.M_UserUsername ?? "", + ); + }, + ), + ], + ), + ); + } +}