Merge branch 'master' into development_aamir

# Conflicts:
#	lib/ui/landing/dashboard_screen.dart
#	lib/ui/login/login_screen.dart
merge-requests/188/head
Aamir Muhammad 3 years ago
commit 7af10ec337

@ -5,6 +5,7 @@ import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
@ -12,6 +13,7 @@ import 'package:mohem_flutter_app/models/dashboard/list_menu.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_main_response.dart'; import 'package:mohem_flutter_app/models/itg/itg_main_response.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:platform_device_id/platform_device_id.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class DashboardApiClient { class DashboardApiClient {
@ -107,11 +109,11 @@ class DashboardApiClient {
//Mark Attendance //Mark Attendance
Future<GenericResponseModel?> markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = ""}) async { Future<GenericResponseModel?> markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = ""}) async {
String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC"; String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC";
var uuid = Uuid(); // var uuid = Uuid();
// Generate a v4 (random) id // Generate a v4 (random) id
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"UID": uuid.v4(), //Mobile Id "UID": await PlatformDeviceId.getDeviceId, //uuid.v4(), //Mobile Id
"Latitude": lat, "Latitude": lat,
"Longitude": long, "Longitude": long,
"QRValue": QRValue, "QRValue": QRValue,
@ -204,6 +206,7 @@ Future setAdvertisementViewed(String masterID, int advertisementId) async {
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"ItgNotificationMasterId": masterID, "ItgNotificationMasterId": masterID,
"EmployeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(),
"ItgAdvertisement": {"advertisementId": advertisementId, "acknowledgment": true} //Mobile Id "ItgAdvertisement": {"advertisementId": advertisementId, "acknowledgment": true} //Mobile Id
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);

@ -88,7 +88,7 @@ class AppState {
String get getHuaweiPushToken => _huaweiPushToken; String get getHuaweiPushToken => _huaweiPushToken;
final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 4.3, mobileType: Platform.isAndroid ? "android" : "ios"); final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 4.4, mobileType: Platform.isAndroid ? "android" : "ios");
void setPostParamsInitConfig() { void setPostParamsInitConfig() {
isAuthenticated = false; isAuthenticated = false;

@ -4,7 +4,7 @@ import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:huawei_hmsavailability/huawei_hmsavailability.dart'; // import 'package:huawei_hmsavailability/huawei_hmsavailability.dart';
import 'package:huawei_push/huawei_push.dart' as huawei_push; import 'package:huawei_push/huawei_push.dart' as huawei_push;
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
@ -22,7 +22,7 @@ class AppNotifications {
factory AppNotifications() => _instance; factory AppNotifications() => _instance;
late HmsApiAvailability hmsApiAvailability; // late HmsApiAvailability hmsApiAvailability;
String _huaweiToken = ''; String _huaweiToken = '';
@ -43,9 +43,9 @@ class AppNotifications {
} }
void init(String? firebaseToken) async { void init(String? firebaseToken) async {
if (Platform.isAndroid) { // if (Platform.isAndroid) {
hmsApiAvailability = HmsApiAvailability(); // hmsApiAvailability = HmsApiAvailability();
} // }
await requestPermissions(); await requestPermissions();
AppState().setDeviceToken = firebaseToken; AppState().setDeviceToken = firebaseToken;
@ -71,9 +71,10 @@ class AppNotifications {
}); });
if (Platform.isAndroid) { if (Platform.isAndroid) {
await hmsApiAvailability.isHMSAvailable().then((value) async { // await hmsApiAvailability.isHMSAvailable().then((value) async {
if (value == 0) { if (await Utils.isAppInstalledFromHuawei()) {
huawei_push.Push.enableLogger();
huawei_push.Push.enableLogger();
var result = await huawei_push.Push.setAutoInitEnabled(true); var result = await huawei_push.Push.setAutoInitEnabled(true);
huawei_push.Push.onNotificationOpenedApp.listen((message) { huawei_push.Push.onNotificationOpenedApp.listen((message) {
@ -84,9 +85,9 @@ class AppNotifications {
// newMessage(toFirebaseRemoteMessage(message)); // newMessage(toFirebaseRemoteMessage(message));
}, onError: (e) => print(e.toString())); }, onError: (e) => print(e.toString()));
} }
}).catchError((err) { // }).catchError((err) {
print(err); // print(err);
}); // });
} }
} }

@ -7,6 +7,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:google_api_availability/google_api_availability.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
@ -20,6 +21,7 @@ import 'package:mohem_flutter_app/widgets/loading_dialog.dart';
import 'package:nfc_manager/nfc_manager.dart'; import 'package:nfc_manager/nfc_manager.dart';
import 'package:nfc_manager/platform_tags.dart'; import 'package:nfc_manager/platform_tags.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:store_checker/store_checker.dart';
// ignore_for_file: avoid_annotating_with_dynamic // ignore_for_file: avoid_annotating_with_dynamic
@ -226,7 +228,6 @@ class Utils {
return BoxDecoration( return BoxDecoration(
color: background, color: background,
border: Border.all( border: Border.all(
width: 1, // width: 1, //
color: background // <--- border width here color: background // <--- border width here
), ),
@ -391,4 +392,28 @@ class Utils {
print(err); print(err);
}); });
} }
//HUAWEI DECISION MAKING
static Future<bool> isAppInstalledFromHuawei() async {
Source installationSource = await StoreChecker.getSource;
if (installationSource == Source.IS_INSTALLED_FROM_HUAWEI_APP_GALLERY) {
return true;
}
return false;
}
static Future<String> getInstallationSource() async {
Source installationSource = await StoreChecker.getSource;
return installationSource.toString().split(".")[1];
}
static Future<bool> isGoogleServicesAvailable() async {
GooglePlayServicesAvailability availability = await GoogleApiAvailability.instance.checkGooglePlayServicesAvailability();
String status = availability.toString().split('.').last;
if (status == "success") {
return true;
}
return false;
}
} }

@ -22,7 +22,7 @@ extension TrimString on String {
} }
} }
String displayLocalizedContent({required bool isPhoneLangArabic,required int selectedLanguage,required String englishContent,required String arabicContent}) { String displayLocalizedContent({required bool isPhoneLangArabic, required int selectedLanguage, required String englishContent, required String arabicContent}) {
if (selectedLanguage == 1) { if (selectedLanguage == 1) {
return englishContent; return englishContent;
} else if (selectedLanguage == 2) { } else if (selectedLanguage == 2) {
@ -122,9 +122,10 @@ extension EmailValidator on String {
decoration: isUnderLine ? TextDecoration.underline : null), decoration: isUnderLine ? TextDecoration.underline : null),
); );
Widget toText16({Color? color, bool isUnderLine = false, bool isBold = false, int? maxlines, double? height}) => Text( Widget toText16({Color? color, bool isUnderLine = false, bool isBold = false, int? maxlines, double? height, bool isCentered = false}) => Text(
this, this,
maxLines: maxlines, maxLines: maxlines,
textAlign: isCentered ? TextAlign.center : null,
style: TextStyle( style: TextStyle(
color: color ?? MyColors.darkTextColor, color: color ?? MyColors.darkTextColor,
fontSize: 16, fontSize: 16,

@ -17,6 +17,7 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart'; import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart';
import 'package:mohem_flutter_app/models/privilege_list_model.dart';
import 'package:mohem_flutter_app/provider/chat_call_provider.dart'; import 'package:mohem_flutter_app/provider/chat_call_provider.dart';
import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/provider/chat_provider_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
@ -26,6 +27,7 @@ import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_banner.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_banner.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';
import 'package:mohem_flutter_app/widgets/mark_attendance_widget.dart'; import 'package:mohem_flutter_app/widgets/mark_attendance_widget.dart';
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
import 'package:mohem_flutter_app/widgets/shimmer/offers_shimmer_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/offers_shimmer_widget.dart';
@ -64,7 +66,9 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
marathonProvider = Provider.of<MarathonProvider>(context, listen: false); marathonProvider = Provider.of<MarathonProvider>(context, listen: false);
cProvider = Provider.of<ChatProviderModel>(context, listen: false); cProvider = Provider.of<ChatProviderModel>(context, listen: false);
chatCallProvider = Provider.of<ChatCallProvider>(context, listen: false); chatCallProvider = Provider.of<ChatCallProvider>(context, listen: false);
_bHubCon(); if (checkIfPrivilegedForChat()) {
_bHubCon();
}
_onRefresh(true); _onRefresh(true);
}); });
} }
@ -127,7 +131,6 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
if (chatHubConnection.state == HubConnectionState.Connected) { if (chatHubConnection.state == HubConnectionState.Connected) {
Utils.hideLoading(context); Utils.hideLoading(context);
Navigator.pushNamed(context, AppRoutes.chat); Navigator.pushNamed(context, AppRoutes.chat);
Utils.saveStringFromPrefs("isAppOpendByChat", "false");
} }
} }
@ -146,7 +149,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
data.fetchMenuEntries(); data.fetchMenuEntries();
data.getCategoryOffersListAPI(context); data.getCategoryOffersListAPI(context);
marathonProvider.getMarathonDetailsFromApi(); marathonProvider.getMarathonDetailsFromApi();
if(isFromInit) { if (isFromInit) {
checkERMChannel(); checkERMChannel();
} }
if (!cProvider.disbaleChatForThisUser && !isFromInit) checkHubCon(); if (!cProvider.disbaleChatForThisUser && !isFromInit) checkHubCon();
@ -291,9 +294,27 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
children: [ children: [
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: <Widget>[
LocaleKeys.welcomeBack.tr().toText14(color: MyColors.grey77Color), LocaleKeys.welcomeBack.tr().toText14(color: MyColors.grey77Color),
(AppState().memberInformationList!.eMPLOYEENAME ?? "").toText24(isBold: true), (AppState().memberInformationList!.eMPLOYEENAME ?? "").toText24(isBold: true).onPress(() async {
return showMDialog(
context,
backgroundColor: Colors.transparent,
isDismissable: true,
child: SizedBox(
width: MediaQuery.of(context).size.width / 2.2,
height: MediaQuery.of(context).size.width / 2.2,
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25.0),
),
child: Center(
child: "This app is installed from ${await Utils.getInstallationSource()}".toText16(isCentered: true),
),
),
),
);
}),
16.height, 16.height,
Row( Row(
children: [ children: [
@ -599,24 +620,28 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
"assets/icons/chat/chat.svg", "assets/icons/chat/chat.svg",
color: currentIndex == 4 color: !checkIfPrivilegedForChat()
? MyColors.grey3AColor ? MyColors.lightGreyE3Color
: cProvider.disbaleChatForThisUser : currentIndex == 4
? MyColors.lightGreyE3Color ? MyColors.grey3AColor
: MyColors.grey98Color, : cProvider.disbaleChatForThisUser
? MyColors.lightGreyE3Color
: MyColors.grey98Color,
).paddingAll(4), ).paddingAll(4),
Consumer<ChatProviderModel>( Consumer<ChatProviderModel>(
builder: (BuildContext cxt, ChatProviderModel data, Widget? child) { builder: (BuildContext cxt, ChatProviderModel data, Widget? child) {
return Positioned( return !checkIfPrivilegedForChat()
right: 0, ? const SizedBox()
top: 0, : Positioned(
child: Container( right: 0,
padding: const EdgeInsets.only(left: 4, right: 4), top: 0,
alignment: Alignment.center, child: Container(
decoration: BoxDecoration(color: cProvider.disbaleChatForThisUser ? MyColors.pinkDarkColor : MyColors.redColor, borderRadius: BorderRadius.circular(17)), padding: const EdgeInsets.only(left: 4, right: 4),
child: data.chatUConvCounter.toString().toText10(color: Colors.white), alignment: Alignment.center,
), decoration: BoxDecoration(color: cProvider.disbaleChatForThisUser ? MyColors.pinkDarkColor : MyColors.redColor, borderRadius: BorderRadius.circular(17)),
); child: data.chatUConvCounter.toString().toText10(color: Colors.white),
),
);
}, },
), ),
], ],
@ -668,4 +693,15 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
Navigator.pushNamed(context, AppRoutes.offersAndDiscountsDetails, arguments: getOffersDetailList); Navigator.pushNamed(context, AppRoutes.offersAndDiscountsDetails, arguments: getOffersDetailList);
} }
bool checkIfPrivilegedForChat() {
for (PrivilegeListModel element in AppState().privilegeListModel!) {
if (element.serviceName?.toLowerCase() == "chat") {
if (element.previlege != null) {
return element.previlege!;
}
}
}
return false;
}
} }

@ -59,12 +59,12 @@ class _LoginScreenState extends State<LoginScreen> {
bool isOnExternalStorage = false; bool isOnExternalStorage = false;
bool isDevelopmentModeEnable = false; bool isDevelopmentModeEnable = false;
late HmsApiAvailability hmsApiAvailability; // late HmsApiAvailability hmsApiAvailability;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
hmsApiAvailability = HmsApiAvailability(); // hmsApiAvailability = HmsApiAvailability();
// checkFirebaseToken(); // checkFirebaseToken();
// if (kReleaseMode) { // if (kReleaseMode) {
// checkDeviceSafety(); // checkDeviceSafety();
@ -92,45 +92,46 @@ class _LoginScreenState extends State<LoginScreen> {
super.dispose(); super.dispose();
} }
String? firebaseToken; String? firebaseToken;
GetMobileLoginInfoListModel? loginInfo; GetMobileLoginInfoListModel? loginInfo;
Future<void> checkFirebaseToken() async { Future<void> checkFirebaseToken() async {
if (await Utils.getStringFromPrefs("isIncomingCall") == "true") { try {
Utils.hideLoading(context); Utils.showLoading(context);
Navigator.pushNamed(context, AppRoutes.chatStartCall, arguments: IncomingCallDataPayload.fromRawJson(await Utils.getStringFromPrefs("inComingCallData"))); if (Platform.isAndroid) {
} else { try {
try { // await hmsApiAvailability.isHMSAvailable().then((value) async {
Utils.showLoading(context); // if (await Utils.isAppInstalledFromHuawei() && !(await Utils.isGoogleServicesAvailable())) {
if (Platform.isAndroid) { if (!(await Utils.isGoogleServicesAvailable())) {
try { //print("HUAWEI APPPP GALLERYYYY!!!!");
await hmsApiAvailability.isHMSAvailable().then((value) async { AppState().setIsHuawei = true;
if (value == 0) { AppNotifications().initHuaweiPush(checkLoginInfo);
AppState().setIsHuawei = true; } else {
AppNotifications().initHuaweiPush(checkLoginInfo); print("GOOGLE PLAY STOREEEE!!!!");
} else { await Firebase.initializeApp();
await Firebase.initializeApp(); _firebaseMessaging = FirebaseMessaging.instance;
_firebaseMessaging = FirebaseMessaging.instance; firebaseToken = await _firebaseMessaging.getToken();
firebaseToken = await _firebaseMessaging.getToken(); AppNotifications().init(firebaseToken);
AppNotifications().init(firebaseToken); checkLoginInfo();
checkLoginInfo(); await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); }
} // });
}); } catch (ex) {}
} catch (ex) {} } else {
} else { await Firebase.initializeApp();
await Firebase.initializeApp(); _firebaseMessaging = FirebaseMessaging.instance;
_firebaseMessaging = FirebaseMessaging.instance; firebaseToken = await _firebaseMessaging.getToken();
firebaseToken = await _firebaseMessaging.getToken(); AppNotifications().init(firebaseToken);
AppNotifications().init(firebaseToken); checkLoginInfo();
checkLoginInfo();
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
}
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
} }
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
} }
} }

