Merge branch 'aamir_dev' into faiz_dev

aamir_dev
Faiz Hashmi 2 years ago
commit 718cc75d13

@ -121,7 +121,6 @@
F095357B123772C701252686 /* Pods-Runner.release.xcconfig */,
B5D2F47A7F9A7D8C8678860A /* Pods-Runner.profile.xcconfig */,
);
name = Pods;
path = Pods;
sourceTree = "<group>";
};
@ -377,13 +376,14 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.carProviderApp;
PRODUCT_BUNDLE_IDENTIFIER = com.example.carProviderAppp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@ -504,13 +504,14 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.carProviderApp;
PRODUCT_BUNDLE_IDENTIFIER = com.example.carProviderAppp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -526,13 +527,14 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.carProviderApp;
PRODUCT_BUNDLE_IDENTIFIER = com.example.carProviderAppp;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;

@ -27,8 +27,6 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@ -38,8 +36,8 @@
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@ -61,8 +59,13 @@
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
<EnvironmentVariables>
<EnvironmentVariable
key = "IDEPreferLogStreaming"
value = "YES"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"

@ -1,5 +1,6 @@
import UIKit
import Flutter
import GoogleMaps
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
@ -7,6 +8,7 @@ import Flutter
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GMSServices.provideAPIKey("AIzaSyCyDbWUM9d_sBUGIE8PcuShzPaqO08NSC8")
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
@ -22,6 +24,22 @@
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppleMusicUsageDescription</key>
<string>Access to pick a photo</string>
<key>NSCameraUsageDescription</key>
<string>Access to take a photo by camera</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Access to pick a photo</string>
<key>NSFaceIDUsageDescription</key>
<string>This app requires Face ID to allow biometric authentication for app login.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This App requires access to your location to pick the location.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This App requires access to your location to pick the location.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This App requires access to your location to pick the location.</string>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
@ -41,15 +59,5 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>NSCameraUsageDescription</key>
<string>Access to take a photo by camera</string>
<key>NSAppleMusicUsageDescription</key>
<string>Access to pick a photo</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Access to pick a photo</string>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>

@ -18,7 +18,7 @@ import 'package:car_provider_app/views/settings/services/duplication/sheet/appro
import 'package:car_provider_app/views/settings/services/items_list_page.dart';
import 'package:car_provider_app/views/settings/services/services_list_page.dart';
import 'package:car_provider_app/views/subscriptions/my_subscritions_page.dart';
import 'package:car_provider_app/views/subscriptions/subscriptions_page.dart';
import 'package:car_provider_app/views/subscriptions/all_subscriptions_page.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:flutter/material.dart';

@ -255,7 +255,7 @@ class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentP
await context.read<AppointmentsVM>().getMyAppointmentsForProvider({
"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0",
"ProviderBranchID": branchId.toString(),
}, isNeedToRebuild: true);
},);
}
double calculatePrice() {

@ -156,6 +156,6 @@ class MergeAppointmentListPage extends StatelessWidget {
.toString() ??
"0",
"ProviderBranchID": branchId.toString(),
}, isNeedToRebuild: true);
});
}
}

@ -21,7 +21,6 @@ import 'package:provider/provider.dart';
import '../dashboard/widget/appointment_slider_widget.dart';
import 'package:easy_localization/easy_localization.dart';
class UpdateAppointmentPage extends StatelessWidget {
late AppointmentListModel appointmentListModel;
@ -30,7 +29,7 @@ class UpdateAppointmentPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
appBar: CustomAppBar(
title: LocaleKeys.updateAppointment.tr(),
),
body: SizedBox(
@ -266,6 +265,6 @@ class UpdateAppointmentPage extends StatelessWidget {
await context.read<AppointmentsVM>().getMyAppointmentsForProvider({
"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0",
"ProviderBranchID": branchId.toString(),
}, isNeedToRebuild: true);
});
}
}

