import 'dart:convert'; import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:image_picker/image_picker.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/views/widgets/equipment/pick_asset.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/sound/record_sound.dart'; import '../../../../models/lookup.dart'; import '../../../../new_views/app_style/app_color.dart'; import '../../../../new_views/common_widgets/app_dashed_button.dart'; import '../../../../new_views/common_widgets/app_lazy_loading.dart'; import '../../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; import '../../../../providers/service_request_providers/equipment_status_provider.dart'; import '../../../../providers/service_request_providers/priority_provider.dart'; class CreateRequestPage extends StatefulWidget { static const String id = "/create-request"; final ServiceRequest serviceRequest; const CreateRequestPage({this.serviceRequest, Key key}) : super(key: key); @override CreateRequestPageState createState() => CreateRequestPageState(); } class CreateRequestPageState extends State { TextEditingController _commentController; double _height; UserProvider _userProvider; SettingProvider _settingProvider; ServiceRequestsProvider _serviceRequestsProvider; ServiceRequest _serviceRequest; final List _deviceImages = []; bool _isLoading = false; bool _showDatePicker = false; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); DateTime _dateTime; bool isFirstActionSubmitted = false; @override void initState() { _commentController = TextEditingController(); if (widget.serviceRequest != null) { _serviceRequest = widget.serviceRequest; _deviceImages.addAll(_serviceRequest.devicePhotos.map((e) => File(e)).toList()); _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit"; if (_showDatePicker && _serviceRequest.visitDate != null) { _dateTime = DateTime.tryParse(_serviceRequest.visitDate); } } else { _serviceRequest = ServiceRequest(); } isFirstActionSubmitted = _serviceRequest?.firstAction != null; super.initState(); } // // getServiceRequestById(String id) async { // try { // ServiceRequest request = await _serviceRequestsProvider.getServiceRequestObjectById(requestId: id) ?? ""; // _serviceRequest = request; // _device = _serviceRequest.device; // _deviceImages.addAll(_serviceRequest.devicePhotos.map((e) { // return File(e); // }).toList()); // _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit"; // if (_showDatePicker && _serviceRequest.visitDate != null) { // _dateTime = DateTime.tryParse(_serviceRequest.visitDate); // } // _isLoading = false; // } catch (ex) { // _isLoading = false; // } // setState(() {}); // } @override void dispose() { _commentController.dispose(); super.dispose(); } bool _isLocalUrl(String url) { if (url?.isEmpty != false) return false; return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\'); } @override Widget build(BuildContext context) { _height = MediaQuery.of(context).size.height; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _serviceRequestsProvider = Provider.of(context); return Scaffold( key: _scaffoldKey, appBar: DefaultAppBar(title: context.translation.newServiceRequest), body: SafeArea( child: LoadingManager( isLoading: _isLoading, isFailedLoading: false, stateCode: 200, onRefresh: () async {}, child: Form( key: _formKey, child: Column( children: [ SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ PickAsset( device: _serviceRequest.device, onPickAsset: (asset) { _serviceRequest.device = asset; setState(() {}); }, ), 8.height, SingleItemDropDownMenu( context: context, title: context.translation.priority, initialValue: _serviceRequest?.priority, onSelect: (value) { _serviceRequest.priority = value; }, ), 8.height, SingleItemDropDownMenu( context: context, title: context.translation.equipmentStatus, initialValue: _serviceRequest?.defectType, onSelect: (value) { _serviceRequest.defectType = value; }, ), 8.height, AppDashedButton(title: _serviceRequest.devicePhotos?.first?.split("/")?.last ?? context.translation.attachImage, onPressed: _attachImage), 16.height, Align( alignment: AlignmentDirectional.centerStart, child: context.translation.callComments.heading5(context), ), 8.height, AppTextFormField( controller: _commentController, labelText: context.translation.comments, suffixIcon: "warning".toSvgAsset(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, width: 24).paddingOnly(end: 16), ), 8.height, RecordSound( onRecord: (audio) { _serviceRequest.audio = audio; }, enabled: widget.serviceRequest == null ? true : false, ), 16.height, ], ), ).expanded, AppFilledButton( onPressed: _submit, label: context.translation.submitRequest, ), ], ), ).paddingOnly(start: 16, end: 16, bottom: 24, top: 16), ), ), ); } _attachImage() async { ImageSource source = await showDialog( context: context, builder: (dialogContext) => CupertinoAlertDialog( actions: [ TextButton( child: Text(context.translation.pickFromCamera), onPressed: () { Navigator.of(dialogContext).pop(ImageSource.camera); }, ), TextButton( child: Text(context.translation.pickFromGallery), onPressed: () { Navigator.of(dialogContext).pop(ImageSource.gallery); }, ), TextButton( child: Text(context.translation.pickFromFiles), onPressed: () async { await _fromFilePicker(); Navigator.pop(context); }, ), ], ), ); if (source == null) return; final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800); if (pickedFile != null) { _serviceRequest.devicePhotos ??= []; _serviceRequest.devicePhotos?.clear(); _serviceRequest.devicePhotos?.add(pickedFile.path); setState(() {}); } } _fromFilePicker() async { FilePickerResult result = await FilePicker.platform.pickFiles( type: FileType.custom, allowedExtensions: ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'], ); if (result?.files?.first != null) { _serviceRequest.devicePhotos ??= []; _serviceRequest.devicePhotos?.clear(); _serviceRequest.devicePhotos?.add(result?.files?.first?.path); setState(() {}); } } Future _submit() async { if (_formKey.currentState.validate() && await _serviceRequest.validateNewRequest(context)) { _formKey.currentState.save(); _serviceRequest.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList(); if (_serviceRequest.audio != null) { if (_isLocalUrl(_serviceRequest.audio)) { final File file = File(_serviceRequest.audio); _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; } } showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); int status = await _serviceRequestsProvider.createRequest( user: _userProvider.user, host: _settingProvider.host, serviceRequest: _serviceRequest, ); Navigator.of(context); if (status >= 200 && status < 300) { Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); Navigator.pop(context); } else { Fluttertoast.showToast(msg: context.translation.failedRequestMessage); } } } }