You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			196 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			196 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Dart
		
	
import 'dart:convert';
 | 
						|
import 'dart:typed_data';
 | 
						|
 | 
						|
import 'package:easy_localization/easy_localization.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:flutter_svg/flutter_svg.dart';
 | 
						|
import 'package:fluttertoast/fluttertoast.dart';
 | 
						|
import 'package:mohem_flutter_app/app_state/app_state.dart';
 | 
						|
import 'package:mohem_flutter_app/classes/colors.dart';
 | 
						|
import 'package:mohem_flutter_app/config/routes.dart';
 | 
						|
import 'package:mohem_flutter_app/exceptions/api_exception.dart';
 | 
						|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
 | 
						|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
 | 
						|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
 | 
						|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
 | 
						|
import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
 | 
						|
import 'package:mohem_flutter_app/widgets/loading_dialog.dart';
 | 
						|
import 'package:shared_preferences/shared_preferences.dart';
 | 
						|
// ignore_for_file: avoid_annotating_with_dynamic
 | 
						|
 | 
						|
class Utils {
 | 
						|
  static bool _isLoadingVisible = false;
 | 
						|
 | 
						|
  static bool get isLoading => _isLoadingVisible;
 | 
						|
 | 
						|
  static void showToast(String message, {bool longDuration = false}) {
 | 
						|
    Fluttertoast.showToast(
 | 
						|
        msg: message,
 | 
						|
        toastLength: longDuration ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT,
 | 
						|
        gravity: ToastGravity.BOTTOM,
 | 
						|
        timeInSecForIosWeb: 1,
 | 
						|
        backgroundColor: Colors.black54,
 | 
						|
        textColor: Colors.white,
 | 
						|
        fontSize: 16.0);
 | 
						|
  }
 | 
						|
 | 
						|
  static dynamic getNotNullValue(List<dynamic> list, int index) {
 | 
						|
    try {
 | 
						|
      return list[index];
 | 
						|
    } catch (ex) {
 | 
						|
      return null;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  static int stringToHex(String colorCode) {
 | 
						|
    try {
 | 
						|
      return int.parse(colorCode.replaceAll("#", "0xff"));
 | 
						|
    } catch (ex) {
 | 
						|
      return (0xff000000);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  static void showLoading(BuildContext context) {
 | 
						|
    WidgetsBinding.instance.addPostFrameCallback((_) {
 | 
						|
      _isLoadingVisible = true;
 | 
						|
      showDialog(
 | 
						|
        context: context,
 | 
						|
        barrierColor: Colors.black.withOpacity(0.5),
 | 
						|
        builder: (BuildContext context) => LoadingDialog(),
 | 
						|
      ).then((value) {
 | 
						|
        _isLoadingVisible = false;
 | 
						|
      });
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  static Future delay(int millis) async {
 | 
						|
    return await Future.delayed(Duration(milliseconds: millis));
 | 
						|
  }
 | 
						|
 | 
						|
  static void hideLoading(BuildContext context) {
 | 
						|
    if (_isLoadingVisible) {
 | 
						|
      _isLoadingVisible = false;
 | 
						|
      Navigator.of(context).pop();
 | 
						|
    }
 | 
						|
    _isLoadingVisible = false;
 | 
						|
  }
 | 
						|
 | 
						|
  static Future<String> getStringFromPrefs(String key) async {
 | 
						|
    SharedPreferences prefs = await SharedPreferences.getInstance();
 | 
						|
    return prefs.getString(key) ?? "";
 | 
						|
  }
 | 
						|
 | 
						|
  static Future<bool> saveStringFromPrefs(String key, String value) async {
 | 
						|
    SharedPreferences prefs = await SharedPreferences.getInstance();
 | 
						|
    return await prefs.setString(key, value);
 | 
						|
  }
 | 
						|
 | 
						|
  static void handleException(dynamic exception, cxt, Function(String)? onErrorMessage) {
 | 
						|
    String errorMessage;
 | 
						|
    if (exception is APIException) {
 | 
						|
      if (exception.message == APIException.UNAUTHORIZED) {
 | 
						|
        return;
 | 
						|
      } else {
 | 
						|
        errorMessage = exception.error?.errorMessage ?? exception.message;
 | 
						|
      }
 | 
						|
    } else {
 | 
						|
      errorMessage = APIException.UNKNOWN;
 | 
						|
    }
 | 
						|
    if (onErrorMessage != null) {
 | 
						|
      onErrorMessage(errorMessage);
 | 
						|
    } else {
 | 
						|
      if (!AppState().isAuthenticated) {
 | 
						|
        showDialog(
 | 
						|
          context: cxt,
 | 
						|
          builder: (cxt) => ConfirmDialog(
 | 
						|
            message: errorMessage,
 | 
						|
            onTap: () {
 | 
						|
              Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route<dynamic> route) => false);
 | 
						|
            },
 | 
						|
          ),
 | 
						|
        );
 | 
						|
      } else {
 | 
						|
        showToast(errorMessage);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  static void confirmDialog(cxt, String message) {
 | 
						|
    showDialog(
 | 
						|
      context: cxt,
 | 
						|
      builder: (cxt) => ConfirmDialog(
 | 
						|
        message: message,
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  static Widget getNoDataWidget(BuildContext context) {
 | 
						|
    return Column(
 | 
						|
      mainAxisAlignment: MainAxisAlignment.center,
 | 
						|
      children: [
 | 
						|
        SvgPicture.asset('assets/images/not_found.svg', width: 110.0, height: 110.0),
 | 
						|
        Container(margin: const EdgeInsets.only(top: 15.0), child: LocaleKeys.noDataAvailable.tr().toText16().center),
 | 
						|
      ],
 | 
						|
    ).center;
 | 
						|
  }
 | 
						|
 | 
						|
  static Uint8List getPostBytes(img) {
 | 
						|
    try {
 | 
						|
      var b64 = img.replaceFirst('data:image/png;base64,', '');
 | 
						|
      if (img != null && Utils.isBase64(b64)) return Utils.dataFromBase64String(b64);
 | 
						|
    } catch (e) {}
 | 
						|
    return Uint8List.fromList([]);
 | 
						|
  }
 | 
						|
 | 
						|
  static String getBase64FromJpeg(img) {
 | 
						|
    try {
 | 
						|
      var b64 = img.replaceFirst('data:image/jpeg;base64,', '');
 | 
						|
      return b64;
 | 
						|
    } catch (e) {}
 | 
						|
    return "";
 | 
						|
  }
 | 
						|
 | 
						|
  static bool isBase64(String str) {
 | 
						|
    RegExp _base64 = RegExp(r'^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{4})$');
 | 
						|
    return _base64.hasMatch(str);
 | 
						|
  }
 | 
						|
 | 
						|
  static Uint8List dataFromBase64String(String base64String) {
 | 
						|
    return base64Decode(base64String);
 | 
						|
  }
 | 
						|
 | 
						|
  static Widget tableColumnTitle(String? text, {bool showDivider = true, bool alignCenter = false}) {
 | 
						|
    text ??= "";
 | 
						|
    return Column(
 | 
						|
      crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
      mainAxisSize: MainAxisSize.min,
 | 
						|
      children: [
 | 
						|
        6.height,
 | 
						|
        alignCenter ? text.toText12().center : text.toText12(),
 | 
						|
        5.height,
 | 
						|
        if (showDivider)
 | 
						|
          const Divider(
 | 
						|
            height: 1,
 | 
						|
            color: Color(0xff2E303A),
 | 
						|
            thickness: 1,
 | 
						|
          )
 | 
						|
      ],
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  static Widget tableColumnValue(String text, {bool isCapitable = true, bool alignCenter = false}) {
 | 
						|
    return Column(
 | 
						|
      crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
      mainAxisSize: MainAxisSize.min,
 | 
						|
      children: [
 | 
						|
        12.height,
 | 
						|
        if (alignCenter)
 | 
						|
          (isCapitable ? text.toLowerCase().capitalizeFirstofEach : text).toText12(color: MyColors.normalTextColor).center
 | 
						|
        else
 | 
						|
          (isCapitable ? text.toLowerCase().capitalizeFirstofEach : text).toText12(color: MyColors.normalTextColor),
 | 
						|
        12.height,
 | 
						|
      ],
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |