diff --git a/assets/images/grid.svg b/assets/images/grid.svg new file mode 100644 index 00000000..f3e41133 --- /dev/null +++ b/assets/images/grid.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 00000000..2bc8e05f --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,4 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: + - provider: true \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 00000000..85fd7a99 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,36 @@ +PODS: + - Flutter (1.0.0) + - flutter_secure_storage (6.0.0): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + +DEPENDENCIES: + - Flutter (from `Flutter`) + - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + flutter_secure_storage: + :path: ".symlinks/plugins/flutter_secure_storage/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + +SPEC CHECKSUMS: + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + +PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796 + +COCOAPODS: 1.15.2 diff --git a/lib/main.dart b/lib/main.dart index 9c68747d..a4f4fcb8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,30 +1,39 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/access_management/view/access_management.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart'; import 'package:syncrow_web/pages/auth/view/login_page.dart'; import 'package:syncrow_web/pages/home/bloc/home_bloc.dart'; import 'package:syncrow_web/pages/home/view/home_page.dart'; +import 'package:syncrow_web/pages/spaseManagementIcon.dart'; import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; import 'package:syncrow_web/pages/visitor_password/view/visitor_password_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:syncrow_web/services/locator.dart'; +import 'package:syncrow_web/utils/app_routes.dart'; import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/constants/routes_const.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); - initialSetup(); // Perform initial setup, e.g., dependency injection + initialSetup(); String checkToken = await AuthBloc.getTokenAndValidate(); + GoRouter router = GoRouter( + initialLocation: checkToken == 'Success' ? RoutesConst.home :RoutesConst.main , + routes: AppRoutes.getRoutes(), + ); runApp(MyApp( - isLoggedIn: checkToken, + router: router, )); } - class MyApp extends StatelessWidget { - final dynamic isLoggedIn; + final GoRouter router; const MyApp({ super.key, - required this.isLoggedIn, + required this.router, }); + @override Widget build(BuildContext context) { return MultiBlocProvider( @@ -33,7 +42,7 @@ class MyApp extends StatelessWidget { BlocProvider( create: (context) => VisitorPasswordBloc(),) ], - child: MaterialApp( + child: MaterialApp.router( debugShowCheckedModeBanner: false, // Hide debug banner scrollBehavior: const MaterialScrollBehavior().copyWith( dragDevices: { @@ -60,8 +69,16 @@ class MyApp extends StatelessWidget { colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), // Set up color scheme useMaterial3: true, // Enable Material 3 ), - // home:VisitorPasswordDialog(), - home:isLoggedIn == 'Success' ? const HomePage() : const LoginPage(), + + routeInformationProvider: router.routeInformationProvider, + routerDelegate: router.routerDelegate, + routeInformationParser: router.routeInformationParser, + )); } } + + + + + diff --git a/lib/pages/access_management/bloc/access_bloc.dart b/lib/pages/access_management/bloc/access_bloc.dart index dd60237e..0ba74a52 100644 --- a/lib/pages/access_management/bloc/access_bloc.dart +++ b/lib/pages/access_management/bloc/access_bloc.dart @@ -5,7 +5,7 @@ import 'package:syncrow_web/pages/access_management/bloc/access_state.dart'; import 'package:syncrow_web/pages/access_management/model/password_model.dart'; import 'package:syncrow_web/services/access_mang_api.dart'; import 'package:syncrow_web/utils/color_manager.dart'; -import 'package:syncrow_web/utils/constants/const.dart'; +import 'package:syncrow_web/utils/constants/app_enum.dart'; import 'package:syncrow_web/utils/snack_bar.dart'; class AccessBloc extends Bloc { diff --git a/lib/pages/access_management/model/password_model.dart b/lib/pages/access_management/model/password_model.dart index 584e9b7e..e16cc586 100644 --- a/lib/pages/access_management/model/password_model.dart +++ b/lib/pages/access_management/model/password_model.dart @@ -1,4 +1,4 @@ -import 'package:syncrow_web/utils/constants/const.dart'; +import 'package:syncrow_web/utils/constants/app_enum.dart'; class PasswordModel { final dynamic passwordId; diff --git a/lib/pages/access_management/view/access_management.dart b/lib/pages/access_management/view/access_management.dart index 6eea85e8..2e939993 100644 --- a/lib/pages/access_management/view/access_management.dart +++ b/lib/pages/access_management/view/access_management.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_bloc.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_event.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_state.dart'; @@ -7,10 +9,12 @@ import 'package:syncrow_web/pages/common/custom_table.dart'; import 'package:syncrow_web/pages/common/custom_web_textfield.dart'; import 'package:syncrow_web/pages/common/date_time_widget.dart'; import 'package:syncrow_web/pages/common/default_button.dart'; +import 'package:syncrow_web/pages/home/view/home_page.dart'; import 'package:syncrow_web/pages/visitor_password/view/visitor_password_dialog.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; -import 'package:syncrow_web/utils/constants/const.dart'; +import 'package:syncrow_web/utils/constants/app_enum.dart'; +import 'package:syncrow_web/utils/constants/routes_const.dart'; import 'package:syncrow_web/utils/style.dart'; import 'package:syncrow_web/web_layout/web_scaffold.dart'; @@ -18,6 +22,7 @@ class AccessManagementPage extends StatelessWidget { const AccessManagementPage({super.key}); @override Widget build(BuildContext context) { + Size size = MediaQuery.of(context).size; return WebScaffold( enableMenuSideba: false, @@ -29,231 +34,252 @@ class AccessManagementPage extends StatelessWidget { ], ), appBarBody: [ - Text('Physical Access', - style: Theme.of(context).textTheme - .headlineMedium! - .copyWith(color: Colors.white), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Physical Access', + style: Theme.of(context).textTheme.headlineMedium! + .copyWith(color: Colors.white), + ), + Row( + children: [ + InkWell( + onTap: () { + context.go(RoutesConst.home); + }, + child: SvgPicture.asset( + height: 20, + width: 20, + Assets.grid, + ), + ), + const SizedBox(width: 10,) + + ], + ), + ], ), ], scaffoldBody: BlocProvider(create: (BuildContext context) => AccessBloc()..add(FetchTableData()), - child: BlocConsumer(listener: (context, state) { - }, builder: (context, state) { - final accessBloc = BlocProvider.of(context); - final filteredData = accessBloc.filteredData; - return state is AccessLoaded? - const Center(child: CircularProgressIndicator()): - Container( - padding: EdgeInsets.all(30), - height: size.height, - width: size.width, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - decoration: containerDecoration, - height: size.height * 0.05, - child: Flexible( - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: BlocProvider.of(context).tabs.length, - shrinkWrap: true, - itemBuilder: (context, index) { - final isSelected = index == BlocProvider.of(context).selectedIndex; - return InkWell( - onTap: () { - BlocProvider.of(context).add(TabChangedEvent(index)); - }, - child: Container( - decoration: BoxDecoration( - color: ColorsManager.boxColor, - border: Border.all( - color: isSelected ? Colors.blue : Colors.transparent, - width: 2.0, + child: BlocConsumer(listener: (context, state) {}, + builder: (context, state) { + final accessBloc = BlocProvider.of(context); + final filteredData = accessBloc.filteredData; + return state is AccessLoaded? + const Center(child: CircularProgressIndicator()): + Container( + padding: EdgeInsets.all(30), + height: size.height, + width: size.width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: containerDecoration, + height: size.height * 0.05, + child: Flexible( + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: BlocProvider.of(context).tabs.length, + shrinkWrap: true, + itemBuilder: (context, index) { + final isSelected = index == BlocProvider.of(context).selectedIndex; + return InkWell( + onTap: () { + BlocProvider.of(context).add(TabChangedEvent(index)); + }, + child: Container( + decoration: BoxDecoration( + color: ColorsManager.boxColor, + border: Border.all( + color: isSelected ? Colors.blue : Colors.transparent, + width: 2.0, + ), + borderRadius: index == 0 + ? const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10)) + : index == 3 + ? const BorderRadius.only( + topRight: Radius.circular(10), + bottomRight: Radius.circular(10)) + : null, ), - borderRadius: index == 0 - ? const BorderRadius.only( - topLeft: Radius.circular(10), - bottomLeft: Radius.circular(10)) - : index == 3 - ? const BorderRadius.only( - topRight: Radius.circular(10), - bottomRight: Radius.circular(10)) - : null, - ), - padding: const EdgeInsets.only(left: 10, right: 10), - child: Center( - child: Text( - BlocProvider.of(context).tabs[index], - style: TextStyle( - color: isSelected ? Colors.blue : Colors.black, + padding: const EdgeInsets.only(left: 10, right: 10), + child: Center( + child: Text( + BlocProvider.of(context).tabs[index], + style: TextStyle( + color: isSelected ? Colors.blue : Colors.black, + ), ), ), ), - ), - ); - }, - ), - ), - ), - const SizedBox( - height: 20, - ), - Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.end, - textBaseline: TextBaseline.ideographic, children: [ - Container( - width: size.width * 0.15, - child: CustomWebTextField( - controller: accessBloc.passwordName, - isRequired: true, - textFieldName: 'Name', - description: '', - ), - ), - const SizedBox( - width: 15, - ), - DateTimeWebWidget( - icon: Assets.calendarIcon, - isRequired: false, - title: 'Access Time', - size: size, - endTime: () { - accessBloc.add(SelectTime(context: context, isStart: false)); - }, - startTime: () { - accessBloc.add(SelectTime(context: context, isStart: true)); - }, - firstString:BlocProvider.of(context).startTime , - secondString:BlocProvider.of(context).endTime , - ) , - const SizedBox( - width: 15, - ), - - SizedBox( - - width: size.width * 0.06, - child:Container( - decoration: containerDecoration, - child: DefaultButton( - onPressed: () { - accessBloc.add(FilterDataEvent( - selectedTabIndex: BlocProvider.of(context).selectedIndex, // Pass the selected tab index - passwordName: accessBloc.passwordName.text.toLowerCase(), - startTime: accessBloc.effectiveTimeTimeStamp, - endTime: accessBloc.expirationTimeTimeStamp - )); - }, borderRadius: 9, - child: const Text('Search'))), - ), - const SizedBox( - width: 10, - ), - SizedBox( - width: size.width * 0.06, - child: Container( - decoration: containerDecoration, - child: DefaultButton( - onPressed: () { - accessBloc.add(ResetSearch()); + ); }, - backgroundColor: ColorsManager.whiteColors, - borderRadius: 9, - child: Text( - 'Reset', - style: Theme.of(context) - .textTheme - .bodySmall! - .copyWith(color: Colors.black), - ), ), ), ), - ], - ), - const SizedBox( - height: 20, - ), - Wrap( - children: [ - Container( - width: size.width * 0.15, - decoration: containerDecoration, - child: DefaultButton( - onPressed: () { - showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return const VisitorPasswordDialog(); - }, - ).then((v){ - if(v!=null){ - accessBloc.add(FetchTableData()); - } - }); - }, - borderRadius: 8, - child: const Text('+ Create Visitor Password ')), + const SizedBox( + height: 20, + ), + Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + textBaseline: TextBaseline.ideographic, + children: [ + Container( + width: size.width * 0.15, + child: CustomWebTextField( + controller: accessBloc.passwordName, + isRequired: true, + textFieldName: 'Name', + description: '', + ), + ), + const SizedBox( + width: 15, + ), + DateTimeWebWidget( + icon: Assets.calendarIcon, + isRequired: false, + title: 'Access Time', + size: size, + endTime: () { + accessBloc.add(SelectTime(context: context, isStart: false)); + }, + startTime: () { + accessBloc.add(SelectTime(context: context, isStart: true)); + }, + firstString:BlocProvider.of(context).startTime , + secondString:BlocProvider.of(context).endTime , + ) , + const SizedBox( + width: 15, + ), + + SizedBox( + + width: size.width * 0.06, + child:Container( + decoration: containerDecoration, + child: DefaultButton( + onPressed: () { + accessBloc.add(FilterDataEvent( + selectedTabIndex: BlocProvider.of(context).selectedIndex, // Pass the selected tab index + passwordName: accessBloc.passwordName.text.toLowerCase(), + startTime: accessBloc.effectiveTimeTimeStamp, + endTime: accessBloc.expirationTimeTimeStamp + )); + }, borderRadius: 9, + child: const Text('Search'))), + ), + const SizedBox( + width: 10, + ), + SizedBox( + width: size.width * 0.06, + child: Container( + decoration: containerDecoration, + child: DefaultButton( + onPressed: () { + accessBloc.add(ResetSearch()); + }, + backgroundColor: ColorsManager.whiteColors, + borderRadius: 9, + child: Text( + 'Reset', + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith(color: Colors.black), + ), + ), + ), + ), + ], ), const SizedBox( - width: 10, + height: 20, ), - Container( - width: size.width * 0.12, - decoration: containerDecoration, - child: DefaultButton( - borderRadius: 8, - backgroundColor: ColorsManager.whiteColors, - child: Text( - 'Admin Password', - style: Theme.of(context) - .textTheme - .bodySmall! - .copyWith(color: Colors.black), - ))) + Wrap( + children: [ + Container( + width: size.width * 0.15, + decoration: containerDecoration, + child: DefaultButton( + onPressed: () { + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + return const VisitorPasswordDialog(); + }, + ).then((v){ + if(v!=null){ + accessBloc.add(FetchTableData()); + } + }); + }, + borderRadius: 8, + child: const Text('+ Create Visitor Password ')), + ), + const SizedBox( + width: 10, + ), + Container( + width: size.width * 0.12, + decoration: containerDecoration, + child: DefaultButton( + borderRadius: 8, + backgroundColor: ColorsManager.whiteColors, + child: Text( + 'Admin Password', + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith(color: Colors.black), + ))) + ], + ), + const SizedBox( + height: 20, + ), + Expanded( + child: DynamicTable( + isEmpty: filteredData.isEmpty , + withCheckBox: false, + size: size, + cellDecoration: containerDecoration, + headers: const [ + 'Name', + 'Access Type', + 'Access Period', + 'Accessible Device', + 'Authorizer', + 'Authorization Date & Time', + 'Access Status' + ], + data: filteredData.map((item) { + + return [ + item.passwordName.toString(), + item.passwordType.value, + ('${accessBloc.timestampToDate(item.effectiveTime)} - ${accessBloc.timestampToDate(item.invalidTime)}'), + item.deviceUuid.toString(), + '', + '', + item.passwordStatus.value, + ]; + }).toList(), + ) + // : const Center(child: CircularProgressIndicator()), + ) ], ), - const SizedBox( - height: 20, - ), - Expanded( - child: DynamicTable( - isEmpty: filteredData.isEmpty , - withCheckBox: false, - size: size, - cellDecoration: containerDecoration, - headers: const [ - 'Name', - 'Access Type', - 'Access Period', - 'Accessible Device', - 'Authorizer', - 'Authorization Date & Time', - 'Access Status' - ], - data: filteredData.map((item) { - - return [ - item.passwordName.toString(), - item.passwordType.value, - ('${accessBloc.timestampToDate(item.effectiveTime)} - ${accessBloc.timestampToDate(item.invalidTime)}'), - item.deviceUuid.toString(), - '', - '', - item.passwordStatus.value, - ]; - }).toList(), - ) - // : const Center(child: CircularProgressIndicator()), - ) - ], - ), - ); - }))); + ); + })) + ); } } - diff --git a/lib/pages/auth/view/login_web_page.dart b/lib/pages/auth/view/login_web_page.dart index d8b22d38..9ce60a4c 100644 --- a/lib/pages/auth/view/login_web_page.dart +++ b/lib/pages/auth/view/login_web_page.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_event.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_state.dart'; @@ -13,7 +14,7 @@ import 'package:syncrow_web/pages/common/default_button.dart'; import 'package:syncrow_web/pages/common/first_layer.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; -import 'package:syncrow_web/pages/home/view/home_page.dart'; +import 'package:syncrow_web/utils/constants/routes_const.dart'; import 'package:syncrow_web/utils/style.dart'; class LoginWebPage extends StatefulWidget { @@ -33,13 +34,8 @@ class _LoginWebPageState extends State { child: BlocConsumer( listener: (context, state) { if (state is LoginSuccess) { - // Navigate to home screen after successful login - Navigator.pushReplacement( - context, - MaterialPageRoute(builder: (context) => HomePage()), - ); + context.pushReplacement(RoutesConst.home); } else if (state is LoginFailure) { - // Show error message ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(state.error), diff --git a/lib/pages/home/bloc/home_bloc.dart b/lib/pages/home/bloc/home_bloc.dart index ebcc6b4e..57913c1f 100644 --- a/lib/pages/home/bloc/home_bloc.dart +++ b/lib/pages/home/bloc/home_bloc.dart @@ -2,15 +2,18 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:go_router/go_router.dart'; import 'package:graphview/GraphView.dart'; import 'package:syncrow_web/pages/access_management/view/access_management.dart'; import 'package:syncrow_web/pages/auth/model/user_model.dart'; import 'package:syncrow_web/pages/home/bloc/home_event.dart'; import 'package:syncrow_web/pages/home/bloc/home_state.dart'; import 'package:syncrow_web/pages/home/home_model/home_item_model.dart'; +import 'package:syncrow_web/pages/spaseManagementIcon.dart'; import 'package:syncrow_web/services/home_api.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/constants/routes_const.dart'; class HomeBloc extends Bloc { final Graph graph = Graph()..isTree = true; @@ -60,9 +63,7 @@ class HomeBloc extends Bloc { icon: Assets.accessIcon, active: true, onPress: (context) { - Navigator.of(context).push( - MaterialPageRoute(builder: (context) => AccessManagementPage()), - ); + context.go(RoutesConst.accessManagementPage); }, color: null, ), @@ -71,6 +72,7 @@ class HomeBloc extends Bloc { icon: Assets.spaseManagementIcon, active: true, onPress: (context) { + }, color: ColorsManager.primaryColor, ), diff --git a/lib/pages/home/view/home_page.dart b/lib/pages/home/view/home_page.dart index b4225ae2..3d23317c 100644 --- a/lib/pages/home/view/home_page.dart +++ b/lib/pages/home/view/home_page.dart @@ -8,9 +8,11 @@ class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { - return ResponsiveLayout( + return + + ResponsiveLayout( desktopBody: HomeWebPage(), mobileBody:HomeMobilePage() - ); + ); } } diff --git a/lib/pages/home/view/home_page_web.dart b/lib/pages/home/view/home_page_web.dart index 39a79a57..f542f6d3 100644 --- a/lib/pages/home/view/home_page_web.dart +++ b/lib/pages/home/view/home_page_web.dart @@ -12,7 +12,11 @@ class HomeWebPage extends StatelessWidget { @override Widget build(BuildContext context) { Size size = MediaQuery.of(context).size; - return WebScaffold( + return PopScope( + canPop: false, + onPopInvoked: (didPop) => false, + child: + WebScaffold( enableMenuSideba: false, appBarTitle: Row( children: [ @@ -74,6 +78,6 @@ class HomeWebPage extends StatelessWidget { ); }, ), - )); + ))); } } diff --git a/lib/pages/spaseManagementIcon.dart b/lib/pages/spaseManagementIcon.dart new file mode 100644 index 00000000..510b90b9 --- /dev/null +++ b/lib/pages/spaseManagementIcon.dart @@ -0,0 +1,16 @@ + + + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class SpaseManagementicon extends StatelessWidget { + const SpaseManagementicon({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container(), + ); + } +} diff --git a/lib/pages/visitor_password/model/device_model.dart b/lib/pages/visitor_password/model/device_model.dart index 2c3ce8d9..38ea0396 100644 --- a/lib/pages/visitor_password/model/device_model.dart +++ b/lib/pages/visitor_password/model/device_model.dart @@ -1,6 +1,6 @@ -import 'package:syncrow_web/utils/constants/const.dart'; +import 'package:syncrow_web/utils/constants/app_enum.dart'; class DeviceModel { dynamic productUuid; diff --git a/lib/pages/visitor_password/view/add_device_dialog.dart b/lib/pages/visitor_password/view/add_device_dialog.dart index e5e4853c..25bf56c4 100644 --- a/lib/pages/visitor_password/view/add_device_dialog.dart +++ b/lib/pages/visitor_password/view/add_device_dialog.dart @@ -9,7 +9,7 @@ import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_event.d import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_state.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; -import 'package:syncrow_web/utils/constants/const.dart'; +import 'package:syncrow_web/utils/constants/app_enum.dart'; import 'package:syncrow_web/utils/style.dart'; class AddDeviceDialog extends StatelessWidget { diff --git a/lib/services/auth_api.dart b/lib/services/auth_api.dart index 3cd375f7..dc1064aa 100644 --- a/lib/services/auth_api.dart +++ b/lib/services/auth_api.dart @@ -43,10 +43,11 @@ class AuthenticationAPI { }, showServerMessage: true, expectedResponseModel: (json) { - return 30; + return json['data']['cooldown']; } ); - return 30; + + return response; } on DioException catch (e) { if (e.response != null) { if (e.response!.statusCode == 400) { diff --git a/lib/utils/app_routes.dart b/lib/utils/app_routes.dart new file mode 100644 index 00000000..7f979d74 --- /dev/null +++ b/lib/utils/app_routes.dart @@ -0,0 +1,33 @@ +import 'package:go_router/go_router.dart'; +import 'package:syncrow_web/pages/access_management/view/access_management.dart'; +import 'package:syncrow_web/pages/auth/view/login_page.dart'; +import 'package:syncrow_web/pages/home/view/home_page.dart'; +import 'package:syncrow_web/pages/visitor_password/view/visitor_password_dialog.dart'; +import 'package:syncrow_web/utils/constants/routes_const.dart'; + +class AppRoutes { + static List getRoutes() { + return [ + GoRoute( + path:RoutesConst.main, + builder: (context, state) => const LoginPage(), + ), + + GoRoute( + path: RoutesConst.home, + builder: (context, state) => const HomePage(), + ), + + GoRoute( + path: RoutesConst.visitorPassword, + builder: (context, state) => const VisitorPasswordDialog(), + ), + + GoRoute( + path: RoutesConst.accessManagementPage , + builder: (context, state) => const AccessManagementPage(), + ), + + ]; + } +} diff --git a/lib/utils/constants/const.dart b/lib/utils/constants/app_enum.dart similarity index 100% rename from lib/utils/constants/const.dart rename to lib/utils/constants/app_enum.dart diff --git a/lib/utils/constants/assets.dart b/lib/utils/constants/assets.dart index f4a2859e..18c3bb7b 100644 --- a/lib/utils/constants/assets.dart +++ b/lib/utils/constants/assets.dart @@ -27,4 +27,5 @@ class Assets { static const String deviceNoteIcon = "assets/images/device_note.svg"; static const String timeIcon = "assets/images/time_icon.svg"; static const String emptyTable = "assets/images/empty_table.svg"; + static const String grid = "assets/images/grid.svg"; } diff --git a/lib/utils/constants/routes_const.dart b/lib/utils/constants/routes_const.dart new file mode 100644 index 00000000..b107b0fe --- /dev/null +++ b/lib/utils/constants/routes_const.dart @@ -0,0 +1,6 @@ +class RoutesConst { + static const String main = '/'; + static const String home = '/home'; + static const String visitorPassword = '/visitor-password'; + static const String accessManagementPage = '/access-management-page'; +} diff --git a/lib/utils/navigation_service.dart b/lib/utils/navigation_service.dart index c0b12167..c9d654e6 100644 --- a/lib/utils/navigation_service.dart +++ b/lib/utils/navigation_service.dart @@ -5,3 +5,6 @@ class NavigationService { static GlobalKey? snackbarKey = GlobalKey(); } + + + diff --git a/pubspec.lock b/pubspec.lock index b8984d5a..9a9cd6a8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -216,6 +216,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.7.0" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: "2ddb88e9ad56ae15ee144ed10e33886777eb5ca2509a914850a5faa7b52ff459" + url: "https://pub.dev" + source: hosted + version: "14.2.7" graphview: dependency: "direct main" description: @@ -288,6 +296,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index faaa7ddb..20118a0a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,7 +44,9 @@ dependencies: flutter_secure_storage: ^9.2.2 shared_preferences: ^2.3.0 data_table_2: ^2.5.15 + go_router: intl: ^0.19.0 + dev_dependencies: flutter_test: sdk: flutter