add decorator layer

This commit is contained in:
Rafeek-Khoudare
2025-07-21 15:01:38 +03:00
parent c8eb07c166
commit c473325883
3 changed files with 69 additions and 41 deletions

View File

@ -0,0 +1,32 @@
import 'dart:async';
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/space_management_v2/main_module/shared/models/paginated_data_model.dart';
class NonBookableSpacesDebouncerDecoratorService
implements NonBookableSpacesService {
final NonBookableSpacesService _delegate;
Timer? _debounce;
NonBookableSpacesDebouncerDecoratorService(this._delegate);
@override
Future<PaginatedDataModel<BookableSpacemodel>> load(
NonBookableSpacesParams params) {
final completer = Completer<PaginatedDataModel<BookableSpacemodel>>();
_debounce?.cancel();
_debounce = Timer(const Duration(milliseconds: 500), () async {
try {
final result = await _delegate.load(params);
completer.complete(result);
} catch (e) {
completer.completeError(e);
}
});
return completer.future;
}
}

View File

@ -10,51 +10,44 @@ 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<PaginatedDataModel<BookableSpacemodel>> load(
NonBookableSpacesParams params) {
final completer = Completer<PaginatedDataModel<BookableSpacemodel>>();
_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<String, dynamic>;
return PaginatedDataModel.fromJson(
result,
BookableSpacemodel.fromJsonList,
);
},
);
completer.complete(response);
} on DioException catch (e) {
final message = e.response?.data as Map<String, dynamic>?;
final error = message?['error'] as Map<String, dynamic>?;
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;
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<String, dynamic>;
return PaginatedDataModel.fromJson(
result,
BookableSpacemodel.fromJsonList,
);
},
);
return response;
} on DioException catch (e) {
final message = e.response?.data as Map<String, dynamic>?;
final error = message?['error'] as Map<String, dynamic>?;
final errorMessage = error?['error'] as String? ?? '';
final formattedErrorMessage = [
_defaultErrorMessage,
errorMessage,
].join(': ');
throw APIException(formattedErrorMessage);
} catch (e) {
final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': ');
throw APIException(formattedErrorMessage);
}
}
}

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/data/non_bookable_spaces_decorator.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/data/remote_non_bookable_spaces.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/data/remote_send_bookable_spaces.dart';
import 'package:syncrow_web/pages/access_management/manage_bookable_spaces/domain/models/bookable_space_model.dart';
@ -46,7 +47,9 @@ class _SetupBookableSpacesDialogState extends State<SetupBookableSpacesDialog> {
),
BlocProvider<NonBookableSpacesBloc>(
create: (context) => NonBookableSpacesBloc(
RemoteNonBookableSpaces(HTTPService()),
NonBookableSpacesDebouncerDecoratorService(
RemoteNonBookableSpaces(HTTPService()),
),
)..add(
LoadUnBookableSpacesEvent(
nonBookableSpacesParams: