Refactor Products Module:

- Introduced ProductsBloc and updated ProductsService to remove LoadProductsParam, simplifying the product loading process.
- Updated RemoteProductsService to utilize a new API endpoint for fetching products.
- Adjusted ProductsEvent and ProductsState to reflect changes in the loading mechanism, enhancing maintainability and clarity in the products management flow.
This commit is contained in:
Faris Armoush
2025-07-06 16:44:26 +03:00
parent cebce2ce7f
commit bcd0ae4a2a
7 changed files with 23 additions and 37 deletions

View File

@ -7,6 +7,8 @@ import 'package:syncrow_web/pages/space_management_v2/modules/communities/data/s
import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/domain/params/load_communities_param.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/presentation/bloc/communities_bloc.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/presentation/bloc/communities_bloc.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/communities/presentation/communities_tree_selection_bloc/communities_tree_selection_bloc.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/communities/presentation/communities_tree_selection_bloc/communities_tree_selection_bloc.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/products/data/services/remote_products_service.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/products/presentation/bloc/products_bloc.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/space_details/data/services/remote_space_details_service.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/space_details/data/services/remote_space_details_service.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/space_details/presentation/bloc/space_details_bloc.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/space_details/presentation/bloc/space_details_bloc.dart';
import 'package:syncrow_web/services/api/http_service.dart'; import 'package:syncrow_web/services/api/http_service.dart';
@ -33,6 +35,11 @@ class SpaceManagementPage extends StatelessWidget {
RemoteSpaceDetailsService(httpService: HTTPService()), RemoteSpaceDetailsService(httpService: HTTPService()),
), ),
), ),
BlocProvider(
create: (context) => ProductsBloc(
RemoteProductsService(HTTPService()),
),
),
], ],
child: WebScaffold( child: WebScaffold(
appBarTitle: Text( appBarTitle: Text(

View File

@ -1,9 +1,9 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/models/product.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/models/product.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/params/load_products_param.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/services/products_service.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/services/products_service.dart';
import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/api_exception.dart';
import 'package:syncrow_web/services/api/http_service.dart'; import 'package:syncrow_web/services/api/http_service.dart';
import 'package:syncrow_web/utils/constants/api_const.dart';
class RemoteProductsService implements ProductsService { class RemoteProductsService implements ProductsService {
const RemoteProductsService(this._httpService); const RemoteProductsService(this._httpService);
@ -13,17 +13,14 @@ class RemoteProductsService implements ProductsService {
static const _defaultErrorMessage = 'Failed to load devices'; static const _defaultErrorMessage = 'Failed to load devices';
@override @override
Future<List<Product>> getProducts(LoadProductsParam param) async { Future<List<Product>> getProducts() async {
try { try {
final response = await _httpService.get( final response = await _httpService.get(
path: 'devices', path: ApiEndpoints.listProducts,
queryParameters: {
'spaceUuid': param.spaceUuid,
if (param.type != null) 'type': param.type,
if (param.status != null) 'status': param.status,
},
expectedResponseModel: (data) { expectedResponseModel: (data) {
return (data as List) final json = data as Map<String, dynamic>;
final products = json['data'] as List<dynamic>;
return products
.map((e) => Product.fromJson(e as Map<String, dynamic>)) .map((e) => Product.fromJson(e as Map<String, dynamic>))
.toList(); .toList();
}, },

View File

@ -1,11 +0,0 @@
class LoadProductsParam {
final String spaceUuid;
final String? type;
final String? status;
const LoadProductsParam({
required this.spaceUuid,
this.type,
this.status,
});
}

View File

@ -1,6 +1,5 @@
import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/models/product.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/models/product.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/params/load_products_param.dart';
abstract class ProductsService { abstract class ProductsService {
Future<List<Product>> getProducts(LoadProductsParam param); Future<List<Product>> getProducts();
} }

View File

@ -1,7 +1,6 @@
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/models/product.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/models/product.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/params/load_products_param.dart';
import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/services/products_service.dart'; import 'package:syncrow_web/pages/space_management_v2/modules/products/domain/services/products_service.dart';
import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/api_exception.dart';
@ -9,20 +8,20 @@ part 'products_event.dart';
part 'products_state.dart'; part 'products_state.dart';
class ProductsBloc extends Bloc<ProductsEvent, ProductsState> { class ProductsBloc extends Bloc<ProductsEvent, ProductsState> {
final ProductsService _deviceService; ProductsBloc(this._productsService) : super(ProductsInitial()) {
ProductsBloc(this._deviceService) : super(ProductsInitial()) {
on<LoadProducts>(_onLoadProducts); on<LoadProducts>(_onLoadProducts);
} }
final ProductsService _productsService;
Future<void> _onLoadProducts( Future<void> _onLoadProducts(
LoadProducts event, LoadProducts event,
Emitter<ProductsState> emit, Emitter<ProductsState> emit,
) async { ) async {
emit(ProductsLoading()); emit(ProductsLoading());
try { try {
final devices = await _deviceService.getProducts(event.param); final products = await _productsService.getProducts();
emit(ProductsLoaded(devices)); emit(ProductsLoaded(products));
} on APIException catch (e) { } on APIException catch (e) {
emit(ProductsFailure(e.message)); emit(ProductsFailure(e.message));
} catch (e) { } catch (e) {

View File

@ -8,10 +8,5 @@ sealed class ProductsEvent extends Equatable {
} }
final class LoadProducts extends ProductsEvent { final class LoadProducts extends ProductsEvent {
const LoadProducts(this.param); const LoadProducts();
final LoadProductsParam param;
@override
List<Object> get props => [param];
} }

View File

@ -21,10 +21,10 @@ final class ProductsLoaded extends ProductsState {
} }
final class ProductsFailure extends ProductsState { final class ProductsFailure extends ProductsState {
final String message; final String errorMessage;
const ProductsFailure(this.message); const ProductsFailure(this.errorMessage);
@override @override
List<Object> get props => [message]; List<Object> get props => [errorMessage];
} }