From 739b491bd82bbe74cd9cb3568d42d53540985ea2 Mon Sep 17 00:00:00 2001 From: Rafeek-Khoudare Date: Wed, 16 Jul 2025 11:21:32 +0300 Subject: [PATCH] debouncer Note --- .../data/remote_non_bookable_spaces.dart | 75 +++++++++++-------- .../widgets/space_step_part_widget.dart | 24 +++--- 2 files changed, 53 insertions(+), 46 deletions(-) diff --git a/lib/pages/access_management/manage_bookable_spaces/data/remote_non_bookable_spaces.dart b/lib/pages/access_management/manage_bookable_spaces/data/remote_non_bookable_spaces.dart index 5b286e5e..c42e8129 100644 --- a/lib/pages/access_management/manage_bookable_spaces/data/remote_non_bookable_spaces.dart +++ b/lib/pages/access_management/manage_bookable_spaces/data/remote_non_bookable_spaces.dart @@ -1,51 +1,62 @@ +import 'dart:async'; + import 'package:dio/dio.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/models/bookable_space_model.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/params/non_bookable_spaces_params.dart'; -import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/service/non_bookable_spaces_service.dart'; import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/params/send_bookable_spaces_to_api_params.dart'; +import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/service/non_bookable_spaces_service.dart'; import 'package:syncrow_web/pages/space_management_v2/main_module/shared/models/paginated_data_model.dart'; import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/http_service.dart'; import 'package:syncrow_web/utils/constants/api_const.dart'; class RemoteNonBookableSpaces implements NonBookableSpacesService { + Timer? _debounce; + final HTTPService _httpService; RemoteNonBookableSpaces(this._httpService); static const _defaultErrorMessage = 'Failed to load Spaces'; @override Future> load( - NonBookableSpacesParams params) async { - try { - final response = await _httpService.get( - path: ApiEndpoints.bookableSpaces, - queryParameters: { - 'configured': false, - 'page': params.currentPage, - 'search': params.searchedWords, - }, - expectedResponseModel: (json) { - final result = json as Map; - return PaginatedDataModel.fromJson( - result, - BookableSpacemodel.fromJsonList, - ); - }, - ); - return response; - } on DioException catch (e) { - final message = e.response?.data as Map?; - final error = message?['error'] as Map?; - final errorMessage = error?['error'] as String? ?? ''; - final formattedErrorMessage = [ - _defaultErrorMessage, - errorMessage, - ].join(': '); - throw APIException(formattedErrorMessage); - } catch (e) { - final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': '); - throw APIException(formattedErrorMessage); - } + NonBookableSpacesParams params) { + final completer = Completer>(); + + _debounce?.cancel(); + _debounce = Timer(const Duration(milliseconds: 500), () async { + try { + final response = await _httpService.get( + path: ApiEndpoints.bookableSpaces, + queryParameters: { + 'configured': false, + 'page': params.currentPage, + 'search': params.searchedWords, + }, + expectedResponseModel: (json) { + final result = json as Map; + return PaginatedDataModel.fromJson( + result, + BookableSpacemodel.fromJsonList, + ); + }, + ); + completer.complete(response); + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [ + _defaultErrorMessage, + errorMessage, + ].join(': '); + completer.completeError(APIException(formattedErrorMessage)); + } catch (e) { + final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': '); + completer.completeError(APIException(formattedErrorMessage)); + } + }); + + return completer.future; } @override diff --git a/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/space_step_part_widget.dart b/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/space_step_part_widget.dart index 13a89106..953ec1f6 100644 --- a/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/space_step_part_widget.dart +++ b/lib/pages/access_management/manage_bookable_spaces/presentation/widgets/space_step_part_widget.dart @@ -19,7 +19,6 @@ class SpacesStepDetailsWidget extends StatefulWidget { } class _SpacesStepDetailsWidgetState extends State { - Timer? _debounce; ScrollController scrollController = ScrollController(); int currentPage = 1; String? currentSearchTerm; @@ -94,7 +93,7 @@ class _SpacesStepDetailsWidgetState extends State { padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 20), decoration: const BoxDecoration( - color: Color(0xFFF8F8F8), + color: ColorsManager.circleRolesBackground, borderRadius: BorderRadius.vertical( top: Radius.circular(20), ), @@ -102,19 +101,16 @@ class _SpacesStepDetailsWidgetState extends State { child: SearchUnbookableSpacesWidget( title: 'Search', onChanged: (p0) { - if (_debounce?.isActive ?? false) _debounce!.cancel(); - _debounce = Timer(const Duration(milliseconds: 500), () { - currentSearchTerm = p0; - currentPage = 1; - context.read().add( - LoadUnBookableSpacesEvent( - nonBookableSpacesParams: NonBookableSpacesParams( - currentPage: currentPage, - searchedWords: currentSearchTerm, - ), + currentSearchTerm = p0; + currentPage = 1; + context.read().add( + LoadUnBookableSpacesEvent( + nonBookableSpacesParams: NonBookableSpacesParams( + currentPage: currentPage, + searchedWords: currentSearchTerm, ), - ); - }); + ), + ); }, ), ),