@ -279,8 +279,8 @@ class MarathonProvider extends ChangeNotifier {
oneSec, oneSec,
(Timer timer) async { (Timer timer) async {
if (totalSecondsToWaitForWinner == 1) { if (totalSecondsToWaitForWinner == 1) {
await callGetSelectedWinnersApi().whenComplete(() => updateQuestionCardStatus(QuestionCardStatus.winnerFound));
timer.cancel(); timer.cancel();
await callGetSelectedWinnersApi().whenComplete(() => updateQuestionCardStatus(QuestionCardStatus.winnerFound));
return; return;
} else if (totalSecondsToWaitForWinner == 15) { } else if (totalSecondsToWaitForWinner == 15) {
totalSecondsToWaitForWinner--; totalSecondsToWaitForWinner--;
@ -353,12 +353,15 @@ class MarathonProvider extends ChangeNotifier {
gapTimeImage = currentQuestion.gapImage; gapTimeImage = currentQuestion.gapImage;
gapTimeText = currentQuestion.gapText; gapTimeText = currentQuestion.gapText;
gapTimeType = currentQuestion.gapType; gapTimeType = currentQuestion.gapType;
startTimerForQuestion();
updateCardData();
if (Utils.isLoading) { if (Utils.isLoading) {
Utils.hideLoading(AppRoutes.navigatorKey.currentContext!); Utils.hideLoading(AppRoutes.navigatorKey.currentContext!);
} }
startTimerForQuestion(); if (!AppState().getIsDemoMarathon) {
updateCardData(); totalMarathoners = await MarathonApiClient().getMarathonersCount(marathonId: marathonDetailModel.id!);
totalMarathoners = await MarathonApiClient().getMarathonersCount(marathonId: marathonDetailModel.id!); }
Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.marathonScreen); Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.marathonScreen);
} else { } else {
currentQuestion = AppState().getIsDemoMarathon currentQuestion = AppState().getIsDemoMarathon

@ -18,7 +18,7 @@ import 'package:mohem_flutter_app/ui/screens/items_for_sale/fragments/select_cat
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/button/simple_button.dart'; import 'package:mohem_flutter_app/widgets/button/simple_button.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
import 'package:mohem_flutter_app/widgets/image_picker.dart'; import 'package:mohem_flutter_app/widgets/image_picker.dart' as imagePicker;
import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; import 'package:mohem_flutter_app/widgets/radio/show_radio.dart';
class AddItemDetailsFragment extends StatefulWidget { class AddItemDetailsFragment extends StatefulWidget {
@ -200,14 +200,22 @@ class _AddItemDetailsFragmentState extends State<AddItemDetailsFragment> {
children: [ children: [
title.toText16().expanded, title.toText16().expanded,
6.width, 6.width,
SimpleButton(LocaleKeys.add.tr(), () { SimpleButton(
ImageOptions.showImageOptionsNew(context, false, (String image, File file) { LocaleKeys.add.tr(),
setState(() { () {
images.add(image); if (images.length < 3) {
Navigator.of(context).pop(); imagePicker.ImageOptions.showImageOptionsNew(context, false, (String image, File file) {
}); setState(() {
}); images.add(image);
}, fontSize: 14), Navigator.of(context).pop();
});
});
} else {
Utils.showToast("The maximum no. of images allowed is 3.");
}
},
fontSize: 14,
),
], ],
), ),
if (images.isNotEmpty) 12.height, if (images.isNotEmpty) 12.height,

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
@ -24,6 +25,7 @@ class ItemForSaleDetailPage extends StatefulWidget {
class _ItemForSaleDetailPageState extends State<ItemForSaleDetailPage> { class _ItemForSaleDetailPageState extends State<ItemForSaleDetailPage> {
late GetItemsForSaleList getItemsForSaleList; late GetItemsForSaleList getItemsForSaleList;
int _current = 0;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -46,15 +48,32 @@ class _ItemForSaleDetailPageState extends State<ItemForSaleDetailPage> {
transitionOnUserGestures: true, transitionOnUserGestures: true,
child: AspectRatio( child: AspectRatio(
aspectRatio: 322 / 261, aspectRatio: 322 / 261,
child: ClipRRect( child: CarouselSlider(
borderRadius: BorderRadius.circular(6), items: getItemImages(),
child: Image.memory( options: CarouselOptions(
base64Decode(getItemsForSaleList.itemAttachments![0].content!), enableInfiniteScroll: false,
fit: BoxFit.cover, onPageChanged: (index, reason) {
), setState(() {
_current = index;
});
}),
), ),
), ),
).paddingAll(8), ).paddingAll(8),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: getItemImages().asMap().entries.map((entry) {
return Container(
width: 8.0,
height: 8.0,
margin: const EdgeInsets.symmetric(horizontal: 4.0),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: (Theme.of(context).brightness == Brightness.dark ? Colors.white : Colors.black).withOpacity(_current == entry.key ? 0.9 : 0.4),
),
);
}).toList(),
),
Column( Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -111,4 +130,23 @@ class _ItemForSaleDetailPageState extends State<ItemForSaleDetailPage> {
), ),
); );
} }
List<Widget> getItemImages() {
List<Widget> itemImages = [];
getItemsForSaleList.itemAttachments!.forEach((element) {
itemImages.add(
Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0),
child: ClipRRect(
borderRadius: BorderRadius.circular(6),
child: Image.memory(
base64Decode(element.content!),
fit: BoxFit.cover,
),
),
),
);
});
return itemImages;
}
} }

