mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-08-25 15:39:41 +00:00
48 lines
1.5 KiB
Dart
48 lines
1.5 KiB
Dart
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<PaginatedBookableSpaces>? _lastCompleter;
|
|
|
|
DebouncedBookingSystemService(
|
|
this._inner, {
|
|
this.debounceDuration = const Duration(milliseconds: 500),
|
|
});
|
|
|
|
@override
|
|
Future<PaginatedBookableSpaces> getBookableSpaces({
|
|
required LoadCommunitiesParam param,
|
|
}) {
|
|
_debounceTimer?.cancel();
|
|
if (_lastCompleter != null && !_lastCompleter!.isCompleted) {
|
|
_lastCompleter!
|
|
.completeError(StateError("Cancelled by new search"));
|
|
}
|
|
|
|
final completer = Completer<PaginatedBookableSpaces>();
|
|
_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;
|
|
}
|
|
}
|