import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.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/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/default_app_bar.dart'; import '../../../../models/lookup.dart'; import '../../../../new_views/app_style/app_color.dart'; import '../../../../new_views/common_widgets/app_filled_button.dart'; import '../../../../new_views/common_widgets/app_text_form_field.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'; import '../../../../providers/service_request_providers/requested_through_provider.dart'; import '../../../../providers/service_request_providers/type_of_request_provider.dart'; import '../../../widgets/equipment/pick_asset.dart'; import '../../../widgets/images/multi_image_picker.dart'; import '../../../widgets/sound/record_sound.dart'; class UpdateServiceRequestPage extends StatefulWidget { static const String id = "/update_service_request_page"; final ServiceRequest serviceRequest; const UpdateServiceRequestPage({Key key, this.serviceRequest}) : super(key: key); @override State createState() => _UpdateServiceRequestPageState(); } class _UpdateServiceRequestPageState extends State { final GlobalKey _formKey = GlobalKey(); TextEditingController _commentController; List _deviceImages = []; UserProvider _userProvider; @override void initState() { super.initState(); _deviceImages = widget.serviceRequest.devicePhotos.map((e) => File(e)).toList(); _commentController = TextEditingController(text: widget.serviceRequest.callComments ?? ""); } @override void dispose() { _commentController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { _userProvider = Provider.of(context, listen: false); return Scaffold( appBar: DefaultAppBar(title: context.translation.updateServiceRequest), body: SafeArea( child: Form( key: _formKey, child: Column( children: [ SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ PickAsset( editable: false, device: widget.serviceRequest.device, onPickAsset: (asset) { widget.serviceRequest.device = asset; setState(() {}); }, ), 8.height, SingleItemDropDownMenu( context: context, title: context.translation.priority, initialValue: widget.serviceRequest?.priority, onSelect: (value) { widget.serviceRequest.priority = value; }, ), 8.height, SingleItemDropDownMenu( context: context, title: context.translation.equipmentStatus, initialValue: widget.serviceRequest?.defectType, onSelect: (value) { widget.serviceRequest.defectType = value; }, ), 8.height, Consumer(builder: (context, snapshot, _) { return SingleItemDropDownMenu( context: context, enabled: false, title: context.translation.requestedThrough, initialValue: snapshot.items?.firstWhere((element) => element.value == 3, orElse: () => null), ); }), 8.height, SingleItemDropDownMenu( context: context, title: context.translation.typeOfRequest, initialValue: widget.serviceRequest?.type, onSelect: (value) { widget.serviceRequest.type = value; }, ), 8.height, MultiFilesPicker( label: context.translation.attachImage, onlyImages: true, files: _deviceImages, ), ((widget.serviceRequest.devicePhotos?.isNotEmpty ?? false) ? 16 : 8).height, Align( alignment: AlignmentDirectional.centerStart, child: context.translation.callComments.heading5(context), ), 8.height, AppTextFormField( controller: _commentController, labelText: context.translation.comments, initialValue: widget.serviceRequest.callComments, suffixIcon: "warning".toSvgAsset(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, width: 24).paddingOnly(end: 16), onSaved: (text) { widget.serviceRequest.callComments = text; }, ), 8.height, RecordSound( onRecord: (audio) { widget.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), ), ); } Future _submit() async { widget.serviceRequest?.requestedThrough = Provider.of(context, listen: false).items?.firstWhere((element) => element.value == 3, orElse: () => null); if (_formKey.currentState.validate() && await widget.serviceRequest.validateNewRequest(context)) { _formKey.currentState.save(); widget.serviceRequest.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList(); if (widget.serviceRequest.audio != null) { if (_isLocalUrl(widget.serviceRequest.audio)) { final File file = File(widget.serviceRequest.audio); widget.serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; } } await Provider.of(context, listen: false).updateRequest(context: context, user: _userProvider.user, request: widget.serviceRequest); } } bool _isLocalUrl(String url) { if (url?.isEmpty != false) return false; return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\'); } }