api intigreted of scan Qr and recent scan histoy ,scan history,scan history details
This commit is contained in:
@@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 {}
|
||||
@@ -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];
|
||||
}
|
||||
70
lib/scan/bloc/submit_qr_code/submit_qr_code_bloc.dart
Normal file
70
lib/scan/bloc/submit_qr_code/submit_qr_code_bloc.dart
Normal 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());
|
||||
}
|
||||
}
|
||||
21
lib/scan/bloc/submit_qr_code/submit_qr_code_event.dart
Normal file
21
lib/scan/bloc/submit_qr_code/submit_qr_code_event.dart
Normal 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();
|
||||
}
|
||||
42
lib/scan/bloc/submit_qr_code/submit_qr_code_state.dart
Normal file
42
lib/scan/bloc/submit_qr_code/submit_qr_code_state.dart
Normal 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];
|
||||
}
|
||||
100
lib/scan/models/recent_scan_history_model.dart
Normal file
100
lib/scan/models/recent_scan_history_model.dart
Normal 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);
|
||||
}
|
||||
}
|
||||
18
lib/scan/repository/recent_scan_history_repository.dart
Normal file
18
lib/scan/repository/recent_scan_history_repository.dart
Normal 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');
|
||||
}
|
||||
}
|
||||
}
|
||||
29
lib/scan/repository/submit_qr_code_repository.dart
Normal file
29
lib/scan/repository/submit_qr_code_repository.dart
Normal 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
Reference in New Issue
Block a user