api intigreted of scan Qr and recent scan histoy ,scan history,scan history details

This commit is contained in:
Raj.Ghag
2026-04-17 15:55:54 +05:30
parent f301585948
commit 94cd74a135
60 changed files with 3678 additions and 1119 deletions

View File

@@ -0,0 +1,26 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:equatable/equatable.dart';
import '../../repository/recent_scan_history_repository.dart';
import '../../models/recent_scan_history_model.dart';
part 'recent_scan_history_event.dart';
part 'recent_scan_history_state.dart';
class RecentScanHistoryBloc extends Bloc<RecentScanHistoryEvent, RecentScanHistoryState> {
final RecentScanHistoryRepository _repository;
RecentScanHistoryBloc(this._repository) : super(RecentScanHistoryInitial()) {
on<FetchRecentScanHistory>(_onFetchRecentScanHistory);
}
Future<void> _onFetchRecentScanHistory(
FetchRecentScanHistory event, Emitter<RecentScanHistoryState> emit) async {
emit(RecentScanHistoryLoading());
try {
final history = await _repository.fetchRecentScanHistory();
emit(RecentScanHistoryLoaded(history));
} catch (e) {
emit(RecentScanHistoryError(e.toString()));
}
}
}

View File

@@ -0,0 +1,10 @@
part of 'recent_scan_history_bloc.dart';
abstract class RecentScanHistoryEvent extends Equatable {
const RecentScanHistoryEvent();
@override
List<Object> get props => [];
}
class FetchRecentScanHistory extends RecentScanHistoryEvent {}

View File

@@ -0,0 +1,30 @@
part of 'recent_scan_history_bloc.dart';
abstract class RecentScanHistoryState extends Equatable {
const RecentScanHistoryState();
@override
List<Object?> get props => [];
}
class RecentScanHistoryInitial extends RecentScanHistoryState {}
class RecentScanHistoryLoading extends RecentScanHistoryState {}
class RecentScanHistoryLoaded extends RecentScanHistoryState {
final List<RecentScanHistory> history;
const RecentScanHistoryLoaded(this.history);
@override
List<Object?> get props => [history];
}
class RecentScanHistoryError extends RecentScanHistoryState {
final String message;
const RecentScanHistoryError(this.message);
@override
List<Object?> get props => [message];
}

View File

@@ -0,0 +1,70 @@
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import '../../repository/submit_qr_code_repository.dart';
part 'submit_qr_code_event.dart';
part 'submit_qr_code_state.dart';
class SubmitQrCodeBloc
extends Bloc<SubmitQrCodeEvent, SubmitQrCodeState> {
final SubmitQrCodeRepository _repository;
SubmitQrCodeBloc({SubmitQrCodeRepository? repository})
: _repository = repository ?? SubmitQrCodeRepository(),
super(const SubmitQrCodeInitial()) {
on<SubmitQrCodeEventTriggered>(_onSubmitQrCode);
on<ResetSubmitQrCodeEvent>(_onReset);
}
Future<void> _onSubmitQrCode(
SubmitQrCodeEventTriggered event,
Emitter<SubmitQrCodeState> emit,
) async {
if (event.qrCode.trim().isEmpty) {
emit(const SubmitQrCodeFailure(
errorMessage: 'QR code cannot be empty'));
return;
}
emit(const SubmitQrCodeLoading());
try {
final response = await _repository.submitQrCode(
qrCode: event.qrCode,
);
final success = response['success'] == true;
final message = response['message']?.toString();
final error = response['error']?.toString();
if (success) {
emit(SubmitQrCodeSuccess(
data: response,
message: message,
));
} else {
emit(SubmitQrCodeFailure(
errorMessage: message ?? 'Failed to submit QR Code',
error: error,
));
}
} on Exception catch (e) {
emit(SubmitQrCodeFailure(
errorMessage: e.toString().replaceFirst('Exception: ', ''),
));
} catch (e) {
emit(SubmitQrCodeFailure(
errorMessage: 'Unexpected error: $e',
));
}
}
void _onReset(
ResetSubmitQrCodeEvent event,
Emitter<SubmitQrCodeState> emit,
) {
emit(const SubmitQrCodeInitial());
}
}

View File

@@ -0,0 +1,21 @@
part of 'submit_qr_code_bloc.dart';
abstract class SubmitQrCodeEvent extends Equatable {
const SubmitQrCodeEvent();
@override
List<Object?> get props => [];
}
class SubmitQrCodeEventTriggered extends SubmitQrCodeEvent {
final String qrCode;
const SubmitQrCodeEventTriggered({required this.qrCode});
@override
List<Object?> get props => [qrCode];
}
class ResetSubmitQrCodeEvent extends SubmitQrCodeEvent {
const ResetSubmitQrCodeEvent();
}

View File

