Initial commit: Uruk Prize Platform architecture, backend core, mobile app, gateway caller & deployment pipeline

This commit is contained in:
Hamza-Ayed
2026-09-18 17:12:05 +03:00
commit 879dd36f1b
1149 changed files with 97122 additions and 0 deletions
@@ -0,0 +1,45 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../core/network/api_client.dart';
import 'membership_state.dart';
class MembershipCubit extends Cubit<MembershipState> {
final ApiClient _apiClient;
MembershipCubit({ApiClient? apiClient})
: _apiClient = apiClient ?? ApiClient(),
super(MembershipInitial());
Future<void> fetchCardDetails() async {
emit(MembershipLoading());
try {
final res = await _apiClient.get('/api/v1/subscription/my-card');
final data = res['data'] as Map<String, dynamic>;
emit(MembershipLoaded(cardData: data));
} on ApiException catch (e) {
if (e.statusCode == 404) {
emit(MembershipNotSubscribed());
} else {
emit(MembershipFailure(e.message));
}
} catch (e) {
emit(MembershipFailure(e.toString()));
}
}
Future<void> refreshDynamicQr() async {
if (state is! MembershipLoaded) return;
final current = state as MembershipLoaded;
try {
final res = await _apiClient.get('/api/v1/qr/dynamic-token');
final data = res['data'] as Map<String, dynamic>;
emit(current.copyWith(
dynamicQrToken: data['token'] as String?,
qrValidUntil: data['valid_until'] as int?,
));
} catch (e) {
emit(MembershipFailure('تعذر تحديث كود التحقق: $e'));
}
}
}
@@ -0,0 +1,52 @@
import 'package:equatable/equatable.dart';
abstract class MembershipState extends Equatable {
const MembershipState();
@override
List<Object?> get props => [];
}
class MembershipInitial extends MembershipState {}
class MembershipLoading extends MembershipState {}
class MembershipLoaded extends MembershipState {
final Map<String, dynamic> cardData;
final String? dynamicQrToken;
final int? qrValidUntil;
const MembershipLoaded({
required this.cardData,
this.dynamicQrToken,
this.qrValidUntil,
});
bool get isActive => cardData['status'] == 'ACTIVE';
MembershipLoaded copyWith({
Map<String, dynamic>? cardData,
String? dynamicQrToken,
int? qrValidUntil,
}) {
return MembershipLoaded(
cardData: cardData ?? this.cardData,
dynamicQrToken: dynamicQrToken ?? this.dynamicQrToken,
qrValidUntil: qrValidUntil ?? this.qrValidUntil,
);
}
@override
List<Object?> get props => [cardData, dynamicQrToken, qrValidUntil];
}
class MembershipNotSubscribed extends MembershipState {}
class MembershipFailure extends MembershipState {
final String message;
const MembershipFailure(this.message);
@override
List<Object?> get props => [message];
}