Files
front-hokm/lib/features/shop/shop_cubit.dart
T
2026-06-15 16:42:28 +03:30

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}'),
'سکه رایگان دریافت شد',
);
}