// ignore_for_file: deprecated_member_use import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/localization/app_translations.dart'; import 'package:fcs/pages/main/model/language_model.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; import '../customer/customer_detail.dart'; import '../widgets/label_widgets.dart'; final log = Logger('Util'); Future showMsgDialog(BuildContext context, String title, String msg) { return showDialog( context: context, builder: (_) { return AlertDialog( title: Text(title), content: Text(msg), actions: [ TextButton( child: Text( "Close", style: TextStyle(color: primaryColor), ), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); } Future showConfirmDialog( BuildContext context, String translationKey, ok(), {List? translationVariables}) async { await showDialog( context: context, builder: (_) { return AlertDialog( title: Center( child: LocalText( context, translationKey, translationVariables: translationVariables, color: primaryColor, ), ), content: Container( child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ TextButton( style: TextButton.styleFrom( backgroundColor: Colors.grey[300], shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0))), child: Text( AppTranslations.of(context)!.text('btn.cancel'), style: Provider.of(context).isEng ? TextStyle(color: primaryColor) : TextStyle( fontFamily: 'Myanmar3', color: primaryColor), ), onPressed: () { Navigator.of(context).pop(); }), SizedBox( width: 0, ), TextButton( style: TextButton.styleFrom( backgroundColor: primaryColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0))), child: Text(AppTranslations.of(context)!.text('btn.ok'), style: Provider.of(context).isEng ? TextStyle( color: Colors.white, fontWeight: FontWeight.bold) : TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontFamily: 'Myanmar3')), onPressed: () async { Navigator.of(context).pop(); await ok(); }) ], ), ), ); }); } Widget getStatus(String status) { return status == "Delivered" ? Text(status, style: TextStyle( color: primaryColor, fontSize: 18, fontWeight: FontWeight.bold)) : status == "rejected" ? Chip( backgroundColor: Colors.red, avatar: Icon( Icons.remove, color: Colors.white, size: 14, ), label: Text( status, style: TextStyle(color: Colors.white, fontSize: 12), )) : status == "In progress" ? Text( status, style: TextStyle(color: Colors.white, fontSize: 12), ) : status == "Pickuped" ? Text( status, style: TextStyle( color: primaryColor, fontSize: 18, fontWeight: FontWeight.bold), ) : status == "Pending" || status == "Rescheduled" ? Row( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Icon(Icons.schedule), ), Text( status, style: TextStyle( color: primaryColor, fontSize: 18, fontWeight: FontWeight.bold), ) ], ) : status == "Assigned" ? Row( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Icon(Icons.check), ), Text( status, style: TextStyle( color: primaryColor, fontSize: 18, fontWeight: FontWeight.bold), ) ], ) : status == "Canceled" ? Text( status, style: TextStyle( color: primaryColor, fontSize: 18, fontWeight: FontWeight.bold), ) : status == "Delivered" || status == "Avaliable" ? Text( status, style: TextStyle( color: Colors.green, fontSize: 18), ) : status == "Used" ? Text( status, style: TextStyle( color: Colors.red, fontSize: 18), ) : status == "Paid" ? Row( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Icon(Icons.check), ), Text( status, style: TextStyle( color: primaryColor, fontSize: 18, fontWeight: FontWeight.bold), ) ], ) : Text( status, style: TextStyle( color: primaryColor, fontSize: 18, fontWeight: FontWeight.bold), ); } call(BuildContext context, String phone) { showConfirmDialog(context, "contact.phone.confim", () => launch("tel:$phone"), translationVariables: [phone]); } Widget nameWidget(String name) { return Center( child: Padding( padding: const EdgeInsets.only(left: 10.0, top: 8), child: Text( name, style: TextStyle( color: Colors.black87, fontSize: 18, fontWeight: FontWeight.bold), ), ), ); } Widget phoneWidget(BuildContext context, String phone) { return Container( padding: EdgeInsets.only(top: 10), child: Row( children: [ Icon(Icons.phone), Padding( padding: const EdgeInsets.only(right: 8.0), child: labeledText(context, phone, "user.phone"), ), ], ), ); } Widget fcsInput(String label, IconData iconData, {required TextEditingController controller, required String value, bool autoFocus = false, TextInputType? textInputType}) { return TextFormField( initialValue: value, controller: controller, cursorColor: primaryColor, maxLines: null, minLines: 1, autofocus: autoFocus, keyboardType: textInputType, decoration: InputDecoration( fillColor: Colors.white, labelText: label, labelStyle: TextStyle(fontSize: 16, color: Colors.grey), filled: true, icon: Icon( iconData, color: primaryColor, ), focusedBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.grey, width: 1.0)), )); } Widget fcsInputReadOnly(String label, IconData iconData, {required TextEditingController controller, required String value}) { return TextFormField( initialValue: value, controller: controller, cursorColor: primaryColor, maxLines: null, minLines: 1, readOnly: true, decoration: InputDecoration( fillColor: Colors.white, border: InputBorder.none, labelText: label, labelStyle: TextStyle(fontSize: 16, color: Colors.grey), filled: true, icon: Icon( iconData, color: primaryColor, ), )); } Widget fcsDropDown(String label, IconData iconData, {required TextEditingController controller}) { return Row( children: [ Padding( padding: const EdgeInsets.only(right: 8.0), child: Icon(iconData), ), Expanded( child: SizedBox( height: 50.0, child: Row(children: [ Expanded(child: _dropDown()), ]), )), ], ); } Widget _dropDown() { return DropdownButton( value: "Ko Nge", icon: Icon(Icons.arrow_downward), iconSize: 24, elevation: 16, // style: TextStyle(color: Colors.deepPurple), underline: Container( height: 2, color: primaryColor, ), onChanged: (String? newValue) {}, items: ['Ko Nge', 'Two', 'Free', 'Four'] .map>((String value) { return DropdownMenuItem( value: value, child: Text(value), ); }).toList(), ); } Widget fcsButton(BuildContext context, String text, {Function? callack, IconData? iconData}) { var languageModel = Provider.of(context); var style = languageModel.isEng ? TextStyle( fontSize: 16.0, color: Colors.white, fontWeight: FontWeight.bold) : TextStyle( fontSize: 16.0, color: Colors.white, fontWeight: FontWeight.bold, fontFamily: "Myanmar3"); return Container( padding: EdgeInsets.only(left: 10, right: 10, top: 10), child: SizedBox( height: 45.0, child: ElevatedButton( style: ElevatedButton.styleFrom( elevation: 0, backgroundColor: primaryColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(3)))), onPressed: callack == null ? null : () => callack(), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ iconData == null ? Container() : Icon( iconData, color: Colors.white, ), SizedBox( width: 15, ), Text(text, style: style), ], ), ), ), ); } String getLocalString(BuildContext context, String key) { return AppTranslations.of(context)!.text(key); } void showToast(GlobalKey key, String text) { final ScaffoldMessengerState scaffold = key.currentState as ScaffoldMessengerState; scaffold.showSnackBar( SnackBar( content: Text(text), backgroundColor: secondaryColor, duration: Duration(seconds: 1), ), ); } bool hasUnicode(String text) { final int maxBits = 128; List unicodeSymbols = text.codeUnits.where((ch) => ch > maxBits).toList(); return unicodeSymbols.isNotEmpty; } String removeTrailingZeros(double number) { String result = number.toString(); result = result.indexOf('.') > 0 ? result.replaceAll(RegExp(r"([.]*0)(?!.*\d)"), "") : result; return result; } bool isValidEmail(String email) { // Define a regular expression for validating an email final emailRegex = RegExp(r'^[^@\s]+@[^@\s]+\.[^@\s]+$'); // Check if the email matches the pattern return emailRegex.hasMatch(email); } String capitalizeFirstLetter(String text) { if (text.isEmpty) return text; return text[0].toUpperCase() + text.substring(1); } Widget userSearchBox(BuildContext context, {required String lableKey, IconData? icon, User? user, Function()? onSearch, MainAxisAlignment rowMainAxisAlignment = MainAxisAlignment.start}) { return Column( children: [ Row( mainAxisAlignment: rowMainAxisAlignment, children: [ Flexible( child: Padding( padding: const EdgeInsets.only(left: 2), child: LocalText(context, lableKey, color: labelColor, fontSize: 15), )), IconButton( icon: Icon(Icons.search, color: Colors.black), onPressed: onSearch), ], ), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only( right: 15, ), child: user != null && user.fcsID != "" ? Icon(icon, color: primaryColor) : const SizedBox(), ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(user?.name ?? ''), Text(user?.fcsID ?? '', style: TextStyle(fontSize: 13, color: labelColor)), Text(user?.phoneNumber ?? '', style: TextStyle(fontSize: 13, color: labelColor)) ], )) ], ) ], ); } Widget userDisplayBox(BuildContext context, {required String lableKey, IconData? icon, String? name, String? fcsID, bool showLink = true}) { return fcsID != null && fcsID != "" ? Padding( padding: const EdgeInsets.only(top: 8.0, bottom: 8), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ icon != null ? Padding( padding: const EdgeInsets.only(right: 15), child: Icon(icon, color: primaryColor)) : const SizedBox(), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ LocalText(context, lableKey, color: Colors.black54, fontSize: 15), InkWell( onTap: showLink ? () { Navigator.push( context, CupertinoPageRoute( builder: (context) => CustomerDetail(fcsId: fcsID))); } : null, child: Text(name ?? '', style: showLink ? TextStyle( shadows: [ Shadow( color: linkColor, offset: Offset(0, -2)) ], color: Colors.transparent, decoration: TextDecoration.underline, decorationColor: linkColor) : TextStyle(color: Colors.black)), ), Text(fcsID, style: TextStyle(fontSize: 13, color: labelColor)) ], ), ), ], ), ) : const SizedBox(); } Widget settingRow(BuildContext context, {required String label, IconData? iconData, Widget? image, Function()? onTap, String? text}) { return ListTile( minTileHeight: 50, contentPadding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), onTap: onTap, leading: iconData != null ? Icon(iconData, color: primaryColor) : image ?? const SizedBox(), title: LocalText(context, label, fontSize: 15, color: Colors.black54), subtitle: text != null ? Padding( padding: const EdgeInsets.only(right: 10), child: Text( text, style: const TextStyle(color: Colors.black), ), ) : const SizedBox(), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ const Icon(SimpleLineIcons.arrow_right, color: labelColor, size: 16), ], ), ); }