Merge branch 'master' into aamir_dev

# Conflicts:
#	pubspec.yaml
aamir_dev
Aamir 1 year ago
commit 4e96c2fd2f

@ -28,8 +28,10 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion 34
namespace = "com.cloud.solutions.mowater.ksa.provider"
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
@ -49,6 +51,8 @@ android {
targetSdkVersion 33
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
multiDexEnabled true
}
buildTypes {
@ -67,5 +71,7 @@ flutter {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation platform('com.google.firebase:firebase-bom:33.1.2')
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2'
// implementation 'com.google.firebase:firebase-analytics'
}

@ -1,3 +1,36 @@
//buildscript {
// ext.kotlin_version = '1.8.0'
// repositories {
// google()
// mavenCentral()
// }
//
// dependencies {
// classpath 'com.android.tools.build:gradle:7.3.0'
// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// classpath 'com.google.gms:google-services:4.4.2'
// }
//}
//
//
//allprojects {
// repositories {
// google()
// mavenCentral()
// }
//}
//
//rootProject.buildDir = '../build'
//subprojects {
// project.buildDir = "${rootProject.buildDir}/${project.name}"
// project.evaluationDependsOn(':app')
//}
//
//tasks.register("clean", Delete) {
// delete rootProject.buildDir
//}
buildscript {
ext.kotlin_version = '1.8.0'
repositories {
@ -6,7 +39,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
classpath 'com.android.tools.build:gradle:8.7.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.4.2'
}
@ -18,6 +51,18 @@ allprojects {
google()
mavenCentral()
}
subprojects {
afterEvaluate { project ->
if (project.hasProperty('android')) {
project.android {
if (namespace == null) {
namespace project.group
}
}
}
}
}
}
rootProject.buildDir = '../build'

@ -1,5 +1,6 @@
#Mon Nov 04 14:28:07 AST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

@ -1,11 +1,26 @@
include ':app'
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}()
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version '8.7.0' apply false
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
}
include ":app"

@ -22,82 +22,44 @@ import 'package:mc_common_app/config/routes.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/utils/enums.dart';
class ProviderAppRoutes {
//settings
static const defineLicense = "/defineLicese";
static const String dealershipSetting = "/dealershipSetting";
static const String branchList = "/branchList";
static const String branchDetail = "/branchDetail";
static const String defineBranch = "/defineBranch";
//Appointments
static const String appointment = "/appointment";
static const String appointmentDetailList = "/appointmentDetailList";
static const String updateAppointmentPage = "/updateAppointmentPage";
static const String addServiceInAppointment = "/addServiceInAppointment";
static const String mergeAppointments = "/mergeAppointments";
//Requests
static const String requestsDetailPage = "/requestsDetailPage";
static const String sendOfferPage = "/sendOfferPage";
//Services
static const String dealerUser = "/dealerUser";
static const String servicesList = "/servicesList";
static const String itemsList = "/itemsList";
static const String createItem = "/createItem";
static const String createServices = "/createServices";
static const String createServices2 = "/createServices2";
static const String createServices3 = "/createServices3";
//Schedules
static const String schedulesList = "/schedulesList";
static const String addSchedule = "/addSchedule";
// Subscriptions
static const String mySubscriptionsPage = "/mySubscriptionsPage";
static const String subscriptionsPage = "/subscriptionsPage";
//Bracnh Duplication
static const String matchServices = "/matchServices";
static const String userSettings = "/userSettings";
static final Map<String, WidgetBuilder> routes = {
//Home page
AppRoutes.dashboard: (context) => const DashboardView(),
AppRoutes.dashboard: (context) => DashboardView(dashboardRouteEnum: (ModalRoute.of(context)!.settings.arguments ?? DashboardRouteEnum.none) as DashboardRouteEnum),
// defineLicense: (context) => DefineLicensePage(),
dealershipSetting: (context) => const DealershipView(),
AppRoutes.dealershipSetting: (context) => const DealershipView(),
// branchList: (context) => BranchListPage(),
defineBranch: (context) => DefineBranchView((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as BranchDetailModel)),
branchDetail: (context) => BranchDetailPage(ModalRoute.of(context)!.settings.arguments as BranchDetailModel),
AppRoutes.defineBranch: (context) => DefineBranchView((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as BranchDetailModel)),
AppRoutes.branchDetail: (context) => BranchDetailPage(ModalRoute.of(context)!.settings.arguments as BranchDetailModel),
//Appointments
appointment: (context) => AppointmentPage(branch: ModalRoute.of(context)!.settings.arguments as BranchDetailModel),
appointmentDetailList: (context) => const AppointmentDetailListPage(),
updateAppointmentPage: (context) => UpdateAppointmentPage(),
addServiceInAppointment: (context) => AddNewServiceAppointmentPage(ModalRoute.of(context)!.settings.arguments as AppointmentListModel),
mergeAppointments: (context) => const MergeAppointmentListPage(),
AppRoutes.appointment: (context) => AppointmentPage(branch: ModalRoute.of(context)!.settings.arguments as BranchDetailModel),
AppRoutes.appointmentDetailList: (context) => const AppointmentDetailListPage(),
AppRoutes.updateAppointmentPage: (context) => UpdateAppointmentPage(),
AppRoutes.addServiceInAppointment: (context) => AddNewServiceAppointmentPage(ModalRoute.of(context)!.settings.arguments as AppointmentListModel),
AppRoutes.mergeAppointments: (context) => const MergeAppointmentListPage(),
//Subscriptions
mySubscriptionsPage: (context) => const MySubscriptionsPage(),
subscriptionsPage: (context) => const SubscriptionsPage(),
AppRoutes.mySubscriptionsPage: (context) => const MySubscriptionsPage(),
AppRoutes.subscriptionsPage: (context) => const SubscriptionsPage(),
//Services
dealerUser: (context) => DealerUserPage(ModalRoute.of(context)!.settings.arguments as String),
servicesList: (context) => const ServicesListPage(),
itemsList: (context) => ItemsListPage(),
createItem: (context) => const CreateItemPage(),
AppRoutes.dealerUser: (context) => DealerUserPage(ModalRoute.of(context)!.settings.arguments as String),
AppRoutes.servicesList: (context) => const ServicesListPage(),
AppRoutes.itemsList: (context) => ItemsListPage(),
AppRoutes.createItem: (context) => const CreateItemPage(),
//createServices: (context) => CreateServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as ServiceProviderBranch)),
//createServices2: (context) => CreateServicesPage2((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as ServiceProviderBranch)),
createServices3: (context) => CreateServicesPage3((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as CreateBranchModel)),
AppRoutes.createServices3: (context) => CreateServicesPage3((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as CreateBranchModel)),
//Schedules
schedulesList: (context) => SchedulesListPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as String)),
addSchedule: (context) => const AddSchedulesPage(),
AppRoutes.schedulesList: (context) => SchedulesListPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as String)),
AppRoutes.addSchedule: (context) => const AddSchedulesPage(),
//Branch Duplication
matchServices: (context) => MatchedServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as MatchServicesArguments)),
AppRoutes.matchServices: (context) => MatchedServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as MatchServicesArguments)),
};
}

@ -1,14 +1,14 @@
import 'dart:io';
import 'package:car_provider_app/config/provider_dependencies.dart';
import 'package:mc_common_app/repositories/items_repo.dart';
import 'package:mc_common_app/repositories/schedule_repo.dart';
import 'package:car_provider_app/view_models/dashboard_view_model.dart';
import 'package:car_provider_app/view_models/items_view_model.dart';
import 'package:car_provider_app/view_models/schedule_view_model.dart';
import 'package:mc_common_app/repositories/setting_options_repo.dart';
import 'package:mc_common_app/repositories/shipping_repo.dart';
import 'package:mc_common_app/services/firebase_service.dart';
import 'package:mc_common_app/utils/location/Location.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_provider.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
@ -61,15 +61,17 @@ Future<void> main() async {
await Firebase.initializeApp();
}
ProviderAppDependencies.addDependencies();
injector.get<FirebaseMessagingService>().initializeNotifications();
injector.get<FirebaseMessagingService>().initializeNotifications().whenComplete(() {
injector.get<Location>().handleLocationPermission();
});
ProviderAppRoutes.routes.addAll(AppRoutes.routes);
runApp(MultiProvider(
providers: [
ChangeNotifierProvider<BaseVM>(
create: (_) => BaseVM(),
),
ChangeNotifierProvider<DashboardVM>(
create: (_) => DashboardVM(
ChangeNotifierProvider<DashboardVMProvider>(
create: (_) => DashboardVMProvider(
userRepo: injector.get<UserRepo>(),
commonServices: injector.get<CommonAppServices>(),
),
@ -159,7 +161,7 @@ Future<void> main() async {
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
@override
Widget build(BuildContext context) {
return ResponsiveSizer(
builder: (context, orientation, deviceType) {

@ -1,151 +0,0 @@
import 'dart:io';
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/views/branch_management/branch/dealer/widget/add_phone_num_wiget.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/models/user_models/image_response.dart';
import 'package:mc_common_app/repositories/user_repo.dart';
import 'package:mc_common_app/services/common_services.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/shipping_management_view_model.dart';
import 'package:provider/provider.dart';
import 'package:mc_common_app/utils/location/Location.dart';
import 'package:mc_common_app/utils/shared_prefrence.dart';
import 'package:mc_common_app/utils/utils.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/base_view_model.dart';
import 'package:mc_common_app/widgets/bottom_sheet.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/service_view_model.dart';
import 'package:mc_common_app/view_models/subscriptions_view_model.dart';
class DashboardVM extends BaseVM {
final CommonAppServices commonServices;
final UserRepo userRepo;
DashboardVM({required this.commonServices, required this.userRepo});
String pickedImage = "";
int selectedNavbarBarIndex = 2;
void onNavbarTapped(int index) async {
logger.i(AppState().getDeviceToken);
selectedNavbarBarIndex = index;
notifyListeners();
}
void pickImageFromPhone(BuildContext context, int sourceFlag) async {
final File? pickedImageFile = await commonServices.pickImageFromPhone(sourceFlag);
if (pickedImageFile == null) {
return;
}
int sizeInBytes = pickedImageFile.lengthSync();
if (sizeInBytes > 1000000) {
Utils.showToast(LocaleKeys.fileLarger.tr());
return;
} else {
String image64 = Utils.convertFileToBase64(pickedImageFile);
Utils.showLoading(context);
ImageResponse response = await userRepo.updateUserImage(image64);
Utils.hideLoading(context);
Navigator.pop(context);
if (response.messageStatus == 1) {
Utils.showToast(LocaleKeys.imageUploaded.tr());
AppState().getUser.data!.userInfo!.userImageUrl = response.data;
} else {
Utils.showToast(response.message ?? "");
}
}
}
Future<ImageResponse> updateUserImage(String image) async {
return await userRepo.updateUserImage(image);
}
fetchUsernameAndLocation() async {
String userName = await SharedPrefManager.getPhoneOrEmail();
Location.getCurrentLocation(
(LatLng? latlng) {
AppState().currentLocation = latlng ?? const LatLng(0, 0);
},
);
notifyListeners();
}
Future<void> onRefresh(BuildContext context) async {
final requestsVM = context.read<RequestsVM>();
final chatVM = context.read<ChatVM>();
final appointmentVM = context.read<AppointmentsVM>();
final shippingManagementVM = context.read<ShippingManagementVM>();
final serviceVM = context.read<ServiceVM>();
final adVm = context.read<AdVM>();
final subscriptionsVM = context.read<SubscriptionsVM>();
requestsVM.populateDataForRequestsFilter();
appointmentVM.populateAppointmentsFilterList();
shippingManagementVM.populateShippingRequestFilterList();
await serviceVM.getBranchAndServices();
await appointmentVM.getMyAppointmentsForProvider({"ServiceProviderID": injector.get<AppState>().getUser.data?.userInfo?.providerId.toString() ?? "0"});
adVm.populateAdsFilterList();
await chatVM.buildHubConnection(context);
await adVm.getMyAds();
await adVm.getExploreAds();
await adVm.getVehicleTypes();
await adVm.getVehicleAdsDuration();
await requestsVM.getRequests();
// await subscriptionsVM.getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
await subscriptionsVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true);
// await subscriptionsVM.getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
}
void checkUserSubscription(SubscriptionActionTypeEnum actionType, BuildContext context, {required Function() callback}) async {
switch (actionType) {
case SubscriptionActionTypeEnum.ads:
performCheckOnAds(context);
break;
case SubscriptionActionTypeEnum.users:
performCheckOnUsers(context, callback);
break;
case SubscriptionActionTypeEnum.branches:
performCheckOnBranches(context);
break;
}
}
void performCheckOnBranches(BuildContext context) async {
if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.branchesRemaining! > 0) {
logger.d(AppState().getproviderSubscription.first.toJson());
await navigateWithName(context, ProviderAppRoutes.defineBranch);
} else {
Utils.showToast("Upgrade your subscription to add more Branches.");
}
}
void performCheckOnAds(BuildContext context) async {
//adsRemaining
if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.adsRemaining! > 0) {
logger.d(AppState().getproviderSubscription.first.toJson());
await navigateWithName(context, ProviderAppRoutes.defineBranch);
} else {
Utils.showToast("Upgrade your subscription to add more Ads.");
}
}
void performCheckOnUsers(BuildContext context, Function() callBack) async {
if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.subUsersRemaining! > 0) {
logger.d(AppState().getproviderSubscription.first.toJson());
showMyBottomSheet(context, isDismissible: false, child: const AddPhoneNumWidget(), callBackFunc: callBack);
} else {
Utils.showToast("Upgrade your subscription to add more Sub Users.");
}
}
}

@ -31,6 +31,8 @@ class ScheduleVM extends BaseVM {
setState(ViewState.idle);
}
String currentSelectedBranchName = "";
Future<GenericRespModel> setScheduleInactive(int scheduleId, int branchId) async {
GenericRespModel val = await scheduleRepo.setScheduleInActive(scheduleId, branchId);
if (val.messageStatus == 1) {

@ -80,7 +80,7 @@ class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentP
),
12.height,
Consumer<ServiceVM>(
builder: (context, model, _) {
builder: (context, serviceVm, _) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
@ -95,27 +95,27 @@ class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentP
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
model.categoryDropList.isNotEmpty
serviceVm.categoryDropList.isNotEmpty
? DropdownField(
(DropValue value) async {
category = value;
service = null;
model.fetchProviderServices(widget.appointmentListModel.branchId.toString(), value.id.toString());
serviceVm.fetchProviderServices(widget.appointmentListModel.branchId.toString(), value.id.toString());
},
dropdownValue: category,
list: model.categoryDropList,
list: serviceVm.categoryDropList,
hint: LocaleKeys.selectServiceCategory.tr(),
)
: const Center(
child: CircularProgressIndicator(),
),
12.height,
model.servicesDropList.isNotEmpty
serviceVm.servicesDropList.isNotEmpty
? DropdownField(
(DropValue value) {
service = value;
pickedItems = null;
model.setState(ViewState.idle);
serviceVm.setState(ViewState.idle);
showMyBottomSheet(
context,
child: SelectItemsSheet(
@ -129,18 +129,18 @@ class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentP
PickerItem(id: element.id ?? 0, title: element.name ?? ""),
);
}
model.notifyListeners();
serviceVm.notifyListeners();
},
),
);
},
dropdownValue: service,
list: model.servicesDropList,
list: serviceVm.servicesDropList,
hint: LocaleKeys.defineServices.tr(),
)
: category == null
? Container()
: model.services != null && model.servicesDropList.isEmpty
: serviceVm.services != null && serviceVm.servicesDropList.isEmpty
? Text(LocaleKeys.noServiceFound.tr())
: const CircularProgressIndicator(),
12.height,
@ -161,7 +161,7 @@ class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentP
PickerItem(id: element.id ?? 0, title: element.name ?? ""),
);
}
model.notifyListeners();
serviceVm.notifyListeners();
},
),
);

@ -1,6 +1,7 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/views/dashboard/widget/general_appointment_widget.dart';
import 'package:flutter/material.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/utils/enums.dart';
@ -40,7 +41,7 @@ class AppointmentDetailListPage extends StatelessWidget {
onTap: () {
appointmentsVM.selectedAppointmentId = appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index].id ?? 0;
appointmentsVM.selectedAppointmentSubIndex = index;
navigateWithName(context, ProviderAppRoutes.updateAppointmentPage, arguments: appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index]);
navigateWithName(context, AppRoutes.updateAppointmentPage, arguments: appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index]);
},
);
},
@ -59,7 +60,7 @@ class AppointmentDetailListPage extends StatelessWidget {
maxWidth: double.infinity,
margin: const EdgeInsets.all(21),
onPressed: () {
navigateWithName(context, ProviderAppRoutes.mergeAppointments);
navigateWithName(context, AppRoutes.mergeAppointments);
},
)
: const SizedBox(),

@ -4,6 +4,7 @@ import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/views/dashboard/widget/general_appointment_widget.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
@ -113,7 +114,7 @@ class _AppointmentPageState extends State<AppointmentPage> {
context.read<AppointmentsVM>().selectedAppointmentIndex = index;
navigateWithName(
context,
ProviderAppRoutes.appointmentDetailList,
AppRoutes.appointmentDetailList,
// arguments: appointmentsVM
// .myFilteredAppointments2[index]
// .customerAppointmentList,

@ -5,6 +5,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
@ -62,7 +63,7 @@ class UpdateAppointmentPage extends StatelessWidget {
onPressed: () {
navigateWithName(
context,
ProviderAppRoutes.addServiceInAppointment,
AppRoutes.addServiceInAppointment,
arguments: appointmentListModel,
);
},
@ -72,7 +73,7 @@ class UpdateAppointmentPage extends StatelessWidget {
),
),
if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.cancelled) ...[
Utils.buildStatusContainer("Appointment Cancelled").paddingAll(10),
Utils.buildStatusContainer(LocaleKeys.appointmentCancelled.tr()).paddingAll(10),
],
if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.booked)
Row(

@ -1,13 +1,13 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:sizer/sizer.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:easy_localization/easy_localization.dart';
@ -85,7 +85,7 @@ class AppointmentDetailListWidget extends StatelessWidget {
width: double.infinity,
allPading: 12,
onTap: () {
if (isNeedClick) navigateWithName(context, ProviderAppRoutes.updateAppointmentPage);
if (isNeedClick) navigateWithName(context, AppRoutes.updateAppointmentPage);
},
);
}

