Feat: fix bug for features upload file
This commit is contained in:
parent
6bf43369c4
commit
0a38f3f788
|
@ -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,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue