diff --git a/lib/main.dart b/lib/main.dart index a50d2615..071c7433 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,22 +1,9 @@ import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:go_router/go_router.dart'; import 'package:syncrow_web/firebase_options.dart'; -import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart'; -import 'package:syncrow_web/pages/home/bloc/home_bloc.dart'; -import 'package:syncrow_web/pages/home/bloc/home_event.dart'; -import 'package:syncrow_web/pages/routines/bloc/create_routine_bloc/create_routine_bloc.dart'; -import 'package:syncrow_web/pages/routines/bloc/routine_bloc/routine_bloc.dart'; -import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; -import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; import 'package:syncrow_web/services/locator.dart'; -import 'package:syncrow_web/utils/app_routes.dart'; -import 'package:syncrow_web/utils/constants/routes_const.dart'; -import 'package:syncrow_web/utils/navigation_service.dart'; -import 'package:syncrow_web/utils/theme/theme.dart'; +import 'package:syncrow_web/syncrow_app.dart'; Future main() async { try { @@ -33,59 +20,5 @@ Future main() async { ); initialSetup(); } catch (_) {} - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - MyApp({super.key}); - - final GoRouter _router = GoRouter( - initialLocation: RoutesConst.auth, - routes: AppRoutes.getRoutes(), - redirect: (context, state) async { - final checkToken = await AuthBloc.getTokenAndValidate(); - final loggedIn = checkToken == 'Success'; - final goingToLogin = state.uri.toString() == RoutesConst.auth; - - if (!loggedIn && !goingToLogin) return RoutesConst.auth; - if (loggedIn && goingToLogin) return RoutesConst.home; - - return null; - }, - ); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider( - create: (context) => CreateRoutineBloc(), - ), - BlocProvider(create: (context) => HomeBloc()..add(const FetchUserInfo())), - BlocProvider( - create: (context) => VisitorPasswordBloc(), - ), - BlocProvider( - create: (context) => RoutineBloc(), - ), - BlocProvider( - create: (context) => SpaceTreeBloc(), - ), - ], - child: MaterialApp.router( - debugShowCheckedModeBanner: false, - scrollBehavior: const MaterialScrollBehavior().copyWith( - dragDevices: { - PointerDeviceKind.mouse, - PointerDeviceKind.touch, - PointerDeviceKind.stylus, - PointerDeviceKind.unknown, - }, - ), - key: NavigationService.navigatorKey, - // scaffoldMessengerKey: NavigationService.snackbarKey, - theme: myTheme, - routerConfig: _router, - )); - } + runApp(const SyncrowApp()); } diff --git a/lib/main_dev.dart b/lib/main_dev.dart index 284e2f30..49df196f 100644 --- a/lib/main_dev.dart +++ b/lib/main_dev.dart @@ -1,22 +1,9 @@ import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:go_router/go_router.dart'; import 'package:syncrow_web/firebase_options.dart'; -import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart'; -import 'package:syncrow_web/pages/home/bloc/home_bloc.dart'; -import 'package:syncrow_web/pages/home/bloc/home_event.dart'; -import 'package:syncrow_web/pages/routines/bloc/create_routine_bloc/create_routine_bloc.dart'; -import 'package:syncrow_web/pages/routines/bloc/routine_bloc/routine_bloc.dart'; -import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; -import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; import 'package:syncrow_web/services/locator.dart'; -import 'package:syncrow_web/utils/app_routes.dart'; -import 'package:syncrow_web/utils/constants/routes_const.dart'; -import 'package:syncrow_web/utils/navigation_service.dart'; -import 'package:syncrow_web/utils/theme/theme.dart'; +import 'package:syncrow_web/syncrow_app.dart'; Future main() async { try { @@ -33,59 +20,5 @@ Future main() async { ); initialSetup(); } catch (_) {} - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - MyApp({super.key}); - - final GoRouter _router = GoRouter( - initialLocation: RoutesConst.auth, - routes: AppRoutes.getRoutes(), - redirect: (context, state) async { - final checkToken = await AuthBloc.getTokenAndValidate(); - final loggedIn = checkToken == 'Success'; - final goingToLogin = state.uri.toString() == RoutesConst.auth; - - if (!loggedIn && !goingToLogin) return RoutesConst.auth; - if (loggedIn && goingToLogin) return RoutesConst.home; - - return null; - }, - ); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider( - create: (context) => CreateRoutineBloc(), - ), - BlocProvider(create: (context) => HomeBloc()..add(const FetchUserInfo())), - BlocProvider( - create: (context) => VisitorPasswordBloc(), - ), - BlocProvider( - create: (context) => RoutineBloc(), - ), - BlocProvider( - create: (context) => SpaceTreeBloc(), - ), - ], - child: MaterialApp.router( - debugShowCheckedModeBanner: false, - scrollBehavior: const MaterialScrollBehavior().copyWith( - dragDevices: { - PointerDeviceKind.mouse, - PointerDeviceKind.touch, - PointerDeviceKind.stylus, - PointerDeviceKind.unknown, - }, - ), - key: NavigationService.navigatorKey, - // scaffoldMessengerKey: NavigationService.snackbarKey, - theme: myTheme, - routerConfig: _router, - )); - } + runApp(const SyncrowApp()); } diff --git a/lib/main_staging.dart b/lib/main_staging.dart index 6389c53a..6e0de3e1 100644 --- a/lib/main_staging.dart +++ b/lib/main_staging.dart @@ -1,26 +1,16 @@ import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:go_router/go_router.dart'; import 'package:syncrow_web/firebase_options.dart'; -import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart'; -import 'package:syncrow_web/pages/home/bloc/home_bloc.dart'; -import 'package:syncrow_web/pages/home/bloc/home_event.dart'; -import 'package:syncrow_web/pages/routines/bloc/create_routine_bloc/create_routine_bloc.dart'; -import 'package:syncrow_web/pages/routines/bloc/routine_bloc/routine_bloc.dart'; -import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; -import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; import 'package:syncrow_web/services/locator.dart'; -import 'package:syncrow_web/utils/app_routes.dart'; -import 'package:syncrow_web/utils/constants/routes_const.dart'; -import 'package:syncrow_web/utils/navigation_service.dart'; -import 'package:syncrow_web/utils/theme/theme.dart'; +import 'package:syncrow_web/syncrow_app.dart'; Future main() async { try { - const environment = String.fromEnvironment('FLAVOR', defaultValue: 'staging'); + const environment = String.fromEnvironment( + 'FLAVOR', + defaultValue: 'staging', + ); await dotenv.load(fileName: '.env.$environment'); WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( @@ -30,59 +20,5 @@ Future main() async { ); initialSetup(); } catch (_) {} - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - MyApp({super.key}); - - final GoRouter _router = GoRouter( - initialLocation: RoutesConst.auth, - routes: AppRoutes.getRoutes(), - redirect: (context, state) async { - final checkToken = await AuthBloc.getTokenAndValidate(); - final loggedIn = checkToken == 'Success'; - final goingToLogin = state.uri.toString() == RoutesConst.auth; - - if (!loggedIn && !goingToLogin) return RoutesConst.auth; - if (loggedIn && goingToLogin) return RoutesConst.home; - - return null; - }, - ); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider( - create: (context) => CreateRoutineBloc(), - ), - BlocProvider(create: (context) => HomeBloc()..add(const FetchUserInfo())), - BlocProvider( - create: (context) => VisitorPasswordBloc(), - ), - BlocProvider( - create: (context) => RoutineBloc(), - ), - BlocProvider( - create: (context) => SpaceTreeBloc(), - ), - ], - child: MaterialApp.router( - debugShowCheckedModeBanner: false, - scrollBehavior: const MaterialScrollBehavior().copyWith( - dragDevices: { - PointerDeviceKind.mouse, - PointerDeviceKind.touch, - PointerDeviceKind.stylus, - PointerDeviceKind.unknown, - }, - ), - key: NavigationService.navigatorKey, - // scaffoldMessengerKey: NavigationService.snackbarKey, - theme: myTheme, - routerConfig: _router, - )); - } + runApp(const SyncrowApp()); } diff --git a/lib/pages/access_management/booking_system/presentation/bloc/calendar/events_bloc.dart b/lib/pages/access_management/booking_system/presentation/bloc/calendar/events_bloc.dart index b42947bd..59a1aa28 100644 --- a/lib/pages/access_management/booking_system/presentation/bloc/calendar/events_bloc.dart +++ b/lib/pages/access_management/booking_system/presentation/bloc/calendar/events_bloc.dart @@ -10,7 +10,7 @@ part 'events_event.dart'; part 'events_state.dart'; class CalendarEventsBloc extends Bloc { - final EventController eventController = EventController(); + EventController eventController = EventController(); final CalendarSystemService calendarService; CalendarEventsBloc({ @@ -20,7 +20,9 @@ class CalendarEventsBloc extends Bloc { on(_onAddEvent); on(_onDisposeResources); on(_onGoToWeek); + on(_onResetEvents); } + Future _onLoadEvents( LoadEvents event, Emitter emit, @@ -126,4 +128,18 @@ class CalendarEventsBloc extends Bloc { eventController.dispose(); return super.close(); } + + void _onResetEvents( + ResetEvents event, + Emitter emit, + ) { + if (calendarService is MemoryCalendarServiceWithRemoteFallback) { + (calendarService as MemoryCalendarServiceWithRemoteFallback) + .memoryService + .clear(); + } + eventController.dispose(); + eventController = EventController(); + emit(EventsInitial()); + } } diff --git a/lib/pages/access_management/booking_system/presentation/bloc/calendar/events_event.dart b/lib/pages/access_management/booking_system/presentation/bloc/calendar/events_event.dart index 6a368e17..ecd7f975 100644 --- a/lib/pages/access_management/booking_system/presentation/bloc/calendar/events_event.dart +++ b/lib/pages/access_management/booking_system/presentation/bloc/calendar/events_event.dart @@ -29,3 +29,10 @@ class CheckWeekHasEvents extends CalendarEventsEvent { final DateTime weekStart; const CheckWeekHasEvents(this.weekStart); } + +class ResetEvents extends CalendarEventsEvent { + const ResetEvents(); + + @override + List get props => []; +} \ No newline at end of file diff --git a/lib/pages/access_management/booking_system/presentation/view/booking_page.dart b/lib/pages/access_management/booking_system/presentation/view/booking_page.dart index aac5c5b7..68934ddc 100644 --- a/lib/pages/access_management/booking_system/presentation/view/booking_page.dart +++ b/lib/pages/access_management/booking_system/presentation/view/booking_page.dart @@ -1,3 +1,4 @@ +// booking_page.dart import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:calendar_view/calendar_view.dart'; @@ -26,7 +27,33 @@ class BookingPage extends StatefulWidget { } class _BookingPageState extends State { - late final EventController _eventController; + @override + Widget build(BuildContext context) { + return MultiBlocProvider( + providers: [ + BlocProvider(create: (_) => SelectedBookableSpaceBloc()), + BlocProvider(create: (_) => DateSelectionBloc()), + BlocProvider( + create: (_) => CalendarEventsBloc( + calendarService: MemoryCalendarServiceWithRemoteFallback( + remoteService: RemoteCalendarService(HTTPService()), + memoryService: MemoryCalendarService(), + ), + ), + ), + ], + child: _BookingPageContent(), + ); + } +} + +class _BookingPageContent extends StatefulWidget { + @override + State<_BookingPageContent> createState() => _BookingPageContentState(); +} + +class _BookingPageContentState extends State<_BookingPageContent> { + late EventController _eventController; @override void initState() { @@ -40,7 +67,7 @@ class _BookingPageState extends State { super.dispose(); } - void _dispatchLoadEvents(BuildContext context) { + void _loadEvents(BuildContext context) { final selectedRoom = context.read().state.selectedBookableSpace; final dateState = context.read().state; @@ -60,186 +87,170 @@ class _BookingPageState extends State { @override Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider(create: (_) => SelectedBookableSpaceBloc()), - BlocProvider(create: (_) => DateSelectionBloc()), - BlocProvider( - create: (_) => CalendarEventsBloc( - calendarService: MemoryCalendarServiceWithRemoteFallback( - remoteService: RemoteCalendarService( - HTTPService(), - ), - memoryService: MemoryCalendarService(), - ), - )), - ], - child: Builder( - builder: (context) => - BlocListener( - listenWhen: (prev, curr) => curr is EventsLoaded, + return BlocListener( + listener: (context, state) { + if (state.selectedBookableSpace != null) { + // Reset events and clear cache when room changes + context.read().add(ResetEvents()); + _loadEvents(context); + } + }, + child: BlocListener( + listener: (context, state) { + _loadEvents(context); + }, + child: BlocListener( listener: (context, state) { if (state is EventsLoaded) { _eventController.removeWhere((_) => true); _eventController.addAll(state.events); } }, - child: BlocListener( - listener: (context, state) => _dispatchLoadEvents(context), - child: BlocListener( - listener: (context, state) => _dispatchLoadEvents(context), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Container( - decoration: BoxDecoration( - color: ColorsManager.whiteColors, - boxShadow: [ - BoxShadow( - color: ColorsManager.blackColor.withOpacity(0.1), - offset: const Offset(3, 0), - blurRadius: 6, - spreadRadius: 0, - ), - ], + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + color: ColorsManager.whiteColors, + boxShadow: [ + BoxShadow( + color: ColorsManager.blackColor.withOpacity(0.1), + offset: const Offset(3, 0), + blurRadius: 6, + spreadRadius: 0, ), - child: Column( - children: [ - Expanded( - flex: 2, - child: BlocBuilder( - builder: (context, state) { - return BookingSidebar( - onRoomSelected: (selectedRoom) { - context - .read() - .add(SelectBookableSpace(selectedRoom)); - }, - ); - }, - ), - ), - Expanded( - child: BlocBuilder( - builder: (context, dateState) { - return CustomCalendarPage( - selectedDate: dateState.selectedDate, - onDateChanged: (day, month, year) { - final newDate = DateTime(year, month, day); - context - .read() - .add(SelectDate(newDate)); - context.read().add( - SelectDateFromSidebarCalendar(newDate)); - }, - ); - }, - ), - ), - ], - ), - ), + ], ), - Expanded( - flex: 5, - child: Padding( - padding: const EdgeInsets.all(20.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + child: Column( + children: [ + Expanded( + flex: 2, + child: BlocBuilder( + builder: (context, state) { + return BookingSidebar( + onRoomSelected: (selectedRoom) { + context + .read() + .add(SelectBookableSpace(selectedRoom)); + }, + ); + }, + ), + ), + Expanded( + child: + BlocBuilder( + builder: (context, dateState) { + return CustomCalendarPage( + selectedDate: dateState.selectedDate, + onDateChanged: (day, month, year) { + final newDate = DateTime(year, month, day); + context + .read() + .add(SelectDate(newDate)); + context.read().add( + SelectDateFromSidebarCalendar(newDate)); + }, + ); + }, + ), + ), + ], + ), + ), + ), + Expanded( + flex: 5, + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - children: [ - SvgTextButton( - svgAsset: Assets.homeIcon, - label: 'Manage Bookable Spaces', - onPressed: () {}, - ), - const SizedBox(width: 20), - SvgTextButton( - svgAsset: Assets.groupIcon, - label: 'Manage Users', - onPressed: () {}, - ), - ], + SvgTextButton( + svgAsset: Assets.homeIcon, + label: 'Manage Bookable Spaces', + onPressed: () {}, ), - BlocBuilder( - builder: (context, state) { - final weekStart = state.weekStart; - final weekEnd = - weekStart.add(const Duration(days: 6)); - return WeekNavigation( - weekStart: weekStart, - weekEnd: weekEnd, - onPreviousWeek: () { - context - .read() - .add(PreviousWeek()); - }, - onNextWeek: () { - context - .read() - .add(NextWeek()); - }, - ); - }, + const SizedBox(width: 20), + SvgTextButton( + svgAsset: Assets.groupIcon, + label: 'Manage Users', + onPressed: () {}, ), ], ), - Expanded( - flex: 5, - child: BlocBuilder( - builder: (context, roomState) { - final selectedRoom = - roomState.selectedBookableSpace; - return BlocBuilder( - builder: (context, dateState) { - return BlocListener( - listenWhen: (prev, curr) => - curr is EventsLoaded, - listener: (context, state) { - if (state is EventsLoaded) { - _eventController - .removeWhere((_) => true); - _eventController.addAll(state.events); - } - }, - child: WeeklyCalendarPage( - startTime: selectedRoom - ?.bookableConfig.startTime, - endTime: selectedRoom - ?.bookableConfig.endTime, - weekStart: dateState.weekStart, - selectedDate: dateState.selectedDate, - eventController: _eventController, - selectedDateFromSideBarCalender: context - .watch() - .state - .selectedDateFromSideBarCalender, - ), + BlocBuilder( + builder: (context, state) { + final weekStart = state.weekStart; + final weekEnd = + weekStart.add(const Duration(days: 6)); + return WeekNavigation( + weekStart: weekStart, + weekEnd: weekEnd, + onPreviousWeek: () { + context + .read() + .add(PreviousWeek()); + }, + onNextWeek: () { + context + .read() + .add(NextWeek()); + }, + ); + }, + ), + ], + ), + const SizedBox(height: 20), + Expanded( + flex: 5, + child: BlocBuilder( + builder: (context, roomState) { + final selectedRoom = + roomState.selectedBookableSpace; + return BlocBuilder( + builder: (context, dateState) { + return BlocBuilder( + builder: (context, eventState) { + return WeeklyCalendarPage( + key: ValueKey( + selectedRoom?.uuid ?? 'no-room'), + startTime: selectedRoom + ?.bookableConfig.startTime, + endTime: + selectedRoom?.bookableConfig.endTime, + weekStart: dateState.weekStart, + selectedDate: dateState.selectedDate, + eventController: _eventController, + selectedDateFromSideBarCalender: context + .watch() + .state + .selectedDateFromSideBarCalender, + // isLoading: eventState is EventsLoading, ); }, ); }, - ), - ), - ], + ); + }, + ), ), - ), + ], ), - ], + ), ), - ), + ], ), ), ), diff --git a/lib/pages/access_management/booking_system/presentation/view/widgets/booking_sidebar.dart b/lib/pages/access_management/booking_system/presentation/view/widgets/booking_sidebar.dart index 666df3bb..bd051a94 100644 --- a/lib/pages/access_management/booking_system/presentation/view/widgets/booking_sidebar.dart +++ b/lib/pages/access_management/booking_system/presentation/view/widgets/booking_sidebar.dart @@ -76,21 +76,29 @@ class __SidebarContentState extends State<_SidebarContent> { builder: (context, state) { return Column( children: [ - const _SidebarHeader(title: 'Spaces'), + Padding( + padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), + child: Container( + decoration: BoxDecoration( + color: ColorsManager.whiteColors, + boxShadow: [ + BoxShadow( + color: ColorsManager.blackColor.withOpacity(0.1), + offset: const Offset(0, 4), + blurRadius: 4, + spreadRadius: 0, + ), + ], + ), + child: _SidebarHeader(title: 'Spaces')), + ), Container( decoration: BoxDecoration( color: ColorsManager.whiteColors, - borderRadius: BorderRadius.circular(8.0), boxShadow: [ BoxShadow( color: ColorsManager.blackColor.withOpacity(0.1), - offset: const Offset(0, -2), - blurRadius: 4, - spreadRadius: 0, - ), - BoxShadow( - color: ColorsManager.blackColor.withOpacity(0.1), - offset: const Offset(0, 2), + offset: const Offset(0, 4), blurRadius: 4, spreadRadius: 0, ), @@ -220,7 +228,7 @@ class _SidebarHeader extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.all(10.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/pages/access_management/booking_system/presentation/view/widgets/custom_calendar_page.dart b/lib/pages/access_management/booking_system/presentation/view/widgets/custom_calendar_page.dart index eb758311..21dfe646 100644 --- a/lib/pages/access_management/booking_system/presentation/view/widgets/custom_calendar_page.dart +++ b/lib/pages/access_management/booking_system/presentation/view/widgets/custom_calendar_page.dart @@ -66,18 +66,28 @@ class _CustomCalendarPageState extends State { weekdayLabels: const ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'], ); - return CalendarDatePicker2( - config: config, - value: [_selectedDate], - onValueChanged: (dates) { - final picked = dates.first; - if (picked != null) { - setState(() { - _selectedDate = picked; - }); - widget.onDateChanged(picked.day, picked.month, picked.year); - } - }, + return Container( + decoration: const BoxDecoration( + border: Border( + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + ), + ), + child: CalendarDatePicker2( + config: config, + value: [_selectedDate], + onValueChanged: (dates) { + final picked = dates.first; + if (picked != null) { + setState(() { + _selectedDate = picked; + }); + widget.onDateChanged(picked.day, picked.month, picked.year); + } + }, + ), ); } } diff --git a/lib/pages/access_management/booking_system/presentation/view/widgets/event_tile_widget.dart b/lib/pages/access_management/booking_system/presentation/view/widgets/event_tile_widget.dart index b7e942d6..87c10a81 100644 --- a/lib/pages/access_management/booking_system/presentation/view/widgets/event_tile_widget.dart +++ b/lib/pages/access_management/booking_system/presentation/view/widgets/event_tile_widget.dart @@ -32,15 +32,17 @@ class EventTileWidget extends StatelessWidget { return Expanded( child: Container( width: double.infinity, - padding: EdgeInsets.all(5), + padding: const EdgeInsets.all(5), decoration: BoxDecoration( color: isEventEnded ? ColorsManager.grayColor.withOpacity(0.1) : ColorsManager.blue1.withOpacity(0.1), borderRadius: BorderRadius.circular(6), - border: const Border( + border: Border( left: BorderSide( - color: ColorsManager.grayColor, + color: isEventEnded + ? ColorsManager.grayColor + : ColorsManager.secondaryColor, width: 4, ), ), diff --git a/lib/pages/access_management/booking_system/presentation/view/widgets/room_list_item.dart b/lib/pages/access_management/booking_system/presentation/view/widgets/room_list_item.dart index 83eda16b..57a14002 100644 --- a/lib/pages/access_management/booking_system/presentation/view/widgets/room_list_item.dart +++ b/lib/pages/access_management/booking_system/presentation/view/widgets/room_list_item.dart @@ -21,7 +21,7 @@ class RoomListItem extends StatelessWidget { groupValue: isSelected ? room.uuid : null, visualDensity: const VisualDensity(vertical: -4), onChanged: (value) => onTap(), - activeColor: ColorsManager.primaryColor, + activeColor: ColorsManager.secondaryColor, title: Text( room.spaceName, maxLines: 2, diff --git a/lib/pages/access_management/booking_system/presentation/view/widgets/week_day_header.dart b/lib/pages/access_management/booking_system/presentation/view/widgets/week_day_header.dart index 57e35c6d..325ce582 100644 --- a/lib/pages/access_management/booking_system/presentation/view/widgets/week_day_header.dart +++ b/lib/pages/access_management/booking_system/presentation/view/widgets/week_day_header.dart @@ -14,26 +14,33 @@ class WeekDayHeader extends StatelessWidget { @override Widget build(BuildContext context) { - return Column( - children: [ - Text( - DateFormat('EEE').format(date).toUpperCase(), - style: TextStyle( - fontWeight: FontWeight.w400, - fontSize: 14, - color: isSelectedDay ? Colors.blue : Colors.black, + return ColoredBox( + color: isSelectedDay + ? ColorsManager.secondaryColor.withOpacity(0.1) + : Colors.transparent, + child: Column( + children: [ + const SizedBox( + height: 10, ), - ), - Text( - DateFormat('d').format(date), - style: TextStyle( - fontWeight: FontWeight.w700, - fontSize: 20, - color: - isSelectedDay ? ColorsManager.blue1 : ColorsManager.blackColor, + Text( + DateFormat('EEE').format(date).toUpperCase(), + style: const TextStyle( + fontWeight: FontWeight.w400, + fontSize: 14, + color: ColorsManager.blackColor, + ), ), - ), - ], + Text( + DateFormat('d').format(date), + style: const TextStyle( + fontWeight: FontWeight.w700, + fontSize: 30, + color: ColorsManager.blackColor, + ), + ), + ], + ), ); } } diff --git a/lib/pages/access_management/booking_system/presentation/view/widgets/weekly_calendar_page.dart b/lib/pages/access_management/booking_system/presentation/view/widgets/weekly_calendar_page.dart index 2bfd5429..931746b7 100644 --- a/lib/pages/access_management/booking_system/presentation/view/widgets/weekly_calendar_page.dart +++ b/lib/pages/access_management/booking_system/presentation/view/widgets/weekly_calendar_page.dart @@ -24,7 +24,7 @@ class WeeklyCalendarPage extends StatelessWidget { }); static const double timeLineWidth = 65; static const int totalDays = 7; - static const double dayColumnWidth = 220; + static const double dayColumnWidth = 220; final double calendarContentWidth = timeLineWidth + (totalDays * dayColumnWidth); @@ -57,13 +57,10 @@ class WeeklyCalendarPage extends StatelessWidget { ); } - - - const double timeLineWidth = 65; + const double timeLineWidth = 90; return LayoutBuilder( builder: (context, constraints) { - bool isInRange(DateTime date, DateTime start, DateTime end) { !date.isBefore(start) && !date.isAfter(end); // remove this line and Check if the date is within the range @@ -100,7 +97,6 @@ class WeeklyCalendarPage extends StatelessWidget { width: width, decoration: BoxDecoration( color: Colors.orange.withOpacity(0.13), - borderRadius: BorderRadius.circular(8), ), ); } else if (isSelected) { @@ -110,7 +106,6 @@ class WeeklyCalendarPage extends StatelessWidget { decoration: BoxDecoration( color: ColorsManager.spaceColor.withOpacity(0.07), - borderRadius: BorderRadius.circular(8), ), ); } @@ -143,7 +138,7 @@ class WeeklyCalendarPage extends StatelessWidget { heightPerMinute: 1.7, showLiveTimeLineInAllDays: false, showVerticalLines: true, - emulateVerticalOffsetBy: -80, + emulateVerticalOffsetBy: -95, startDay: WeekDays.monday, liveTimeIndicatorSettings: const LiveTimeIndicatorSettings( @@ -161,7 +156,7 @@ class WeeklyCalendarPage extends StatelessWidget { }, timeLineWidth: timeLineWidth, weekPageHeaderBuilder: (start, end) => Container(), - weekTitleHeight: 60, + weekTitleHeight: 90, weekNumberBuilder: (firstDayOfWeek) => Padding( padding: const EdgeInsets.only(right: 15, bottom: 10), child: Column( @@ -208,8 +203,6 @@ class WeeklyCalendarPage extends StatelessWidget { }, ); } - - } bool isSameDay(DateTime d1, DateTime d2) { diff --git a/lib/pages/device_managment/garage_door/view/garage_door_control_view.dart b/lib/pages/device_managment/garage_door/view/garage_door_control_view.dart index 30d9bf5d..86ca1317 100644 --- a/lib/pages/device_managment/garage_door/view/garage_door_control_view.dart +++ b/lib/pages/device_managment/garage_door/view/garage_door_control_view.dart @@ -6,6 +6,7 @@ import 'package:syncrow_web/pages/device_managment/garage_door/bloc/garage_door_ import 'package:syncrow_web/pages/device_managment/garage_door/helper/garage_door_helper.dart'; import 'package:syncrow_web/pages/device_managment/garage_door/models/garage_door_model.dart'; import 'package:syncrow_web/pages/device_managment/garage_door/schedule_view/schedule_garage_view.dart'; +import 'package:syncrow_web/pages/device_managment/schedule_device/schedule_widgets/schedual_view.dart'; import 'package:syncrow_web/pages/device_managment/shared/icon_name_status_container.dart'; import 'package:syncrow_web/pages/device_managment/shared/table/report_table.dart'; import 'package:syncrow_web/pages/device_managment/shared/toggle_widget.dart'; @@ -94,11 +95,18 @@ class GarageDoorControlView extends StatelessWidget FetchGarageDoorSchedulesEvent( deviceId: deviceId, category: 'doorcontact_state'), ); - showDialog( + + showDialog( context: context, builder: (ctx) => BlocProvider.value( value: BlocProvider.of(context), - child: BuildGarageDoorScheduleView(status: status), + child: BuildScheduleView( + deviceUuid: deviceId, + category: 'Timer', + code: 'doorcontact_state', + countdownCode: 'Timer', + deviceType: 'GD', + ), )); }, name: 'Scheduling', diff --git a/lib/pages/device_managment/schedule_device/bloc/schedule_bloc.dart b/lib/pages/device_managment/schedule_device/bloc/schedule_bloc.dart index 62bef920..11b2ebbb 100644 --- a/lib/pages/device_managment/schedule_device/bloc/schedule_bloc.dart +++ b/lib/pages/device_managment/schedule_device/bloc/schedule_bloc.dart @@ -287,7 +287,8 @@ class ScheduleBloc extends Bloc { try { if (state is ScheduleLoaded) { Status status = Status(code: '', value: ''); - if (event.deviceType == 'CUR_2') { + if (event.deviceType == 'CUR_2' || + event.deviceType == 'GD' ) { status = status.copyWith( code: 'control', value: event.functionOn == true ? 'open' : 'close'); diff --git a/lib/pages/device_managment/schedule_device/schedule_widgets/count_down_button.dart b/lib/pages/device_managment/schedule_device/schedule_widgets/count_down_button.dart index 8fa1e290..752f2243 100644 --- a/lib/pages/device_managment/schedule_device/schedule_widgets/count_down_button.dart +++ b/lib/pages/device_managment/schedule_device/schedule_widgets/count_down_button.dart @@ -69,7 +69,7 @@ class CountdownModeButtons extends StatelessWidget { countDownCode: countDownCode), ); }, - backgroundColor: ColorsManager.primaryColorWithOpacity, + backgroundColor: ColorsManager.secondaryColor, child: const Text('Save'), ), ), diff --git a/lib/pages/device_managment/schedule_device/schedule_widgets/inching_mode_buttons.dart b/lib/pages/device_managment/schedule_device/schedule_widgets/inching_mode_buttons.dart index e8dc5e79..c8fe1357 100644 --- a/lib/pages/device_managment/schedule_device/schedule_widgets/inching_mode_buttons.dart +++ b/lib/pages/device_managment/schedule_device/schedule_widgets/inching_mode_buttons.dart @@ -63,7 +63,7 @@ class InchingModeButtons extends StatelessWidget { ), ); }, - backgroundColor: ColorsManager.primaryColor, + backgroundColor: ColorsManager.secondaryColor, child: const Text('Save'), ), ), diff --git a/lib/pages/device_managment/schedule_device/schedule_widgets/schedual_view.dart b/lib/pages/device_managment/schedule_device/schedule_widgets/schedual_view.dart index d5194f35..5103e9d0 100644 --- a/lib/pages/device_managment/schedule_device/schedule_widgets/schedual_view.dart +++ b/lib/pages/device_managment/schedule_device/schedule_widgets/schedual_view.dart @@ -31,11 +31,12 @@ class BuildScheduleView extends StatelessWidget { @override Widget build(BuildContext context) { return BlocProvider( - create: (_) => ScheduleBloc(deviceId: deviceUuid,) + create: (_) => ScheduleBloc( + deviceId: deviceUuid, + ) ..add(ScheduleGetEvent(category: category)) ..add(ScheduleFetchStatusEvent( - deviceId: deviceUuid, - countdownCode: countdownCode ?? '')), + deviceId: deviceUuid, countdownCode: countdownCode ?? '')), child: Dialog( backgroundColor: Colors.white, insetPadding: const EdgeInsets.all(20), @@ -56,7 +57,7 @@ class BuildScheduleView extends StatelessWidget { children: [ const ScheduleHeader(), const SizedBox(height: 20), - if (deviceType == 'CUR_2') + if (deviceType == 'CUR_2' || deviceType == 'GD') const SizedBox() else ScheduleModeSelector( @@ -76,8 +77,7 @@ class BuildScheduleView extends StatelessWidget { category: category, time: '', function: Status( - code: code.toString(), - value: true), + code: code.toString(), value: true), days: [], ), isEdit: false, @@ -96,7 +96,7 @@ class BuildScheduleView extends StatelessWidget { } }, ), - if (deviceType != 'CUR_2') + if (deviceType != 'CUR_2'|| deviceType != 'GD') if (state.scheduleMode == ScheduleModes.countdown || state.scheduleMode == ScheduleModes.inching) CountdownInchingView( diff --git a/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_managment_ui.dart b/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_managment_ui.dart index 39899fe5..924524f0 100644 --- a/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_managment_ui.dart +++ b/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_managment_ui.dart @@ -24,12 +24,13 @@ class ScheduleManagementUI extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - width: 170, + width: 177, height: 40, child: DefaultButton( - borderColor: ColorsManager.grayColor.withOpacity(0.5), - padding: 2, - backgroundColor: ColorsManager.graysColor, + borderWidth: 4, + borderColor: ColorsManager.neutralGray, + padding: 8, + backgroundColor: ColorsManager.textFieldGreyColor, borderRadius: 15, onPressed: onAddSchedule, child: Row( diff --git a/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_mode_buttons.dart b/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_mode_buttons.dart index f1df1f20..76accf60 100644 --- a/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_mode_buttons.dart +++ b/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_mode_buttons.dart @@ -39,7 +39,7 @@ class ScheduleModeButtons extends StatelessWidget { borderRadius: 8, height: 40, onPressed: onSave, - backgroundColor: ColorsManager.primaryColorWithOpacity, + backgroundColor: ColorsManager.secondaryColor, child: const Text('Save'), ), ), diff --git a/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_table.dart b/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_table.dart index c1771c1b..8dc4d211 100644 --- a/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_table.dart +++ b/lib/pages/device_managment/schedule_device/schedule_widgets/schedule_table.dart @@ -194,7 +194,7 @@ class _ScheduleTableView extends StatelessWidget { child: Text(_getSelectedDays( ScheduleModel.parseSelectedDays(schedule.days)))), Center(child: Text(formatIsoStringToTime(schedule.time, context))), - if (deviceType == 'CUR_2') + if (deviceType == 'CUR_2' || deviceType == 'GD') Center( child: Text(schedule.function.value == true ? 'open' : 'close')) else diff --git a/lib/pages/device_managment/water_heater/helper/add_schedule_dialog_helper.dart b/lib/pages/device_managment/water_heater/helper/add_schedule_dialog_helper.dart index e5695b9e..6b5ff033 100644 --- a/lib/pages/device_managment/water_heater/helper/add_schedule_dialog_helper.dart +++ b/lib/pages/device_managment/water_heater/helper/add_schedule_dialog_helper.dart @@ -23,7 +23,7 @@ class ScheduleDialogHelper { required String deviceType, }) { bool temp; - if (deviceType == 'CUR_2') { + if (deviceType == 'CUR_2' || deviceType == 'GD') { temp = schedule!.function.value == 'open' ? true : false; } else { temp = schedule!.function.value; @@ -116,7 +116,7 @@ class ScheduleDialogHelper { ScheduleModeButtons( onSave: () { dynamic temp; - if (deviceType == 'CUR_2') { + if (deviceType == 'CUR_2' || deviceType == 'GD') { temp = functionOn! ? 'open' : 'close'; } else { temp = functionOn; @@ -202,18 +202,23 @@ class ScheduleDialogHelper { ), const SizedBox(width: 10), Radio( + activeColor: ColorsManager.secondaryColor, + focusColor: ColorsManager.secondaryColor, value: true, groupValue: isOn, onChanged: (val) => onChanged(true), ), - Text(categor == 'CUR_2' ? 'open' : 'On'), + Text(categor == 'CUR_2' || categor == 'GD' ? 'open' : 'On'), const SizedBox(width: 10), Radio( + activeColor: ColorsManager.secondaryColor, + focusColor: ColorsManager.secondaryColor, + value: false, groupValue: isOn, onChanged: (val) => onChanged(false), ), - Text(categor == 'CUR_2' ? 'close' : 'Off'), + Text(categor == 'CUR_2' || categor == 'GD' ? 'close' : 'Off'), ], ); } diff --git a/lib/services/locator.dart b/lib/services/locator.dart index 055deb05..83fa5f56 100644 --- a/lib/services/locator.dart +++ b/lib/services/locator.dart @@ -4,9 +4,7 @@ import 'package:syncrow_web/services/api/http_interceptor.dart'; import 'package:syncrow_web/services/api/http_service.dart'; final GetIt serviceLocator = GetIt.instance; -//setupLocator() // to search for dependency injection in flutter -initialSetup() { +void initialSetup() { serviceLocator.registerSingleton(HTTPInterceptor()); - //Base classes serviceLocator.registerSingleton(HTTPService.setupDioClient()); } diff --git a/lib/syncrow_app.dart b/lib/syncrow_app.dart new file mode 100644 index 00000000..54df3351 --- /dev/null +++ b/lib/syncrow_app.dart @@ -0,0 +1,53 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/home/bloc/home_bloc.dart'; +import 'package:syncrow_web/pages/home/bloc/home_event.dart'; +import 'package:syncrow_web/pages/routines/bloc/create_routine_bloc/create_routine_bloc.dart'; +import 'package:syncrow_web/pages/routines/bloc/routine_bloc/routine_bloc.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; +import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; +import 'package:syncrow_web/utils/app_routes.dart'; +import 'package:syncrow_web/utils/navigation_service.dart'; +import 'package:syncrow_web/utils/theme/theme.dart'; + +class SyncrowApp extends StatelessWidget { + const SyncrowApp({super.key}); + + @override + Widget build(BuildContext context) { + return MultiBlocProvider( + providers: [ + BlocProvider( + create: (context) => CreateRoutineBloc(), + ), + BlocProvider( + create: (context) => HomeBloc()..add(const FetchUserInfo()), + ), + BlocProvider( + create: (context) => VisitorPasswordBloc(), + ), + BlocProvider( + create: (context) => RoutineBloc(), + ), + BlocProvider( + create: (context) => SpaceTreeBloc(), + ), + ], + child: MaterialApp.router( + debugShowCheckedModeBanner: false, + scrollBehavior: const MaterialScrollBehavior().copyWith( + dragDevices: { + PointerDeviceKind.mouse, + PointerDeviceKind.touch, + PointerDeviceKind.stylus, + PointerDeviceKind.unknown, + }, + ), + key: NavigationService.navigatorKey, + theme: myTheme, + routerConfig: AppRoutes.router, + ), + ); + } +} diff --git a/lib/utils/app_routes.dart b/lib/utils/app_routes.dart index 263bdbd6..aea52478 100644 --- a/lib/utils/app_routes.dart +++ b/lib/utils/app_routes.dart @@ -1,17 +1,31 @@ import 'package:go_router/go_router.dart'; import 'package:syncrow_web/pages/access_management/view/access_management.dart'; import 'package:syncrow_web/pages/analytics/modules/analytics/views/analytics_page.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/device_managment/all_devices/view/device_managment_page.dart'; import 'package:syncrow_web/pages/home/view/home_page.dart'; import 'package:syncrow_web/pages/roles_and_permission/view/roles_and_permission_page.dart'; -import 'package:syncrow_web/pages/spaces_management/all_spaces/view/spaces_management_page.dart'; +import 'package:syncrow_web/pages/space_management_v2/main_module/views/space_management_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 [ +abstract final class AppRoutes { + const AppRoutes._(); + + static final GoRouter router = GoRouter( + initialLocation: RoutesConst.auth, + redirect: (context, state) async { + final checkToken = await AuthBloc.getTokenAndValidate(); + final loggedIn = checkToken == 'Success'; + final goingToLogin = state.uri.toString() == RoutesConst.auth; + + if (!loggedIn && !goingToLogin) return RoutesConst.auth; + if (loggedIn && goingToLogin) return RoutesConst.home; + + return null; + }, + routes: [ GoRoute( path: RoutesConst.auth, builder: (context, state) => const LoginPage(), @@ -43,6 +57,6 @@ class AppRoutes { name: 'analytics', builder: (context, state) => const AnalyticsPage(), ), - ]; - } + ], + ); } diff --git a/lib/utils/constants/api_const.dart b/lib/utils/constants/api_const.dart index 399cc1cd..cd424624 100644 --- a/lib/utils/constants/api_const.dart +++ b/lib/utils/constants/api_const.dart @@ -140,6 +140,7 @@ abstract class ApiEndpoints { static const String saveSchedule = '/schedule/{deviceUuid}'; + ////booking System static const String bookableSpaces = '/bookable-spaces'; static const String getCalendarEvents = '/api';