@ -64,7 +64,7 @@ class SelectItemsSheet extends StatelessWidget {
child: itemsVM.serviceItems?.data == null
? const Center(child: CircularProgressIndicator())
: itemsVM.serviceItems?.data!.length == 0
? Center(child: EmptyWidget(text: LocaleKeys.noItemstoShow.tr()))
? Center(child: EmptyWidget(text: LocaleKeys.noItemsToShow.tr()))
: ListView.separated(
itemBuilder: (BuildContext context, int index) {
return CheckboxListTile(

@ -1,42 +1,58 @@
import 'dart:async';
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/view_models/schedule_view_model.dart';
import 'package:car_provider_app/views/branch_management/branch/dealer/widget/assign_dealer_user_sheet.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:car_provider_app/views/branch_management/services/services_list_page.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_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/utils/utils.dart';
import 'package:mc_common_app/view_models/service_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/common_widgets/custom_add_button_widget.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/row_with_arrow.dart';
import 'package:provider/provider.dart';
class BranchDetailPage extends StatelessWidget {
class BranchDetailPage extends StatefulWidget {
final BranchDetailModel branchData;
const BranchDetailPage(this.branchData, {super.key});
getBranchUsers(BuildContext context) {
scheduleMicrotask(() {
if (context.read<ServiceVM>().allProviderDealersList.isNotEmpty) {
context.read<ServiceVM>().getAllProviderDealers(
{"ServiceProviderBranchID": branchData.id.toString(), "ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""},
);
}
@override
State<BranchDetailPage> createState() => _BranchDetailPageState();
}
class _BranchDetailPageState extends State<BranchDetailPage> {
@override
void initState() {
onInitState();
super.initState();
}
onInitState() async {
ServiceVM serviceVM = context.read<ServiceVM>();
scheduleMicrotask(() async {
await serviceVM.getAllProviderDealers(
{
"ServiceProviderBranchID": widget.branchData.id.toString(),
"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? "",
},
);
context.read<ServiceVM>().filterUserBranchCategories();
serviceVM.filterUserBranchCategories();
});
}
@ -82,7 +98,7 @@ class BranchDetailPage extends StatelessWidget {
Widget buildFooterActionWidget(BuildContext context) {
Widget actionWidget = const SizedBox();
if (AppState().userType == UserType.providerDealer && branchData.branchStatus == BranchStatusEnum.approvedOrActive) {
if (AppState().userType == UserType.providerDealer && widget.branchData.branchStatus == BranchStatusEnum.approvedOrActive) {
actionWidget = ShowFillButton(
title: LocaleKeys.assignDealerUser.tr(),
maxWidth: double.infinity,
@ -95,19 +111,19 @@ class BranchDetailPage extends StatelessWidget {
showMyBottomSheet(
context,
child: AssignDealerUserSheet(
branchId: branchData.id.toString(),
branchId: widget.branchData.id.toString(),
callBackFunc: () {
getBranchUsers(context);
onInitState();
},
),
);
},
);
} else if (branchData.branchStatus == BranchStatusEnum.pending) {
} else if (widget.branchData.branchStatus == BranchStatusEnum.pending) {
actionWidget = pendingApprovalAction(pendingText: "Approval Pending");
} else if (branchData.branchStatus == BranchStatusEnum.deactivated) {
} else if (widget.branchData.branchStatus == BranchStatusEnum.deactivated) {
actionWidget = pendingApprovalAction(pendingText: "Activate Now");
} else if (branchData.branchStatus == BranchStatusEnum.rejected) {
} else if (widget.branchData.branchStatus == BranchStatusEnum.rejected) {
actionWidget = Column(
children: [
Row(
@ -117,9 +133,9 @@ class BranchDetailPage extends StatelessWidget {
),
Row(
children: [
if (branchData.branchAuditTrial != null && branchData.branchAuditTrial!.isNotEmpty) ...[
if (widget.branchData.branchAuditTrial != null && widget.branchData.branchAuditTrial!.isNotEmpty) ...[
Flexible(
child: ("${branchData.branchAuditTrial!.first.comment}").toText(
child: ("${widget.branchData.branchAuditTrial!.first.comment}").toText(
fontSize: 14,
color: MyColors.primaryColor,
isItalic: true,
@ -129,15 +145,7 @@ class BranchDetailPage extends StatelessWidget {
],
),
12.height,
ShowFillButton(
title: LocaleKeys.rejectedFormAdmin.tr(),
maxWidth: double.infinity,
backgroundColor: MyColors.darkWhiteColor,
borderColor: MyColors.darkPrimaryColor,
txtColor: MyColors.lightTextColor,
isFilled: true,
onPressed: () {},
),
Utils.buildStatusContainer(LocaleKeys.rejectedFormAdmin.tr(), marginAll: 0, fontSize: 16),
],
);
}
@ -203,165 +211,187 @@ class BranchDetailPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
getBranchUsers(context);
return Scaffold(
appBar: CustomAppBar(title: LocaleKeys.branchDetail.tr()),
body: Consumer<ServiceVM>(builder: (context, serviceVM, _) {
return SizedBox(
width: double.infinity,
height: double.infinity,
child: Column(
children: [
Expanded(
child: SingleChildScrollView(
child: Column(
children: [
10.height,
Column(
children: [
Row(
child: RefreshIndicator(
onRefresh: () async => await onInitState(),
child: Column(
children: [
Expanded(
child: SingleChildScrollView(
child: Column(
children: [
10.height,
Column(
children: [
Row(
children: [
Expanded(
child: Row(
children: [
widget.branchData.branchProfileImage.buildNetworkImage(height: 66, width: 53, fit: BoxFit.cover),
11.width,
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
(widget.branchData.branchName!).toText(fontSize: 16, color: MyColors.darkTextColor),
showData("", widget.branchData.branchDescription.toString()),
],
),
),
],
),
),
if (widget.branchData.branchStatus != BranchStatusEnum.pending) ...[
SvgPicture.asset(MyAssets.icEdit).onPress(() {
navigateWithName(context, AppRoutes.defineBranch, arguments: widget.branchData);
}),
],
],
),
Column(
children: [
showData("${LocaleKeys.location.tr()}:", "${widget.branchData.cityName.toString()}, ${widget.branchData.countryName.toString()}"),
showData("${LocaleKeys.provider.tr()}:", widget.branchData.serviceProviderName.toString()),
showData("${LocaleKeys.time.tr()}:", "${widget.branchData.openTime.toString()} - ${widget.branchData.closeTime.toString()}"),
showData("${LocaleKeys.address.tr()}:", widget.branchData.address.toString()),
],
).paddingOnly(left: 65),
],
).horPaddingMain(),
10.height,
Container(
width: double.infinity,
color: MyColors.darkIconColor,
padding: const EdgeInsets.symmetric(horizontal: 21, vertical: 10),
child: Row(
children: [
const Icon(
Icons.calendar_month,
color: Colors.white,
),
8.width,
Expanded(
child: Row(
children: [
branchData.branchProfileImage.buildNetworkImage(height: 66, width: 53, fit: BoxFit.cover),
11.width,
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
(branchData.branchName!).toText(fontSize: 16, color: MyColors.darkTextColor),
showData("", branchData.branchDescription.toString()),
],
),
child: LocaleKeys.setorEditBranchSchedule.tr().toText(
isUnderLine: true,
fontSize: 12,
color: Colors.white,
decorationColor: MyColors.white,
),
],
),
),
if (branchData.branchStatus != BranchStatusEnum.pending) ...[
SvgPicture.asset(MyAssets.icEdit).onPress(() {
navigateWithName(context, ProviderAppRoutes.defineBranch, arguments: branchData);
}),
],
],
)
.withArrow(
isArrowEnabled: true,
color: Colors.white,
arrowWidth: 16.16,
arrowHeight: 11.75,
)
.margin(right: 5),
).onPress(() {
if (widget.branchData.branchStatus == BranchStatusEnum.pending || widget.branchData.branchStatus == BranchStatusEnum.rejected) {
Utils.showToast("Please wait for the branch verification.");
return;
}
context.read<ScheduleVM>().currentSelectedBranchName = widget.branchData.branchName.toString();
navigateWithName(context, AppRoutes.schedulesList, arguments: widget.branchData.id.toString());
}),
10.height,
CustomAddButton(
needsBorder: true,
bgColor: MyColors.white,
onTap: () {
if (widget.branchData.branchStatus == BranchStatusEnum.pending || widget.branchData.branchStatus == BranchStatusEnum.rejected) {
Utils.showToast("Please wait for the branch verification.");
return;
}
navigateWithName(
context,
AppRoutes.createServices3,
arguments: CreateBranchModel(
branchId: widget.branchData.id.toString(),
branchName: widget.branchData.branchName.toString(),
isForEdit: false,
),
);
},
text: LocaleKeys.addNewService.tr(),
icon: Container(
height: 24,
width: 24,
decoration: const BoxDecoration(shape: BoxShape.circle, color: MyColors.darkTextColor),
child: const Icon(Icons.add, color: MyColors.white),
)).horPaddingMain(),
// Row(
// crossAxisAlignment: CrossAxisAlignment.center,
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// const Icon(
// Icons.add,
// color: Colors.white,
// size: 18,
// ).toContainer(
// borderRadius: 100,
// paddingAll: 2,
// backgroundColor: MyColors.darkIconColor,
// ),
// 8.width,
// LocaleKeys.addNewService.tr().toText(fontSize: 15, color: MyColors.lightTextColor, letterSpacing: -0.52),
// ],
// )
// .toContainer(
// borderRadius: 0,
// backgroundColor: MyColors.darkWhiteColor,
// width: double.infinity,
// paddingAll: 25,
// margin: const EdgeInsets.only(
// left: 20,
// right: 20,
// top: 20,
// ))
// .onPress(() {}),
if (serviceVM.state == ViewState.busy) ...[
30.height,
const Center(
child: CircularProgressIndicator(),
),
Column(
children: [
showData("${LocaleKeys.location.tr()}:", "${branchData.cityName.toString()}, ${branchData.countryName.toString()}"),
showData("${LocaleKeys.provider.tr()}:", branchData.serviceProviderName.toString()),
showData("${LocaleKeys.time.tr()}:", "${branchData.openTime.toString()} - ${branchData.closeTime.toString()}"),
showData("${LocaleKeys.address.tr()}:", branchData.address.toString()),
],
).paddingOnly(left: 65),
],
).horPaddingMain(),
10.height,
Container(
width: double.infinity,
color: MyColors.darkIconColor,
padding: const EdgeInsets.symmetric(horizontal: 21, vertical: 10),
child: Row(
children: [
const Icon(
Icons.calendar_month,
color: Colors.white,
),
8.width,
Expanded(
child: LocaleKeys.setorEditBranchSchedule.tr().toText(
isUnderLine: true,
fontSize: 12,
color: Colors.white,
decorationColor: MyColors.white,
),
),
],
)
.withArrow(
isArrowEnabled: true,
color: Colors.white,
arrowWidth: 16.16,
arrowHeight: 11.75,
)
.margin(right: 5),
).onPress(() {
if (branchData.branchStatus == BranchStatusEnum.pending || branchData.branchStatus == BranchStatusEnum.rejected) {
Utils.showToast("Please wait for the branch verification.");
return;
}
navigateWithName(context, ProviderAppRoutes.schedulesList, arguments: branchData.id.toString());
}),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(
Icons.add,
color: Colors.white,
size: 18,
).toContainer(
borderRadius: 100,
paddingAll: 2,
backgroundColor: MyColors.darkIconColor,
] else ...[
ListView.separated(
itemBuilder: (context, pIndex) {
return buildServiceTileWidget(pIndex, serviceVM).onPress(() {
serviceVM.categories[pIndex].branchId = widget.branchData.id.toString();
serviceVM.categories[pIndex].branchName = widget.branchData.branchName.toString();
navigateWithName(context, AppRoutes.servicesList, arguments: serviceVM.categories[pIndex]);
});
},
itemCount: serviceVM.categories.length,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
padding: const EdgeInsets.all(20),
separatorBuilder: (BuildContext context, int index) {
return 12.height;
},
),
8.width,
LocaleKeys.addNewService.tr().toText(fontSize: 15, color: MyColors.lightTextColor, letterSpacing: -0.52),
],
)
.toContainer(
borderRadius: 0,
backgroundColor: MyColors.darkWhiteColor,
width: double.infinity,
paddingAll: 25,
margin: const EdgeInsets.only(
left: 20,
right: 20,
top: 20,
))
.onPress(() {
if (branchData.branchStatus == BranchStatusEnum.pending || branchData.branchStatus == BranchStatusEnum.rejected) {
Utils.showToast("Please wait for the branch verification.");
return;
}
navigateWithName(
context,
ProviderAppRoutes.createServices3,
arguments: CreateBranchModel(
branchId: branchData.id.toString(),
branchName: branchData.branchName.toString(),
isForEdit: false,
),
);
}),
ListView.separated(
itemBuilder: (context, pIndex) {
return buildServiceTileWidget(pIndex, serviceVM).onPress(() {
serviceVM.categories[pIndex].branchId = branchData.id.toString();
serviceVM.categories[pIndex].branchName = branchData.branchName.toString();
navigateWithName(context, ProviderAppRoutes.servicesList, arguments: serviceVM.categories[pIndex]);
});
},
itemCount: serviceVM.categories.length,
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
padding: const EdgeInsets.all(20),
separatorBuilder: (BuildContext context, int index) {
return 12.height;
},
),
12.height,
],
12.height,
],
),
),
),
),
Container(
width: double.infinity,
height: 1,
color: Colors.grey[100],
),
buildFooterActionWidget(context),
],
Container(
width: double.infinity,
height: 1,
color: Colors.grey[100],
),
buildFooterActionWidget(context),
],
),
),
);
}),

@ -1,13 +1,12 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/view_models/dashboard_view_model.dart';
import 'package:flutter/gestures.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_provider.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:easy_localization/easy_localization.dart';
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/provider_branches_models/branch_detail_model.dart';
@ -66,45 +65,45 @@ class BranchListPage extends StatelessWidget {
title: LocaleKeys.myBranches.tr(),
isRemoveBackButton: true,
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: Column(
children: [
Padding(
padding: const EdgeInsets.only(left: 21, right: 21, top: 21),
child: RoleTypeTab(
context.watch<ServiceVM>().selectedBranchStatus == 3 ? 0 : context.watch<ServiceVM>().selectedBranchStatus,
[
DropValue(3, "Active", ""),
DropValue(1, "Requested", ""),
],
onSelect: (DropValue value) {
context.read<ServiceVM>().updateSelectedBranchType(value.id);
},
body: RefreshIndicator(
onRefresh: () async => await context.read<ServiceVM>().getBranchAndServices(),
child: SizedBox(
width: double.infinity,
height: double.infinity,
child: Column(
children: [
Padding(
padding: const EdgeInsets.only(left: 21, right: 21, top: 21),
child: RoleTypeTab(
context.watch<ServiceVM>().selectedBranchStatus == 3 ? 0 : context.watch<ServiceVM>().selectedBranchStatus,
[
DropValue(3, "Active", ""),
DropValue(1, "Requested", ""),
],
onSelect: (DropValue value) {
context.read<ServiceVM>().updateSelectedBranchType(value.id);
},
),
),
),
Expanded(
child: Consumer<ServiceVM>(
builder: (context, serviceVM, _) {
if (serviceVM.state == ViewState.busy) {
return const Center(child: CircularProgressIndicator());
} else {
List<BranchDetailModel> branches = [];
if (serviceVM.branches!.data != null) {
if (serviceVM.selectedBranchStatus == 3) {
// 3 means active branch
branches = serviceVM.branches!.data!.serviceProviderBranch!.where((element) => element.statusId == 3).toList();
} else {
branches = serviceVM.branches!.data!.serviceProviderBranch!.where((element) {
return element.statusId != 3; // means rest of the branches
}).toList();
Expanded(
child: Consumer<ServiceVM>(
builder: (context, serviceVM, _) {
if (serviceVM.state == ViewState.busy) {
return const Center(child: CircularProgressIndicator());
} else {
List<BranchDetailModel> branches = [];
if (serviceVM.branches!.data != null) {
if (serviceVM.selectedBranchStatus == 3) {
// 3 means active branch
branches = serviceVM.branches!.data!.serviceProviderBranch!.where((element) => element.statusId == 3).toList();
} else {
branches = serviceVM.branches!.data!.serviceProviderBranch!.where((element) {
return element.statusId != 3; // means rest of the branches
}).toList();
}
}
}
return RefreshIndicator(
onRefresh: () async => await context.read<ServiceVM>().getBranchAndServices(),
child: branches.isEmpty
return branches.isEmpty
? Center(child: LocaleKeys.no_branch.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium))
: ListView.separated(
itemBuilder: (context, index) {
@ -183,19 +182,20 @@ class BranchListPage extends StatelessWidget {
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12)).onPress(() async {
branchModel.countryID = serviceVM.branches!.data!.countryID;
branchModel.countryName = serviceVM.branches!.data!.countryName;
navigateWithName(context, ProviderAppRoutes.branchDetail, arguments: branchModel);
serviceVM.updateSelectedBranchId(branchModel.id);
navigateWithName(context, AppRoutes.branchDetail, arguments: branchModel);
}),
);
},
separatorBuilder: (context, index) => 12.height,
itemCount: branches.length,
).paddingAll(21),
);
}
},
).paddingAll(21);
}
},
),
),
),
],
],
),
),
),
floatingActionButton: FloatingActionButton(
@ -205,7 +205,7 @@ class BranchListPage extends StatelessWidget {
color: Colors.white,
),
onPressed: () {
context.read<DashboardVM>().checkUserSubscription(SubscriptionActionTypeEnum.branches, context, callback: () { });
context.read<DashboardVMProvider>().checkUserSubscription(SubscriptionActionTypeEnum.branches, context, callback: () {});
},
),
);

@ -1,8 +1,8 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/theme/colors.dart';
@ -35,7 +35,7 @@ class DealershipView extends StatelessWidget {
),
title: LocaleKeys.defineBranches.tr().toText(fontSize: 12),
onTap: () {
navigateWithName(context, ProviderAppRoutes.branchList);
navigateWithName(context, AppRoutes.branchList);
},
),
ListTile(
@ -45,7 +45,7 @@ class DealershipView extends StatelessWidget {
),
title: LocaleKeys.defineServices.tr().toText(fontSize: 12),
onTap: () {
navigateWithName(context, ProviderAppRoutes.createServices2);
navigateWithName(context, AppRoutes.createServices2);
},
),
ListTile(

@ -1,7 +1,7 @@
import 'package:car_provider_app/view_models/dashboard_view_model.dart';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_provider.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
@ -41,7 +41,10 @@ class _AssignDealerUserSheetState extends State<AssignDealerUserSheet> {
}
getBranchUsers() {
provider.getAllProviderDealers({"ServiceProviderBranchID": widget.branchId, "ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""});
provider.getAllProviderDealers({
"ServiceProviderBranchID": widget.branchId,
"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? "",
});
}
@override
@ -86,7 +89,6 @@ class _AssignDealerUserSheetState extends State<AssignDealerUserSheet> {
maxWidth: double.infinity,
maxHeight: 55,
fontSize: 15,
onPressed: () async {
if (validation()) {
Utils.showLoading(context);
@ -123,7 +125,7 @@ class _AssignDealerUserSheetState extends State<AssignDealerUserSheet> {
txtColor: MyColors.darkPrimaryColor,
isFilled: false,
onPressed: () {
context.read<DashboardVM>().checkUserSubscription(SubscriptionActionTypeEnum.users, context, callback: () {
context.read<DashboardVMProvider>().checkUserSubscription(SubscriptionActionTypeEnum.users, context, callback: () {
getBranchUsers();
});
},
@ -143,6 +145,9 @@ class _AssignDealerUserSheetState extends State<AssignDealerUserSheet> {
Checkbox(
value: model.allProviderDealersList[index].isBranchUser,
onChanged: (v) {
for (var element in model.allProviderDealersList) {
element.isBranchUser = false;
}
model.allProviderDealersList[index].isBranchUser = v ?? false;
model.notifyListeners();
},

@ -1,5 +1,4 @@
import 'dart:async';
import 'package:car_provider_app/view_models/dashboard_view_model.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
@ -175,11 +174,13 @@ class _DefineBranchViewState extends State<DefineBranchView> {
},
),
12.height,
DottedRectContainer(
onTap: () => serviceVM.pickMultipleImages(),
text: LocaleKeys.attachImage.tr(),
icon: MyAssets.attachmentIcon.buildSvg(),
),
if (serviceVM.pickedBranchImages.isEmpty) ...[
DottedRectContainer(
onTap: () => serviceVM.pickMultipleImages(),
text: LocaleKeys.attachImage.tr(),
icon: MyAssets.attachmentIcon.buildSvg(),
),
],
if (serviceVM.branchImageError != "") ...[
10.height,
Row(

@ -1,5 +1,4 @@
import 'dart:async';
import 'package:car_provider_app/view_models/schedule_view_model.dart';
import 'package:car_provider_app/views/branch_management/schedule/widgets/chips_picker_item.dart';
import 'package:car_provider_app/views/branch_management/schedule/widgets/select_days_sheet.dart';
@ -8,7 +7,6 @@ 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/generated/locale_keys.g.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/models/appointments_models/schedule_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/theme/colors.dart';
@ -17,6 +15,7 @@ import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.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/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart';
import 'package:mc_common_app/widgets/bottom_sheet.dart';
@ -30,7 +29,7 @@ class AddSchedulesPage extends StatefulWidget {
}
class _AddSchedulesPageState extends State<AddSchedulesPage> {
late ScheduleVM mModel;
late ScheduleVM schedulevm;
String name = "", startDate = "", endDate = "", startTime = "", endTime = "", slotsTime = "", appointmentPerSlot = "", servicesGroupID = "";
@ -42,36 +41,71 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
endDate = DateHelper.formatAsYearMonthDay(scheduleData.toDate ?? DateTime.now());
startTime = scheduleData.startTime ?? "";
endTime = scheduleData.endTime ?? "";
slotsTime = scheduleData.slotDurationMinute.toString();
if (scheduleData.slotDurationMinute != null) {
int temp = scheduleData.slotDurationMinute!;
int index = minutesDrop.indexWhere((element) => element.id == temp);
if (index != -1) {
slotTimeId = temp;
slotsTime = "$temp Minutes";
} else {
temp = 20;
slotTimeId = temp;
slotsTime = "$temp Minutes";
}
}
appointmentPerSlot = scheduleData.perSlotAppointment.toString();
// mModel.selectedServicesItems.clear();
scheduleData.scheduleServices?.forEach((element) {
print("Services Elements");
print(element);
mModel.selectedServicesItems.add(PickerItem(id: element.serviceProviderServiceId ?? 0, title: element.serviceDescription ?? ""));
schedulevm.selectedServicesItems.add(PickerItem(id: element.serviceProviderServiceId ?? 0, title: element.serviceDescription ?? ""));
});
logger.d(mModel.selectedServicesItems.first.id);
mModel.selectedDaysItems.clear();
schedulevm.selectedDaysItems.clear();
scheduleData.weeklyOffDays?.forEach((element) {
for (var daysElement in initDaysList) {
if (element.dayNumber == daysElement.id) {
daysElement.isSelected = true;
mModel.selectedDaysItems.add(daysElement);
schedulevm.selectedDaysItems.add(daysElement);
}
}
});
if (scheduleData.appointmentType != null) {
if (scheduleData.appointmentType == 1) {
selectedScheduleLocationDrop = DropValue(1, 'Company Location', '');
} else {
selectedScheduleLocationDrop = DropValue(1, 'Company Location', '');
}
}
}
int slotTimeId = 10;
List<DropValue> minutesDrop = [
DropValue(10, '10 Minutes', ''),
DropValue(15, '15 Minutes', ''),
DropValue(20, '20 Minutes', ''),
DropValue(25, '25 Minutes', ''),
DropValue(30, '30 Minutes', ''),
DropValue(50, '50 Minutes', ''),
DropValue(60, '60 Minutes', ''),
];
DropValue selectedScheduleLocationDrop = DropValue(-1, '', '');
List<DropValue> scheduleLocationIdDrop = [
DropValue(1, 'Company Location', ''),
DropValue(2, 'Customer Location', ''),
];
@override
void initState() {
super.initState();
scheduleMicrotask(() {
mModel = context.read<ScheduleVM>();
schedulevm = context.read<ScheduleVM>();
scheduleData = ModalRoute.of(context)!.settings.arguments as ScheduleData;
mModel.getAllServices(scheduleData.branchId, scheduleData);
mModel.selectedServicesItems = [];
mModel.selectedDaysItems = [];
schedulevm.getAllServices(scheduleData.branchId, scheduleData);
schedulevm.selectedServicesItems = [];
schedulevm.selectedDaysItems = [];
if (scheduleData.id != null) {
setEditData();
}
@ -81,13 +115,11 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: const CustomAppBar(
title: "Create Schedules",
),
appBar: CustomAppBar(title: LocaleKeys.createGroupServices.tr()),
body: SizedBox(
width: double.infinity,
child: Consumer<ScheduleVM>(
builder: (_, ScheduleVM model, child) {
builder: (_, ScheduleVM scheduleVM, child) {
return Column(
children: [
Expanded(
@ -95,6 +127,16 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
padding: const EdgeInsets.all(20),
child: Column(
children: [
if (scheduleVM.currentSelectedBranchName.isNotEmpty) ...[
TxtField(
isBackgroundEnabled: true,
isNeedClickAll: true,
hint: '',
value: scheduleVM.currentSelectedBranchName,
onTap: () {},
),
8.height,
],
TxtField(
hint: LocaleKeys.nameofSchedule.tr(),
value: name,
@ -105,13 +147,13 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
8.height,
ChipsPickerItem(
hint: LocaleKeys.select_Services.tr(),
itemsList: [...model.selectedServicesItems],
itemsList: [...scheduleVM.selectedServicesItems],
onClick: () {
showMyBottomSheet(
context,
child: SelectServicesSheet(
onSelectServices: () {
model.filterSelectedServices();
scheduleVM.filterSelectedServices();
FocusManager.instance.primaryFocus?.unfocus();
},
),
@ -133,7 +175,7 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
firstDate: DateTime.now(),
);
FocusManager.instance.primaryFocus?.unfocus();
model.refresh();
scheduleVM.refresh();
},
),
8.height,
@ -151,19 +193,19 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
firstDate: DateTime.now(),
);
FocusManager.instance.primaryFocus?.unfocus();
model.refresh();
scheduleVM.refresh();
},
),
8.height,
ChipsPickerItem(
hint: LocaleKeys.offDays.tr(),
itemsList: [...model.selectedDaysItems],
itemsList: [...scheduleVM.selectedDaysItems],
onClick: () {
showMyBottomSheet(
context,
child: SelectDaysSheet(
onSelected: (List<PickerItem> picked) {
model.filterDays(picked);
scheduleVM.filterDays(picked);
FocusManager.instance.primaryFocus?.unfocus();
},
),
@ -185,7 +227,7 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
onTap: () async {
startTime = await Utils.pickTime(context);
FocusManager.instance.primaryFocus?.unfocus();
model.refresh();
scheduleVM.refresh();
},
),
),
@ -207,27 +249,25 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
initialTime: _startTime,
);
FocusManager.instance.primaryFocus?.unfocus();
model.refresh();
scheduleVM.refresh();
},
),
),
],
),
8.height,
TxtField(
hint: LocaleKeys.slotsTime.tr(),
postfixWidget: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
"Min".toText(color: MyColors.lightTextColor),
],
),
keyboardType: TextInputType.number,
value: slotsTime,
onChanged: (v) {
slotsTime = v;
Builder(
builder: (context) {
return DropdownField(
(DropValue value) {
slotsTime = value.value;
slotTimeId = value.id;
},
list: minutesDrop,
dropdownValue: slotsTime.isNotEmpty ? DropValue(slotTimeId, slotsTime, "") : null,
hint: LocaleKeys.slotsTime.tr(),
errorValue: '',
);
},
),
8.height,
@ -239,6 +279,20 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
appointmentPerSlot = v;
},
),
8.height,
Builder(
builder: (context) {
return DropdownField(
(DropValue value) {
selectedScheduleLocationDrop = value;
},
list: scheduleLocationIdDrop,
dropdownValue: selectedScheduleLocationDrop.id != -1 ? selectedScheduleLocationDrop : null,
hint: LocaleKeys.selectServiceLocation.tr(),
errorValue: '',
);
},
),
],
),
),
@ -248,11 +302,11 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
maxWidth: double.infinity,
margin: const EdgeInsets.all(20),
onPressed: () {
if (validation(model)) {
if (validation(scheduleVM)) {
if (scheduleData.id != null) {
updateSchedule(context, model);
updateSchedule(context, scheduleVM);
} else {
createSchedule(context, model);
createSchedule(context, scheduleVM);
}
}
},
@ -298,9 +352,9 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
return valid;
}
createSchedule(BuildContext context, ScheduleVM model) async {
createSchedule(BuildContext context, ScheduleVM scheduleVM) async {
List<int> days = [];
for (var element in model.selectedDaysItems) {
for (var element in scheduleVM.selectedDaysItems) {
days.add(element.id);
}
@ -312,19 +366,19 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
"toDate": endDate,
"startTime": startTime,
"endTime": endTime,
"slotDurationMinute": slotsTime,
"slotDurationMinute": slotsTime.replaceFirst(' Minutes', ''),
"perSlotAppointment": appointmentPerSlot,
"deliveryServiceType": 1,
"appointmentType": 1,
"appointmentType": selectedScheduleLocationDrop.id,
"weeklyOffDays": days
};
Utils.showLoading(context);
GenericRespModel scheduleResponse = await model.createSchedule(map);
GenericRespModel scheduleResponse = await scheduleVM.createSchedule(map);
if (scheduleResponse.messageStatus == 1) {
List<int> services = [];
for (var element in model.selectedServicesItems) {
for (var element in scheduleVM.selectedServicesItems) {
services.add(element.id);
}
var map1 = {
@ -333,7 +387,7 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
"serviceGroupDescription": "string",
};
GenericRespModel servicesResponse = await model.addServicesInSchedule(map1);
GenericRespModel servicesResponse = await scheduleVM.addServicesInSchedule(map1);
Utils.hideLoading(context);
if (servicesResponse.messageStatus == 1) {
Utils.showToast("Successfully schedule created");
@ -363,11 +417,11 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
"toDate": endDate,
"startTime": startTime,
"endTime": endTime,
"slotDurationMinute": slotsTime,
"slotDurationMinute": slotsTime.replaceFirst(' Minutes', ''),
"perSlotAppointment": appointmentPerSlot,
"deliveryServiceType": 1,
"weeklyOffDays": days,
"appointmentType": scheduleData.appointmentType
"appointmentType": selectedScheduleLocationDrop.id,
};
Utils.showLoading(context);

@ -1,7 +1,7 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/view_models/schedule_view_model.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
@ -93,7 +93,7 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
: scheduleVM.schedule!.data!.isEmpty
? EmptyWidget(
text: LocaleKeys.noSchedulesFound.tr(),
)
).paddingAll(21)
: ListView.separated(
itemBuilder: (BuildContext context, int index) {
return Column(
@ -119,7 +119,7 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
),
).onPress(() {
scheduleVM.schedule!.data![index].branchId = widget.branchId ?? "";
navigateWithName(context, ProviderAppRoutes.addSchedule, arguments: scheduleVM.schedule!.data![index]);
navigateWithName(context, AppRoutes.addSchedule, arguments: scheduleVM.schedule!.data![index]);
}),
],
),
@ -130,6 +130,7 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
showItem("${LocaleKeys.shiftEndTime.tr()}:", scheduleVM.schedule!.data![index].endTime ?? ""),
showItem("${LocaleKeys.slotsTime.tr()}:", "${scheduleVM.schedule!.data![index].slotDurationMinute} Mins"),
showItem("${LocaleKeys.appointmentPerSlot.tr()}:", scheduleVM.schedule!.data![index].perSlotAppointment.toString()),
showItem(LocaleKeys.serviceLocation.tr(), scheduleVM.schedule!.data![index].appointmentType == 1 ? LocaleKeys.companyLocation.tr() : LocaleKeys.customerLocation.tr()),
showItem("${LocaleKeys.offDays.tr()}:", offDays(scheduleVM.schedule!.data![index])),
12.height,
"${LocaleKeys.services.tr()}:".toText(fontSize: 12, color: MyColors.lightTextColor),
@ -160,7 +161,7 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
maxWidth: double.infinity,
margin: const EdgeInsets.all(20),
onPressed: () {
navigateWithName(context, ProviderAppRoutes.addSchedule, arguments: ScheduleData(branchId: widget.branchId ?? ""));
navigateWithName(context, AppRoutes.addSchedule, arguments: ScheduleData(branchId: widget.branchId ?? ""));
},
),
],

@ -25,7 +25,12 @@ class ChipsPickerItem extends StatelessWidget {
Widget build(BuildContext context) {
return Row(
children: [
if (itemsList.isEmpty) Expanded(child: hint.toText(fontSize: 15, fontWeight: MyFonts.Medium, color: borderColor)),
if (itemsList.isEmpty)
Expanded(
child: Text(
hint,
style: const TextStyle(color: borderColor, fontSize: 15, fontWeight: MyFonts.Medium),
)),
if (itemsList.isNotEmpty)
Expanded(
child: ListView(

@ -16,6 +16,7 @@ import 'package:mc_common_app/widgets/checkbox_with_title_desc.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/empty_widget.dart';
import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart';
@ -39,7 +40,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
bool isHomeAppointmentAvailable = false;
int serviceRage = 0;
String chargersPerKm = "";
int? categoryId;
int? categoryId = -1;
int? serviceId = -1;
DropValue? category;
DropValue? service;
@ -70,6 +71,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
@override
Widget build(BuildContext context) {
log("categoryId: ${categoryId}");
return Scaffold(
appBar: CustomAppBar(title: LocaleKeys.editServices.tr()),
body: SizedBox(
@ -85,39 +87,43 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
DropdownField(
isSelectAble: !widget.branchModel!.isForEdit,
(DropValue value) async {
categoryId = value.id;
category = value;
service = null;
serviceId = -1;
isAppointmentAvailable = false;
isHomeAppointmentAvailable = false;
model.fetchServicesByCategoryId(value.id);
},
dropdownValue: category,
list: model.categoryDropList,
hint: category != null ? category!.value : LocaleKeys.selectServiceCategory.tr(),
),
12.height,
(model.state == ViewState.idle)
? DropdownField(
isSelectAble: !widget.branchModel!.isForEdit,
(DropValue value) async {
categoryId = value.id;
category = value;
service = null;
serviceId = -1;
isAppointmentAvailable = false;
isHomeAppointmentAvailable = false;
model.fetchServicesByCategoryId(value.id);
},
dropdownValue: category,
list: model.categoryDropList,
hint: category != null ? category!.value : LocaleKeys.selectServiceCategory.tr(),
)
? categoryId != -1 && model.servicesDropList.isNotEmpty
? DropdownField(
(DropValue value) {
service = value;
serviceId = value.id;
isAppointmentAvailable = false;
isHomeAppointmentAvailable = false;
model.setState(ViewState.idle);
},
dropdownValue: service,
list: model.servicesDropList,
hint: LocaleKeys.defineServices.tr(),
)
: categoryId == -1
? const SizedBox()
: model.state == ViewState.idle
? EmptyWidget(text: LocaleKeys.noServicesAvailable.tr())
: const SizedBox()
: const CircularProgressIndicator(),
12.height,
model.servicesDropList.isNotEmpty
? DropdownField(
(DropValue value) {
service = value;
serviceId = value.id;
isAppointmentAvailable = false;
isHomeAppointmentAvailable = false;
model.setState(ViewState.idle);
},
dropdownValue: service,
list: model.servicesDropList,
hint: LocaleKeys.defineServices.tr(),
)
: Container(),
12.height,
if (serviceId != -1) ...[
Column(
children: [
@ -281,7 +287,6 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
Utils.showLoading(context);
GenericRespModel mResponse = await model.updateServices(map);
model.getBranchAndServices();
model.filterUserBranchCategories();
Utils.hideLoading(context);
Utils.showToast(mResponse.message ?? "");
if (mResponse.messageStatus == 1) {

@ -106,7 +106,7 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
value: model.matchedServices![index].isExpandedOrSelected,
onChanged: (v) {
if (model.matchedServices![index].serviceItems!.isEmpty) {
Utils.showToast(LocaleKeys.noItemstoShow.tr());
Utils.showToast(LocaleKeys.noItemsToShow.tr());
} else {
model.matchedServices![index].isExpandedOrSelected = v ?? false;
model.updateServiceItem(index, model.matchedServices![index].isExpandedOrSelected);

@ -1,4 +1,4 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
@ -115,7 +115,7 @@ class ApprovedBranchesListSheet extends StatelessWidget {
// branches[index].countryName = model.branchs!.data!.countryName;
navigateWithName(
context,
ProviderAppRoutes.matchServices,
AppRoutes.matchServices,
arguments: MatchServicesArguments(
oldBranch: branches[index].id ?? 0,
oldBranchName: branches[index].branchName ?? "",

@ -1,7 +1,7 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/view_models/items_view_model.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
@ -42,7 +42,7 @@ class ItemsListPage extends StatelessWidget {
return model.state == ViewState.busy
? const Center(child: CircularProgressIndicator())
: model.serviceItems!.data!.isEmpty
? EmptyWidget(text: LocaleKeys.noItemstoShow.tr(), isWrappedColumn: false)
? EmptyWidget(text: LocaleKeys.noItemsToShow.tr(), isWrappedColumn: false)
: ListView.separated(
itemBuilder: (BuildContext context, int index) {
return SizedBox(
@ -86,14 +86,11 @@ class ItemsListPage extends StatelessWidget {
),
).onPress(() {
model.serviceItems!.data![index].isUpdateOrSelected = true;
navigateWithName(context, ProviderAppRoutes.createItem, arguments: model.serviceItems!.data![index]);
navigateWithName(context, AppRoutes.createItem, arguments: model.serviceItems!.data![index]);
}),
],
),
).toWhiteContainer(
width: double.infinity,
allPading: 12,
);
).toWhiteContainer(width: double.infinity, allPading: 12);
},
separatorBuilder: (BuildContext context, int index) {
return 12.height;
@ -111,7 +108,7 @@ class ItemsListPage extends StatelessWidget {
onPressed: () {
navigateWithName(
context,
ProviderAppRoutes.createItem,
AppRoutes.createItem,
arguments: ItemData(
serviceProviderServiceId: serviceProviderService!.serviceProviderServiceId,
),

@ -1,10 +1,11 @@
import 'dart:developer';
import 'dart:async';
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/views/branch_management/services/duplication/sheet/approved_branches_list_sheet.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
@ -14,12 +15,13 @@ 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/utils/utils.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:mc_common_app/widgets/bottom_sheet.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/tab/role_type_tab.dart';
import 'package:provider/provider.dart';
class CreateBranchModel {
final String branchId;
@ -50,15 +52,33 @@ class _ServicesListPageState extends State<ServicesListPage> {
int selectedTab = 0;
ServiceStatusEnum selectedService = ServiceStatusEnum.approvedOrActive;
List<ServiceModel> filteredServices = [];
late CategoryData categoryData;
ViewState screenState = ViewState.busy;
@override
void initState() {
scheduleMicrotask(() async {
await _fetchServices();
});
super.initState();
}
Future<void> _fetchServices() async {
categoryData.services = await context.read<ServiceVM>().fetchProviderServicesModelByCategoryIdAndBranchID(
branchID: categoryData.branchId.toString(),
categoryId: categoryData.id.toString(),
);
filteredServices = categoryData.services!.where((i) => i.serviceStatus == ServiceStatusEnum.approvedOrActive.index + 1).toList();
screenState = ViewState.idle;
setState(() {});
}
@override
Widget build(BuildContext context) {
final categoryData = ModalRoute.of(context)!.settings.arguments as CategoryData;
List<ServiceModel> services = [];
if (selectedService == ServiceStatusEnum.approvedOrActive) {
services = categoryData.services!.where((i) => i.serviceStatus == ServiceStatusEnum.approvedOrActive.index + 1).toList();
} else {
services = categoryData.services!.where((i) => i.serviceStatus != ServiceStatusEnum.approvedOrActive.index + 1).toList();
}
categoryData = ModalRoute.of(context)!.settings.arguments as CategoryData;
return Scaffold(
appBar: CustomAppBar(
@ -96,8 +116,10 @@ class _ServicesListPageState extends State<ServicesListPage> {
selectedTab = value.id;
if (selectedTab == 0) {
selectedService = ServiceStatusEnum.approvedOrActive;
filteredServices = categoryData.services!.where((i) => i.serviceStatus == ServiceStatusEnum.approvedOrActive.index + 1).toList();
} else {
selectedService = value.id.toServiceStatusEnum();
filteredServices = categoryData.services!.where((i) => i.serviceStatus != ServiceStatusEnum.approvedOrActive.index + 1).toList();
}
});
},
@ -105,80 +127,106 @@ class _ServicesListPageState extends State<ServicesListPage> {
),
const SizedBox(height: 10),
Expanded(
child: services.isEmpty
? Center(
child: LocaleKeys.noItemstoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
)
: ListView.separated(
itemBuilder: (context, index) {
return SizedBox(
width: double.infinity,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (services[index].serviceStatus == 1) ...[
Utils.statusContainerChip(text: "Pending", chipColor: MyColors.adPendingStatusColor),
5.height,
],
Row(
children: [
Expanded(
child: (services[index].serviceDescription ?? "").toText(fontSize: 16),
),
Padding(
padding: const EdgeInsets.all(4.0),
child: SvgPicture.asset(
MyAssets.icEdit,
width: 16,
height: 16,
child: RefreshIndicator(
onRefresh: () async {
screenState = ViewState.busy;
setState(() {});
categoryData.services = await context.read<ServiceVM>().fetchProviderServicesModelByCategoryIdAndBranchID(
branchID: categoryData.branchId.toString(),
categoryId: categoryData.id.toString(),
);
if (selectedService == ServiceStatusEnum.approvedOrActive) {
filteredServices = categoryData.services!.where((i) => i.serviceStatus == ServiceStatusEnum.approvedOrActive.index + 1).toList();
} else {
filteredServices = categoryData.services!.where((i) => i.serviceStatus != ServiceStatusEnum.approvedOrActive.index + 1).toList();
}
screenState = ViewState.idle;
setState(() {});
},
child: screenState == ViewState.busy
? const Center(
child: CircularProgressIndicator(),
)
: filteredServices.isEmpty
? Center(
child: LocaleKeys.noServicesAvailable.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
)
: ListView.separated(
itemBuilder: (context, index) {
return SizedBox(
width: double.infinity,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (filteredServices[index].serviceStatus == 1) ...[
Utils.statusContainerChip(text: "Pending", chipColor: MyColors.adPendingStatusColor),
5.height,
],
Row(
children: [
Expanded(
child: (filteredServices[index].serviceDescription ?? "").toText(fontSize: 16),
),
if (filteredServices[index].serviceStatus != 1) ...[
Padding(
padding: const EdgeInsets.all(4.0),
child: SvgPicture.asset(
MyAssets.icEdit,
width: 16,
height: 16,
),
).onPress(() {
navigateWithName(context, AppRoutes.createServices3,
arguments: CreateBranchModel(
branchId: categoryData.branchId ?? '',
branchName: categoryData.branchName ?? '',
categoryId: categoryData.id.toString(),
categoryName: categoryData.categoryName,
serviceProviderService: filteredServices[index],
isForEdit: true,
));
}),
]
],
),
).onPress(() {
navigateWithName(context, ProviderAppRoutes.createServices3,
arguments: CreateBranchModel(
branchId: categoryData.branchId ?? '',
branchName: categoryData.branchName ?? '',
categoryId: categoryData.id.toString(),
categoryName: categoryData.categoryName,
serviceProviderService: services[index],
isForEdit: true,
));
}),
],
),
const SizedBox(height: 4),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
const SizedBox(height: 4),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: [
const SizedBox(height: 4),
showItem('${LocaleKeys.availableforAppointment.tr()}:', (services[index].isAllowAppointment ?? false) ? LocaleKeys.yes.tr() : LocaleKeys.no.tr(), valueColor: Colors.green),
showItem('${LocaleKeys.allowingHomeService.tr()}:', (services[index].isAllowAppointmentHome ?? false) ? LocaleKeys.yes.tr() : LocaleKeys.no.tr(), valueColor: Colors.green),
if ((services[index].isAllowAppointmentHome ?? false)) ...[
showItem('${LocaleKeys.homeServiceRange.tr()}:', services[index].customerLocationRange.toString()),
showItem('${LocaleKeys.chargesPerKM.tr()}:', services[index].rangePricePerKm.toString()),
],
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 4),
showItem('${LocaleKeys.availableforAppointment.tr()}:', (filteredServices[index].isAllowAppointment ?? false) ? LocaleKeys.yes.tr() : LocaleKeys.no.tr(),
valueColor: Colors.green),
showItem('${LocaleKeys.allowingHomeService.tr()}:', (filteredServices[index].isAllowAppointmentHome ?? false) ? LocaleKeys.yes.tr() : LocaleKeys.no.tr(),
valueColor: Colors.green),
if ((filteredServices[index].isAllowAppointmentHome ?? false)) ...[
showItem('${LocaleKeys.homeServiceRange.tr()}:', filteredServices[index].customerLocationRange.toString()),
showItem('${LocaleKeys.chargesPerKM.tr()}:', filteredServices[index].rangePricePerKm.toString()),
],
],
),
),
const Icon(Icons.arrow_forward_rounded, size: 20),
],
),
),
const Icon(Icons.arrow_forward_rounded, size: 20),
],
),
],
],
),
).toWhiteContainer(width: double.infinity, allPading: 12).onPress(
() => navigateWithName(context, AppRoutes.itemsList, arguments: filteredServices[index]),
);
},
separatorBuilder: (context, index) {
return const SizedBox(height: 12);
},
padding: const EdgeInsets.only(left: 20, right: 20, bottom: 20, top: 10),
itemCount: filteredServices.length,
),
).toWhiteContainer(width: double.infinity, allPading: 12).onPress(
() => navigateWithName(context, ProviderAppRoutes.itemsList, arguments: services[index]),
);
},
separatorBuilder: (context, index) {
return const SizedBox(height: 12);
},
padding: const EdgeInsets.only(left: 20, right: 20, bottom: 20, top: 10),
itemCount: services.length,
),
),
),
],
),

@ -1,7 +1,9 @@
import 'dart:async';
import 'package:car_provider_app/view_models/dashboard_view_model.dart';
import 'dart:developer';
import 'package:car_provider_app/views/branch_management/branch/branch_list_page.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_provider.dart';
import 'package:mc_common_app/views/common_fragments/requests_fragment.dart';
import 'package:mc_common_app/widgets/common_widgets/bottom_nav_bar.dart';
import 'package:provider/provider.dart';
@ -10,21 +12,24 @@ import 'fragments/home_fragment.dart';
import 'package:mc_common_app/views/common_fragments/ads_fragment.dart';
class DashboardView extends StatefulWidget {
const DashboardView({Key? key}) : super(key: key);
final DashboardRouteEnum dashboardRouteEnum;
const DashboardView({Key? key, required this.dashboardRouteEnum}) : super(key: key);
@override
State<DashboardView> createState() => _DashboardViewState();
}
class _DashboardViewState extends State<DashboardView> {
late DashboardVM dashboardVM;
late DashboardVMProvider dashboardVMProvider;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
void initState() {
log("widget.dashboardRouteEnum: ${widget.dashboardRouteEnum}");
super.initState();
dashboardVM = Provider.of<DashboardVM>(context, listen: false);
scheduleMicrotask(() => dashboardVM.onRefresh(context));
dashboardVMProvider = Provider.of<DashboardVMProvider>(context, listen: false);
scheduleMicrotask(() => dashboardVMProvider.onRefresh(context, dashboardRouteEnum: widget.dashboardRouteEnum));
}
@override
@ -41,13 +46,13 @@ class _DashboardViewState extends State<DashboardView> {
canPop: false,
child: Scaffold(
key: _scaffoldKey,
body: fragments[context.watch<DashboardVM>().selectedNavbarBarIndex],
body: fragments[context.watch<DashboardVMProvider>().selectedNavbarBarIndex],
bottomNavigationBar: CustomBottomNavbar(
onSelected: (index) {
dashboardVM.onNavbarTapped(index);
dashboardVMProvider.onNavbarTapped(index);
},
isProvider: true,
selectedNavbarBarIndex: dashboardVM.selectedNavbarBarIndex,
selectedNavbarBarIndex: dashboardVMProvider.selectedNavbarBarIndex,
),
),
);

@ -1,8 +1,7 @@
import 'package:geolocator/geolocator.dart';
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
@ -10,14 +9,10 @@ import 'package:mc_common_app/models/provider_branches_models/branch_detail_mode
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/utils/utils.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
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/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/tab/role_type_tab.dart';
import 'package:provider/provider.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:easy_localization/easy_localization.dart';
class BranchAppointmentFragment extends StatelessWidget {
@ -109,7 +104,7 @@ class BranchAppointmentFragment extends StatelessWidget {
).toContainer(borderRadius: 0, isShadowEnabled: true).onPress(() async {
branches[index].countryID = serviceVM.branches!.data!.countryID;
branches[index].countryName = serviceVM.branches!.data!.countryName;
navigateWithName(context, ProviderAppRoutes.appointment, arguments: branches[index]);
navigateWithName(context, AppRoutes.appointment, arguments: branches[index]);
});
},
separatorBuilder: (context, index) {

@ -1,5 +1,3 @@
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:mc_common_app/classes/app_state.dart';
@ -14,11 +12,11 @@ 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/dashboard_view_model_provider.dart';
import 'package:mc_common_app/views/advertisement/components/ads_list_widget.dart';
import 'package:mc_common_app/views/appointments/widgets/common_appointment_slider_widget.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/common_widgets/view_all_widget.dart';
import 'package:badges/badges.dart' as b;
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
@ -34,25 +32,25 @@ class HomeFragment extends StatelessWidget {
leadingWidth: 100,
toolbarHeight: 59,
onTap: () => navigateWithName(context, AppRoutes.settingOptionsMore),
actions: [
IconButton(
onPressed: () => context.read<AppointmentsVM>().onGeneralChatMessagesButtonPressed(context: context),
icon: b.Badge(
badgeContent: '3'.toText(color: MyColors.white),
badgeStyle: const b.BadgeStyle(
badgeColor: MyColors.primaryColor,
padding: EdgeInsets.all(5),
),
child: const Padding(padding: EdgeInsets.only(top: 8, bottom: 8, right: 25, left: 10), child: Icon(Icons.message, size: 21))),
),
10.width,
actions: const [
// IconButton(
// onPressed: () => context.read<AppointmentsVM>().onGeneralChatMessagesButtonPressed(context: context),
// icon: b.Badge(
// badgeContent: '3'.toText(color: MyColors.white),
// badgeStyle: const b.BadgeStyle(
// badgeColor: MyColors.primaryColor,
// padding: EdgeInsets.all(5),
// ),
// child: const Padding(padding: EdgeInsets.only(top: 8, bottom: 8, right: 25, left: 10), child: Icon(Icons.message, size: 21))),
// ),
// 10.width,
],
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: RefreshIndicator(
onRefresh: () async => await context.read<DashboardVM>().onRefresh(context),
onRefresh: () async => await context.read<DashboardVMProvider>().onRefresh(context),
child: ListView(
padding: EdgeInsets.zero,
children: [
@ -63,7 +61,7 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.upcoming_appointment.tr(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVM>().onNavbarTapped(1);
context.read<DashboardVMProvider>().onNavbarTapped(1);
},
).horPaddingMain(),
// const AppointmentSliderWidget().horPaddingMain(),
@ -74,7 +72,7 @@ class HomeFragment extends StatelessWidget {
] else ...[
CommonAppointmentSliderWidget(
onAppointmentClick: (AppointmentListModel value) {
navigateWithName(context, ProviderAppRoutes.appointmentDetailList, arguments: value);
navigateWithName(context, AppRoutes.appointmentDetailList, arguments: value);
},
)
.toWhiteContainer(
@ -88,7 +86,7 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.myBranches.tr(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVM>().onNavbarTapped(0);
context.read<DashboardVMProvider>().onNavbarTapped(0);
},
).horPaddingMain(),
const ServiceProviderWidget().horPaddingMain(),
@ -114,7 +112,7 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.my_active_Ads.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVM>().onNavbarTapped(3);
context.read<DashboardVMProvider>().onNavbarTapped(3);
context.read<AdVM>().updateIsExploreAds(true);
context.read<AdVM>().applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds);
},
@ -136,7 +134,7 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.myRecommendedAds.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVM>().onNavbarTapped(3);
context.read<DashboardVMProvider>().onNavbarTapped(3);
context.read<AdVM>().updateIsExploreAds(true);
context.read<AdVM>().applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds);
},

@ -1,6 +1,5 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/generated/locale_keys.g.dart';
import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/theme/colors.dart';
@ -53,7 +52,8 @@ class ServiceProviderWidget extends StatelessWidget {
() {
serviceVM.homePageBranches[index].countryID = serviceVM.branches!.data!.countryID;
serviceVM.homePageBranches[index].countryName = serviceVM.branches!.data!.countryName;
navigateWithName(context, ProviderAppRoutes.branchDetail, arguments: serviceVM.homePageBranches[index]);
serviceVM.updateSelectedBranchId(serviceVM.homePageBranches[index].id);
navigateWithName(context, AppRoutes.branchDetail, arguments: serviceVM.homePageBranches[index]);
},
);
},

@ -31,7 +31,6 @@ class SubscriptionsPage extends StatefulWidget {
class _SubscriptionsPageState extends State<SubscriptionsPage> {
@override
void initState() {
// TODO: implement initState
super.initState();
scheduleMicrotask(() {
context.read<SubscriptionsVM>().getSubscriptionBySP(

@ -1,24 +1,15 @@
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/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/main.dart';
import 'package:mc_common_app/models/general_models/generic_resp_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/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/payment_view_model.dart';
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';
@ -37,9 +28,9 @@ class _MySubscriptionsPageState extends State<MySubscriptionsPage> {
@override
void initState() {
super.initState();
scheduleMicrotask(() {
// context.read<SubscriptionsVM>().getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
});
// scheduleMicrotask(() {
// context.read<SubscriptionsVM>().getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
// });
}
@override
@ -70,7 +61,6 @@ class _MySubscriptionsPageState extends State<MySubscriptionsPage> {
backgroundColor: MyColors.darkIconColor,
isMainPage: model.mySubscriptionsBySp[index].isExpired ?? false,
onRenewSubscriptionClick: () async {
print(sub.toJson());
showMyBottomSheet(
context,
child: UpgradePackageSheet(
@ -151,7 +141,7 @@ class _MySubscriptionsPageState extends State<MySubscriptionsPage> {
maxWidth: double.infinity,
margin: const EdgeInsets.symmetric(horizontal: 21),
onPressed: () {
navigateWithName(context, ProviderAppRoutes.subscriptionsPage);
navigateWithName(context, AppRoutes.subscriptionsPage);
},
),
21.height,

@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
@ -58,7 +59,7 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
padding: const EdgeInsets.only(left: 21, right: 21, bottom: 21, top: 4),
child: Consumer<SubscriptionsVM>(builder: (context, model, _) {
if (model.state == ViewState.busy) {
print(model.newPrice);
log(model.newPrice);
return SizedBox(
width: double.infinity,
height: MediaQuery.of(context).size.height / 2,
@ -79,7 +80,7 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
12.height,
packageItem(
LocaleKeys.nowVar.tr(),
(LocaleKeys.yourSubscriptionUpgradeAffectingFrom.tr() + " ${DateHelper.formatAsLongDate(widget.subscription.dateEnd ?? DateTime.now())}"),
("${LocaleKeys.yourSubscriptionUpgradeAffectingFrom.tr()} ${widget.subscription.dateEnd == null ? DateHelper.formatAsDayMonthYear(DateTime.now()) : DateHelper.formatAsDayMonthYear(DateHelper.parseStringToDate(DateHelper.formatDateT(widget.subscription.dateEnd!)))}"),
double.parse(model.newPrice).toStringAsFixed(2),
isNowSelected,
).onPress(() {
@ -89,10 +90,10 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
});
}),
6.height,
if (!AppState().getproviderSubscription.first.isExpired!)
if (AppState().getproviderSubscription.isNotEmpty && !AppState().getproviderSubscription.first.isExpired!)
packageItem(
LocaleKeys.upgradeAfterCurrentExpiry.tr(),
(LocaleKeys.yourSubscriptionUpgradeCurrentSubscriptionAffectingFrom.tr() + " ${DateHelper.formatAsLongDate(widget.subscription.dateEnd ?? DateTime.now())}"),
("${LocaleKeys.yourSubscriptionUpgradeCurrentSubscriptionAffectingFrom.tr()} ${AppState().getproviderSubscription.first.dateEnd == null ? "" : AppState().getproviderSubscription.first.dateEnd == null ? DateHelper.formatAsDayMonthYear(DateTime.now()) : DateHelper.formatAsDayMonthYear(DateHelper.parseStringToDate(DateHelper.formatDateT(AppState().getproviderSubscription.first.dateEnd!)))}"),
widget.subscription.price.toString(),
isNowSelected ? false : true,
).onPress(() {
@ -174,11 +175,11 @@ class _UpgradePackageSheetState extends State<UpgradePackageSheet> {
fontWeight: FontWeight.bold,
),
4.height,
if (widget.subscription.dateEnd != null)
description.toText(
fontSize: 12,
color: MyColors.lightTextColor,
),
// if (widget.subscription.dateEnd != null)
description.toText(
fontSize: 12,
color: MyColors.lightTextColor,
),
10.height,
Row(
crossAxisAlignment: CrossAxisAlignment.end,

@ -2,10 +2,12 @@ import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.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:easy_localization/easy_localization.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class AllSubscriptionsCard extends StatelessWidget {
@ -65,9 +67,9 @@ class AllSubscriptionsCard extends StatelessWidget {
],
),
6.height,
showItem("Ads:", subscription.subscriptionAds.toString()),
showItem("Users:", subscription.subscriptionSubUsers.toString()),
showItem("Branches:", subscription.subscriptionBranches.toString()),
showItem("${LocaleKeys.ads.tr()}:", subscription.subscriptionAds.toString()),
showItem("${LocaleKeys.users.tr()}:", subscription.subscriptionSubUsers.toString()),
showItem("${LocaleKeys.branches.tr()}:", subscription.subscriptionBranches.toString()),
14.height,
Row(
crossAxisAlignment: CrossAxisAlignment.center,
@ -80,7 +82,7 @@ class AllSubscriptionsCard extends StatelessWidget {
children: [
subscription.price.toString().toText(fontSize: 29, isBold: true, color: textColor, letterSpacing: -1.77, height: 1),
2.width,
"${subscription.currency ?? ""}/Month".toText(color: MyColors.lightTextColor, fontSize: 16, letterSpacing: -0.64).paddingOnly(bottom: 2),
"${subscription.currency ?? ""} for ${subscription.durationDays} ${LocaleKeys.daysVar.tr()}".toText(color: MyColors.lightTextColor, fontSize: 16, letterSpacing: -0.64).paddingOnly(bottom: 3),
],
),
),

@ -101,7 +101,7 @@ class MySubscriptionsCard extends StatelessWidget {
),
Row(
children: [
"${pvm.isExpired! ? "Expired" : "Expires"} on ${DateHelper.formatAsDayMonthYear(pvm.dateEnd)}".toText(fontSize: 14, letterSpacing: -0.56, color: textColor, fontWeight: MyFonts.Medium),
"${pvm.isExpired! ? "Expired" : "Expires"} on ${DateHelper.formatAsDayMonthYear(DateHelper.parseStringToDate(DateHelper.formatDateT(pvm.dateEnd ?? "")))}".toText(fontSize: 14, letterSpacing: -0.56, color: textColor, fontWeight: MyFonts.Medium),
if (pvm.isRenewable!)
Row(
children: [

@ -55,7 +55,7 @@ dev_dependencies:
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^2.0.0
flutter_lints: ^4.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec

Loading…
Cancel
Save