feat: refactor code

This commit is contained in:
2026-06-17 12:57:28 +03:30
parent e9f294fa19
commit 519752b478
106 changed files with 3459 additions and 2309 deletions
@@ -0,0 +1,89 @@
/// موجودیت‌های کاتالوگ فروشگاه (مستقل از JSON).
class CoinPackage {
final String id;
final String title;
final int coins;
final int vipDays;
final int priceToman;
final int bonusPct;
const CoinPackage({
required this.id,
required this.title,
required this.coins,
required this.vipDays,
required this.priceToman,
required this.bonusPct,
});
}
class TicketPackage {
final String id;
final String title;
final int tickets;
final int priceToman;
const TicketPackage({
required this.id,
required this.title,
required this.tickets,
required this.priceToman,
});
}
class CardSkin {
final String id;
final String title;
final int priceCoins;
const CardSkin(
{required this.id, required this.title, required this.priceCoins});
}
class Booster {
final String id;
final String title;
final int multiplier;
final int hours;
final int priceToman;
const Booster({
required this.id,
required this.title,
required this.multiplier,
required this.hours,
required this.priceToman,
});
}
class VipPackage {
final String id;
final String title;
final int months;
final int priceToman;
const VipPackage({
required this.id,
required this.title,
required this.months,
required this.priceToman,
});
}
/// کلِ داده‌ی فروشگاه: کاتالوگ + کارت‌های متعلق به کاربر + کارت انتخابی.
class ShopData {
final List<CoinPackage> coinPackages;
final List<TicketPackage> ticketPackages;
final List<CardSkin> cardSkins;
final List<Booster> boosters;
final List<VipPackage> vipPackages;
final List<String> ownedCards;
final String selectedCard;
const ShopData({
required this.coinPackages,
required this.ticketPackages,
required this.cardSkins,
required this.boosters,
required this.vipPackages,
required this.ownedCards,
required this.selectedCard,
});
bool owns(String cardId) => cardId == 'simple' || ownedCards.contains(cardId);
}
@@ -0,0 +1,11 @@
import '../../../../core/resources/data_state.dart';
import '../../../../core/usecase/use_case.dart';
import '../entities/shop_entities.dart';
abstract class ShopRepository {
Future<DataState<ShopData>> getShop();
Future<DataState<String>> buyCard(String cardId);
Future<DataState<String>> selectCard(String cardId);
Future<DataState<String>> purchase(PurchaseParams params);
Future<DataState<int>> adReward(String token);
}
@@ -0,0 +1,11 @@
import '../../../../core/resources/data_state.dart';
import '../../../../core/usecase/use_case.dart';
import '../repository/shop_repository.dart';
class AdRewardUseCase implements UseCase<DataState<int>, String> {
final ShopRepository repository;
AdRewardUseCase(this.repository);
@override
Future<DataState<int>> call(String params) => repository.adReward(params);
}
@@ -0,0 +1,11 @@
import '../../../../core/resources/data_state.dart';
import '../../../../core/usecase/use_case.dart';
import '../repository/shop_repository.dart';
class BuyCardUseCase implements UseCase<DataState<String>, String> {
final ShopRepository repository;
BuyCardUseCase(this.repository);
@override
Future<DataState<String>> call(String params) => repository.buyCard(params);
}
@@ -0,0 +1,12 @@
import '../../../../core/resources/data_state.dart';
import '../../../../core/usecase/use_case.dart';
import '../entities/shop_entities.dart';
import '../repository/shop_repository.dart';
class GetShopUseCase implements UseCase<DataState<ShopData>, NoParams> {
final ShopRepository repository;
GetShopUseCase(this.repository);
@override
Future<DataState<ShopData>> call(NoParams params) => repository.getShop();
}
@@ -0,0 +1,12 @@
import '../../../../core/resources/data_state.dart';
import '../../../../core/usecase/use_case.dart';
import '../repository/shop_repository.dart';
class PurchaseUseCase implements UseCase<DataState<String>, PurchaseParams> {
final ShopRepository repository;
PurchaseUseCase(this.repository);
@override
Future<DataState<String>> call(PurchaseParams params) =>
repository.purchase(params);
}
@@ -0,0 +1,12 @@
import '../../../../core/resources/data_state.dart';
import '../../../../core/usecase/use_case.dart';
import '../repository/shop_repository.dart';
class SelectCardUseCase implements UseCase<DataState<String>, String> {
final ShopRepository repository;
SelectCardUseCase(this.repository);
@override
Future<DataState<String>> call(String params) =>
repository.selectCard(params);
}