import 'dart:async'; import 'package:syncrow_web/pages/access_management/booking_system/domain/load_bookable_spaces_param.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/bookable_system_service.dart'; class DebouncedBookingSystemService implements BookableSystemService { final BookableSystemService _inner; final Duration debounceDuration; Timer? _debounceTimer; Completer? _lastCompleter; DebouncedBookingSystemService( this._inner, { this.debounceDuration = const Duration(milliseconds: 500), }); @override Future getBookableSpaces({ required LoadBookableSpacesParam 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; } }