@ -25,6 +25,7 @@ import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart';
import 'package:mc_common_app/view_models/chat_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/view_models/subscriptions_view_model.dart';
import 'package:mc_common_app/view_models/user_view_model.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/common_widgets/bottom_nav_bar.dart';
@ -49,20 +50,15 @@ class _DashboardPageState extends State<DashboardPage> {
dashboardVM = Provider.of<DashboardVM>(context, listen: false);
context.read<RequestsVM>().populateRequestsFilterList();
context.read<AppointmentsVM>().populateAppointmentsFilterList();
_onRefresh();
scheduleMicrotask(() => _onRefresh());
}
Future<void> _onRefresh() async {
final requestsVM = context.read<RequestsVM>();
// final chatVM = context.read<ChatVM>();
// context.read<AdVM>().populateAdsFilterList();
context.read<ServiceVM>().getBranchAndServices();
await context.read<ServiceVM>().getBranchAndServices();
AdVM adVm = Provider.of<AdVM>(context, listen: false);
// context.read<AppointmentsVM>().myUpComingAppointments,
AppointmentsVM appointmentsVM = Provider.of<AppointmentsVM>(context, listen: false);
if (appointmentsVM.myAppointments.isEmpty) {
await appointmentsVM.getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});
}
SubscriptionsVM sVM = Provider.of<SubscriptionsVM>(context, listen: false);
await context.read<AppointmentsVM>().getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});
adVm.populateAdsFilterList();
if (adVm.myAds.isEmpty) {
await adVm.getMyAds();
@ -82,11 +78,17 @@ class _DashboardPageState extends State<DashboardPage> {
if (requestsVM.myRequests.isEmpty) {
await requestsVM.getRequests(appType: AppType.provider);
}
if (sVM.mySubscriptionsBySp.isEmpty) {
await sVM.getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
}
if (sVM.tempSubscriptions.isEmpty) {
await sVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true);
}
// await chatVM.buildHubConnection(context);
}
@override
Widget build(BuildContext context) {
List<Widget> fragments = [

@ -1,3 +1,5 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/view_models/dashboard_view_model.dart';
import 'package:car_provider_app/views/dashboard/widget/my_service_provider.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
@ -5,11 +7,13 @@ import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:mc_common_app/views/advertisement/ads_list.dart';
import 'package:mc_common_app/views/appointments/widgets/customer_appointment_slider_widget.dart';
@ -20,7 +24,6 @@ import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
import '../widget/appointment_slider_widget.dart';
class HomeFragment extends StatelessWidget {
@ -64,28 +67,29 @@ class HomeFragment extends StatelessWidget {
onRefresh: onRefresh,
child: ListView(
children: [
10.height,
ViewAllWidget(
title: LocaleKeys.upcoming_appointment.tr(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {},
).horPaddingMain(),
title: LocaleKeys.upcoming_appointment.tr(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVM>().updateIndex(1);
}).horPaddingMain(),
// const AppointmentSliderWidget().horPaddingMain(),
CustomerAppointmentSliderWidget(
myUpComingAppointments: context.read<AppointmentsVM>().myUpComingAppointments,
isNeedToShowEmptyMessage: true,
onAppointmentClick: () {
// navigateWithName(
// context, ProviderAppRoutes.appointment,
// arguments: branches[index]);
onAppointmentClick: (AppointmentListModel value) {
navigateWithName(context, ProviderAppRoutes.appointmentDetailList, arguments: value);
},
),
21.height,
ViewAllWidget(
title: LocaleKeys.myBranches.tr(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {},
onSubtitleTapped: () {
context.read<DashboardVM>().updateIndex(0);
},
).horPaddingMain(),
const ServiceProviderWidget().horPaddingMain(),
Consumer(
builder: (BuildContext context, AdVM adVM, Widget? child) {
if (adVM.state == ViewState.busy) {

@ -25,7 +25,7 @@ class ServiceProviderWidget extends StatelessWidget {
if (model.state == ViewState.busy) {
return const Center(child: CircularProgressIndicator());
} else {
return model.branches!.data == null
return model.branches == null || model.branches!.data == null
? Center(child: Text(LocaleKeys.noBranchFound.tr()))
: model.branches!.data!.serviceProviderBranch != null && model.branches!.data!.serviceProviderBranch!.isEmpty
? Center(child: Text(LocaleKeys.no_branch.tr()))

@ -13,6 +13,7 @@ import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:permission_handler/permission_handler.dart';
import 'map_selection_widget.dart';
import 'package:geocoding/geocoding.dart';
class PickLocationPage extends StatefulWidget {
Function(double, double, String) onPickAddress;
@ -122,6 +123,8 @@ class _PickLocationPageState extends State<PickLocationPage> {
Future<void> _updatePosition(CameraPosition _position) async {
latitude = _position.target.latitude;
longitude = _position.target.longitude;
print(latitude);
print(latitude);
updateAddress(latitude, longitude);
}
@ -137,8 +140,7 @@ class _PickLocationPageState extends State<PickLocationPage> {
requestPermissions().then(
(value) async {
if (value[Permission.location]!.isGranted) {
var position =
await GeolocatorPlatform.instance.getCurrentPosition();
var position = await GeolocatorPlatform.instance.getCurrentPosition();
currentPostion = LatLng(position.latitude, position.longitude);
latitude = position.latitude;
longitude = position.longitude;
@ -151,11 +153,8 @@ class _PickLocationPageState extends State<PickLocationPage> {
}
updateAddress(double latitude, double longitude) async {
// List<Placemark> placemarks =
// await placemarkFromCoordinates(latitude, longitude);
// _counter.value =
// '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}';
// print("Address121: " + placemarks[0].toString());
List<Placemark> placemarks = await placemarkFromCoordinates(latitude, longitude);
_counter.value = '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}';
}
setMap() {
@ -176,6 +175,6 @@ class _PickLocationPageState extends State<PickLocationPage> {
}
Future<Map<Permission, PermissionStatus>> requestPermissions() async {
var permissionResults = [Permission.calendar].request();
var permissionResults = [Permission.location].request();
return permissionResults;
}

@ -2,11 +2,13 @@ import 'dart:async';
import 'package:car_provider_app/views/subscriptions/sheet/downgrade_data_sheet.dart';
import 'package:car_provider_app/views/subscriptions/sheet/upgrade_package_sheet.dart';
import 'package:car_provider_app/views/subscriptions/widget/subscriptions_card.dart';
import 'package:car_provider_app/views/subscriptions/widget/all_subscriptions_card.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
@ -17,6 +19,7 @@ import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/tab/menu_tabs.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class SubscriptionsPage extends StatefulWidget {
const SubscriptionsPage({Key? key}) : super(key: key);
@ -41,50 +44,49 @@ class _SubscriptionsPageState extends State<SubscriptionsPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: const CustomAppBar(
title: "Subscriptions",
appBar: CustomAppBar(
title: LocaleKeys.subscriptions.tr(),
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: Consumer<SubscriptionsVM>(builder: (context, model, _) {
return model.state == ViewState.busy
child: Consumer<SubscriptionsVM>(builder: (context, subcriptionsVM, _) {
return subcriptionsVM.state == ViewState.busy
? const Center(child: CircularProgressIndicator())
: SingleChildScrollView(
child: Column(
children: [
21.height,
MenuTabs(
model.selectedIndex,
model.monthlyTabs,
subcriptionsVM.monthlyTabs,
selectedColor: MyColors.primaryColor,
onSelect: (DropValue selectedValue) {
model.selectedMothlyTab = selectedValue;
// model.selectedIndex = selectedIndex;
model.filterSubscriptions();
model.setState(ViewState.idle);
onSelected: (DropValue selectedValue, int index) {
subcriptionsVM.selectedMothlyTab = selectedValue;
subcriptionsVM.monthlyTabs.forEach((element) => element.isEnabled = false);
subcriptionsVM.monthlyTabs[index].isEnabled = true;
subcriptionsVM.filterSubscriptions();
subcriptionsVM.setState(ViewState.idle);
},
),
21.height,
ListView.separated(
itemBuilder: (BuildContext context, int index) {
return SubscriptionsCard(
model.tempSubscriptions[index],
isSubscribed: model.tempSubscriptions[index].isSubscribed ?? false,
isMainPage: false,
onRenewSubscriptionClick: () {
// context.read<PaymentVM>().updateOrderProviderSubscriptionId(id: model.tempSubscriptions[index].id??0);
// navigateWithName(
// context,
// AppRoutes.paymentMethodsView,
// arguments: PaymentTypes.subscription,
// );
if (model.tempSubscriptions[index].subscriptionTypeEnum == SubscriptionTypeEnum.upgrade) {
showMyBottomSheet(context, child: UpgradePackageSheet(model.tempSubscriptions[index]));
} else {
showMyBottomSheet(context, child: DowngradeDataSheet(model.tempSubscriptions[index]));
return AllSubscriptionsCard(
subcriptionsVM.tempSubscriptions[index],
isSubscribed: subcriptionsVM.tempSubscriptions[index].isSubscribed ?? false,
onRenewSubscriptionClick: () async {
MResponse response = await subcriptionsVM.createSubscriptionOrder(subcriptionsVM.tempSubscriptions[index].id ?? 0, true, true);
if (response.data != null) {
context.read<PaymentVM>().updateOrderProviderSubscriptionId(id: response.data ?? 0);
navigateWithName(context, AppRoutes.paymentMethodsView, arguments: PaymentTypes.subscription);
}
},
onUpgradeSubscriptionClick: () {
showMyBottomSheet(context, child: UpgradePackageSheet(subcriptionsVM.tempSubscriptions[index]));
},
onDowngradeSubscriptionClick: () {
showMyBottomSheet(context, child: DowngradeDataSheet(subcriptionsVM.tempSubscriptions[index]));
},
);
},
separatorBuilder: (BuildContext context, int index) {
@ -92,7 +94,7 @@ class _SubscriptionsPageState extends State<SubscriptionsPage> {
},
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: model.tempSubscriptions.length,
itemCount: subcriptionsVM.tempSubscriptions.length,
),
21.height,
],

@ -1,14 +1,18 @@
import 'dart:async';
import 'dart:developer';
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/views/subscriptions/sheet/select_package_sheet.dart';
import 'package:car_provider_app/views/subscriptions/widget/subscriptions_card.dart';
import 'package:car_provider_app/views/subscriptions/sheet/upgrade_package_sheet.dart';
import 'package:car_provider_app/views/subscriptions/widget/all_subscriptions_card.dart';
import 'package:car_provider_app/views/subscriptions/widget/my_subscriptions_card.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
@ -18,19 +22,30 @@ import 'package:mc_common_app/view_models/subscriptions_view_model.dart';
import 'package:mc_common_app/widgets/bottom_sheet.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class MySubscriptionsPage extends StatelessWidget {
class MySubscriptionsPage extends StatefulWidget {
const MySubscriptionsPage({Key? key}) : super(key: key);
@override
State<MySubscriptionsPage> createState() => _MySubscriptionsPageState();
}
class _MySubscriptionsPageState extends State<MySubscriptionsPage> {
@override
void initState() {
super.initState();
scheduleMicrotask(() {
context.read<SubscriptionsVM>().getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
});
}
@override
Widget build(BuildContext context) {
context.read<SubscriptionsVM>().getMySubscriptions(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
return Scaffold(
appBar: const CustomAppBar(
title: "My Subscriptions",
appBar: CustomAppBar(
title: LocaleKeys.mySubscription.tr(),
),
body: SizedBox(
width: double.infinity,
@ -47,41 +62,61 @@ class MySubscriptionsPage extends StatelessWidget {
21.height,
ListView.separated(
itemBuilder: (BuildContext context, int index) {
return SubscriptionsCard(
model.allSubscriptions.data![index],
isSubscribed: model.allSubscriptions.data![index].isSubscribed ?? false,
var sub = model.mySubscriptionsBySp[index];
return MySubscriptionsCard(
model.mySubscriptionsBySp[index],
isSubscribed: false,
backgroundColor: MyColors.darkIconColor,
isMainPage: model.mySubscriptionsBySp[index].isExpired ?? false,
onRenewSubscriptionClick: () async {
Utils.showLoading(context);
MResponse response = await model.createSubscriptionOrder(
model.allSubscriptions.data![index].id ?? 0,
true,
false,
model.allSubscriptions.data![index].price.toString(),
);
MResponse response = await model.createSubscriptionOrder(model.mySubscriptionsBySp[index].subscriptionID ?? 0, true, true);
Utils.hideLoading(context);
if (response.data != null) {
log("response.data: ${response.data}");
context.read<PaymentVM>().updateOrderProviderSubscriptionId(id: response.data ?? 0);
navigateWithName(
context,
AppRoutes.paymentMethodsView,
arguments: PaymentTypes.subscription,
);
navigateWithName(context, AppRoutes.paymentMethodsView, arguments: PaymentTypes.subscription);
}
},
).onPress(
() {
showMyBottomSheet(context, child: const SelectPackageSheet());
onUpgradeSubscriptionClick: () {
print("Upgrade");
print(sub.toJson());
// showMyBottomSheet(
// context,
// child: UpgradePackageSheet(
// Subscription(
// id: sub.subscriptionID,
// isMyCurrentPackage: false,
// isExpired: sub.isExpired,
// isActive: sub.isActive,
// isSubscribed: true,
// name: sub.subscriptionName,
// description: sub.subscriptionDescription,
// numberOfAds: sub.totalAds ?? 0,
// numberOfBranches: sub.totalBranches ?? 0,
// numberOfSubUsers: sub.totalSubUsers ?? 0,
// countryId: 1,
// countryName: "KSA" ,
// currency: "SAR",
// price: 0,
// dateEnd: sub.dateEnd,
// dateStart: sub.dateStart
// ),
// ),
// );
},
);
// .onPress(
// () {
// // showMyBottomSheet(context, child: const SelectPackageSheet());
// },
// );
},
separatorBuilder: (BuildContext context, int index) {
return 21.height;
},
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: model.allSubscriptions.data!.length,
itemCount: model.mySubscriptionsBySp.length,
),
21.height,
],
@ -102,7 +137,6 @@ class MySubscriptionsPage extends StatelessWidget {
],
),
),
);
}
}

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
@ -33,7 +35,9 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
void initState() {
// TODO: implement initState
super.initState();
calculateUpgradePrice();
scheduleMicrotask(() {
calculateUpgradePrice();
});
}
calculateUpgradePrice() {
@ -70,7 +74,7 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
12.height,
packageItem(
"Now",
("Your subscription will upgrade now. Affecting from ${DateHelper.formatAsLongDate(widget.subscription.dateEnd!)}"),
("Your subscription will upgrade now. Affecting from ${DateHelper.formatAsLongDate(widget.subscription.dateEnd ?? DateTime.now())}"),
model.newPrice.toString(),
isNowSelected,
).onPress(() {
@ -82,7 +86,7 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
6.height,
packageItem(
"Upgrade after current expiry",
("Your subscription will upgrade after you current subscription will end. Affecting from 27 January, 2024 ${DateHelper.formatAsLongDate(widget.subscription.dateEnd!)}"),
("Your subscription will upgrade after you current subscription will end. Affecting from 27 January, 2024 ${DateHelper.formatAsLongDate(widget.subscription.dateEnd ?? DateTime.now())}"),
widget.subscription.price.toString(),
isNowSelected ? false : true,
).onPress(() {
@ -102,17 +106,10 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
paymentType: PaymentTypes.subscription,
onTempContinue: () async {
Utils.showLoading(context);
MResponse mResponse = await model.payForSubscription(
widget.subscription.id!,
isNowSelected,
false,
price);
MResponse mResponse = await model.payForSubscription(widget.subscription.id!, isNowSelected, false, price);
Utils.hideLoading(context);
if (mResponse.messageStatus == 1) {
context
.read<PaymentVM>()
.updateOrderProviderSubscriptionId(
id: mResponse.data);
context.read<PaymentVM>().updateOrderProviderSubscriptionId(id: mResponse.data);
// Utils.showToast(
// "Subscriptions is successfully updated");
@ -133,8 +130,7 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
);
}
Widget packageItem(
String title, String description, String price, bool isSelected) {
Widget packageItem(String title, String description, String price, bool isSelected) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
@ -145,8 +141,7 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
color: Colors.white,
).toContainer(
isEnabledBorder: true,
backgroundColor:
isSelected ? MyColors.primaryColor : Colors.transparent,
backgroundColor: isSelected ? MyColors.primaryColor : Colors.transparent,
borderColor: MyColors.primaryColor,
borderWidget: 1,
borderRadius: 0,
@ -176,10 +171,7 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
2.width,
Padding(
padding: const EdgeInsets.only(bottom: 2),
child: "SAR".toText(
fontSize: 16,
isBold: true,
color: MyColors.lightTextColor),
child: "SAR".toText(fontSize: 16, isBold: true, color: MyColors.lightTextColor),
),
],
)

@ -0,0 +1,168 @@
import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class AllSubscriptionsCard extends StatelessWidget {
Subscription subscription;
bool isSubscribed;
Color? backgroundColor;
late Color textColor;
Function onRenewSubscriptionClick;
Function onUpgradeSubscriptionClick;
Function onDowngradeSubscriptionClick;
AllSubscriptionsCard(
this.subscription, {
Key? key,
this.isSubscribed = false,
this.backgroundColor,
required this.onRenewSubscriptionClick,
required this.onUpgradeSubscriptionClick,
required this.onDowngradeSubscriptionClick,
}) : super(key: key);
@override
Widget build(BuildContext context) {
textColor = backgroundColor == null ? Colors.black : Colors.white;
// return InkWell(
// onTap: isSubscribed
// ? null
// : () {
// onRenewSubscriptionClick();
// },
// child:
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: subscription.name.toString().toText(
fontSize: 18,
color: textColor,
),
),
// if (isSubscribed)
// Row(
// children: [
// Container(
// color: MyColors.white,
// padding: const EdgeInsets.all(2),
// child: const Icon(
// Icons.done,
// size: 8,
// color: MyColors.primaryColor,
// ),
// ).toCircle(
// borderRadius: 122,
// ),
// 6.width,
// "Subscribed".toText(color: Colors.white, isBold: true)
// ],
// ).toContainer(
// backgroundColor: MyColors.primaryColor,
// borderRadius: 20,
// padding: const EdgeInsets.symmetric(
// horizontal: 6,
// vertical: 3,
// ),
// )
if (subscription.isMyCurrentPackage!) "Current Package".toText(color: MyColors.primaryColor, fontWeight: FontWeight.bold),
if (!subscription.isMyCurrentPackage!)
(subscription.subscriptionTypeEnum)!
.getStringSubscriptionTypeEnum()
.toText(color: Colors.white)
.toContainer(
backgroundColor: MyColors.primaryColor,
borderRadius: 30,
padding: const EdgeInsets.symmetric(
horizontal: 6,
vertical: 3,
),
)
.onPress(() {
if (subscription.subscriptionTypeEnum == SubscriptionTypeEnum.downgrade) {
onDowngradeSubscriptionClick();
} else {
onUpgradeSubscriptionClick();
}
})
],
),
6.height,
showItem("Ads:", subscription.numberOfAds.toString()),
showItem("Users:", subscription.numberOfSubUsers.toString()),
showItem("Branches:", subscription.numberOfBranches.toString()),
14.height,
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
subscription.price.toString().toText(
fontSize: 26,
isBold: true,
color: textColor,
),
2.width,
"${subscription.currency}/Month".toText(
color: MyColors.lightTextColor,
fontSize: 16,
),
],
),
),
if (subscription.isMyCurrentPackage!)
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
(subscription.subscriptionTypeEnum == SubscriptionTypeEnum.current) ? "Renew".toText() : (subscription.subscriptionTypeEnum)!.getStringSubscriptionTypeEnum().toText(),
6.width,
const Icon(
Icons.arrow_forward,
size: 16,
)
],
).onPress(() {
onRenewSubscriptionClick();
}),
],
),
],
).toWhiteContainer(
width: double.infinity,
allPading: 12,
backgroundColor: backgroundColor,
margin: const EdgeInsets.symmetric(
horizontal: 21,
),
);
// );
}
Widget showItem(String title, String value) {
return Row(
children: [
title.toText(
fontSize: 14,
color: textColor,
),
2.width,
value.toText(
fontSize: 14,
color: textColor,
),
],
);
}
}

@ -0,0 +1,158 @@
import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/subscriptions_models/provider_subscription_model.dart';
import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class MySubscriptionsCard extends StatelessWidget {
ProviderSubscriptionModel providerSubscriptionModel;
bool isSubscribed;
Color? backgroundColor;
late Color textColor;
Function onRenewSubscriptionClick;
Function onUpgradeSubscriptionClick;
bool isMainPage;
MySubscriptionsCard(this.providerSubscriptionModel,
{Key? key, this.isSubscribed = false, this.backgroundColor, required this.onRenewSubscriptionClick, required this.onUpgradeSubscriptionClick, this.isMainPage = true})
: super(key: key);
@override
Widget build(BuildContext context) {
textColor = backgroundColor == null ? Colors.black : Colors.white;
// return InkWell(
// onTap: isSubscribed
// ? null
// : () {
// onRenewSubscriptionClick();
// },
// child:
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: providerSubscriptionModel.subscriptionName.toString().toText(
fontSize: 18,
color: textColor,
),
),
// if (providerSubscriptionModel.isActive!) "Current Package".toText(color: MyColors.primaryColor, fontWeight: FontWeight.bold),
5.width,
if (!providerSubscriptionModel.isExpired!)
Row(
children: [
Container(
height: 15,
width: 15,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: MyColors.white,
),
alignment: Alignment.center,
child: Icon(
Icons.done,
size: 12,
color: MyColors.primaryColor,
),
),
5.width,
"Subscribed".toText(color: MyColors.white)
],
)
.toContainer(
backgroundColor: MyColors.primaryColor,
borderRadius: 30,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 7),
)
.onPress(() {
onUpgradeSubscriptionClick();
})
],
),
6.height,
showItem("Ads:", providerSubscriptionModel.adsRemaining.toString()),
showItem("Users:", providerSubscriptionModel.subUsersRemaining.toString()),
showItem("Branches:", providerSubscriptionModel.branchesRemaining.toString()),
14.height,
// Row(
// crossAxisAlignment: CrossAxisAlignment.center,
// mainAxisAlignment: MainAxisAlignment.start,
// children: [
// Expanded(
// child: Row(
// mainAxisAlignment: MainAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.end,
// children: [
// "10000".toString().toText(
// fontSize: 26,
// isBold: true,
// color: textColor,
// ),
// 2.width,
// " SAR/Month".toText(
// color: MyColors.lightTextColor,
// fontSize: 16,
// ),
// ],
// ),
// ),
// ],
// ),
Row(
children: [
"Expires on ${DateHelper.formatAsDayMonthYear(providerSubscriptionModel.dateEnd)}".toText(
fontSize: 14,
color: textColor,
),
if (!providerSubscriptionModel.isTrialSubscription!)
Row(
children: [
6.width,
"Renew".toText(
color: MyColors.primaryColor,
fontSize: 14,
textDecoration: TextDecoration.underline,
decorationColor: MyColors.primaryColor,
isBold: true,
),
],
).onPress(() {
onRenewSubscriptionClick();
}),
],
)
],
).toWhiteContainer(
width: double.infinity,
allPading: 12,
backgroundColor: backgroundColor,
margin: const EdgeInsets.symmetric(
horizontal: 21,
),
);
//);
}
Widget showItem(String title, String value) {
return Row(
children: [
title.toText(
fontSize: 14,
color: textColor,
),
2.width,
value.toText(
fontSize: 14,
color: textColor,
),
],
);
}
}

@ -1,185 +0,0 @@
import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class SubscriptionsCard extends StatelessWidget {
Subscription subscription;
bool isSubscribed;
Color? backgroundColor;
late Color textColor;
Function onRenewSubscriptionClick;
bool isMainPage;
SubscriptionsCard(this.subscription,
{Key? key,
this.isSubscribed = false,
this.backgroundColor,
required this.onRenewSubscriptionClick,
this.isMainPage = true})
: super(key: key);
@override
Widget build(BuildContext context) {
textColor = backgroundColor == null ? Colors.black : Colors.white;
return InkWell(
onTap: isSubscribed
? null
: () {
onRenewSubscriptionClick();
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: subscription.name.toString().toText(
fontSize: 18,
color: textColor,
),
),
// if (isSubscribed)
// Row(
// children: [
// Container(
// color: MyColors.white,
// padding: const EdgeInsets.all(2),
// child: const Icon(
// Icons.done,
// size: 8,
// color: MyColors.primaryColor,
// ),
// ).toCircle(
// borderRadius: 122,
// ),
// 6.width,
// "Subscribed".toText(color: Colors.white, isBold: true)
// ],
// ).toContainer(
// backgroundColor: MyColors.primaryColor,
// borderRadius: 20,
// padding: const EdgeInsets.symmetric(
// horizontal: 6,
// vertical: 3,
// ),
// )
if (!isMainPage)
if (subscription.subscriptionTypeEnum ==
SubscriptionTypeEnum.current)
"Current Package".toText(color: MyColors.primaryColor,fontWeight: FontWeight.bold),
if (isMainPage)
"Upgrade".toText(color: Colors.white).toContainer(
backgroundColor: MyColors.primaryColor,
borderRadius: 30,
padding: const EdgeInsets.symmetric(
horizontal: 6,
vertical: 3,
),
)
],
),
6.height,
showItem("Ads:", subscription.numberOfAds.toString()),
showItem("Users:", subscription.numberOfSubUsers.toString()),
showItem("Branches:", subscription.numberOfBranches.toString()),
14.height,
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
subscription.price.toString().toText(
fontSize: 26,
isBold: true,
color: textColor,
),
2.width,
"${subscription.currency}/Month".toText(
color: MyColors.lightTextColor,
fontSize: 16,
),
],
),
),
if (!isMainPage)
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
(subscription.subscriptionTypeEnum ==
SubscriptionTypeEnum.current)
? "Renew".toText()
: (subscription.subscriptionTypeEnum)!
.getStringSubscriptionTypeEnum()
.toText(),
6.width,
const Icon(
Icons.arrow_forward,
size: 16,
)
],
),
],
),
// if (isSubscribed)
if (isMainPage)
Row(
children: [
"Expires on ${DateHelper.formatAsDayMonthYear(subscription.dateEnd)}"
.toText(
fontSize: 14,
color: textColor,
),
Row(
children: [
6.width,
"Renew".toText(
color: MyColors.primaryColor,
fontSize: 14,
textDecoration: TextDecoration.underline,
decorationColor: MyColors.primaryColor,
isBold: true,
),
],
).onPress(() {
onRenewSubscriptionClick();
}),
],
)
],
).toWhiteContainer(
width: double.infinity,
allPading: 12,
backgroundColor: backgroundColor,
margin: const EdgeInsets.symmetric(
horizontal: 21,
),
),
);
}
Widget showItem(String title, String value) {
return Row(
children: [
title.toText(
fontSize: 14,
color: textColor,
),
2.width,
value.toText(
fontSize: 14,
color: textColor,
),
],
);
}
}

@ -40,7 +40,7 @@ dependencies:
# path: C:/Users/mirza.shafique/AndroidStudioProjects/mc_common_app
mc_common_app:
path: /Volumes/Data/Projects/Flutter/car_common_app
path: /Users/amir/StudioProjects/car_common_app

Loading…
Cancel
Save