nhance_partner/lib/presentation/themes/indicators/mutli_FileUpload.dart
2025-11-29 10:58:21 +05:30

184 lines
5.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../layouts/responsive_layout.dart';
import 'multi_fileUploadService.dart';
class MultiFileUploadWidget extends StatefulWidget {
const MultiFileUploadWidget({super.key});
@override
State<MultiFileUploadWidget> createState() => _MultiFileUploadWidgetState();
static bool hasFiles = false; // ✅ Static variable to check from parent
}
class _MultiFileUploadWidgetState extends State<MultiFileUploadWidget> {
final fileService = MultiFileUploadService();
String? errorMessage;
void _pickFiles() async {
final error = await fileService.pickFiles(
maxFileSizeInMB: 10,
); // 5 MB limit
if (error != null) {
if (mounted) {
setState(() {
errorMessage = error;
});
// also show alert dialog for big error messages
// showDialog(
// context: context,
// builder: (ctx) => AlertDialog(
// title: const Text("File Upload Error"),
// content: Text(error),
// actions: [
// TextButton(
// onPressed: () => Navigator.pop(ctx),
// child: const Text("OK"),
// ),
// ],
// ),
// );
}
} else {
setState(() {
errorMessage = null;
MultiFileUploadWidget.hasFiles = fileService.files.isNotEmpty;
});
}
}
void _removeFile(int index) {
fileService.removeFileAt(index);
setState(() {
MultiFileUploadWidget.hasFiles = fileService.files.isNotEmpty;
});
}
@override
Widget build(BuildContext context) {
final files = fileService.files;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// if (ResponsiveLayout.isMobile(context)) ...[
OutlinedButton.icon(
onPressed: _pickFiles,
icon: const Icon(
Icons.file_upload_outlined,
color: Color(0xFF2E7D6E),
size: 18,
),
label: const Text(
"Upload Documents",
style: TextStyle(fontSize: 11, color: Colors.black),
overflow: TextOverflow.ellipsis,
),
style: OutlinedButton.styleFrom(
side: const BorderSide(color: Color(0xFF2E7D6E)),
),
),
const SizedBox(height: 3),
Text(
"Supports only PDF, PNG, JPG, JPEG,HEIC formats (max 10 MB each)",
style: GoogleFonts.poppins(fontSize: 8, color: Colors.grey),
),
// ]
// else ...[
// Row(
// children: [
// OutlinedButton.icon(
// onPressed: _pickFiles,
// icon: const Icon(
// Icons.file_upload_outlined,
// color: Color(0xFFE26728),
// size: 24,
// ),
// label: const Text(
// "Upload Documents",
// style: TextStyle(fontSize: 14, color: Colors.black),
// overflow: TextOverflow.ellipsis,
// ),
// style: OutlinedButton.styleFrom(
// side: const BorderSide(color: Color(0xFFE26728)),
// ),
// ),
// const SizedBox(width: 12),
// // const Expanded(
// // child: Text(
// // "Supports only PDF, PNG, JPG, JPEG,HEIC formats (max 10 MB each)",
// // style: TextStyle(fontSize: 12, color: Colors.grey),
// // overflow: TextOverflow.ellipsis,
// // ),
// // ),
// ],
// ),
// ],
// if (fileService.files.isEmpty && errorMessage == null) ...[
// const SizedBox(height: 4),
// const Text(
// "Required",
// style: TextStyle(color: Colors.red, fontSize: 12),
// ),
// ],
if (errorMessage != null) ...[
const SizedBox(height: 4),
Text(
errorMessage!,
style: GoogleFonts.poppins(color: Colors.red, fontSize: 12),
),
],
const SizedBox(height: 8),
...fileService.files.asMap().entries.map((entry) {
final index = entry.key;
final uploaded = entry.value; // UploadedFile
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ListTile(
dense: true,
contentPadding: EdgeInsets.zero,
title: Text(
uploaded.file.name,
style: GoogleFonts.poppins(fontSize: 11),
),
trailing: IconButton(
padding: EdgeInsets.zero,
splashRadius: 2,
icon: const Icon(Icons.close, color: Colors.red, size: 14),
onPressed: () => _removeFile(index),
),
),
// Padding(
// padding: const EdgeInsets.only(
// left: 8.0,
// bottom: 8.0,
// right: 8.0,
// ),
// child: TextField(
// controller: uploaded.controller,
// style: GoogleFonts.poppins(fontSize: 11),
// decoration: InputDecoration(
// labelText: 'Enter document name',
// labelStyle: GoogleFonts.poppins(fontSize: 11),
//
// border: const OutlineInputBorder(),
// isDense: true,
// ),
// ),
// ),
],
);
}),
],
);
}
}