diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index 5126f6d..7555dc6 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -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/classes/consts.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_attendance_tracking_list_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/itg/itg_main_response.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'; class DashboardApiClient { @@ -107,11 +109,11 @@ class DashboardApiClient { //Mark Attendance Future markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = ""}) async { String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC"; - var uuid = Uuid(); + // var uuid = Uuid(); // Generate a v4 (random) id Map postParams = { - "UID": uuid.v4(), //Mobile Id + "UID": await PlatformDeviceId.getDeviceId, //uuid.v4(), //Mobile Id "Latitude": lat, "Longitude": long, "QRValue": QRValue, @@ -204,6 +206,7 @@ Future setAdvertisementViewed(String masterID, int advertisementId) async { Map postParams = { "ItgNotificationMasterId": masterID, + "EmployeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(), "ItgAdvertisement": {"advertisementId": advertisementId, "acknowledgment": true} //Mobile Id }; postParams.addAll(AppState().postParamsJson); diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart index 2395bc1..cbdcdd9 100644 --- a/lib/app_state/app_state.dart +++ b/lib/app_state/app_state.dart @@ -88,7 +88,7 @@ class AppState { 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() { isAuthenticated = false; diff --git a/lib/classes/notifications.dart b/lib/classes/notifications.dart index 30fc809..5d204a4 100644 --- a/lib/classes/notifications.dart +++ b/lib/classes/notifications.dart @@ -4,7 +4,7 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.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:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; @@ -22,7 +22,7 @@ class AppNotifications { factory AppNotifications() => _instance; - late HmsApiAvailability hmsApiAvailability; + // late HmsApiAvailability hmsApiAvailability; String _huaweiToken = ''; @@ -43,9 +43,9 @@ class AppNotifications { } void init(String? firebaseToken) async { - if (Platform.isAndroid) { - hmsApiAvailability = HmsApiAvailability(); - } + // if (Platform.isAndroid) { + // hmsApiAvailability = HmsApiAvailability(); + // } await requestPermissions(); AppState().setDeviceToken = firebaseToken; @@ -71,9 +71,10 @@ class AppNotifications { }); if (Platform.isAndroid) { - await hmsApiAvailability.isHMSAvailable().then((value) async { - if (value == 0) { - huawei_push.Push.enableLogger(); + // await hmsApiAvailability.isHMSAvailable().then((value) async { + if (await Utils.isAppInstalledFromHuawei()) { + + huawei_push.Push.enableLogger(); var result = await huawei_push.Push.setAutoInitEnabled(true); huawei_push.Push.onNotificationOpenedApp.listen((message) { @@ -84,9 +85,9 @@ class AppNotifications { // newMessage(toFirebaseRemoteMessage(message)); }, onError: (e) => print(e.toString())); } - }).catchError((err) { - print(err); - }); + // }).catchError((err) { + // print(err); + // }); } } diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 076e8ab..fb8e90f 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -7,6 +7,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.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/classes/colors.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/platform_tags.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:store_checker/store_checker.dart'; // ignore_for_file: avoid_annotating_with_dynamic @@ -226,7 +228,6 @@ class Utils { return BoxDecoration( color: background, border: Border.all( - width: 1, // color: background // <--- border width here ), @@ -391,4 +392,28 @@ class Utils { print(err); }); } + + //HUAWEI DECISION MAKING + static Future isAppInstalledFromHuawei() async { + Source installationSource = await StoreChecker.getSource; + + if (installationSource == Source.IS_INSTALLED_FROM_HUAWEI_APP_GALLERY) { + return true; + } + return false; + } + + static Future getInstallationSource() async { + Source installationSource = await StoreChecker.getSource; + return installationSource.toString().split(".")[1]; + } + + static Future isGoogleServicesAvailable() async { + GooglePlayServicesAvailability availability = await GoogleApiAvailability.instance.checkGooglePlayServicesAvailability(); + String status = availability.toString().split('.').last; + if (status == "success") { + return true; + } + return false; + } } diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index b9e1acd..45cfc05 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -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) { return englishContent; } else if (selectedLanguage == 2) { @@ -122,9 +122,10 @@ extension EmailValidator on String { 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, maxLines: maxlines, + textAlign: isCentered ? TextAlign.center : null, style: TextStyle( color: color ?? MyColors.darkTextColor, fontSize: 16, diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index 4b1dad8..d9c83b5 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -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/generated/locale_keys.g.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_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/widgets/marathon_banner.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/shimmer/dashboard_shimmer_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/offers_shimmer_widget.dart'; @@ -64,7 +66,9 @@ class _DashboardScreenState extends State with WidgetsBindingOb marathonProvider = Provider.of(context, listen: false); cProvider = Provider.of(context, listen: false); chatCallProvider = Provider.of(context, listen: false); - _bHubCon(); + if (checkIfPrivilegedForChat()) { + _bHubCon(); + } _onRefresh(true); }); } @@ -127,7 +131,6 @@ class _DashboardScreenState extends State with WidgetsBindingOb if (chatHubConnection.state == HubConnectionState.Connected) { Utils.hideLoading(context); Navigator.pushNamed(context, AppRoutes.chat); - Utils.saveStringFromPrefs("isAppOpendByChat", "false"); } } @@ -146,7 +149,7 @@ class _DashboardScreenState extends State with WidgetsBindingOb data.fetchMenuEntries(); data.getCategoryOffersListAPI(context); marathonProvider.getMarathonDetailsFromApi(); - if(isFromInit) { + if (isFromInit) { checkERMChannel(); } if (!cProvider.disbaleChatForThisUser && !isFromInit) checkHubCon(); @@ -291,9 +294,27 @@ class _DashboardScreenState extends State with WidgetsBindingOb children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ 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, Row( children: [ @@ -599,24 +620,28 @@ class _DashboardScreenState extends State with WidgetsBindingOb children: [ SvgPicture.asset( "assets/icons/chat/chat.svg", - color: currentIndex == 4 - ? MyColors.grey3AColor - : cProvider.disbaleChatForThisUser - ? MyColors.lightGreyE3Color - : MyColors.grey98Color, + color: !checkIfPrivilegedForChat() + ? MyColors.lightGreyE3Color + : currentIndex == 4 + ? MyColors.grey3AColor + : cProvider.disbaleChatForThisUser + ? MyColors.lightGreyE3Color + : MyColors.grey98Color, ).paddingAll(4), Consumer( builder: (BuildContext cxt, ChatProviderModel data, Widget? child) { - return Positioned( - right: 0, - top: 0, - child: Container( - padding: const EdgeInsets.only(left: 4, right: 4), - alignment: Alignment.center, - decoration: BoxDecoration(color: cProvider.disbaleChatForThisUser ? MyColors.pinkDarkColor : MyColors.redColor, borderRadius: BorderRadius.circular(17)), - child: data.chatUConvCounter.toString().toText10(color: Colors.white), - ), - ); + return !checkIfPrivilegedForChat() + ? const SizedBox() + : Positioned( + right: 0, + top: 0, + child: Container( + padding: const EdgeInsets.only(left: 4, right: 4), + 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 with WidgetsBindingOb 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; + } } diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index f3f77e3..317afe7 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -59,12 +59,12 @@ class _LoginScreenState extends State { bool isOnExternalStorage = false; bool isDevelopmentModeEnable = false; - late HmsApiAvailability hmsApiAvailability; + // late HmsApiAvailability hmsApiAvailability; @override void initState() { super.initState(); - hmsApiAvailability = HmsApiAvailability(); + // hmsApiAvailability = HmsApiAvailability(); // checkFirebaseToken(); // if (kReleaseMode) { // checkDeviceSafety(); @@ -92,45 +92,46 @@ class _LoginScreenState extends State { super.dispose(); } + + + String? firebaseToken; GetMobileLoginInfoListModel? loginInfo; Future checkFirebaseToken() async { - if (await Utils.getStringFromPrefs("isIncomingCall") == "true") { - Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.chatStartCall, arguments: IncomingCallDataPayload.fromRawJson(await Utils.getStringFromPrefs("inComingCallData"))); - } else { - try { - Utils.showLoading(context); - if (Platform.isAndroid) { - try { - await hmsApiAvailability.isHMSAvailable().then((value) async { - if (value == 0) { - AppState().setIsHuawei = true; - AppNotifications().initHuaweiPush(checkLoginInfo); - } else { - await Firebase.initializeApp(); - _firebaseMessaging = FirebaseMessaging.instance; - firebaseToken = await _firebaseMessaging.getToken(); - AppNotifications().init(firebaseToken); - checkLoginInfo(); - await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); - } - }); - } catch (ex) {} - } else { - await Firebase.initializeApp(); - _firebaseMessaging = FirebaseMessaging.instance; - firebaseToken = await _firebaseMessaging.getToken(); - AppNotifications().init(firebaseToken); - checkLoginInfo(); - await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); - } - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); + try { + Utils.showLoading(context); + if (Platform.isAndroid) { + try { + // await hmsApiAvailability.isHMSAvailable().then((value) async { + // if (await Utils.isAppInstalledFromHuawei() && !(await Utils.isGoogleServicesAvailable())) { + if (!(await Utils.isGoogleServicesAvailable())) { + //print("HUAWEI APPPP GALLERYYYY!!!!"); + AppState().setIsHuawei = true; + AppNotifications().initHuaweiPush(checkLoginInfo); + } else { + print("GOOGLE PLAY STOREEEE!!!!"); + await Firebase.initializeApp(); + _firebaseMessaging = FirebaseMessaging.instance; + firebaseToken = await _firebaseMessaging.getToken(); + AppNotifications().init(firebaseToken); + checkLoginInfo(); + await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); + } + // }); + } catch (ex) {} + } else { + await Firebase.initializeApp(); + _firebaseMessaging = FirebaseMessaging.instance; + firebaseToken = await _firebaseMessaging.getToken(); + AppNotifications().init(firebaseToken); + checkLoginInfo(); await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); } + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); } } diff --git a/lib/ui/marathon/marathon_provider.dart b/lib/ui/marathon/marathon_provider.dart index 65b9353..908a8c0 100644 --- a/lib/ui/marathon/marathon_provider.dart +++ b/lib/ui/marathon/marathon_provider.dart @@ -279,8 +279,8 @@ class MarathonProvider extends ChangeNotifier { oneSec, (Timer timer) async { if (totalSecondsToWaitForWinner == 1) { - await callGetSelectedWinnersApi().whenComplete(() => updateQuestionCardStatus(QuestionCardStatus.winnerFound)); timer.cancel(); + await callGetSelectedWinnersApi().whenComplete(() => updateQuestionCardStatus(QuestionCardStatus.winnerFound)); return; } else if (totalSecondsToWaitForWinner == 15) { totalSecondsToWaitForWinner--; @@ -353,12 +353,15 @@ class MarathonProvider extends ChangeNotifier { gapTimeImage = currentQuestion.gapImage; gapTimeText = currentQuestion.gapText; gapTimeType = currentQuestion.gapType; + + startTimerForQuestion(); + updateCardData(); if (Utils.isLoading) { Utils.hideLoading(AppRoutes.navigatorKey.currentContext!); } - startTimerForQuestion(); - updateCardData(); - totalMarathoners = await MarathonApiClient().getMarathonersCount(marathonId: marathonDetailModel.id!); + if (!AppState().getIsDemoMarathon) { + totalMarathoners = await MarathonApiClient().getMarathonersCount(marathonId: marathonDetailModel.id!); + } Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.marathonScreen); } else { currentQuestion = AppState().getIsDemoMarathon diff --git a/lib/ui/screens/items_for_sale/fragments/add_details_fragment.dart b/lib/ui/screens/items_for_sale/fragments/add_details_fragment.dart index 5e3f749..75d1da2 100644 --- a/lib/ui/screens/items_for_sale/fragments/add_details_fragment.dart +++ b/lib/ui/screens/items_for_sale/fragments/add_details_fragment.dart @@ -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/simple_button.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'; class AddItemDetailsFragment extends StatefulWidget { @@ -200,14 +200,22 @@ class _AddItemDetailsFragmentState extends State { children: [ title.toText16().expanded, 6.width, - SimpleButton(LocaleKeys.add.tr(), () { - ImageOptions.showImageOptionsNew(context, false, (String image, File file) { - setState(() { - images.add(image); - Navigator.of(context).pop(); - }); - }); - }, fontSize: 14), + SimpleButton( + LocaleKeys.add.tr(), + () { + if (images.length < 3) { + imagePicker.ImageOptions.showImageOptionsNew(context, false, (String image, File file) { + setState(() { + images.add(image); + Navigator.of(context).pop(); + }); + }); + } else { + Utils.showToast("The maximum no. of images allowed is 3."); + } + }, + fontSize: 14, + ), ], ), if (images.isNotEmpty) 12.height, diff --git a/lib/ui/screens/items_for_sale/item_for_sale_detail.dart b/lib/ui/screens/items_for_sale/item_for_sale_detail.dart index ee76943..ce1809a 100644 --- a/lib/ui/screens/items_for_sale/item_for_sale_detail.dart +++ b/lib/ui/screens/items_for_sale/item_for_sale_detail.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:carousel_slider/carousel_slider.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; @@ -24,6 +25,7 @@ class ItemForSaleDetailPage extends StatefulWidget { class _ItemForSaleDetailPageState extends State { late GetItemsForSaleList getItemsForSaleList; + int _current = 0; @override Widget build(BuildContext context) { @@ -46,15 +48,32 @@ class _ItemForSaleDetailPageState extends State { transitionOnUserGestures: true, child: AspectRatio( aspectRatio: 322 / 261, - child: ClipRRect( - borderRadius: BorderRadius.circular(6), - child: Image.memory( - base64Decode(getItemsForSaleList.itemAttachments![0].content!), - fit: BoxFit.cover, - ), + child: CarouselSlider( + items: getItemImages(), + options: CarouselOptions( + enableInfiniteScroll: false, + onPageChanged: (index, reason) { + setState(() { + _current = index; + }); + }), ), ), ).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( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, @@ -111,4 +130,23 @@ class _ItemForSaleDetailPageState extends State { ), ); } + + List getItemImages() { + List 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; + } } diff --git a/lib/widgets/Updater.dart b/lib/widgets/Updater.dart index 82cc172..3042dbb 100644 --- a/lib/widgets/Updater.dart +++ b/lib/widgets/Updater.dart @@ -1,18 +1,20 @@ /* ZiK */ import 'dart:async'; + import 'package:flutter/cupertino.dart'; typedef ChildProvider = Widget Function(BuildContext context, E? data); -class Updater extends StatelessWidget{ +class Updater extends StatelessWidget { final ChildProvider childProvider; StreamController? sink; T? initialData; List _history = []; Stream? _stream; - Updater({T? initialData, required this.childProvider}){ + + Updater({T? initialData, required this.childProvider}) { this.sink = StreamController(); this.initialData = initialData; _stream = this.sink?.stream; @@ -23,17 +25,17 @@ class Updater extends StatelessWidget{ return StreamBuilder( initialData: this.initialData, stream: _stream, - builder: (ctx, snapshot){ - return childProvider(context, snapshot.data); - }); + builder: (ctx, snapshot) { + return childProvider(context, snapshot.data); + }); } void pushData(T? data) { _history.add(data); sink?.sink.add(data); } - + List getDataHistory() => _history; - T? getLatestData() => _history.last; -} \ No newline at end of file + T? getLatestData() => _history.last; +} diff --git a/lib/widgets/app_bar_widget.dart b/lib/widgets/app_bar_widget.dart index 1096f24..6f9898e 100644 --- a/lib/widgets/app_bar_widget.dart +++ b/lib/widgets/app_bar_widget.dart @@ -1,13 +1,9 @@ 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/config/routes.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/provider/chat_provider_model.dart'; -import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; -import 'package:provider/provider.dart'; AppBar AppBarWidget(BuildContext context, {required String title, diff --git a/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart b/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart index b20674e..d810457 100644 --- a/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart +++ b/lib/widgets/bottom_sheets/search_employee_bottom_sheet.dart @@ -1,5 +1,3 @@ -import 'dart:convert'; - import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.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/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:provider/provider.dart'; -import 'package:pull_to_refresh/pull_to_refresh.dart'; class SearchEmployeeBottomSheet extends StatefulWidget { int? notificationID; @@ -243,11 +240,11 @@ class _SearchEmployeeBottomSheetState extends State { children: [ Stack( children: [ - SvgPicture.asset( - "assets/images/user.svg", - height: 48, - width: 48, - ), + SvgPicture.asset( + "assets/images/user.svg", + height: 48, + width: 48, + ), Positioned( right: 5, bottom: 1, @@ -307,13 +304,7 @@ class _SearchEmployeeBottomSheetState extends State { ).onPress( () { if (provider.chatUsersList![index].isFav == null || provider.chatUsersList![index].isFav == false) { - provider - .favoriteUser( - userID: AppState().chatDetails!.response!.id!, - targetUserID: provider.chatUsersList![index].id!, - fromSearch: true - ) - .then((value) { + provider.favoriteUser(userID: AppState().chatDetails!.response!.id!, targetUserID: provider.chatUsersList![index].id!, fromSearch: true).then((value) { setState(() {}); }); } else if (provider.chatUsersList![index].isFav == true) { @@ -326,13 +317,7 @@ class _SearchEmployeeBottomSheetState extends State { setState(() {}); }); } else { - provider - .favoriteUser( - userID: AppState().chatDetails!.response!.id!, - targetUserID: provider.chatUsersList![index].id!, - fromSearch: true - ) - .then((value) { + provider.favoriteUser(userID: AppState().chatDetails!.response!.id!, targetUserID: provider.chatUsersList![index].id!, fromSearch: true).then((value) { setState(() {}); }); } diff --git a/lib/widgets/button/default_button.dart b/lib/widgets/button/default_button.dart index 71de642..338a13d 100644 --- a/lib/widgets/button/default_button.dart +++ b/lib/widgets/button/default_button.dart @@ -5,8 +5,7 @@ import 'package:mohem_flutter_app/classes/colors.dart'; extension WithContainer on Widget { Widget get insideContainer => Container( color: Colors.white, - padding: - const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), child: this, ); } @@ -76,8 +75,7 @@ class DefaultButton extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ if (iconData != null) Icon(iconData, color: textColor), - if (svgIcon != null) - SvgPicture.asset(svgIcon ?? "", color: textColor), + if (svgIcon != null) SvgPicture.asset(svgIcon ?? "", color: textColor), if (!isTextExpanded) Padding( padding: EdgeInsets.only( diff --git a/lib/widgets/chat_app_bar_widge.dart b/lib/widgets/chat_app_bar_widge.dart index 25ed34c..cc252ec 100644 --- a/lib/widgets/chat_app_bar_widge.dart +++ b/lib/widgets/chat_app_bar_widge.dart @@ -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/models/chat/get_search_user_chat_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'; AppBar ChatAppBarWidget(BuildContext context, diff --git a/lib/widgets/dialogs/dialogs.dart b/lib/widgets/dialogs/dialogs.dart index debb147..6765e38 100644 --- a/lib/widgets/dialogs/dialogs.dart +++ b/lib/widgets/dialogs/dialogs.dart @@ -1,6 +1,6 @@ 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( context: context, barrierDismissible: isDismissable, diff --git a/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart b/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart index ec4146b..cc710fe 100644 --- a/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart +++ b/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart @@ -68,7 +68,9 @@ class DynamicTextFieldWidget extends StatelessWidget { enabled: isEnable, scrollPadding: EdgeInsets.zero, 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, //controller: controller, maxLines: lines, diff --git a/lib/widgets/image_picker.dart b/lib/widgets/image_picker.dart index 834695b..ef04f84 100644 --- a/lib/widgets/image_picker.dart +++ b/lib/widgets/image_picker.dart @@ -45,7 +45,19 @@ class ImageOptions { onFilesTap: () async { FilePickerResult? result = await FilePicker.platform.pickFiles( 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 files = result!.paths.map((path) => File(path!)).toList(); image(result.files.first.path.toString(), files.first); @@ -54,67 +66,68 @@ class ImageOptions { ); } - static void showImageOptions(BuildContext context, Function(String, File) image) { - showModalBottomSheet( - backgroundColor: Colors.transparent, - context: context, - builder: (BuildContext bc) { - return _BottomSheet( - children: [ - _BottomSheetItem( - title: "Select File Source", - onTap: () {}, - icon: Icons.file_present, - color: MyColors.black, - ), - _BottomSheetItem( - title: "Gallery", - icon: Icons.image, - onTap: () async { - if (Platform.isAndroid) { - galleryImageAndroid(image); - } else { - File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 10))?.path ?? ""); - String fileName = _image.path; - var bytes = File(fileName).readAsBytesSync(); - String base64Encode = base64.encode(bytes); - if (base64Encode != null) { - image(base64Encode, _image); - } - } - }, - ), - _BottomSheetItem( - title: "Camera", - icon: Icons.camera_alt, - onTap: () async { - if (Platform.isAndroid) { - cameraImageAndroid(image); - } else { - File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 10))?.path ?? ""); - String fileName = _image.path; - var bytes = File(fileName).readAsBytesSync(); - String base64Encode = base64.encode(bytes); - if (base64Encode != null) { - image(base64Encode, _image); - } - } - }, - ), - _BottomSheetItem( - title: "Cancel", - onTap: () {}, - icon: Icons.cancel, - color: MyColors.redColor, - ) - ], - ); - }); - } +// static void showImageOptions(BuildContext context, Function(String, File) image) { +// showModalBottomSheet( +// backgroundColor: Colors.transparent, +// context: context, +// builder: (BuildContext bc) { +// return _BottomSheet( +// children: [ +// _BottomSheetItem( +// title: "Select File Source", +// onTap: () {}, +// icon: Icons.file_present, +// color: MyColors.black, +// ), +// _BottomSheetItem( +// title: "Gallery", +// icon: Icons.image, +// onTap: () async { +// if (Platform.isAndroid) { +// galleryImageAndroid(image); +// } else { +// File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 10))?.path ?? ""); +// String fileName = _image.path; +// var bytes = File(fileName).readAsBytesSync(); +// String base64Encode = base64.encode(bytes); +// if (base64Encode != null) { +// image(base64Encode, _image); +// } +// } +// }, +// ), +// _BottomSheetItem( +// title: "Camera", +// icon: Icons.camera_alt, +// onTap: () async { +// if (Platform.isAndroid) { +// cameraImageAndroid(image); +// } else { +// File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 10))?.path ?? ""); +// String fileName = _image.path; +// var bytes = File(fileName).readAsBytesSync(); +// String base64Encode = base64.encode(bytes); +// if (base64Encode != null) { +// image(base64Encode, _image); +// } +// } +// }, +// ), +// _BottomSheetItem( +// title: "Cancel", +// onTap: () {}, +// icon: Icons.cancel, +// color: MyColors.redColor, +// ) +// ], +// ); +// }); +// } } void galleryImageAndroid(Function(String, File) image) async { File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20))?.path ?? ""); + String fileName = _image.path; var bytes = File(fileName).readAsBytesSync(); String base64Encode = base64.encode(bytes); diff --git a/lib/widgets/mark_attendance_widget.dart b/lib/widgets/mark_attendance_widget.dart index d6d111a..2ffa961 100644 --- a/lib/widgets/mark_attendance_widget.dart +++ b/lib/widgets/mark_attendance_widget.dart @@ -164,7 +164,6 @@ class _MarkAttendanceWidgetState extends State { } else { performWifiAttendance(widget.model); } - // connectWifi(); }), if (isQrEnabled) attendanceMethod("QR", "assets/images/ic_qr.svg", isQrEnabled, () async { @@ -193,42 +192,53 @@ class _MarkAttendanceWidgetState extends State { } void getHuaweiCurrentLocation(String attendanceType) { - FusedLocationProviderClient locationService = FusedLocationProviderClient(); - LocationRequest locationRequest = LocationRequest(); - locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY; - locationRequest.interval = 1000; - List locationRequestList = [locationRequest]; - LocationSettingsRequest locationSettingsRequest = LocationSettingsRequest(requests: locationRequestList); + try { + FusedLocationProviderClient locationService = FusedLocationProviderClient(); + LocationRequest locationRequest = LocationRequest(); + locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY; + locationRequest.interval = 1000; + List locationRequestList = [locationRequest]; + LocationSettingsRequest locationSettingsRequest = LocationSettingsRequest(requests: locationRequestList); - locationService.checkLocationSettings(locationSettingsRequest).then((settings) async { - await locationService.getLastLocation().then((value) { - if (value.latitude == null || value.longitude == null) { - showDialog( - context: context, - builder: (BuildContext cxt) => ConfirmDialog( - message: "Unable to get your location, Please check your location settings & try again.", - onTap: () { - Navigator.pop(context); - }, - ), - ); - } else { - if (attendanceType == "QR") { - performQrCodeAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); - } - if (attendanceType == "WIFI") { - performWifiAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); - } - if (attendanceType == "NFC") { - performNfcAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); + locationService.checkLocationSettings(locationSettingsRequest).then((settings) async { + await locationService.getLastLocation().then((value) { + if (value.latitude == null || value.longitude == null) { + showDialog( + context: context, + builder: (BuildContext cxt) => ConfirmDialog( + message: "Unable to get your location, Please check your location settings & try again.", + onTap: () { + Navigator.pop(context); + }, + ), + ); + } else { + if (attendanceType == "QR") { + performQrCodeAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); + } + if (attendanceType == "WIFI") { + performWifiAttendance(widget.model, lat: value.latitude.toString() ?? "", lng: value.longitude.toString() ?? ""); + } + if (attendanceType == "NFC") { + 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) { - if (error.code == "LOCATION_SETTINGS_NOT_AVAILABLE") { - // Location service not enabled. - } - }); + } catch(error) { + print("HUAWEI LOCATION ERROR!!!!!"); + print(error); + } + } Future performNfcAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { diff --git a/lib/widgets/otp_widget.dart b/lib/widgets/otp_widget.dart index e90308d..7994b1e 100644 --- a/lib/widgets/otp_widget.dart +++ b/lib/widgets/otp_widget.dart @@ -108,7 +108,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi } } - void calculateStrList() { + void calculateStrList() { if (strList.length > widget.maxLength) { strList.length = widget.maxLength; } diff --git a/lib/widgets/qr_scanner_dialog.dart b/lib/widgets/qr_scanner_dialog.dart index 1889616..11e2601 100644 --- a/lib/widgets/qr_scanner_dialog.dart +++ b/lib/widgets/qr_scanner_dialog.dart @@ -1,9 +1,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.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:qr_code_scanner/qr_code_scanner.dart'; class QrScannerDialog extends StatefulWidget { @override diff --git a/pubspec.yaml b/pubspec.yaml index 974db1d..adcab03 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 3.2.6+300026 +version: 3.2.91+300030 environment: sdk: ">=2.16.0 <3.0.0" @@ -54,7 +54,10 @@ dependencies: logger: ^1.1.0 flutter_countdown_timer: ^4.1.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 file_picker: ^4.6.1 geolocator: ^9.0.2 @@ -102,11 +105,18 @@ dependencies: flutter_layout_grid: ^2.0.1 #Huawei Dependencies - huawei_hmsavailability: ^6.6.0+300 +# huawei_hmsavailability: ^6.6.0+300 huawei_location: 6.0.0+302 huawei_push: ^6.7.0+300 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: firebase_core_platform_interface: 4.5.1