import 'dart:async'; import 'package:meta/meta.dart'; import 'package:syncrow_web/pages/access_management/booking_system/domain/models/paginated_bookable_spaces.dart'; import 'package:syncrow_web/pages/access_management/booking_system/domain/services/booking_system_service.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart'; class DebouncedBookingSystemService implements BookingSystemService { final BookingSystemService _inner; final Duration debounceDuration; Timer? _debounceTimer; Completer? _lastCompleter; DebouncedBookingSystemService( this._inner, { this.debounceDuration = const Duration(milliseconds: 500), }); @override Future getBookableSpaces({ required LoadCommunitiesParam param, }) { _debounceTimer?.cancel(); if (_lastCompleter != null && !_lastCompleter!.isCompleted) { _lastCompleter! .completeError(StateError("Cancelled by new search")); } final completer = Completer(); _lastCompleter = completer; _debounceTimer = Timer(debounceDuration, () async { try { final result = await _inner.getBookableSpaces(param: param); if (!completer.isCompleted) { completer.complete(result); } } catch (e, st) { if (!completer.isCompleted) { completer.completeError(e, st); } } }); return completer.future; } }