import 'dart:convert'; import 'dart:io'; import 'package:flutter/cupertino.dart'; 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/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/widget_extensions.dart'; import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/service_request/pending_service_request_model.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart'; import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart'; import 'package:test_sa/views/pages/user/requests/pending_requests_screen.dart'; import 'package:test_sa/views/widgets/bottom_sheets/pending_request_bottom_sheet.dart'; import 'package:test_sa/views/widgets/equipment/asset_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/sound/TextSpeechRecordWidget.dart'; import '../../../../new_views/app_style/app_color.dart'; import '../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../providers/service_request_providers/priority_provider.dart'; import '../../../../providers/service_request_providers/type_of_request_provider.dart'; class CreateServiceRequestPage extends StatefulWidget { static const String id = "/create-request"; final ServiceRequest? serviceRequest; const CreateServiceRequestPage({this.serviceRequest, Key? key}) : super(key: key); @override CreateServiceRequestPageState createState() => CreateServiceRequestPageState(); } class CreateServiceRequestPageState extends State { late TextEditingController _commentController; late double _height; late UserProvider _userProvider; late SettingProvider _settingProvider; late ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequest _serviceRequest; final List attachments = []; final 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!; attachments.addAll(_serviceRequest.devicePhotos!.map((e) => GenericAttachmentModel(name: 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; // attachments.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(':\\'); } // bool priority; void getData() { Provider.of(context).getDate(); Provider.of(context).getDate(); Provider.of(context).getDate(); Provider.of(context).getDate(); } PendingAssetServiceRequest? pendingAssetServiceRequest; @override Widget build(BuildContext context) { _height = MediaQuery.of(context).size.height; _userProvider = 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: [ Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ AssetPicker( device: _serviceRequest.device, showLoading: checkPendingRequest, onPick: (asset) async { pendingAssetServiceRequest = null; _serviceRequest.device = asset; await checkAssetForPendingServiceRequest(asset.id!.toInt()); if (pendingAssetServiceRequest != null && pendingAssetServiceRequest!.details!.isNotEmpty) { showPendingRequestBottomSheet(); } }, ), if (pendingAssetServiceRequest != null && pendingAssetServiceRequest!.details!.isNotEmpty) ...[ 8.height, Row( children: [ const Icon(Icons.warning, color: Color(0xffEE404C), size: 14), 8.width, Text( "This asset already have ${pendingAssetServiceRequest!.details!.length} request pending", style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w500, color: Color(0xff7D859A), decoration: TextDecoration.underline), ).expanded, ], ).onPress(() { showPendingRequests(); }), ], 16.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(context.translation.priority, style: Theme.of(context).textTheme.bodyLarge), Consumer(builder: (cxt, snapshot, _) { _serviceRequest.priority ??= snapshot.items.firstWhere((element) => element.value == 0, orElse: null); return Transform.scale( scale: 0.8, child: CupertinoSwitch( thumbColor: _serviceRequest.priority?.value != 0 ? const Color(0xffF63939) : Colors.blueGrey.withOpacity(.5), activeColor: AppColor.blueStatus(context).withOpacity(.25), value: _serviceRequest.priority?.value != 0, onChanged: (state) { if (state) { _serviceRequest.priority = snapshot.items.firstWhere((element) => element.value == 1, orElse: null); } else { _serviceRequest.priority = snapshot.items.firstWhere((element) => element.value == 0, orElse: null); } setState(() {}); }).toShimmer(isShow: snapshot.loading,context: context), ); }), ], ), 16.height, Consumer(builder: (cxt, snapshot, _) { try { _serviceRequest.defectType ??= snapshot.items.first; } catch (ex) { print("snapshot.items:${snapshot.items.length}"); } return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text(context.translation.equipmentStatus, style: Theme.of(context).textTheme.bodyLarge), 8.height, Wrap( runSpacing: 8, spacing: 8, children: [ for (var element in snapshot.items) Row( mainAxisSize: MainAxisSize.min, children: [ SizedBox( width: 24, height: 24, child: Radio( value: element, activeColor: Colors.red, fillColor: WidgetStateColor.resolveWith((states) { if (states.contains(WidgetState.selected)) return const Color(0xff3DA5E5); return const Color(0xffE0E0E0); }), groupValue: _serviceRequest.defectType, onChanged: (state) { setState(() { _serviceRequest.defectType = element; }); }), ), 8.width, Text(element.name!, style: Theme.of(context).textTheme.bodySmall), ], ) ], ).toShimmer(isShow: snapshot.loading,context: context), ], ); }), 16.height, AttachmentPicker(label: context.translation.attachImage, attachment: attachments, showAsGrid: true), ], ).toShadowContainer(context), // 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; // }, // ), // Consumer(builder: (context, snapshot, _) { // return SingleItemDropDownMenu( // context: context, // enabled: false, // title: context.translation.source, // initialValue: snapshot.items?.firstWhere((element) => element.value == 3, orElse: null), // ); // }), // 8.height, // Consumer(builder: (context, snapshot, _) { // return SingleItemDropDownMenu( // context: context, // title: context.translation.requestType, // enabled: false, // initialValue: snapshot.items?.firstWhere((element) => element.value == 1, orElse: null), // // onSelect: (value) { // // _serviceRequest.type = value; // // }, // ); // }), // Align( // alignment: AlignmentDirectional.centerStart, // child: context.translation.callComments.heading5(context), // ), 8.height, // SpeechToTextButton( // controller: _commentController, // ), // 8.height, // AppTextFormField( // controller: _commentController, // labelText: context.translation.problemDesc, // suffixIcon: "warning".toSvgAsset(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, width: 24).paddingOnly(end: 16), // initialValue: _serviceRequest.callComments, // onSaved: (text) { // _serviceRequest.callComments = text; // }, // ), // 8.height, // RecordSound( // onRecord: (audio) { // _serviceRequest.audio = audio; // }, // enabled: widget.serviceRequest == null ? true : false, // ), 8.height, TextSpeechRecordWidget( initialMessage: _serviceRequest.callComments!, onMessageChange: (message) { _serviceRequest.callComments = message; }, onRecord: (audio) { _serviceRequest.audio = audio; }, enabled: widget.serviceRequest == null ? true : false, ), 16.height, ], ), ).expanded, AppFilledButton( onPressed: checkPendingRequest ? null : _submit, loading: checkPendingRequest, label: (pendingAssetServiceRequest != null && (pendingAssetServiceRequest!.details?.isNotEmpty ?? false)) ? "Submit Duplicate Request" : "Submit New Request", ), ], ), ).paddingOnly(start: 16, end: 16, bottom: 24, top: 16), ), ), ); } bool checkPendingRequest = false; void showPendingRequests() { Navigator.of(context).push(MaterialPageRoute(builder: (_) => PendingServiceRequestScreen(pendingAssetServiceRequest!))); } void showPendingRequestBottomSheet() async { bool view = (await showModalBottomSheet( context: context, isDismissible: false, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical( top: Radius.circular(20), ), ), clipBehavior: Clip.antiAliasWithSaveLayer, builder: (BuildContext context) => PendingRequestBottomSheet(pendingAssetServiceRequest!, _serviceRequest.device!), )) as bool; if (view) { showPendingRequests(); } } Future checkAssetForPendingServiceRequest(int assetId) async { checkPendingRequest = true; setState(() {}); pendingAssetServiceRequest = await _serviceRequestsProvider.checkAssetPendingRequest(assetId); await Future.delayed(const Duration(milliseconds: 250)); checkPendingRequest = false; setState(() {}); } Future _submit() async { _serviceRequest.requestedThrough = Provider.of(context, listen: false).items.firstWhere((element) => element.value == 3, orElse: null); _serviceRequest.type = Provider.of(context, listen: false).items.firstWhere((element) => element.value == 1, orElse: null); if (_formKey.currentState!.validate() && await _serviceRequest.validateNewRequest(context)) { _formKey.currentState!.save(); // bool canSubmitRequest = await checkAssetForPendingServiceRequest(_serviceRequest.device.id); // if (!canSubmitRequest) { // return; // } _serviceRequest.devicePhotos = attachments.map((item) => ServiceRequestUtils.isLocalUrl(item.name??'') ? "${item.name?.split("/").last}|${base64Encode(File(item.name??'').readAsBytesSync())}" : item.name??'').toList(); if (_serviceRequest.audio != null) { if (_isLocalUrl(_serviceRequest.audio!)) { final File file = File(_serviceRequest.audio!); _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; } } await _serviceRequestsProvider.createRequest( context: context, user: _userProvider.user!, host: _settingProvider.host!, serviceRequest: _serviceRequest, ); } } }