Feat: fix bug for features upload file

This commit is contained in:
orangdeso 2025-05-06 22:06:08 +07:00
parent 6bf43369c4
commit 0a38f3f788
4 changed files with 122 additions and 86 deletions

View File

@ -235,10 +235,14 @@ class _DetailTicketScreenState extends State<DetailTicketScreen> {
text: 'Upload Bukti Pembayaran', text: 'Upload Bukti Pembayaran',
textColor: Colors.white, textColor: Colors.white,
onTap: () { onTap: () {
Get.toNamed(Routes.UPLOADFILE, arguments: { Get.toNamed(
Routes.UPLOADFILE,
arguments: {
'ticketId': transaction.ticketId, 'ticketId': transaction.ticketId,
'transactionId': transaction.id, 'transactionId': transaction.id,
}); 'mode': 'history'
},
);
}, },
), ),
); );
@ -265,12 +269,6 @@ class _DetailTicketScreenState extends State<DetailTicketScreen> {
onTap: () async { onTap: () async {
await Permission.camera.status; await Permission.camera.status;
// final argument = {
// 'ticketId': transaction.ticketId,
// 'transactionId': transaction.id,
// };
// Get.toNamed(Routes.SCANQR, arguments: argument);
final result = await Get.toNamed( final result = await Get.toNamed(
Routes.SCANQR, Routes.SCANQR,
arguments: { arguments: {
@ -279,7 +277,6 @@ class _DetailTicketScreenState extends State<DetailTicketScreen> {
}, },
); );
// 2. Jika porter sibuk, tampilkan Snackbar dan hentikan di sini
if (result == 'PORTER_BUSY') { if (result == 'PORTER_BUSY') {
SnackbarHelper.showError( SnackbarHelper.showError(
'Porter Tidak Tersedia', 'Porter Tidak Tersedia',
@ -353,8 +350,11 @@ class _DetailTicketScreenState extends State<DetailTicketScreen> {
typeId: passenger['typeId'] ?? '', typeId: passenger['typeId'] ?? '',
noId: maskedId, noId: maskedId,
onTap: () { onTap: () {
Get.toNamed(Routes.PRINTBOARDINGPASS, Get.toNamed(Routes.PRINTBOARDINGPASS, arguments: {
arguments: {'transaction': transaction, 'passengerIndex': index}); 'transactionId': transaction.id,
'ticketId': transaction.ticketId,
'passengerIndex': index,
});
}, },
), ),
); );

View File

@ -1,4 +1,5 @@
import 'dart:developer'; import 'dart:developer' show log;
import 'dart:math' show Random;
import 'package:e_porter/_core/component/card/custome_shadow_cotainner.dart'; import 'package:e_porter/_core/component/card/custome_shadow_cotainner.dart';
import 'package:e_porter/_core/constants/colors.dart'; import 'package:e_porter/_core/constants/colors.dart';
@ -108,6 +109,14 @@ class _TicketBookingStep4ScreenState extends State<TicketBookingStep4Screen> {
} }
} }
String _generateBarcodeId() {
const prefix = 'P-';
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
final rand = Random.secure();
final code = List.generate(10, (index) => chars[rand.nextInt(chars.length)]).join();
return '$prefix$code';
}
String getPorterInfo(String type) { String getPorterInfo(String type) {
final porter = selectedPorterServices[type]; final porter = selectedPorterServices[type];
if (porter != null) { if (porter != null) {
@ -316,7 +325,6 @@ class _TicketBookingStep4ScreenState extends State<TicketBookingStep4Screen> {
}); });
} }
// Persiapkan data user
final userDetailData = { final userDetailData = {
'uid': userData.uid, 'uid': userData.uid,
'name': userData.name, 'name': userData.name,
@ -326,15 +334,18 @@ class _TicketBookingStep4ScreenState extends State<TicketBookingStep4Screen> {
final List<Map<String, dynamic>> passengerDetailsList = []; final List<Map<String, dynamic>> passengerDetailsList = [];
for (var passenger in selectedPassengers) { for (var passenger in selectedPassengers) {
if (passenger != null) { if (passenger == null) continue;
final barcodeId = _generateBarcodeId();
passengerDetailsList.add({ passengerDetailsList.add({
'name': passenger.name, 'name': passenger.name,
'typeId': passenger.typeId, 'typeId': passenger.typeId,
'noId': passenger.noId, 'noId': passenger.noId,
'gender': passenger.gender, 'gender': passenger.gender,
'idBarcode': barcodeId,
}); });
} }
}
// Buat transaksi // Buat transaksi
final transactionId = await transactionController.createTransaction( final transactionId = await transactionController.createTransaction(

View File

@ -4,6 +4,7 @@ import 'package:e_porter/_core/component/button/button_outline.dart';
import 'package:e_porter/_core/constants/colors.dart'; import 'package:e_porter/_core/constants/colors.dart';
import 'package:e_porter/_core/constants/typography.dart'; import 'package:e_porter/_core/constants/typography.dart';
import 'package:e_porter/_core/service/permission_service.dart'; import 'package:e_porter/_core/service/permission_service.dart';
import 'package:e_porter/presentation/screens/navigation/main_navigation.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -29,11 +30,12 @@ class UploadFileScreen extends StatefulWidget {
class _UploadFileScreenState extends State<UploadFileScreen> { class _UploadFileScreenState extends State<UploadFileScreen> {
final List<UploadFileModel> uploadedFiles = []; final List<UploadFileModel> uploadedFiles = [];
final TransactionController _transactionController = Get.find<TransactionController>(); final TransactionController _transactionController = Get.find<TransactionController>();
bool isUploading = false; final isUploading = false.obs;
late String ticketId; late String ticketId;
late String transactionId; late String transactionId;
late String userId = ''; late String userId = '';
late final bool isHistoryMode;
@override @override
void initState() { void initState() {
@ -41,8 +43,11 @@ class _UploadFileScreenState extends State<UploadFileScreen> {
final args = Get.arguments as Map<String, dynamic>; final args = Get.arguments as Map<String, dynamic>;
ticketId = args['ticketId'] ?? ''; ticketId = args['ticketId'] ?? '';
transactionId = args['transactionId'] ?? ''; transactionId = args['transactionId'] ?? '';
isHistoryMode = (args['mode'] == 'history');
WidgetsBinding.instance.addPostFrameCallback((_) {
_loadUserData(); _loadUserData();
});
} }
Future<void> _loadUserData() async { Future<void> _loadUserData() async {
@ -55,7 +60,6 @@ class _UploadFileScreenState extends State<UploadFileScreen> {
} }
void _uploadToServer() async { void _uploadToServer() async {
try {
if (ticketId.isEmpty || transactionId.isEmpty || userId.isEmpty) { if (ticketId.isEmpty || transactionId.isEmpty || userId.isEmpty) {
Get.snackbar( Get.snackbar(
'Error', 'Error',
@ -76,10 +80,9 @@ class _UploadFileScreenState extends State<UploadFileScreen> {
return; return;
} }
setState(() { isUploading.value = true;
isUploading = true;
});
try {
Get.snackbar( Get.snackbar(
'Info', 'Info',
'Mengupload bukti pembayaran...', 'Mengupload bukti pembayaran...',
@ -104,7 +107,14 @@ class _UploadFileScreenState extends State<UploadFileScreen> {
colorText: Colors.white, colorText: Colors.white,
); );
if (isHistoryMode) {
Get.offAll(
() => MainNavigation(initialTabIndex: 1),
arguments: 'penumpang',
);
} else {
Get.offAllNamed(Routes.NAVBAR); Get.offAllNamed(Routes.NAVBAR);
}
} catch (e) { } catch (e) {
Get.snackbar( Get.snackbar(
'Error', 'Error',
@ -113,11 +123,7 @@ class _UploadFileScreenState extends State<UploadFileScreen> {
colorText: Colors.white, colorText: Colors.white,
); );
} finally { } finally {
if (mounted) { isUploading.value = false;
setState(() {
isUploading = false;
});
}
} }
} }
@ -189,10 +195,24 @@ class _UploadFileScreenState extends State<UploadFileScreen> {
), ),
), ),
), ),
bottomNavigationBar: CustomeShadowCotainner( bottomNavigationBar: Obx(() {
if (isUploading.value) {
return CustomeShadowCotainner(
child: SizedBox(
height: 40.h,
child: Center(
child: CircularProgressIndicator(
color: PrimaryColors.primary800,
),
),
),
);
}
return CustomeShadowCotainner(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
if (!isHistoryMode) ...[
ButtonOutline( ButtonOutline(
text: 'Nanti', text: 'Nanti',
textColor: PrimaryColors.primary800, textColor: PrimaryColors.primary800,
@ -200,11 +220,14 @@ class _UploadFileScreenState extends State<UploadFileScreen> {
Get.offAllNamed(Routes.NAVBAR); Get.offAllNamed(Routes.NAVBAR);
}, },
), ),
],
SizedBox(height: 10.h), SizedBox(height: 10.h),
ButtonFill( ButtonFill(
text: 'Upload', text: 'Upload',
textColor: Colors.white, textColor: Colors.white,
onTap: () { onTap: isUploading.value
? null
: () {
if (uploadedFiles.isNotEmpty) { if (uploadedFiles.isNotEmpty) {
_submitFiles(); _submitFiles();
} else { } else {
@ -215,11 +238,11 @@ class _UploadFileScreenState extends State<UploadFileScreen> {
colorText: Colors.white, colorText: Colors.white,
); );
} }
}, }),
),
], ],
), ),
), );
}),
); );
} }
@ -349,7 +372,7 @@ class _UploadFileScreenState extends State<UploadFileScreen> {
try { try {
FilePickerResult? result = await FilePicker.platform.pickFiles( FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.custom, type: FileType.custom,
allowedExtensions: ['jpg', 'jpeg', 'png', 'pdf'], allowedExtensions: ['jpg', 'jpeg', 'png'],
); );
if (result != null) { if (result != null) {

View File

@ -142,6 +142,7 @@ class AppRoutes {
GetPage( GetPage(
name: Routes.UPLOADFILE, name: Routes.UPLOADFILE,
page: () => UploadFileScreen(), page: () => UploadFileScreen(),
binding: TransactionBinding(),
), ),
GetPage( GetPage(
name: Routes.TRANSACTIONHISTORY, name: Routes.TRANSACTIONHISTORY,
@ -150,6 +151,7 @@ class AppRoutes {
GetPage( GetPage(
name: Routes.DETAILTICKET, name: Routes.DETAILTICKET,
page: () => DetailTicketScreen(), page: () => DetailTicketScreen(),
binding: HistoryBinding(),
), ),
GetPage( GetPage(
name: Routes.PRINTBOARDINGPASS, name: Routes.PRINTBOARDINGPASS,