import 'dart:convert'; import 'package:car_provider_app/view_models/items_view_model.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:mc_common_app/models/services_models/item_model.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/AppPermissionHandler.dart'; import 'package:mc_common_app/utils/date_helper.dart'; import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/checkbox_with_title_desc.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; class CreateItemPage extends StatefulWidget { const CreateItemPage({Key? key}) : super(key: key); @override State createState() => _CreateItemPageState(); } class _CreateItemPageState extends State { String? name, description, price, year, itemImage; bool isAppointmentAvailable = false; bool isWorkshopAppointmentAvailable = false; bool isHomeAppointmentAvailable = false; bool isDefaultValudDone = false; ItemsVM? model; ItemData? itemData; setDefaultData() { name = itemData!.name; description = itemData!.description; price = itemData!.price; print(itemData!.manufactureDate); //TODO: need to discuss with zahoor year and picture if (itemData!.manufactureDate != null) year = DateHelper.formatAsYearMonthDay(DateHelper.parseStringToDate(itemData!.manufactureDate ?? DateTime.now().toString())); // itemImage=itemData. isAppointmentAvailable = itemData!.isAllowAppointment ?? false; isWorkshopAppointmentAvailable = itemData!.isAppointmentCompanyLoc ?? false; isHomeAppointmentAvailable = itemData!.isAppointmentCustomerLoc ?? false; isDefaultValudDone = true; } @override Widget build(BuildContext context) { model ??= context.read(); itemData ??= ModalRoute.of(context)!.settings.arguments as ItemData; if (!isDefaultValudDone) setDefaultData(); return Scaffold( appBar: const CustomAppBar( title: "Add Items", ), body: Container( width: double.infinity, height: double.infinity, padding: const EdgeInsets.all(20), child: Column( children: [ Expanded( child: SingleChildScrollView( child: Column( children: [ TxtField( hint: "Item Name", value: name, onChanged: (v) { name = v; }, ), 12.height, TxtField( hint: "Item Description", value: description, onChanged: (v) { description = v; }, ), 12.height, TxtField( hint: "Item Price", value: price, keyboardType: TextInputType.number, onChanged: (v) { price = v; }, ), 12.height, TxtField( hint: "Manufacture Year", value: year, keyboardType: TextInputType.number, isNeedClickAll: true, postfixWidget: const IconButton( onPressed: null, icon: Icon(Icons.date_range), ), onTap: () async { year = await Utils.pickDateFromDatePicker(context, firstDate: DateTime(1990), lastDate: DateTime.now()); setState(() {}); }, onChanged: (v) { year = v; }, ), 12.height, if (itemImage != null && itemImage!.isNotEmpty) Column( children: [ Image.memory( base64Decode(itemImage ?? ""), ).toContainer( isEnabledBorder: true, paddingAll: 12, ), 12.height, ], ), InkWell( onTap: () async { bool isPermissionsAvailable = await requestPermissionGranted(context, Permission.storage); if (isPermissionsAvailable && model != null) { itemImage = await model!.selectFile() ?? ""; setState(() {}); } }, child: Container( width: double.infinity, height: 45, decoration: BoxDecoration( color: Colors.transparent, border: Border.all(color: MyColors.greyACColor, width: 2), borderRadius: const BorderRadius.all(Radius.circular(0)), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ const Icon( Icons.attach_file, size: 18, color: MyColors.darkPrimaryColor, ), 8.width, const Text( "Attach Item Image", style: TextStyle( color: MyColors.darkPrimaryColor, ), ), const Icon( Icons.attach_file, size: 18, color: Colors.transparent, ), ], ), ), ), 20.height, CheckBoxWithTitleDescription( isSelected: isAppointmentAvailable, title: 'Available for appointment', description: 'This option will allow customer to book appointment for these services', onSelection: (bool v) { setState(() { isAppointmentAvailable = v; // isWorkshopAppointmentAvailable = v; }); }, ), 12.height, if (isAppointmentAvailable) CheckBoxWithTitleDescription( isSelected: isWorkshopAppointmentAvailable, title: 'Allow Workshop service', description: 'This option will show to customer that you can avail this service on workshop or not.', onSelection: (bool v) { setState(() { isWorkshopAppointmentAvailable = v; }); }, ), 12.height, if (isAppointmentAvailable) CheckBoxWithTitleDescription( isSelected: isHomeAppointmentAvailable, title: 'Allow home services', description: 'This option will allow customer to book appointment at their desired location', onSelection: (bool v) { setState(() { isHomeAppointmentAvailable = v; }); }, ), 12.height, ], ), ), ), ShowFillButton( title: (itemData!.isUpdateOrSelected ?? false) ? "Update Item" : "Create Item", maxWidth: double.infinity, onPressed: () async { if (validation()) { if (!(itemData?.isUpdateOrSelected ?? false)) { Map map = { "name": name, "price": price, "description": description, "itemImage": itemImage ?? "", "companyID": 1, "manufactureDate": year, "serviceProviderServiceID": itemData!.serviceProviderServiceId, "isActive": true, "isAllowAppointment": isAppointmentAvailable, "isAppointmentCompanyLoc": isWorkshopAppointmentAvailable, "isAppointmentCustomerLoc": isHomeAppointmentAvailable }; Utils.showLoading(context); MResponse mResponse = await model!.createServiceItem(map); Utils.hideLoading(context); if (mResponse.messageStatus == 1) { model!.getServiceItems(itemData!.serviceProviderServiceId ?? 0); } Utils.showToast(mResponse.message ?? ""); pop(context); } else { Map map = { "id": itemData!.id, "name": name, "price": price, "description": description, "itemImage": itemImage ?? "", "companyID": 1, "manufactureDate": year, "serviceProviderServiceID": itemData!.serviceProviderServiceId, "isActive": true, "isAllowAppointment": isAppointmentAvailable, "isAppointmentCompanyLoc": isWorkshopAppointmentAvailable, "isAppointmentCustomerLoc": isHomeAppointmentAvailable }; Utils.showLoading(context); MResponse mResponse = await model!.updateServiceItem(map); Utils.hideLoading(context); if (mResponse.messageStatus == 1) { model!.getServiceItems(itemData!.serviceProviderServiceId ?? 0); } Utils.showToast(mResponse.message ?? ""); pop(context); } } }, ), ], ), ), ); } bool validation() { bool valid = true; if (name == null || name!.length < 3) { Utils.showToast("Please add valid item name"); valid = false; } else if (description == null || description!.length < 3) { Utils.showToast("Please add valid item description"); valid = false; } else if (price == null) { Utils.showToast("Please add valid item price"); valid = false; } else if (year == null) { Utils.showToast("Please add valid year"); valid = false; } return valid; } }