80 lines
2.6 KiB
Dart
80 lines
2.6 KiB
Dart
import 'package:dio/dio.dart';
|
|
import 'package:equatable/equatable.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
|
|
import 'shop_models.dart';
|
|
import 'shop_repository.dart';
|
|
|
|
enum ShopStatus { initial, loading, loaded, error }
|
|
|
|
class ShopState extends Equatable {
|
|
final ShopStatus status;
|
|
final ShopData? data;
|
|
final bool busy; // در حال انجام یک عملیات (خرید/انتخاب)
|
|
|
|
const ShopState({this.status = ShopStatus.initial, this.data, this.busy = false});
|
|
|
|
ShopState copyWith({ShopStatus? status, ShopData? data, bool? busy}) => ShopState(
|
|
status: status ?? this.status,
|
|
data: data ?? this.data,
|
|
busy: busy ?? this.busy,
|
|
);
|
|
|
|
@override
|
|
List<Object?> get props => [status, data, busy];
|
|
}
|
|
|
|
class ShopCubit extends Cubit<ShopState> {
|
|
final ShopRepository _repo;
|
|
ShopCubit(this._repo) : super(const ShopState());
|
|
|
|
Future<void> load() async {
|
|
emit(state.copyWith(status: ShopStatus.loading));
|
|
try {
|
|
emit(state.copyWith(status: ShopStatus.loaded, data: await _repo.getShop()));
|
|
} catch (_) {
|
|
emit(state.copyWith(status: ShopStatus.error));
|
|
}
|
|
}
|
|
|
|
/// یک عملیات را اجرا، فروشگاه را بازخوانی و پیام نتیجه را برمیگرداند.
|
|
Future<String> _run(Future<void> Function() action, String okMsg) async {
|
|
if (state.busy) return '';
|
|
emit(state.copyWith(busy: true));
|
|
try {
|
|
await action();
|
|
final data = await _repo.getShop();
|
|
emit(state.copyWith(status: ShopStatus.loaded, data: data, busy: false));
|
|
return okMsg;
|
|
} on DioException catch (e) {
|
|
emit(state.copyWith(busy: false));
|
|
final d = e.response?.data;
|
|
if (d is Map && d['message'] != null) return d['message'].toString();
|
|
return 'خطا در ارتباط با سرور';
|
|
} catch (_) {
|
|
emit(state.copyWith(busy: false));
|
|
return 'خطای نامشخص';
|
|
}
|
|
}
|
|
|
|
Future<String> buyCard(String id) => _run(() => _repo.buyCard(id), 'کارت خریداری شد');
|
|
|
|
Future<String> selectCard(String id) =>
|
|
_run(() => _repo.selectCard(id), 'کارت انتخاب شد');
|
|
|
|
Future<String> purchase(String kind, String id) => _run(
|
|
() => _repo.purchase(
|
|
store: 'bazaar',
|
|
kind: kind,
|
|
productId: id,
|
|
token: 'dev-$kind-$id-${DateTime.now().millisecondsSinceEpoch}',
|
|
),
|
|
'خرید با موفقیت انجام شد',
|
|
);
|
|
|
|
Future<String> claimAd() => _run(
|
|
() => _repo.adReward('dev-ad-${DateTime.now().millisecondsSinceEpoch}'),
|
|
'سکه رایگان دریافت شد',
|
|
);
|
|
}
|