// ignore_for_file: public_member_api_docs, sort_constructors_first import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:qadirneyriz/config/config.dart'; import 'package:qadirneyriz/models/meetings/meetings_model.dart'; import 'package:qadirneyriz/screens/meeting_summary/state.dart'; import 'package:qadirneyriz/utils/enums/status.dart'; import 'package:qadirneyriz/utils/tools/tools.dart'; import 'package:qadirneyriz/widgets/card_meeting.dart'; import 'package:qadirneyriz/widgets/custom_appbar.dart'; import 'package:qadirneyriz/widgets/custom_button.dart'; class MeetingSummaryScreen extends StatefulWidget { final Datum meetingItem; const MeetingSummaryScreen({ Key? key, required this.meetingItem, }) : super(key: key); @override State createState() => _MeetingSummaryScreenState(); } class _MeetingSummaryScreenState extends State { late TextEditingController _textControllerDescription; @override void initState() { super.initState(); _textControllerDescription = TextEditingController(); } @override void dispose() { _textControllerDescription.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( body: Consumer( builder: (context, value, child) { return CustomScrollView( slivers: [ CustomAppbar( title: 'صورت جلسه', ), SliverPadding( padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 2), sliver: SliverToBoxAdapter( child: CustomCardMeeting( titel: widget.meetingItem.subject!.subject ?? '', date: widget.meetingItem.dateJalali ?? '', location: widget.meetingItem.location!.address ?? '', fromTime: widget.meetingItem.azHour ?? '', toTime: widget.meetingItem.taHour ?? '', cardId: widget.meetingItem.id ?? -1, ), ), ), SliverPadding( padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 10), sliver: SliverToBoxAdapter( child: Container( decoration: BoxDecoration( color: const Color(0xffF4F9F6), boxShadow: [ BoxShadow( color: config.ui.mainGray.withOpacity(.1), spreadRadius: .1, offset: const Offset(0, 2), blurRadius: 6, ), ], borderRadius: const BorderRadius.all(Radius.circular(12)), ), child: CustomTextArea( hintText: 'شرح جلسه', controller: _textControllerDescription, ), ), ), ), SliverToBoxAdapter( child: ReceiptUploadDialog( state: value, ), ), SliverToBoxAdapter( child: Padding( padding: const EdgeInsets.all(30.0), child: submitSammaryButton(context, value), ), ) ], ); }, ), ); } Widget submitSammaryButton(BuildContext context, MeetingSummaryState state) { switch (state.statusMinuteMeeting) { case Status.loading: return CustomButton(hieght: 50, text: 'صبر کنید!'); default: return CustomButton( hieght: 50, text: 'ثبت صورت جلسه', onPressed: () async { if (_textControllerDescription.text == '') { // call add new subject Tools.showCustomSnackBar( text: 'موضوع وارد کنید!', isError: true, context, ); } else if (state.selectedFiles == null) { // call add new subject Tools.showCustomSnackBar( text: 'فایل وارد کنید!', isError: true, context, ); } else { final status = await state.addMinuteMeeting( id: widget.meetingItem.id ?? -1, description: _textControllerDescription.text, meetingFiles: state.selectedFiles ?? []); if (status == Status.ready) { // call refrresh subjects } else { Tools.showCustomSnackBar( text: state.errorsMinuteMeeting == null ? state.messageMinuteMeeting ?? ' AppLocalizations.of(context)!.haserror' : Tools.combineErrorMessages( state.errorsMinuteMeeting ?? {}), isError: true, context, ); } } }, ); } } } class CustomTextArea extends StatelessWidget { final String hintText; final TextEditingController controller; final int maxLines; final int minLines; const CustomTextArea({ Key? key, required this.hintText, required this.controller, this.maxLines = 20, this.minLines = 4, }) : super(key: key); @override Widget build(BuildContext context) { return TextField( controller: controller, maxLines: maxLines, minLines: minLines, decoration: InputDecoration( hintText: hintText, hintStyle: TextStyle(color: Colors.black.withOpacity(.4), fontSize: 13), border: InputBorder.none, contentPadding: const EdgeInsets.all(12.0), ), ); } } class ReceiptUploadDialog extends StatefulWidget { final MeetingSummaryState state; const ReceiptUploadDialog({ Key? key, required this.state, }) : super(key: key); @override _ReceiptUploadDialogState createState() => _ReceiptUploadDialogState(); } class _ReceiptUploadDialogState extends State { @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Container( decoration: BoxDecoration( color: const Color(0xffF4F9F6), boxShadow: [ BoxShadow( color: config.ui.mainGray.withOpacity(.1), spreadRadius: .1, offset: const Offset(0, 2), blurRadius: 6, ), ], borderRadius: const BorderRadius.all(Radius.circular(12)), ), child: Padding( padding: const EdgeInsets.symmetric(vertical: 25, horizontal: 10), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'آپلود فایل', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: config.ui.mainGreen, ), ), const SizedBox(height: 20), // Upload box FileBorderBox( child: GestureDetector( onTap: widget.state.pickFiles, child: Column( children: [ Icon(Icons.cloud_upload_outlined, size: 30, color: config.ui.mainGreen), Text( 'انتخاب فایل', style: TextStyle(fontSize: 12, color: config.ui.mainGreen), ), ], ), ), ), // File preview if (widget.state.selectedFiles != null) FilePreview( files: widget.state.selectedFiles!, onDelete: widget.state.removeFile, ), ], ), ), ), ); } } class FilePreview extends StatelessWidget { final List files; final void Function(int) onDelete; const FilePreview({ super.key, required this.files, required this.onDelete, }); @override Widget build(BuildContext context) { return ListView.builder( shrinkWrap: true, itemCount: files.length, physics: const NeverScrollableScrollPhysics(), itemBuilder: (BuildContext context, int index) { return Container( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), border: Border(bottom: BorderSide(color: config.ui.secendGreen)), ), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ const Icon(Icons.file_present_outlined, color: Color(0xffD0D5ED)), const SizedBox(width: 10), Expanded( child: Text( files[index].name, style: const TextStyle(fontSize: 12), ), ), IconButton( icon: Icon(Icons.delete, color: config.ui.secendGreen), onPressed: () => onDelete(index), ), ], ), ); }, ); } } class FileBorderBox extends StatelessWidget { final Widget child; const FileBorderBox({super.key, required this.child}); @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), border: Border.all( color: config.ui.mainGreen, style: BorderStyle.solid, width: .5, ), ), child: Center(child: child), ); } }