@@ -0,0 +1,42 @@
part of 'submit_qr_code_bloc.dart';
abstract class SubmitQrCodeState extends Equatable {
const SubmitQrCodeState();
@override
List<Object?> get props => [];
}
class SubmitQrCodeInitial extends SubmitQrCodeState {
const SubmitQrCodeInitial();
}
class SubmitQrCodeLoading extends SubmitQrCodeState {
const SubmitQrCodeLoading();
}
class SubmitQrCodeSuccess extends SubmitQrCodeState {
final Map<String, dynamic> data;
final String? message;
const SubmitQrCodeSuccess({
required this.data,
this.message,
});
@override
List<Object?> get props => [data, message];
}
class SubmitQrCodeFailure extends SubmitQrCodeState {
final String errorMessage;
final String? error;
const SubmitQrCodeFailure({
required this.errorMessage,
this.error,
});
@override
List<Object?> get props => [errorMessage, error];
}

View File

@@ -0,0 +1,100 @@
import 'package:intl/intl.dart';
class RecentScanHistoryResponse {
final List<RecentScanHistory> data;
RecentScanHistoryResponse({
required this.data,
});
factory RecentScanHistoryResponse.fromJson(Map<String, dynamic> json) {
return RecentScanHistoryResponse(
data: (json['data'] as List<dynamic>?)
?.map((e) => RecentScanHistory.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
);
}
}
class RecentScanHistory {
final int id;
final String passId;
final String qrCode;
final String bookingNumber;
final int attractionId;
final String attractionTitle;
final String customerName;
final String customerEmail;
final String cardType;
final int? scannedByPartnerStaffId;
final String scannedByPartnerStaffName;
final String status;
final String reason;
final DateTime? checkedInDatetime;
final DateTime? activatedAt;
final DateTime? qrExpiresAt;
final DateTime? validUpto;
final DateTime? createdAt;
RecentScanHistory({
required this.id,
required this.passId,
required this.qrCode,
required this.bookingNumber,
required this.attractionId,
required this.attractionTitle,
required this.customerName,
required this.customerEmail,
required this.cardType,
this.scannedByPartnerStaffId,
required this.scannedByPartnerStaffName,
required this.status,
required this.reason,
this.checkedInDatetime,
this.activatedAt,
this.qrExpiresAt,
this.validUpto,
this.createdAt,
});
factory RecentScanHistory.fromJson(Map<String, dynamic> json) {
return RecentScanHistory(
id: json['id'] ?? 0,
passId: (json['passId'] ?? '').toString(),
qrCode: (json['qrCode'] ?? '').toString(),
bookingNumber: (json['bookingNumber'] ?? '').toString(),
attractionId: json['attractionId'] ?? 0,
attractionTitle: (json['attractionTitle'] ?? '').toString(),
customerName: (json['customerName'] ?? '').toString(),
customerEmail: (json['customerEmail'] ?? '').toString(),
cardType: (json['cardType'] ?? '').toString(),
scannedByPartnerStaffId: json['scannedByPartnerStaffId'],
scannedByPartnerStaffName:
(json['scannedByPartnerStaffName'] ?? '').toString(),
status: (json['status'] ?? '').toString(),
reason: (json['reason'] ?? '').toString(),
checkedInDatetime: _parseDate(json['checkedInDatetime']),
activatedAt: _parseDate(json['activatedAt']),
qrExpiresAt: _parseDate(json['qrExpiresAt']),
validUpto: _parseDate(json['validUpto']),
createdAt: _parseDate(json['createdAt']),
);
}
static DateTime? _parseDate(dynamic date) {
if (date == null) return null;
try {
return DateTime.parse(date.toString());
} catch (e) {
return null;
}
}
static final DateFormat _formatter = DateFormat('dd MMM yyyy, hh:mm a');
String formatTime(DateTime? date) {
if (date == null) return 'N/A';
return _formatter.format(date);
}
}

View File

@@ -0,0 +1,18 @@
import '../../network_api_service/api_service/api_service.dart';
import '../../network_api_service/api_urls/api_urls.dart';
import '../models/recent_scan_history_model.dart';
class RecentScanHistoryRepository {
final ApiService _apiService = ApiService();
Future<List<RecentScanHistory>> fetchRecentScanHistory() async {
try {
final response = await _apiService.get(ApiUrls.scanHistory);
final RecentScanHistoryResponse scanResponse =
RecentScanHistoryResponse.fromJson(response.data);
return scanResponse.data;
} catch (e) {
throw Exception('Failed to fetch recent scan history: $e');
}
}
}

View File

@@ -0,0 +1,29 @@
import 'package:dio/dio.dart';
import '../../network_api_service/api_service/api_service.dart';
import '../../network_api_service/api_urls/api_urls.dart';
class SubmitQrCodeRepository {
final ApiService _apiService = ApiService();
Future<Map<String, dynamic>> submitQrCode({
required String qrCode,
}) async {
try {
final response = await _apiService.post(
ApiUrls.redeem,
data: {
"code": qrCode,
},
);
return response.data as Map<String, dynamic>;
} on DioException catch (e) {
if (e.response?.data != null && e.response?.data is Map<String, dynamic>) {
return e.response?.data as Map<String, dynamic>;
}
rethrow;
} catch (e) {
throw Exception('$e');
}
}
}

File diff suppressed because it is too large Load Diff