diff --git a/lib/main.dart b/lib/main.dart index fe14241e..ffd18f31 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -58,7 +58,7 @@ class MyApp extends StatelessWidget { BlocProvider( create: (context) => HomeBloc(projectCubit)..add(const FetchUserInfo())), BlocProvider( - create: (context) => VisitorPasswordBloc(), + create: (context) => VisitorPasswordBloc(projectCubit), ), BlocProvider( create: (context) => RoutineBloc(projectCubit), diff --git a/lib/pages/access_management/bloc/access_bloc.dart b/lib/pages/access_management/bloc/access_bloc.dart index 3e74dbff..ac94036c 100644 --- a/lib/pages/access_management/bloc/access_bloc.dart +++ b/lib/pages/access_management/bloc/access_bloc.dart @@ -3,14 +3,18 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_event.dart'; 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/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/common/hour_picker_dialog.dart'; import 'package:syncrow_web/services/access_mang_api.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/app_enum.dart'; +import 'package:syncrow_web/utils/constants/temp_const.dart'; import 'package:syncrow_web/utils/snack_bar.dart'; class AccessBloc extends Bloc { - AccessBloc() : super((AccessInitial())) { + final ProjectCubit projectCubit; + + AccessBloc(this.projectCubit) : super((AccessInitial())) { on(_onFetchTableData); on(selectTime); on(_filterData); @@ -30,8 +34,10 @@ class AccessBloc extends Bloc { Future _onFetchTableData( FetchTableData event, Emitter emit) async { try { + final projectUuid = projectCubit.state; emit(AccessLoaded()); - data = await AccessMangApi().fetchVisitorPassword(); + data = await AccessMangApi() + .fetchVisitorPassword(projectUuid ?? TempConst.projectId); filteredData = data; updateTabsCount(); emit(TableLoaded(data)); @@ -88,8 +94,8 @@ class AccessBloc extends Bloc { return Theme( data: ThemeData.light().copyWith( colorScheme: ColorScheme.light( - primary: ColorsManager.blackColor, - onPrimary: Colors.white, + primary: ColorsManager.blackColor, + onPrimary: Colors.white, onSurface: ColorsManager.grayColor, ), textButtonTheme: TextButtonThemeData( diff --git a/lib/pages/access_management/view/access_management.dart b/lib/pages/access_management/view/access_management.dart index 9fe3a722..620dd566 100644 --- a/lib/pages/access_management/view/access_management.dart +++ b/lib/pages/access_management/view/access_management.dart @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.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'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/common/buttons/search_reset_buttons.dart'; import 'package:syncrow_web/pages/common/custom_table.dart'; @@ -39,7 +40,7 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { ), rightBody: const NavigateHomeGridView(), scaffoldBody: BlocProvider( - create: (BuildContext context) => AccessBloc()..add(FetchTableData()), + create: (BuildContext context) => AccessBloc(context.read())..add(FetchTableData()), child: BlocConsumer( listener: (context, state) {}, builder: (context, state) { diff --git a/lib/pages/visitor_password/bloc/visitor_password_bloc.dart b/lib/pages/visitor_password/bloc/visitor_password_bloc.dart index aeb53260..02dc0dd3 100644 --- a/lib/pages/visitor_password/bloc/visitor_password_bloc.dart +++ b/lib/pages/visitor_password/bloc/visitor_password_bloc.dart @@ -3,6 +3,7 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:intl/intl.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/common/custom_dialog.dart'; import 'package:syncrow_web/pages/common/hour_picker_dialog.dart'; import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_event.dart'; @@ -13,10 +14,14 @@ import 'package:syncrow_web/pages/visitor_password/model/schedule_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/assets.dart'; +import 'package:syncrow_web/utils/constants/temp_const.dart'; import 'package:syncrow_web/utils/snack_bar.dart'; -class VisitorPasswordBloc extends Bloc { - VisitorPasswordBloc() : super(VisitorPasswordInitial()) { +class VisitorPasswordBloc + extends Bloc { + final ProjectCubit projectCubit; + + VisitorPasswordBloc(this.projectCubit) : super(VisitorPasswordInitial()) { on(selectUsageFrequency); on(_onFetchDevice); on(selectAccessType); @@ -38,7 +43,8 @@ class VisitorPasswordBloc extends Bloc selectedDevices = []; List data = []; @@ -64,12 +70,14 @@ class VisitorPasswordBloc extends Bloc emit) { + selectAccessType( + SelectPasswordType event, Emitter emit) { accessTypeSelected = event.type; emit(PasswordTypeSelected(event.type)); } - selectUsageFrequency(SelectUsageFrequency event, Emitter emit) { + selectUsageFrequency( + SelectUsageFrequency event, Emitter emit) { usageFrequencySelected = event.usageType; emit(UsageFrequencySelected(event.usageType)); } @@ -116,10 +124,12 @@ class VisitorPasswordBloc extends Bloc expirationTimeTimeStamp!) { + if (expirationTimeTimeStamp != null && + selectedTimestamp > expirationTimeTimeStamp!) { CustomSnackBar.displaySnackBar( 'Effective Time cannot be later than Expiration Time.', ); @@ -128,7 +138,8 @@ class VisitorPasswordBloc extends Bloc emit) { + bool toggleRepeat( + ToggleRepeatEvent event, Emitter emit) { emit(LoadingInitialState()); repeat = !repeat; emit(IsRepeatState(repeat: repeat)); @@ -175,10 +187,14 @@ class VisitorPasswordBloc extends Bloc _onFetchDevice(FetchDevice event, Emitter emit) async { + Future _onFetchDevice( + FetchDevice event, Emitter emit) async { try { emit(DeviceLoaded()); - data = await AccessMangApi().fetchDevices(); + final projectUuid = projectCubit.state; + + data = await AccessMangApi() + .fetchDevices(projectUuid ?? TempConst.projectId); emit(TableLoaded(data)); } catch (e) { emit(FailedState(e.toString())); @@ -186,8 +202,8 @@ class VisitorPasswordBloc extends Bloc postOnlineOneTimePassword( - OnlineOneTimePasswordEvent event, Emitter emit) async { + Future postOnlineOneTimePassword(OnlineOneTimePasswordEvent event, + Emitter emit) async { try { emit(LoadingInitialState()); generate7DigitNumber(); @@ -211,7 +227,8 @@ class VisitorPasswordBloc extends Bloc postOnlineMultipleTimePassword( - OnlineMultipleTimePasswordEvent event, Emitter emit) async { + OnlineMultipleTimePasswordEvent event, + Emitter emit) async { try { emit(LoadingInitialState()); @@ -221,7 +238,8 @@ class VisitorPasswordBloc extends Bloc postOfflineOneTimePassword( - OfflineOneTimePasswordEvent event, Emitter emit) async { + Future postOfflineOneTimePassword(OfflineOneTimePasswordEvent event, + Emitter emit) async { try { emit(LoadingInitialState()); await generate7DigitNumber(); var res = await AccessMangApi().postOffLineOneTime( - email: event.email, devicesUuid: selectedDevices, passwordName: event.passwordName); + email: event.email, + devicesUuid: selectedDevices, + passwordName: event.passwordName); if (res['statusCode'] == 201) { passwordStatus = PasswordStatus.fromJson(res['data']); emit(SuccessState()); @@ -264,7 +284,8 @@ class VisitorPasswordBloc extends Bloc postOfflineMultipleTimePassword( - OfflineMultipleTimePasswordEvent event, Emitter emit) async { + OfflineMultipleTimePasswordEvent event, + Emitter emit) async { try { emit(LoadingInitialState()); await generate7DigitNumber(); @@ -287,7 +308,8 @@ class VisitorPasswordBloc extends Bloc emit) { + void selectDevice( + SelectDeviceEvent event, Emitter emit) { if (selectedDeviceIds.contains(event.deviceId)) { selectedDeviceIds.remove(event.deviceId); } else { @@ -329,7 +351,8 @@ class VisitorPasswordBloc extends Bloc mapEventToState(VisitorPasswordEvent event) async* { + Stream mapEventToState( + VisitorPasswordEvent event) async* { if (event is FetchDevice) { } else if (event is UpdateFilteredDevicesEvent) { yield TableLoaded(event.filteredData); @@ -378,16 +401,20 @@ class VisitorPasswordBloc extends Bloc expirationTimeTimeStamp!) { - accessPeriodValidate = "Effective Time cannot be later than Expiration Time."; + if (expirationTimeTimeStamp != null && + selectedTimestamp > expirationTimeTimeStamp!) { + accessPeriodValidate = + "Effective Time cannot be later than Expiration Time."; } else { accessPeriodValidate = ''; effectiveTime = selectedDateTime.toString().split('.').first; effectiveTimeTimeStamp = selectedTimestamp; } } else { - if (effectiveTimeTimeStamp != null && selectedTimestamp < effectiveTimeTimeStamp!) { - accessPeriodValidate = 'Expiration Time cannot be earlier than Effective Time.'; + if (effectiveTimeTimeStamp != null && + selectedTimestamp < effectiveTimeTimeStamp!) { + accessPeriodValidate = + 'Expiration Time cannot be earlier than Effective Time.'; } else { accessPeriodValidate = ''; expirationTime = selectedDateTime.toString().split('.').first; diff --git a/lib/pages/visitor_password/view/add_device_dialog.dart b/lib/pages/visitor_password/view/add_device_dialog.dart index ebc41292..f560b390 100644 --- a/lib/pages/visitor_password/view/add_device_dialog.dart +++ b/lib/pages/visitor_password/view/add_device_dialog.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_web/pages/common/access_device_table.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/common/text_field/custom_web_textfield.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; @@ -19,7 +20,7 @@ class AddDeviceDialog extends StatelessWidget { Widget build(BuildContext context) { Size size = MediaQuery.of(context).size; return BlocProvider( - create: (context) => VisitorPasswordBloc()..add(FetchDevice()), + create: (context) => VisitorPasswordBloc(context.read())..add(FetchDevice()), child: BlocBuilder( builder: (BuildContext context, VisitorPasswordState state) { final visitorBloc = BlocProvider.of(context); diff --git a/lib/pages/visitor_password/view/visitor_password_dialog.dart b/lib/pages/visitor_password/view/visitor_password_dialog.dart index 1f014352..d610e36e 100644 --- a/lib/pages/visitor_password/view/visitor_password_dialog.dart +++ b/lib/pages/visitor_password/view/visitor_password_dialog.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/common/date_time_widget.dart'; import 'package:syncrow_web/pages/common/text_field/custom_web_textfield.dart'; @@ -22,7 +23,7 @@ class VisitorPasswordDialog extends StatelessWidget { Size size = MediaQuery.of(context).size; var text = Theme.of(context).textTheme.bodySmall!.copyWith(color: Colors.black, fontSize: 13); return BlocProvider( - create: (context) => VisitorPasswordBloc(), + create: (context) => VisitorPasswordBloc(context.read()), child: BlocListener( listener: (context, state) { final visitorBloc = BlocProvider.of(context); diff --git a/lib/services/access_mang_api.dart b/lib/services/access_mang_api.dart index 103f6121..6acbc395 100644 --- a/lib/services/access_mang_api.dart +++ b/lib/services/access_mang_api.dart @@ -6,10 +6,10 @@ import 'package:syncrow_web/services/api/http_service.dart'; import 'package:syncrow_web/utils/constants/api_const.dart'; class AccessMangApi { - Future> fetchVisitorPassword() async { + Future> fetchVisitorPassword(String projectId) async { try { final response = await HTTPService().get( - path: ApiEndpoints.visitorPassword, + path: ApiEndpoints.visitorPassword.replaceAll('{projectId}', projectId), showServerMessage: true, expectedResponseModel: (json) { List jsonData = json; @@ -25,10 +25,10 @@ class AccessMangApi { } } - Future fetchDevices() async { + Future fetchDevices(String projectId) async { try { final response = await HTTPService().get( - path: ApiEndpoints.getDevices, + path: ApiEndpoints.getDevices.replaceAll('{projectId}', projectId), showServerMessage: true, expectedResponseModel: (json) { List jsonData = json; @@ -86,7 +86,8 @@ class AccessMangApi { "invalidTime": invalidTime, }; if (scheduleList != null) { - body["scheduleList"] = scheduleList.map((schedule) => schedule.toJson()).toList(); + body["scheduleList"] = + scheduleList.map((schedule) => schedule.toJson()).toList(); } final response = await HTTPService().post( path: ApiEndpoints.sendOnlineMultipleTime, @@ -105,7 +106,11 @@ class AccessMangApi { {String? email, String? passwordName, List? devicesUuid}) async { final response = await HTTPService().post( path: ApiEndpoints.sendOffLineOneTime, - body: jsonEncode({"email": email, "passwordName": passwordName, "devicesUuid": devicesUuid}), + body: jsonEncode({ + "email": email, + "passwordName": passwordName, + "devicesUuid": devicesUuid + }), showServerMessage: true, expectedResponseModel: (json) { return json; diff --git a/lib/services/devices_mang_api.dart b/lib/services/devices_mang_api.dart index d671038f..655c6a83 100644 --- a/lib/services/devices_mang_api.dart +++ b/lib/services/devices_mang_api.dart @@ -20,7 +20,7 @@ class DevicesManagementApi { .replaceAll('{spaceUuid}', spaceId) .replaceAll('{communityUuid}', communityId) .replaceAll('{projectId}', projectId) - : ApiEndpoints.getAllDevices, + : ApiEndpoints.getAllDevices.replaceAll('{projectId}', projectId), showServerMessage: true, expectedResponseModel: (json) { List jsonData = diff --git a/lib/utils/constants/api_const.dart b/lib/utils/constants/api_const.dart index ee41cfa0..72a2b778 100644 --- a/lib/utils/constants/api_const.dart +++ b/lib/utils/constants/api_const.dart @@ -9,8 +9,8 @@ abstract class ApiEndpoints { static const String sendOtp = '/authentication/user/send-otp'; static const String verifyOtp = '/authentication/user/verify-otp'; static const String getRegion = '/region'; - static const String visitorPassword = '/visitor-password'; - static const String getDevices = '/visitor-password/devices'; + static const String visitorPassword = '/projects/{projectId}/visitor-password'; + static const String getDevices = '/projects/{projectId}/visitor-password/devices'; static const String sendOnlineOneTime = '/visitor-password/temporary-password/online/one-time'; static const String sendOnlineMultipleTime = @@ -25,7 +25,7 @@ abstract class ApiEndpoints { ////// Devices Management //////////////// - static const String getAllDevices = '/device'; + static const String getAllDevices = '/projects/{projectId}/device'; static const String getSpaceDevices = '/projects/{projectId}/communities/{communityUuid}/spaces/{spaceUuid}/devices'; static const String getDeviceStatus = '/device/{uuid}/functions/status';