@ -1,18 +1,20 @@
/* ZiK */ /* ZiK */
import 'dart:async'; import 'dart:async';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
typedef ChildProvider<E> = Widget Function(BuildContext context, E? data); typedef ChildProvider<E> = Widget Function(BuildContext context, E? data);
class Updater<T> extends StatelessWidget{ class Updater<T> extends StatelessWidget {
final ChildProvider<T> childProvider; final ChildProvider<T> childProvider;
StreamController<T?>? sink; StreamController<T?>? sink;
T? initialData; T? initialData;
List<T?> _history = []; List<T?> _history = [];
Stream<T?>? _stream; Stream<T?>? _stream;
Updater({T? initialData, required this.childProvider}){
Updater({T? initialData, required this.childProvider}) {
this.sink = StreamController<T?>(); this.sink = StreamController<T?>();
this.initialData = initialData; this.initialData = initialData;
_stream = this.sink?.stream; _stream = this.sink?.stream;
@ -23,17 +25,17 @@ class Updater<T> extends StatelessWidget{
return StreamBuilder<T?>( return StreamBuilder<T?>(
initialData: this.initialData, initialData: this.initialData,
stream: _stream, stream: _stream,
builder: (ctx, snapshot){ builder: (ctx, snapshot) {
return childProvider(context, snapshot.data); return childProvider(context, snapshot.data);
}); });
} }
void pushData(T? data) { void pushData(T? data) {
_history.add(data); _history.add(data);
sink?.sink.add(data); sink?.sink.add(data);
} }
List<T?> getDataHistory() => _history; List<T?> getDataHistory() => _history;
T? getLatestData() => _history.last;
} T? getLatestData() => _history.last;
}

@ -1,13 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.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/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/provider/chat_provider_model.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
import 'package:provider/provider.dart';
AppBar AppBarWidget(BuildContext context, AppBar AppBarWidget(BuildContext context,
{required String title, {required String title,

@ -1,5 +1,3 @@
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -26,7 +24,6 @@ import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class SearchEmployeeBottomSheet extends StatefulWidget { class SearchEmployeeBottomSheet extends StatefulWidget {
int? notificationID; int? notificationID;
@ -243,11 +240,11 @@ class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
children: [ children: [
Stack( Stack(
children: <Widget>[ children: <Widget>[
SvgPicture.asset( SvgPicture.asset(
"assets/images/user.svg", "assets/images/user.svg",
height: 48, height: 48,
width: 48, width: 48,
), ),
Positioned( Positioned(
right: 5, right: 5,
bottom: 1, bottom: 1,
@ -307,13 +304,7 @@ class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
).onPress( ).onPress(
() { () {
if (provider.chatUsersList![index].isFav == null || provider.chatUsersList![index].isFav == false) { if (provider.chatUsersList![index].isFav == null || provider.chatUsersList![index].isFav == false) {
provider provider.favoriteUser(userID: AppState().chatDetails!.response!.id!, targetUserID: provider.chatUsersList![index].id!, fromSearch: true).then((value) {
.favoriteUser(
userID: AppState().chatDetails!.response!.id!,
targetUserID: provider.chatUsersList![index].id!,
fromSearch: true
)
.then((value) {
setState(() {}); setState(() {});
}); });
} else if (provider.chatUsersList![index].isFav == true) { } else if (provider.chatUsersList![index].isFav == true) {
@ -326,13 +317,7 @@ class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
setState(() {}); setState(() {});
}); });
} else { } else {
provider provider.favoriteUser(userID: AppState().chatDetails!.response!.id!, targetUserID: provider.chatUsersList![index].id!, fromSearch: true).then((value) {
.favoriteUser(
userID: AppState().chatDetails!.response!.id!,
targetUserID: provider.chatUsersList![index].id!,
fromSearch: true
)
.then((value) {
setState(() {}); setState(() {});
}); });
} }

@ -5,8 +5,7 @@ import 'package:mohem_flutter_app/classes/colors.dart';
extension WithContainer on Widget { extension WithContainer on Widget {
Widget get insideContainer => Container( Widget get insideContainer => Container(
color: Colors.white, color: Colors.white,
padding: padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21),
const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21),
child: this, child: this,
); );
} }
@ -76,8 +75,7 @@ class DefaultButton extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ children: <Widget>[
if (iconData != null) Icon(iconData, color: textColor), if (iconData != null) Icon(iconData, color: textColor),
if (svgIcon != null) if (svgIcon != null) SvgPicture.asset(svgIcon ?? "", color: textColor),
SvgPicture.asset(svgIcon ?? "", color: textColor),
if (!isTextExpanded) if (!isTextExpanded)
Padding( Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(

@ -7,7 +7,6 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart'; import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart';
import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/provider/chat_provider_model.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
AppBar ChatAppBarWidget(BuildContext context, AppBar ChatAppBarWidget(BuildContext context,

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
void showMDialog(context, {Widget? child,Color? backgroundColor,bool isDismissable=true}) async { void showMDialog(context, {Widget? child, Color? backgroundColor, bool isDismissable = true}) async {
return showDialog( return showDialog(
context: context, context: context,
barrierDismissible: isDismissable, barrierDismissible: isDismissable,

@ -68,7 +68,9 @@ class DynamicTextFieldWidget extends StatelessWidget {
enabled: isEnable, enabled: isEnable,
scrollPadding: EdgeInsets.zero, scrollPadding: EdgeInsets.zero,
readOnly: isReadOnly, readOnly: isReadOnly,
keyboardType: (isInputTypeNum) ? (isInputTypeNumSigned ? const TextInputType.numberWithOptions(signed: true, decimal: true) : TextInputType.numberWithOptions(signed: true, decimal: true)) : TextInputType.text, keyboardType: (isInputTypeNum)
? (isInputTypeNumSigned ? const TextInputType.numberWithOptions(signed: true, decimal: true) : TextInputType.numberWithOptions(signed: true, decimal: true))
: TextInputType.text,
textInputAction: TextInputAction.done, textInputAction: TextInputAction.done,
//controller: controller, //controller: controller,
maxLines: lines, maxLines: lines,

@ -45,7 +45,19 @@ class ImageOptions {
onFilesTap: () async { onFilesTap: () async {
FilePickerResult? result = await FilePicker.platform.pickFiles( FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.custom, type: FileType.custom,
allowedExtensions: ['jpg', 'jpeg ', 'pdf', 'txt', 'docx', 'doc', 'pptx', 'xlsx', 'png', 'rar', 'zip',], allowedExtensions: [
'jpg',
'jpeg ',
'pdf',
'txt',
'docx',
'doc',
'pptx',
'xlsx',
'png',
'rar',
'zip',
],
); );
List<File> files = result!.paths.map((path) => File(path!)).toList(); List<File> files = result!.paths.map((path) => File(path!)).toList();
image(result.files.first.path.toString(), files.first); image(result.files.first.path.toString(), files.first);
@ -54,67 +66,68 @@ class ImageOptions {
); );
} }
static void showImageOptions(BuildContext context, Function(String, File) image) { // static void showImageOptions(BuildContext context, Function(String, File) image) {
showModalBottomSheet( // showModalBottomSheet(
backgroundColor: Colors.transparent, // backgroundColor: Colors.transparent,
context: context, // context: context,
builder: (BuildContext bc) { // builder: (BuildContext bc) {
return _BottomSheet( // return _BottomSheet(
children: <Widget>[ // children: <Widget>[
_BottomSheetItem( // _BottomSheetItem(
title: "Select File Source", // title: "Select File Source",
onTap: () {}, // onTap: () {},
icon: Icons.file_present, // icon: Icons.file_present,
color: MyColors.black, // color: MyColors.black,
), // ),
_BottomSheetItem( // _BottomSheetItem(
title: "Gallery", // title: "Gallery",
icon: Icons.image, // icon: Icons.image,
onTap: () async { // onTap: () async {
if (Platform.isAndroid) { // if (Platform.isAndroid) {
galleryImageAndroid(image); // galleryImageAndroid(image);
} else { // } else {
File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 10))?.path ?? ""); // File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 10))?.path ?? "");
String fileName = _image.path; // String fileName = _image.path;
var bytes = File(fileName).readAsBytesSync(); // var bytes = File(fileName).readAsBytesSync();
String base64Encode = base64.encode(bytes); // String base64Encode = base64.encode(bytes);
if (base64Encode != null) { // if (base64Encode != null) {
image(base64Encode, _image); // image(base64Encode, _image);
} // }
} // }
}, // },
), // ),
_BottomSheetItem( // _BottomSheetItem(
title: "Camera", // title: "Camera",
icon: Icons.camera_alt, // icon: Icons.camera_alt,
onTap: () async { // onTap: () async {
if (Platform.isAndroid) { // if (Platform.isAndroid) {
cameraImageAndroid(image); // cameraImageAndroid(image);
} else { // } else {
File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 10))?.path ?? ""); // File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 10))?.path ?? "");
String fileName = _image.path; // String fileName = _image.path;
var bytes = File(fileName).readAsBytesSync(); // var bytes = File(fileName).readAsBytesSync();
String base64Encode = base64.encode(bytes); // String base64Encode = base64.encode(bytes);
if (base64Encode != null) { // if (base64Encode != null) {
image(base64Encode, _image); // image(base64Encode, _image);
} // }
} // }
}, // },
), // ),
_BottomSheetItem( // _BottomSheetItem(
title: "Cancel", // title: "Cancel",
onTap: () {}, // onTap: () {},
icon: Icons.cancel, // icon: Icons.cancel,
color: MyColors.redColor, // color: MyColors.redColor,
) // )
], // ],
); // );
}); // });
} // }
} }
void galleryImageAndroid(Function(String, File) image) async { void galleryImageAndroid(Function(String, File) image) async {
File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20))?.path ?? ""); File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20))?.path ?? "");
String fileName = _image.path; String fileName = _image.path;
var bytes = File(fileName).readAsBytesSync(); var bytes = File(fileName).readAsBytesSync();
String base64Encode = base64.encode(bytes); String base64Encode = base64.encode(bytes);

@ -164,7 +164,6 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
} else { } else {
performWifiAttendance(widget.model); performWifiAttendance(widget.model);
} }
// connectWifi();
}), }),
if (isQrEnabled) if (isQrEnabled)
attendanceMethod("QR", "assets/images/ic_qr.svg", isQrEnabled, () async { attendanceMethod("QR", "assets/images/ic_qr.svg", isQrEnabled, () async {
@ -193,42 +192,53 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
} }
void getHuaweiCurrentLocation(String attendanceType) { void getHuaweiCurrentLocation(String attendanceType) {
FusedLocationProviderClient locationService = FusedLocationProviderClient(); try {
LocationRequest locationRequest = LocationRequest(); FusedLocationProviderClient locationService = FusedLocationProviderClient();
locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY; LocationRequest locationRequest = LocationRequest();
locationRequest.interval = 1000; locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY;
List<LocationRequest> locationRequestList = <LocationRequest>[locationRequest]; locationRequest.interval = 1000;
LocationSettingsRequest locationSettingsRequest = LocationSettingsRequest(requests: locationRequestList); List<LocationRequest> locationRequestList = <LocationRequest>[locationRequest];
LocationSettingsRequest locationSettingsRequest = LocationSettingsRequest(requests: locationRequestList);
locationService.checkLocationSettings(locationSettingsRequest).then((settings) async { locationService.checkLocationSettings(locationSettingsRequest).then((settings) async {
await locationService.getLastLocation().then((value) { await locationService.getLastLocation().then((value) {
if (value.latitude == null || value.longitude == null) { if (value.latitude == null || value.longitude == null) {
showDialog( showDialog(
context: context, context: context,
builder: (BuildContext cxt) => ConfirmDialog( builder: (BuildContext cxt) => ConfirmDialog(
message: "Unable to get your location, Please check your location settings & try again.", message: "Unable to get your location, Please check your location settings & try again.",
onTap: () { onTap: () {
Navigator.pop(context); Navigator.pop(context);
}, },
), ),
); );
} else { } else {
if (attendanceType == "QR") { if (attendanceType == "QR") {
performQrCodeAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); performQrCodeAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? "");
} }
if (attendanceType == "WIFI") { if (attendanceType == "WIFI") {
performWifiAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); performWifiAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? "");
} }
if (attendanceType == "NFC") { if (attendanceType == "NFC") {
performNfcAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); performNfcAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? "");
}
} }
}).catchError((error) {
print("HUAWEI LOCATION getLastLocation ERROR!!!!!");
print(error);
});
}).catchError((error) {
print("HUAWEI LOCATION checkLocationSettings ERROR!!!!!");
print(error);
if (error.code == "LOCATION_SETTINGS_NOT_AVAILABLE") {
// Location service not enabled.
} }
}); });
}).catchError((error) { } catch(error) {
if (error.code == "LOCATION_SETTINGS_NOT_AVAILABLE") { print("HUAWEI LOCATION ERROR!!!!!");
// Location service not enabled. print(error);
} }
});
} }
Future<void> performNfcAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { Future<void> performNfcAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async {

@ -108,7 +108,7 @@ class OTPWidgetState extends State<OTPWidget> with SingleTickerProviderStateMixi
} }
} }
void calculateStrList() { void calculateStrList() {
if (strList.length > widget.maxLength) { if (strList.length > widget.maxLength) {
strList.length = widget.maxLength; strList.length = widget.maxLength;
} }

@ -1,9 +1,8 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart';
class QrScannerDialog extends StatefulWidget { class QrScannerDialog extends StatefulWidget {
@override @override

@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 3.2.6+300026 version: 3.2.91+300030
environment: environment:
sdk: ">=2.16.0 <3.0.0" sdk: ">=2.16.0 <3.0.0"
@ -54,7 +54,10 @@ dependencies:
logger: ^1.1.0 logger: ^1.1.0
flutter_countdown_timer: ^4.1.0 flutter_countdown_timer: ^4.1.0
nfc_manager: ^3.2.0 nfc_manager: ^3.2.0
uuid: ^3.0.6 # uuid: ^3.0.6
# device_info_plus: ^4.0.0
# android_id: ^0.1.3+1
platform_device_id: ^1.0.1
image_picker: ^0.8.5+3 image_picker: ^0.8.5+3
file_picker: ^4.6.1 file_picker: ^4.6.1
geolocator: ^9.0.2 geolocator: ^9.0.2
@ -102,11 +105,18 @@ dependencies:
flutter_layout_grid: ^2.0.1 flutter_layout_grid: ^2.0.1
#Huawei Dependencies #Huawei Dependencies
huawei_hmsavailability: ^6.6.0+300 # huawei_hmsavailability: ^6.6.0+300
huawei_location: 6.0.0+302 huawei_location: 6.0.0+302
huawei_push: ^6.7.0+300 huawei_push: ^6.7.0+300
firebase_crashlytics: ^2.9.0 firebase_crashlytics: ^2.9.0
#Items for sale Image Carousel Slider
carousel_slider: ^4.2.1
#Huawei Specified
store_checker: ^1.1.0
google_api_availability: ^3.0.1
dependency_overrides: dependency_overrides:
firebase_core_platform_interface: 4.5.1 firebase_core_platform_interface: 4.5.1

Loading…
Cancel
Save