|
|
@ -1,5 +1,6 @@ |
|
|
|
import 'dart:async'; |
|
|
|
import 'dart:async'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import 'package:thesis_shop/bloc/user_bloc.dart'; |
|
|
|
import 'package:thesis_shop/models/product.dart'; |
|
|
|
import 'package:thesis_shop/models/product.dart'; |
|
|
|
import 'package:thesis_shop/service/product_service.dart'; |
|
|
|
import 'package:thesis_shop/service/product_service.dart'; |
|
|
|
import 'package:thesis_shop/utils/disposable.dart'; |
|
|
|
import 'package:thesis_shop/utils/disposable.dart'; |
|
|
@ -9,7 +10,9 @@ part 'product_bloc_states.dart'; |
|
|
|
|
|
|
|
|
|
|
|
class ProductBloc implements Disposable { |
|
|
|
class ProductBloc implements Disposable { |
|
|
|
final ProductService _productService; |
|
|
|
final ProductService _productService; |
|
|
|
|
|
|
|
final UserBloc _userBloc; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool _hasDiscount; |
|
|
|
var _productsState = ProductsState.loading(); |
|
|
|
var _productsState = ProductsState.loading(); |
|
|
|
ProductsState get productsState => _productsState; |
|
|
|
ProductsState get productsState => _productsState; |
|
|
|
|
|
|
|
|
|
|
@ -23,17 +26,49 @@ class ProductBloc implements Disposable { |
|
|
|
Sink<LoadProductEvent> get loadProductSink => |
|
|
|
Sink<LoadProductEvent> get loadProductSink => |
|
|
|
_loadProductEventController.sink; |
|
|
|
_loadProductEventController.sink; |
|
|
|
|
|
|
|
|
|
|
|
ProductBloc(this._productService) { |
|
|
|
ProductBloc(this._productService, this._userBloc) |
|
|
|
|
|
|
|
: _hasDiscount = _userBloc.isSignedIn { |
|
|
|
|
|
|
|
_handleUserEvents(); |
|
|
|
_handleLoadProductEvents(); |
|
|
|
_handleLoadProductEvents(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void _handleUserEvents() { |
|
|
|
|
|
|
|
_userBloc.isSignedInStream.listen((isSignedIn) { |
|
|
|
|
|
|
|
if (isSignedIn && !_hasDiscount) { |
|
|
|
|
|
|
|
if (_productsState.isLoaded()) { |
|
|
|
|
|
|
|
final discountedProducts = _productsState |
|
|
|
|
|
|
|
.as<ProductsLoaded>() |
|
|
|
|
|
|
|
.products |
|
|
|
|
|
|
|
.map((product) => product.copyWithDiscount()) |
|
|
|
|
|
|
|
.toList(); |
|
|
|
|
|
|
|
_productsState = ProductsState.loaded(discountedProducts); |
|
|
|
|
|
|
|
_productsStateSink.add(_productsState); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else if (!isSignedIn && _hasDiscount) { |
|
|
|
|
|
|
|
final undiscountedProducts = _productsState |
|
|
|
|
|
|
|
.as<ProductsLoaded>() |
|
|
|
|
|
|
|
.products |
|
|
|
|
|
|
|
.map((product) => product.copyWithoutDiscount()) |
|
|
|
|
|
|
|
.toList(); |
|
|
|
|
|
|
|
_productsState = ProductsState.loaded(undiscountedProducts); |
|
|
|
|
|
|
|
_productsStateSink.add(_productsState); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
_hasDiscount = isSignedIn; |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void _handleLoadProductEvents() { |
|
|
|
void _handleLoadProductEvents() { |
|
|
|
_loadProductEventController.stream.listen((_) async { |
|
|
|
_loadProductEventController.stream.listen((_) async { |
|
|
|
_productsState = ProductsState.loading(); |
|
|
|
_productsState = ProductsState.loading(); |
|
|
|
_productsStateSink.add(_productsState); |
|
|
|
_productsStateSink.add(_productsState); |
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
final products = await _productService.fetchProducts(); |
|
|
|
var products = await _productService.fetchProducts(); |
|
|
|
|
|
|
|
_hasDiscount = _userBloc.isSignedIn; |
|
|
|
|
|
|
|
if (_hasDiscount) { |
|
|
|
|
|
|
|
products = |
|
|
|
|
|
|
|
products.map((product) => product.copyWithDiscount()).toList(); |
|
|
|
|
|
|
|
} |
|
|
|
_productsState = ProductsState.loaded(products); |
|
|
|
_productsState = ProductsState.loaded(products); |
|
|
|
_productsStateSink.add(_productsState); |
|
|
|
_productsStateSink.add(_productsState); |
|
|
|
} catch (err) { |
|
|
|
} catch (err) { |
|
|
|