|
|
|
|
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:fluttertoast/fluttertoast.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';
|
|
|
|
|
import 'package:sizer/sizer.dart';
|
|
|
|
|
|
|
|
|
|
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 getPostBytes(img) {
|
|
|
|
|
try {
|
|
|
|
|
var b64 = img.replaceFirst('data:image/png;base64,', '');
|
|
|
|
|
if (img != null && Utils.isBase64(b64)) return Utils.dataFromBase64String(b64);
|
|
|
|
|
} catch (e) {}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static getBase64FromJpeg(img) {
|
|
|
|
|
try {
|
|
|
|
|
var b64 = img.replaceFirst('data:image/jpeg;base64,', '');
|
|
|
|
|
return b64;
|
|
|
|
|
} catch (e) {}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|