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 { android {
compileSdkVersion 34 compileSdkVersion 34
namespace = "com.cloud.solutions.mowater.ksa.provider"
compileOptions { compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
} }
@ -49,6 +51,8 @@ android {
targetSdkVersion 33 targetSdkVersion 33
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
multiDexEnabled true
} }
buildTypes { buildTypes {
@ -67,5 +71,7 @@ flutter {
dependencies { dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation platform('com.google.firebase:firebase-bom:33.1.2') 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' // 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 { buildscript {
ext.kotlin_version = '1.8.0' ext.kotlin_version = '1.8.0'
repositories { repositories {
@ -6,7 +39,7 @@ buildscript {
} }
dependencies { 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 "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.4.2' classpath 'com.google.gms:google-services:4.4.2'
} }
@ -18,6 +51,18 @@ allprojects {
google() google()
mavenCentral() mavenCentral()
} }
subprojects {
afterEvaluate { project ->
if (project.hasProperty('android')) {
project.android {
if (namespace == null) {
namespace project.group
}
}
}
}
}
} }
rootProject.buildDir = '../build' rootProject.buildDir = '../build'

@ -1,5 +1,6 @@
#Mon Nov 04 14:28:07 AST 2024
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists 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 zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists 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") includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
def properties = new Properties()
assert localPropertiesFile.exists() repositories {
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } google()
mavenCentral()
gradlePluginPortal()
}
}
def flutterSdkPath = properties.getProperty("flutter.sdk") plugins {
assert flutterSdkPath != null, "flutter.sdk not set in local.properties" id "dev.flutter.flutter-plugin-loader" version "1.0.0"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 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:flutter/material.dart';
import 'package:mc_common_app/models/appointments_models/appointment_list_model.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/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/utils/enums.dart';
class ProviderAppRoutes { 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 = { static final Map<String, WidgetBuilder> routes = {
//Home page //Home page
AppRoutes.dashboard: (context) => const DashboardView(), AppRoutes.dashboard: (context) => DashboardView(dashboardRouteEnum: (ModalRoute.of(context)!.settings.arguments ?? DashboardRouteEnum.none) as DashboardRouteEnum),
// defineLicense: (context) => DefineLicensePage(), // defineLicense: (context) => DefineLicensePage(),
dealershipSetting: (context) => const DealershipView(), AppRoutes.dealershipSetting: (context) => const DealershipView(),
// branchList: (context) => BranchListPage(), // branchList: (context) => BranchListPage(),
defineBranch: (context) => DefineBranchView((ModalRoute.of(context)!.settings.arguments) == null ? null : (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)),
branchDetail: (context) => BranchDetailPage(ModalRoute.of(context)!.settings.arguments as BranchDetailModel), AppRoutes.branchDetail: (context) => BranchDetailPage(ModalRoute.of(context)!.settings.arguments as BranchDetailModel),
//Appointments //Appointments
appointment: (context) => AppointmentPage(branch: ModalRoute.of(context)!.settings.arguments as BranchDetailModel), AppRoutes.appointment: (context) => AppointmentPage(branch: ModalRoute.of(context)!.settings.arguments as BranchDetailModel),
appointmentDetailList: (context) => const AppointmentDetailListPage(), AppRoutes.appointmentDetailList: (context) => const AppointmentDetailListPage(),
updateAppointmentPage: (context) => UpdateAppointmentPage(), AppRoutes.updateAppointmentPage: (context) => UpdateAppointmentPage(),
addServiceInAppointment: (context) => AddNewServiceAppointmentPage(ModalRoute.of(context)!.settings.arguments as AppointmentListModel), AppRoutes.addServiceInAppointment: (context) => AddNewServiceAppointmentPage(ModalRoute.of(context)!.settings.arguments as AppointmentListModel),
mergeAppointments: (context) => const MergeAppointmentListPage(), AppRoutes.mergeAppointments: (context) => const MergeAppointmentListPage(),
//Subscriptions //Subscriptions
mySubscriptionsPage: (context) => const MySubscriptionsPage(), AppRoutes.mySubscriptionsPage: (context) => const MySubscriptionsPage(),
subscriptionsPage: (context) => const SubscriptionsPage(), AppRoutes.subscriptionsPage: (context) => const SubscriptionsPage(),
//Services //Services
dealerUser: (context) => DealerUserPage(ModalRoute.of(context)!.settings.arguments as String), AppRoutes.dealerUser: (context) => DealerUserPage(ModalRoute.of(context)!.settings.arguments as String),
servicesList: (context) => const ServicesListPage(), AppRoutes.servicesList: (context) => const ServicesListPage(),
itemsList: (context) => ItemsListPage(), AppRoutes.itemsList: (context) => ItemsListPage(),
createItem: (context) => const CreateItemPage(), AppRoutes.createItem: (context) => const CreateItemPage(),
//createServices: (context) => CreateServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as ServiceProviderBranch)), //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)), //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 //Schedules
schedulesList: (context) => SchedulesListPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as String)), AppRoutes.schedulesList: (context) => SchedulesListPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as String)),
addSchedule: (context) => const AddSchedulesPage(), AppRoutes.addSchedule: (context) => const AddSchedulesPage(),
//Branch Duplication //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 'dart:io';
import 'package:car_provider_app/config/provider_dependencies.dart'; import 'package:car_provider_app/config/provider_dependencies.dart';
import 'package:mc_common_app/repositories/items_repo.dart'; import 'package:mc_common_app/repositories/items_repo.dart';
import 'package:mc_common_app/repositories/schedule_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/items_view_model.dart';
import 'package:car_provider_app/view_models/schedule_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/setting_options_repo.dart';
import 'package:mc_common_app/repositories/shipping_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/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:mc_common_app/view_models/service_view_model.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -61,15 +61,17 @@ Future<void> main() async {
await Firebase.initializeApp(); await Firebase.initializeApp();
} }
ProviderAppDependencies.addDependencies(); ProviderAppDependencies.addDependencies();
injector.get<FirebaseMessagingService>().initializeNotifications(); injector.get<FirebaseMessagingService>().initializeNotifications().whenComplete(() {
injector.get<Location>().handleLocationPermission();
});
ProviderAppRoutes.routes.addAll(AppRoutes.routes); ProviderAppRoutes.routes.addAll(AppRoutes.routes);
runApp(MultiProvider( runApp(MultiProvider(
providers: [ providers: [
ChangeNotifierProvider<BaseVM>( ChangeNotifierProvider<BaseVM>(
create: (_) => BaseVM(), create: (_) => BaseVM(),
), ),
ChangeNotifierProvider<DashboardVM>( ChangeNotifierProvider<DashboardVMProvider>(
create: (_) => DashboardVM( create: (_) => DashboardVMProvider(
userRepo: injector.get<UserRepo>(), userRepo: injector.get<UserRepo>(),
commonServices: injector.get<CommonAppServices>(), commonServices: injector.get<CommonAppServices>(),
), ),

@ -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); setState(ViewState.idle);
} }
String currentSelectedBranchName = "";
Future<GenericRespModel> setScheduleInactive(int scheduleId, int branchId) async { Future<GenericRespModel> setScheduleInactive(int scheduleId, int branchId) async {
GenericRespModel val = await scheduleRepo.setScheduleInActive(scheduleId, branchId); GenericRespModel val = await scheduleRepo.setScheduleInActive(scheduleId, branchId);
if (val.messageStatus == 1) { if (val.messageStatus == 1) {

@ -80,7 +80,7 @@ class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentP
), ),
12.height, 12.height,
Consumer<ServiceVM>( Consumer<ServiceVM>(
builder: (context, model, _) { builder: (context, serviceVm, _) {
return Column( return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
@ -95,27 +95,27 @@ class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentP
Column( Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
model.categoryDropList.isNotEmpty serviceVm.categoryDropList.isNotEmpty
? DropdownField( ? DropdownField(
(DropValue value) async { (DropValue value) async {
category = value; category = value;
service = null; service = null;
model.fetchProviderServices(widget.appointmentListModel.branchId.toString(), value.id.toString()); serviceVm.fetchProviderServices(widget.appointmentListModel.branchId.toString(), value.id.toString());
}, },
dropdownValue: category, dropdownValue: category,
list: model.categoryDropList, list: serviceVm.categoryDropList,
hint: LocaleKeys.selectServiceCategory.tr(), hint: LocaleKeys.selectServiceCategory.tr(),
) )
: const Center( : const Center(
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
), ),
12.height, 12.height,
model.servicesDropList.isNotEmpty serviceVm.servicesDropList.isNotEmpty
? DropdownField( ? DropdownField(
(DropValue value) { (DropValue value) {
service = value; service = value;
pickedItems = null; pickedItems = null;
model.setState(ViewState.idle); serviceVm.setState(ViewState.idle);
showMyBottomSheet( showMyBottomSheet(
context, context,
child: SelectItemsSheet( child: SelectItemsSheet(
@ -129,18 +129,18 @@ class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentP
PickerItem(id: element.id ?? 0, title: element.name ?? ""), PickerItem(id: element.id ?? 0, title: element.name ?? ""),
); );
} }
model.notifyListeners(); serviceVm.notifyListeners();
}, },
), ),
); );
}, },
dropdownValue: service, dropdownValue: service,
list: model.servicesDropList, list: serviceVm.servicesDropList,
hint: LocaleKeys.defineServices.tr(), hint: LocaleKeys.defineServices.tr(),
) )
: category == null : category == null
? Container() ? Container()
: model.services != null && model.servicesDropList.isEmpty : serviceVm.services != null && serviceVm.servicesDropList.isEmpty
? Text(LocaleKeys.noServiceFound.tr()) ? Text(LocaleKeys.noServiceFound.tr())
: const CircularProgressIndicator(), : const CircularProgressIndicator(),
12.height, 12.height,
@ -161,7 +161,7 @@ class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentP
PickerItem(id: element.id ?? 0, title: element.name ?? ""), 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/config/provider_routes.dart';
import 'package:car_provider_app/views/dashboard/widget/general_appointment_widget.dart'; import 'package:car_provider_app/views/dashboard/widget/general_appointment_widget.dart';
import 'package:flutter/material.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/extensions/int_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
@ -40,7 +41,7 @@ class AppointmentDetailListPage extends StatelessWidget {
onTap: () { onTap: () {
appointmentsVM.selectedAppointmentId = appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index].id ?? 0; appointmentsVM.selectedAppointmentId = appointmentsVM.myFilteredAppointments2[appointmentsVM.selectedAppointmentIndex].customerAppointmentList![index].id ?? 0;
appointmentsVM.selectedAppointmentSubIndex = index; 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, maxWidth: double.infinity,
margin: const EdgeInsets.all(21), margin: const EdgeInsets.all(21),
onPressed: () { onPressed: () {
navigateWithName(context, ProviderAppRoutes.mergeAppointments); navigateWithName(context, AppRoutes.mergeAppointments);
}, },
) )
: const SizedBox(), : 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:car_provider_app/views/dashboard/widget/general_appointment_widget.dart';
import 'package:mc_common_app/classes/app_state.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/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/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.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/models/provider_branches_models/branch_detail_model.dart';
@ -113,7 +114,7 @@ class _AppointmentPageState extends State<AppointmentPage> {
context.read<AppointmentsVM>().selectedAppointmentIndex = index; context.read<AppointmentsVM>().selectedAppointmentIndex = index;
navigateWithName( navigateWithName(
context, context,
ProviderAppRoutes.appointmentDetailList, AppRoutes.appointmentDetailList,
// arguments: appointmentsVM // arguments: appointmentsVM
// .myFilteredAppointments2[index] // .myFilteredAppointments2[index]
// .customerAppointmentList, // .customerAppointmentList,

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

@ -1,13 +1,13 @@
import 'package:car_provider_app/config/provider_routes.dart'; import 'package:car_provider_app/config/provider_routes.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/generated/locale_keys.g.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.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:flutter_svg/flutter_svg.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
@ -85,7 +85,7 @@ class AppointmentDetailListWidget extends StatelessWidget {
width: double.infinity, width: double.infinity,
allPading: 12, allPading: 12,
onTap: () { 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 child: itemsVM.serviceItems?.data == null
? const Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())
: itemsVM.serviceItems?.data!.length == 0 : itemsVM.serviceItems?.data!.length == 0
? Center(child: EmptyWidget(text: LocaleKeys.noItemstoShow.tr())) ? Center(child: EmptyWidget(text: LocaleKeys.noItemsToShow.tr()))
: ListView.separated( : ListView.separated(
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return CheckboxListTile( return CheckboxListTile(

@ -1,42 +1,58 @@
import 'dart:async'; 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: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:car_provider_app/views/branch_management/services/services_list_page.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.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/bottom_sheet.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.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/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/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/row_with_arrow.dart'; import 'package:mc_common_app/widgets/row_with_arrow.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class BranchDetailPage extends StatelessWidget { class BranchDetailPage extends StatefulWidget {
final BranchDetailModel branchData; final BranchDetailModel branchData;
const BranchDetailPage(this.branchData, {super.key}); const BranchDetailPage(this.branchData, {super.key});
getBranchUsers(BuildContext context) { @override
scheduleMicrotask(() { State<BranchDetailPage> createState() => _BranchDetailPageState();
if (context.read<ServiceVM>().allProviderDealersList.isNotEmpty) { }
context.read<ServiceVM>().getAllProviderDealers(
{"ServiceProviderBranchID": branchData.id.toString(), "ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}, class _BranchDetailPageState extends State<BranchDetailPage> {
); @override
void initState() {
onInitState();
super.initState();
} }
context.read<ServiceVM>().filterUserBranchCategories(); onInitState() async {
ServiceVM serviceVM = context.read<ServiceVM>();
scheduleMicrotask(() async {
await serviceVM.getAllProviderDealers(
{
"ServiceProviderBranchID": widget.branchData.id.toString(),
"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? "",
},
);
serviceVM.filterUserBranchCategories();
}); });
} }
@ -82,7 +98,7 @@ class BranchDetailPage extends StatelessWidget {
Widget buildFooterActionWidget(BuildContext context) { Widget buildFooterActionWidget(BuildContext context) {
Widget actionWidget = const SizedBox(); 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( actionWidget = ShowFillButton(
title: LocaleKeys.assignDealerUser.tr(), title: LocaleKeys.assignDealerUser.tr(),
maxWidth: double.infinity, maxWidth: double.infinity,
@ -95,19 +111,19 @@ class BranchDetailPage extends StatelessWidget {
showMyBottomSheet( showMyBottomSheet(
context, context,
child: AssignDealerUserSheet( child: AssignDealerUserSheet(
branchId: branchData.id.toString(), branchId: widget.branchData.id.toString(),
callBackFunc: () { callBackFunc: () {
getBranchUsers(context); onInitState();
}, },
), ),
); );
}, },
); );
} else if (branchData.branchStatus == BranchStatusEnum.pending) { } else if (widget.branchData.branchStatus == BranchStatusEnum.pending) {
actionWidget = pendingApprovalAction(pendingText: "Approval Pending"); actionWidget = pendingApprovalAction(pendingText: "Approval Pending");
} else if (branchData.branchStatus == BranchStatusEnum.deactivated) { } else if (widget.branchData.branchStatus == BranchStatusEnum.deactivated) {
actionWidget = pendingApprovalAction(pendingText: "Activate Now"); actionWidget = pendingApprovalAction(pendingText: "Activate Now");
} else if (branchData.branchStatus == BranchStatusEnum.rejected) { } else if (widget.branchData.branchStatus == BranchStatusEnum.rejected) {
actionWidget = Column( actionWidget = Column(
children: [ children: [
Row( Row(
@ -117,9 +133,9 @@ class BranchDetailPage extends StatelessWidget {
), ),
Row( Row(
children: [ children: [
if (branchData.branchAuditTrial != null && branchData.branchAuditTrial!.isNotEmpty) ...[ if (widget.branchData.branchAuditTrial != null && widget.branchData.branchAuditTrial!.isNotEmpty) ...[
Flexible( Flexible(
child: ("${branchData.branchAuditTrial!.first.comment}").toText( child: ("${widget.branchData.branchAuditTrial!.first.comment}").toText(
fontSize: 14, fontSize: 14,
color: MyColors.primaryColor, color: MyColors.primaryColor,
isItalic: true, isItalic: true,
@ -129,15 +145,7 @@ class BranchDetailPage extends StatelessWidget {
], ],
), ),
12.height, 12.height,
ShowFillButton( Utils.buildStatusContainer(LocaleKeys.rejectedFormAdmin.tr(), marginAll: 0, fontSize: 16),
title: LocaleKeys.rejectedFormAdmin.tr(),
maxWidth: double.infinity,
backgroundColor: MyColors.darkWhiteColor,
borderColor: MyColors.darkPrimaryColor,
txtColor: MyColors.lightTextColor,
isFilled: true,
onPressed: () {},
),
], ],
); );
} }
@ -203,13 +211,14 @@ class BranchDetailPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
getBranchUsers(context);
return Scaffold( return Scaffold(
appBar: CustomAppBar(title: LocaleKeys.branchDetail.tr()), appBar: CustomAppBar(title: LocaleKeys.branchDetail.tr()),
body: Consumer<ServiceVM>(builder: (context, serviceVM, _) { body: Consumer<ServiceVM>(builder: (context, serviceVM, _) {
return SizedBox( return SizedBox(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: RefreshIndicator(
onRefresh: () async => await onInitState(),
child: Column( child: Column(
children: [ children: [
Expanded( Expanded(
@ -224,34 +233,34 @@ class BranchDetailPage extends StatelessWidget {
Expanded( Expanded(
child: Row( child: Row(
children: [ children: [
branchData.branchProfileImage.buildNetworkImage(height: 66, width: 53, fit: BoxFit.cover), widget.branchData.branchProfileImage.buildNetworkImage(height: 66, width: 53, fit: BoxFit.cover),
11.width, 11.width,
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
(branchData.branchName!).toText(fontSize: 16, color: MyColors.darkTextColor), (widget.branchData.branchName!).toText(fontSize: 16, color: MyColors.darkTextColor),
showData("", branchData.branchDescription.toString()), showData("", widget.branchData.branchDescription.toString()),
], ],
), ),
), ),
], ],
), ),
), ),
if (branchData.branchStatus != BranchStatusEnum.pending) ...[ if (widget.branchData.branchStatus != BranchStatusEnum.pending) ...[
SvgPicture.asset(MyAssets.icEdit).onPress(() { SvgPicture.asset(MyAssets.icEdit).onPress(() {
navigateWithName(context, ProviderAppRoutes.defineBranch, arguments: branchData); navigateWithName(context, AppRoutes.defineBranch, arguments: widget.branchData);
}), }),
], ],
], ],
), ),
Column( Column(
children: [ children: [
showData("${LocaleKeys.location.tr()}:", "${branchData.cityName.toString()}, ${branchData.countryName.toString()}"), showData("${LocaleKeys.location.tr()}:", "${widget.branchData.cityName.toString()}, ${widget.branchData.countryName.toString()}"),
showData("${LocaleKeys.provider.tr()}:", branchData.serviceProviderName.toString()), showData("${LocaleKeys.provider.tr()}:", widget.branchData.serviceProviderName.toString()),
showData("${LocaleKeys.time.tr()}:", "${branchData.openTime.toString()} - ${branchData.closeTime.toString()}"), showData("${LocaleKeys.time.tr()}:", "${widget.branchData.openTime.toString()} - ${widget.branchData.closeTime.toString()}"),
showData("${LocaleKeys.address.tr()}:", branchData.address.toString()), showData("${LocaleKeys.address.tr()}:", widget.branchData.address.toString()),
], ],
).paddingOnly(left: 65), ).paddingOnly(left: 65),
], ],
@ -286,60 +295,79 @@ class BranchDetailPage extends StatelessWidget {
) )
.margin(right: 5), .margin(right: 5),
).onPress(() { ).onPress(() {
if (branchData.branchStatus == BranchStatusEnum.pending || branchData.branchStatus == BranchStatusEnum.rejected) { if (widget.branchData.branchStatus == BranchStatusEnum.pending || widget.branchData.branchStatus == BranchStatusEnum.rejected) {
Utils.showToast("Please wait for the branch verification."); Utils.showToast("Please wait for the branch verification.");
return; return;
} }
navigateWithName(context, ProviderAppRoutes.schedulesList, arguments: branchData.id.toString()); context.read<ScheduleVM>().currentSelectedBranchName = widget.branchData.branchName.toString();
navigateWithName(context, AppRoutes.schedulesList, arguments: widget.branchData.id.toString());
}), }),
Row( 10.height,
crossAxisAlignment: CrossAxisAlignment.center, CustomAddButton(
mainAxisAlignment: MainAxisAlignment.center, needsBorder: true,
children: [ bgColor: MyColors.white,
const Icon( onTap: () {
Icons.add, if (widget.branchData.branchStatus == BranchStatusEnum.pending || widget.branchData.branchStatus == BranchStatusEnum.rejected) {
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 (branchData.branchStatus == BranchStatusEnum.pending || branchData.branchStatus == BranchStatusEnum.rejected) {
Utils.showToast("Please wait for the branch verification."); Utils.showToast("Please wait for the branch verification.");
return; return;
} }
navigateWithName( navigateWithName(
context, context,
ProviderAppRoutes.createServices3, AppRoutes.createServices3,
arguments: CreateBranchModel( arguments: CreateBranchModel(
branchId: branchData.id.toString(), branchId: widget.branchData.id.toString(),
branchName: branchData.branchName.toString(), branchName: widget.branchData.branchName.toString(),
isForEdit: false, 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(),
),
] else ...[
ListView.separated( ListView.separated(
itemBuilder: (context, pIndex) { itemBuilder: (context, pIndex) {
return buildServiceTileWidget(pIndex, serviceVM).onPress(() { return buildServiceTileWidget(pIndex, serviceVM).onPress(() {
serviceVM.categories[pIndex].branchId = branchData.id.toString(); serviceVM.categories[pIndex].branchId = widget.branchData.id.toString();
serviceVM.categories[pIndex].branchName = branchData.branchName.toString(); serviceVM.categories[pIndex].branchName = widget.branchData.branchName.toString();
navigateWithName(context, ProviderAppRoutes.servicesList, arguments: serviceVM.categories[pIndex]); navigateWithName(context, AppRoutes.servicesList, arguments: serviceVM.categories[pIndex]);
}); });
}, },
itemCount: serviceVM.categories.length, itemCount: serviceVM.categories.length,
@ -350,6 +378,7 @@ class BranchDetailPage extends StatelessWidget {
return 12.height; return 12.height;
}, },
), ),
],
12.height, 12.height,
], ],
), ),
@ -363,6 +392,7 @@ class BranchDetailPage extends StatelessWidget {
buildFooterActionWidget(context), 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:flutter/gestures.dart';
import 'package:mc_common_app/classes/consts.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/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.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:mc_common_app/view_models/service_view_model.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
@ -66,7 +65,9 @@ class BranchListPage extends StatelessWidget {
title: LocaleKeys.myBranches.tr(), title: LocaleKeys.myBranches.tr(),
isRemoveBackButton: true, isRemoveBackButton: true,
), ),
body: SizedBox( body: RefreshIndicator(
onRefresh: () async => await context.read<ServiceVM>().getBranchAndServices(),
child: SizedBox(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: Column( child: Column(
@ -102,9 +103,7 @@ class BranchListPage extends StatelessWidget {
} }
} }
return RefreshIndicator( return branches.isEmpty
onRefresh: () async => await context.read<ServiceVM>().getBranchAndServices(),
child: branches.isEmpty
? Center(child: LocaleKeys.no_branch.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium)) ? Center(child: LocaleKeys.no_branch.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium))
: ListView.separated( : ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
@ -183,14 +182,14 @@ class BranchListPage extends StatelessWidget {
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12)).onPress(() async { ).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12)).onPress(() async {
branchModel.countryID = serviceVM.branches!.data!.countryID; branchModel.countryID = serviceVM.branches!.data!.countryID;
branchModel.countryName = serviceVM.branches!.data!.countryName; 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, separatorBuilder: (context, index) => 12.height,
itemCount: branches.length, itemCount: branches.length,
).paddingAll(21), ).paddingAll(21);
);
} }
}, },
), ),
@ -198,6 +197,7 @@ class BranchListPage extends StatelessWidget {
], ],
), ),
), ),
),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
backgroundColor: MyColors.darkPrimaryColor, backgroundColor: MyColors.darkPrimaryColor,
child: const Icon( child: const Icon(
@ -205,7 +205,7 @@ class BranchListPage extends StatelessWidget {
color: Colors.white, color: Colors.white,
), ),
onPressed: () { 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:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:mc_common_app/classes/consts.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/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
@ -35,7 +35,7 @@ class DealershipView extends StatelessWidget {
), ),
title: LocaleKeys.defineBranches.tr().toText(fontSize: 12), title: LocaleKeys.defineBranches.tr().toText(fontSize: 12),
onTap: () { onTap: () {
navigateWithName(context, ProviderAppRoutes.branchList); navigateWithName(context, AppRoutes.branchList);
}, },
), ),
ListTile( ListTile(
@ -45,7 +45,7 @@ class DealershipView extends StatelessWidget {
), ),
title: LocaleKeys.defineServices.tr().toText(fontSize: 12), title: LocaleKeys.defineServices.tr().toText(fontSize: 12),
onTap: () { onTap: () {
navigateWithName(context, ProviderAppRoutes.createServices2); navigateWithName(context, AppRoutes.createServices2);
}, },
), ),
ListTile( ListTile(

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

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

@ -1,5 +1,4 @@
import 'dart:async'; import 'dart:async';
import 'package:car_provider_app/view_models/schedule_view_model.dart'; 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/chips_picker_item.dart';
import 'package:car_provider_app/views/branch_management/schedule/widgets/select_days_sheet.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/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/appointments_models/schedule_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/theme/colors.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/utils/utils.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.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/app_bar.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:mc_common_app/widgets/bottom_sheet.dart'; import 'package:mc_common_app/widgets/bottom_sheet.dart';
@ -30,7 +29,7 @@ class AddSchedulesPage extends StatefulWidget {
} }
class _AddSchedulesPageState extends State<AddSchedulesPage> { class _AddSchedulesPageState extends State<AddSchedulesPage> {
late ScheduleVM mModel; late ScheduleVM schedulevm;
String name = "", startDate = "", endDate = "", startTime = "", endTime = "", slotsTime = "", appointmentPerSlot = "", servicesGroupID = ""; 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()); endDate = DateHelper.formatAsYearMonthDay(scheduleData.toDate ?? DateTime.now());
startTime = scheduleData.startTime ?? ""; startTime = scheduleData.startTime ?? "";
endTime = scheduleData.endTime ?? ""; 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(); appointmentPerSlot = scheduleData.perSlotAppointment.toString();
// mModel.selectedServicesItems.clear(); // mModel.selectedServicesItems.clear();
scheduleData.scheduleServices?.forEach((element) { scheduleData.scheduleServices?.forEach((element) {
print("Services Elements"); schedulevm.selectedServicesItems.add(PickerItem(id: element.serviceProviderServiceId ?? 0, title: element.serviceDescription ?? ""));
print(element);
mModel.selectedServicesItems.add(PickerItem(id: element.serviceProviderServiceId ?? 0, title: element.serviceDescription ?? ""));
}); });
logger.d(mModel.selectedServicesItems.first.id); schedulevm.selectedDaysItems.clear();
mModel.selectedDaysItems.clear();
scheduleData.weeklyOffDays?.forEach((element) { scheduleData.weeklyOffDays?.forEach((element) {
for (var daysElement in initDaysList) { for (var daysElement in initDaysList) {
if (element.dayNumber == daysElement.id) { if (element.dayNumber == daysElement.id) {
daysElement.isSelected = true; 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 @override
void initState() { void initState() {
super.initState(); super.initState();
scheduleMicrotask(() { scheduleMicrotask(() {
mModel = context.read<ScheduleVM>(); schedulevm = context.read<ScheduleVM>();
scheduleData = ModalRoute.of(context)!.settings.arguments as ScheduleData; scheduleData = ModalRoute.of(context)!.settings.arguments as ScheduleData;
mModel.getAllServices(scheduleData.branchId, scheduleData); schedulevm.getAllServices(scheduleData.branchId, scheduleData);
mModel.selectedServicesItems = []; schedulevm.selectedServicesItems = [];
mModel.selectedDaysItems = []; schedulevm.selectedDaysItems = [];
if (scheduleData.id != null) { if (scheduleData.id != null) {
setEditData(); setEditData();
} }
@ -81,13 +115,11 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: const CustomAppBar( appBar: CustomAppBar(title: LocaleKeys.createGroupServices.tr()),
title: "Create Schedules",
),
body: SizedBox( body: SizedBox(
width: double.infinity, width: double.infinity,
child: Consumer<ScheduleVM>( child: Consumer<ScheduleVM>(
builder: (_, ScheduleVM model, child) { builder: (_, ScheduleVM scheduleVM, child) {
return Column( return Column(
children: [ children: [
Expanded( Expanded(
@ -95,6 +127,16 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
padding: const EdgeInsets.all(20), padding: const EdgeInsets.all(20),
child: Column( child: Column(
children: [ children: [
if (scheduleVM.currentSelectedBranchName.isNotEmpty) ...[
TxtField(
isBackgroundEnabled: true,
isNeedClickAll: true,
hint: '',
value: scheduleVM.currentSelectedBranchName,
onTap: () {},
),
8.height,
],
TxtField( TxtField(
hint: LocaleKeys.nameofSchedule.tr(), hint: LocaleKeys.nameofSchedule.tr(),
value: name, value: name,
@ -105,13 +147,13 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
8.height, 8.height,
ChipsPickerItem( ChipsPickerItem(
hint: LocaleKeys.select_Services.tr(), hint: LocaleKeys.select_Services.tr(),
itemsList: [...model.selectedServicesItems], itemsList: [...scheduleVM.selectedServicesItems],
onClick: () { onClick: () {
showMyBottomSheet( showMyBottomSheet(
context, context,
child: SelectServicesSheet( child: SelectServicesSheet(
onSelectServices: () { onSelectServices: () {
model.filterSelectedServices(); scheduleVM.filterSelectedServices();
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
}, },
), ),
@ -133,7 +175,7 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
firstDate: DateTime.now(), firstDate: DateTime.now(),
); );
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
model.refresh(); scheduleVM.refresh();
}, },
), ),
8.height, 8.height,
@ -151,19 +193,19 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
firstDate: DateTime.now(), firstDate: DateTime.now(),
); );
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
model.refresh(); scheduleVM.refresh();
}, },
), ),
8.height, 8.height,
ChipsPickerItem( ChipsPickerItem(
hint: LocaleKeys.offDays.tr(), hint: LocaleKeys.offDays.tr(),
itemsList: [...model.selectedDaysItems], itemsList: [...scheduleVM.selectedDaysItems],
onClick: () { onClick: () {
showMyBottomSheet( showMyBottomSheet(
context, context,
child: SelectDaysSheet( child: SelectDaysSheet(
onSelected: (List<PickerItem> picked) { onSelected: (List<PickerItem> picked) {
model.filterDays(picked); scheduleVM.filterDays(picked);
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
}, },
), ),
@ -185,7 +227,7 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
onTap: () async { onTap: () async {
startTime = await Utils.pickTime(context); startTime = await Utils.pickTime(context);
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
model.refresh(); scheduleVM.refresh();
}, },
), ),
), ),
@ -207,27 +249,25 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
initialTime: _startTime, initialTime: _startTime,
); );
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
model.refresh(); scheduleVM.refresh();
}, },
), ),
), ),
], ],
), ),
8.height, 8.height,
TxtField( 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(), hint: LocaleKeys.slotsTime.tr(),
postfixWidget: Row( errorValue: '',
mainAxisSize: MainAxisSize.min, );
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
"Min".toText(color: MyColors.lightTextColor),
],
),
keyboardType: TextInputType.number,
value: slotsTime,
onChanged: (v) {
slotsTime = v;
}, },
), ),
8.height, 8.height,
@ -239,6 +279,20 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
appointmentPerSlot = v; 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, maxWidth: double.infinity,
margin: const EdgeInsets.all(20), margin: const EdgeInsets.all(20),
onPressed: () { onPressed: () {
if (validation(model)) { if (validation(scheduleVM)) {
if (scheduleData.id != null) { if (scheduleData.id != null) {
updateSchedule(context, model); updateSchedule(context, scheduleVM);
} else { } else {
createSchedule(context, model); createSchedule(context, scheduleVM);
} }
} }
}, },
@ -298,9 +352,9 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
return valid; return valid;
} }
createSchedule(BuildContext context, ScheduleVM model) async { createSchedule(BuildContext context, ScheduleVM scheduleVM) async {
List<int> days = []; List<int> days = [];
for (var element in model.selectedDaysItems) { for (var element in scheduleVM.selectedDaysItems) {
days.add(element.id); days.add(element.id);
} }
@ -312,19 +366,19 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
"toDate": endDate, "toDate": endDate,
"startTime": startTime, "startTime": startTime,
"endTime": endTime, "endTime": endTime,
"slotDurationMinute": slotsTime, "slotDurationMinute": slotsTime.replaceFirst(' Minutes', ''),
"perSlotAppointment": appointmentPerSlot, "perSlotAppointment": appointmentPerSlot,
"deliveryServiceType": 1, "deliveryServiceType": 1,
"appointmentType": 1, "appointmentType": selectedScheduleLocationDrop.id,
"weeklyOffDays": days "weeklyOffDays": days
}; };
Utils.showLoading(context); Utils.showLoading(context);
GenericRespModel scheduleResponse = await model.createSchedule(map); GenericRespModel scheduleResponse = await scheduleVM.createSchedule(map);
if (scheduleResponse.messageStatus == 1) { if (scheduleResponse.messageStatus == 1) {
List<int> services = []; List<int> services = [];
for (var element in model.selectedServicesItems) { for (var element in scheduleVM.selectedServicesItems) {
services.add(element.id); services.add(element.id);
} }
var map1 = { var map1 = {
@ -333,7 +387,7 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
"serviceGroupDescription": "string", "serviceGroupDescription": "string",
}; };
GenericRespModel servicesResponse = await model.addServicesInSchedule(map1); GenericRespModel servicesResponse = await scheduleVM.addServicesInSchedule(map1);
Utils.hideLoading(context); Utils.hideLoading(context);
if (servicesResponse.messageStatus == 1) { if (servicesResponse.messageStatus == 1) {
Utils.showToast("Successfully schedule created"); Utils.showToast("Successfully schedule created");
@ -363,11 +417,11 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
"toDate": endDate, "toDate": endDate,
"startTime": startTime, "startTime": startTime,
"endTime": endTime, "endTime": endTime,
"slotDurationMinute": slotsTime, "slotDurationMinute": slotsTime.replaceFirst(' Minutes', ''),
"perSlotAppointment": appointmentPerSlot, "perSlotAppointment": appointmentPerSlot,
"deliveryServiceType": 1, "deliveryServiceType": 1,
"weeklyOffDays": days, "weeklyOffDays": days,
"appointmentType": scheduleData.appointmentType "appointmentType": selectedScheduleLocationDrop.id,
}; };
Utils.showLoading(context); 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:car_provider_app/view_models/schedule_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/generated/locale_keys.g.dart';
@ -93,7 +93,7 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
: scheduleVM.schedule!.data!.isEmpty : scheduleVM.schedule!.data!.isEmpty
? EmptyWidget( ? EmptyWidget(
text: LocaleKeys.noSchedulesFound.tr(), text: LocaleKeys.noSchedulesFound.tr(),
) ).paddingAll(21)
: ListView.separated( : ListView.separated(
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return Column( return Column(
@ -119,7 +119,7 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
), ),
).onPress(() { ).onPress(() {
scheduleVM.schedule!.data![index].branchId = widget.branchId ?? ""; 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.shiftEndTime.tr()}:", scheduleVM.schedule!.data![index].endTime ?? ""),
showItem("${LocaleKeys.slotsTime.tr()}:", "${scheduleVM.schedule!.data![index].slotDurationMinute} Mins"), showItem("${LocaleKeys.slotsTime.tr()}:", "${scheduleVM.schedule!.data![index].slotDurationMinute} Mins"),
showItem("${LocaleKeys.appointmentPerSlot.tr()}:", scheduleVM.schedule!.data![index].perSlotAppointment.toString()), 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])), showItem("${LocaleKeys.offDays.tr()}:", offDays(scheduleVM.schedule!.data![index])),
12.height, 12.height,
"${LocaleKeys.services.tr()}:".toText(fontSize: 12, color: MyColors.lightTextColor), "${LocaleKeys.services.tr()}:".toText(fontSize: 12, color: MyColors.lightTextColor),
@ -160,7 +161,7 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
maxWidth: double.infinity, maxWidth: double.infinity,
margin: const EdgeInsets.all(20), margin: const EdgeInsets.all(20),
onPressed: () { 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) { Widget build(BuildContext context) {
return Row( return Row(
children: [ 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) if (itemsList.isNotEmpty)
Expanded( Expanded(
child: ListView( 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:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.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:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -39,7 +40,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
bool isHomeAppointmentAvailable = false; bool isHomeAppointmentAvailable = false;
int serviceRage = 0; int serviceRage = 0;
String chargersPerKm = ""; String chargersPerKm = "";
int? categoryId; int? categoryId = -1;
int? serviceId = -1; int? serviceId = -1;
DropValue? category; DropValue? category;
DropValue? service; DropValue? service;
@ -70,6 +71,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
log("categoryId: ${categoryId}");
return Scaffold( return Scaffold(
appBar: CustomAppBar(title: LocaleKeys.editServices.tr()), appBar: CustomAppBar(title: LocaleKeys.editServices.tr()),
body: SizedBox( body: SizedBox(
@ -85,8 +87,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
padding: const EdgeInsets.all(20.0), padding: const EdgeInsets.all(20.0),
child: Column( child: Column(
children: [ children: [
(model.state == ViewState.idle) DropdownField(
? DropdownField(
isSelectAble: !widget.branchModel!.isForEdit, isSelectAble: !widget.branchModel!.isForEdit,
(DropValue value) async { (DropValue value) async {
categoryId = value.id; categoryId = value.id;
@ -100,10 +101,10 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
dropdownValue: category, dropdownValue: category,
list: model.categoryDropList, list: model.categoryDropList,
hint: category != null ? category!.value : LocaleKeys.selectServiceCategory.tr(), hint: category != null ? category!.value : LocaleKeys.selectServiceCategory.tr(),
) ),
: const CircularProgressIndicator(),
12.height, 12.height,
model.servicesDropList.isNotEmpty (model.state == ViewState.idle)
? categoryId != -1 && model.servicesDropList.isNotEmpty
? DropdownField( ? DropdownField(
(DropValue value) { (DropValue value) {
service = value; service = value;
@ -116,7 +117,12 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
list: model.servicesDropList, list: model.servicesDropList,
hint: LocaleKeys.defineServices.tr(), hint: LocaleKeys.defineServices.tr(),
) )
: Container(), : categoryId == -1
? const SizedBox()
: model.state == ViewState.idle
? EmptyWidget(text: LocaleKeys.noServicesAvailable.tr())
: const SizedBox()
: const CircularProgressIndicator(),
12.height, 12.height,
if (serviceId != -1) ...[ if (serviceId != -1) ...[
Column( Column(
@ -281,7 +287,6 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
Utils.showLoading(context); Utils.showLoading(context);
GenericRespModel mResponse = await model.updateServices(map); GenericRespModel mResponse = await model.updateServices(map);
model.getBranchAndServices(); model.getBranchAndServices();
model.filterUserBranchCategories();
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.showToast(mResponse.message ?? ""); Utils.showToast(mResponse.message ?? "");
if (mResponse.messageStatus == 1) { if (mResponse.messageStatus == 1) {

@ -106,7 +106,7 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
value: model.matchedServices![index].isExpandedOrSelected, value: model.matchedServices![index].isExpandedOrSelected,
onChanged: (v) { onChanged: (v) {
if (model.matchedServices![index].serviceItems!.isEmpty) { if (model.matchedServices![index].serviceItems!.isEmpty) {
Utils.showToast(LocaleKeys.noItemstoShow.tr()); Utils.showToast(LocaleKeys.noItemsToShow.tr());
} else { } else {
model.matchedServices![index].isExpandedOrSelected = v ?? false; model.matchedServices![index].isExpandedOrSelected = v ?? false;
model.updateServiceItem(index, model.matchedServices![index].isExpandedOrSelected); 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:mc_common_app/view_models/service_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.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; // branches[index].countryName = model.branchs!.data!.countryName;
navigateWithName( navigateWithName(
context, context,
ProviderAppRoutes.matchServices, AppRoutes.matchServices,
arguments: MatchServicesArguments( arguments: MatchServicesArguments(
oldBranch: branches[index].id ?? 0, oldBranch: branches[index].id ?? 0,
oldBranchName: branches[index].branchName ?? "", 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:car_provider_app/view_models/items_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/generated/locale_keys.g.dart';
@ -42,7 +42,7 @@ class ItemsListPage extends StatelessWidget {
return model.state == ViewState.busy return model.state == ViewState.busy
? const Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())
: model.serviceItems!.data!.isEmpty : model.serviceItems!.data!.isEmpty
? EmptyWidget(text: LocaleKeys.noItemstoShow.tr(), isWrappedColumn: false) ? EmptyWidget(text: LocaleKeys.noItemsToShow.tr(), isWrappedColumn: false)
: ListView.separated( : ListView.separated(
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return SizedBox( return SizedBox(
@ -86,14 +86,11 @@ class ItemsListPage extends StatelessWidget {
), ),
).onPress(() { ).onPress(() {
model.serviceItems!.data![index].isUpdateOrSelected = true; 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( ).toWhiteContainer(width: double.infinity, allPading: 12);
width: double.infinity,
allPading: 12,
);
}, },
separatorBuilder: (BuildContext context, int index) { separatorBuilder: (BuildContext context, int index) {
return 12.height; return 12.height;
@ -111,7 +108,7 @@ class ItemsListPage extends StatelessWidget {
onPressed: () { onPressed: () {
navigateWithName( navigateWithName(
context, context,
ProviderAppRoutes.createItem, AppRoutes.createItem,
arguments: ItemData( arguments: ItemData(
serviceProviderServiceId: serviceProviderService!.serviceProviderServiceId, 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: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/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mc_common_app/classes/consts.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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/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/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.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/bottom_sheet.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.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/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/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/tab/role_type_tab.dart'; import 'package:mc_common_app/widgets/tab/role_type_tab.dart';
import 'package:provider/provider.dart';
class CreateBranchModel { class CreateBranchModel {
final String branchId; final String branchId;
@ -50,16 +52,34 @@ class _ServicesListPageState extends State<ServicesListPage> {
int selectedTab = 0; int selectedTab = 0;
ServiceStatusEnum selectedService = ServiceStatusEnum.approvedOrActive; ServiceStatusEnum selectedService = ServiceStatusEnum.approvedOrActive;
List<ServiceModel> filteredServices = [];
late CategoryData categoryData;
ViewState screenState = ViewState.busy;
@override @override
Widget build(BuildContext context) { void initState() {
final categoryData = ModalRoute.of(context)!.settings.arguments as CategoryData; scheduleMicrotask(() async {
List<ServiceModel> services = []; await _fetchServices();
if (selectedService == ServiceStatusEnum.approvedOrActive) { });
services = categoryData.services!.where((i) => i.serviceStatus == ServiceStatusEnum.approvedOrActive.index + 1).toList(); super.initState();
} else { }
services = categoryData.services!.where((i) => i.serviceStatus != ServiceStatusEnum.approvedOrActive.index + 1).toList();
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) {
categoryData = ModalRoute.of(context)!.settings.arguments as CategoryData;
return Scaffold( return Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(
title: LocaleKeys.services.tr(), title: LocaleKeys.services.tr(),
@ -96,8 +116,10 @@ class _ServicesListPageState extends State<ServicesListPage> {
selectedTab = value.id; selectedTab = value.id;
if (selectedTab == 0) { if (selectedTab == 0) {
selectedService = ServiceStatusEnum.approvedOrActive; selectedService = ServiceStatusEnum.approvedOrActive;
filteredServices = categoryData.services!.where((i) => i.serviceStatus == ServiceStatusEnum.approvedOrActive.index + 1).toList();
} else { } else {
selectedService = value.id.toServiceStatusEnum(); selectedService = value.id.toServiceStatusEnum();
filteredServices = categoryData.services!.where((i) => i.serviceStatus != ServiceStatusEnum.approvedOrActive.index + 1).toList();
} }
}); });
}, },
@ -105,9 +127,30 @@ class _ServicesListPageState extends State<ServicesListPage> {
), ),
const SizedBox(height: 10), const SizedBox(height: 10),
Expanded( Expanded(
child: services.isEmpty 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( ? Center(
child: LocaleKeys.noItemstoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor), child: LocaleKeys.noServicesAvailable.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
) )
: ListView.separated( : ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
@ -116,15 +159,16 @@ class _ServicesListPageState extends State<ServicesListPage> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (services[index].serviceStatus == 1) ...[ if (filteredServices[index].serviceStatus == 1) ...[
Utils.statusContainerChip(text: "Pending", chipColor: MyColors.adPendingStatusColor), Utils.statusContainerChip(text: "Pending", chipColor: MyColors.adPendingStatusColor),
5.height, 5.height,
], ],
Row( Row(
children: [ children: [
Expanded( Expanded(
child: (services[index].serviceDescription ?? "").toText(fontSize: 16), child: (filteredServices[index].serviceDescription ?? "").toText(fontSize: 16),
), ),
if (filteredServices[index].serviceStatus != 1) ...[
Padding( Padding(
padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.all(4.0),
child: SvgPicture.asset( child: SvgPicture.asset(
@ -133,16 +177,17 @@ class _ServicesListPageState extends State<ServicesListPage> {
height: 16, height: 16,
), ),
).onPress(() { ).onPress(() {
navigateWithName(context, ProviderAppRoutes.createServices3, navigateWithName(context, AppRoutes.createServices3,
arguments: CreateBranchModel( arguments: CreateBranchModel(
branchId: categoryData.branchId ?? '', branchId: categoryData.branchId ?? '',
branchName: categoryData.branchName ?? '', branchName: categoryData.branchName ?? '',
categoryId: categoryData.id.toString(), categoryId: categoryData.id.toString(),
categoryName: categoryData.categoryName, categoryName: categoryData.categoryName,
serviceProviderService: services[index], serviceProviderService: filteredServices[index],
isForEdit: true, isForEdit: true,
)); ));
}), }),
]
], ],
), ),
const SizedBox(height: 4), const SizedBox(height: 4),
@ -155,11 +200,13 @@ class _ServicesListPageState extends State<ServicesListPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox(height: 4), const SizedBox(height: 4),
showItem('${LocaleKeys.availableforAppointment.tr()}:', (services[index].isAllowAppointment ?? false) ? LocaleKeys.yes.tr() : LocaleKeys.no.tr(), valueColor: Colors.green), showItem('${LocaleKeys.availableforAppointment.tr()}:', (filteredServices[index].isAllowAppointment ?? false) ? LocaleKeys.yes.tr() : LocaleKeys.no.tr(),
showItem('${LocaleKeys.allowingHomeService.tr()}:', (services[index].isAllowAppointmentHome ?? false) ? LocaleKeys.yes.tr() : LocaleKeys.no.tr(), valueColor: Colors.green), valueColor: Colors.green),
if ((services[index].isAllowAppointmentHome ?? false)) ...[ showItem('${LocaleKeys.allowingHomeService.tr()}:', (filteredServices[index].isAllowAppointmentHome ?? false) ? LocaleKeys.yes.tr() : LocaleKeys.no.tr(),
showItem('${LocaleKeys.homeServiceRange.tr()}:', services[index].customerLocationRange.toString()), valueColor: Colors.green),
showItem('${LocaleKeys.chargesPerKM.tr()}:', services[index].rangePricePerKm.toString()), if ((filteredServices[index].isAllowAppointmentHome ?? false)) ...[
showItem('${LocaleKeys.homeServiceRange.tr()}:', filteredServices[index].customerLocationRange.toString()),
showItem('${LocaleKeys.chargesPerKM.tr()}:', filteredServices[index].rangePricePerKm.toString()),
], ],
], ],
), ),
@ -170,14 +217,15 @@ class _ServicesListPageState extends State<ServicesListPage> {
], ],
), ),
).toWhiteContainer(width: double.infinity, allPading: 12).onPress( ).toWhiteContainer(width: double.infinity, allPading: 12).onPress(
() => navigateWithName(context, ProviderAppRoutes.itemsList, arguments: services[index]), () => navigateWithName(context, AppRoutes.itemsList, arguments: filteredServices[index]),
); );
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return const SizedBox(height: 12); return const SizedBox(height: 12);
}, },
padding: const EdgeInsets.only(left: 20, right: 20, bottom: 20, top: 10), padding: const EdgeInsets.only(left: 20, right: 20, bottom: 20, top: 10),
itemCount: services.length, itemCount: filteredServices.length,
),
), ),
), ),
], ],

@ -1,7 +1,9 @@
import 'dart:async'; 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:car_provider_app/views/branch_management/branch/branch_list_page.dart';
import 'package:flutter/material.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/views/common_fragments/requests_fragment.dart';
import 'package:mc_common_app/widgets/common_widgets/bottom_nav_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/bottom_nav_bar.dart';
import 'package:provider/provider.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'; import 'package:mc_common_app/views/common_fragments/ads_fragment.dart';
class DashboardView extends StatefulWidget { 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 @override
State<DashboardView> createState() => _DashboardViewState(); State<DashboardView> createState() => _DashboardViewState();
} }
class _DashboardViewState extends State<DashboardView> { class _DashboardViewState extends State<DashboardView> {
late DashboardVM dashboardVM; late DashboardVMProvider dashboardVMProvider;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override @override
void initState() { void initState() {
log("widget.dashboardRouteEnum: ${widget.dashboardRouteEnum}");
super.initState(); super.initState();
dashboardVM = Provider.of<DashboardVM>(context, listen: false); dashboardVMProvider = Provider.of<DashboardVMProvider>(context, listen: false);
scheduleMicrotask(() => dashboardVM.onRefresh(context)); scheduleMicrotask(() => dashboardVMProvider.onRefresh(context, dashboardRouteEnum: widget.dashboardRouteEnum));
} }
@override @override
@ -41,13 +46,13 @@ class _DashboardViewState extends State<DashboardView> {
canPop: false, canPop: false,
child: Scaffold( child: Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: fragments[context.watch<DashboardVM>().selectedNavbarBarIndex], body: fragments[context.watch<DashboardVMProvider>().selectedNavbarBarIndex],
bottomNavigationBar: CustomBottomNavbar( bottomNavigationBar: CustomBottomNavbar(
onSelected: (index) { onSelected: (index) {
dashboardVM.onNavbarTapped(index); dashboardVMProvider.onNavbarTapped(index);
}, },
isProvider: true, 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: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/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/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/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/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.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/view_models/service_view_model.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.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/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/tab/role_type_tab.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
class BranchAppointmentFragment extends StatelessWidget { class BranchAppointmentFragment extends StatelessWidget {
@ -109,7 +104,7 @@ class BranchAppointmentFragment extends StatelessWidget {
).toContainer(borderRadius: 0, isShadowEnabled: true).onPress(() async { ).toContainer(borderRadius: 0, isShadowEnabled: true).onPress(() async {
branches[index].countryID = serviceVM.branches!.data!.countryID; branches[index].countryID = serviceVM.branches!.data!.countryID;
branches[index].countryName = serviceVM.branches!.data!.countryName; branches[index].countryName = serviceVM.branches!.data!.countryName;
navigateWithName(context, ProviderAppRoutes.appointment, arguments: branches[index]); navigateWithName(context, AppRoutes.appointment, arguments: branches[index]);
}); });
}, },
separatorBuilder: (context, 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:car_provider_app/views/dashboard/widget/my_service_provider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.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/utils/navigator.dart';
import 'package:mc_common_app/view_models/ad_view_model.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/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/advertisement/components/ads_list_widget.dart';
import 'package:mc_common_app/views/appointments/widgets/common_appointment_slider_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/app_bar.dart';
import 'package:mc_common_app/widgets/common_widgets/view_all_widget.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:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
@ -34,25 +32,25 @@ class HomeFragment extends StatelessWidget {
leadingWidth: 100, leadingWidth: 100,
toolbarHeight: 59, toolbarHeight: 59,
onTap: () => navigateWithName(context, AppRoutes.settingOptionsMore), onTap: () => navigateWithName(context, AppRoutes.settingOptionsMore),
actions: [ actions: const [
IconButton( // IconButton(
onPressed: () => context.read<AppointmentsVM>().onGeneralChatMessagesButtonPressed(context: context), // onPressed: () => context.read<AppointmentsVM>().onGeneralChatMessagesButtonPressed(context: context),
icon: b.Badge( // icon: b.Badge(
badgeContent: '3'.toText(color: MyColors.white), // badgeContent: '3'.toText(color: MyColors.white),
badgeStyle: const b.BadgeStyle( // badgeStyle: const b.BadgeStyle(
badgeColor: MyColors.primaryColor, // badgeColor: MyColors.primaryColor,
padding: EdgeInsets.all(5), // padding: EdgeInsets.all(5),
), // ),
child: const Padding(padding: EdgeInsets.only(top: 8, bottom: 8, right: 25, left: 10), child: Icon(Icons.message, size: 21))), // child: const Padding(padding: EdgeInsets.only(top: 8, bottom: 8, right: 25, left: 10), child: Icon(Icons.message, size: 21))),
), // ),
10.width, // 10.width,
], ],
), ),
body: SizedBox( body: SizedBox(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: RefreshIndicator( child: RefreshIndicator(
onRefresh: () async => await context.read<DashboardVM>().onRefresh(context), onRefresh: () async => await context.read<DashboardVMProvider>().onRefresh(context),
child: ListView( child: ListView(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
children: [ children: [
@ -63,7 +61,7 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.upcoming_appointment.tr(), title: LocaleKeys.upcoming_appointment.tr(),
subTitle: LocaleKeys.view_all.tr(), subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () { onSubtitleTapped: () {
context.read<DashboardVM>().onNavbarTapped(1); context.read<DashboardVMProvider>().onNavbarTapped(1);
}, },
).horPaddingMain(), ).horPaddingMain(),
// const AppointmentSliderWidget().horPaddingMain(), // const AppointmentSliderWidget().horPaddingMain(),
@ -74,7 +72,7 @@ class HomeFragment extends StatelessWidget {
] else ...[ ] else ...[
CommonAppointmentSliderWidget( CommonAppointmentSliderWidget(
onAppointmentClick: (AppointmentListModel value) { onAppointmentClick: (AppointmentListModel value) {
navigateWithName(context, ProviderAppRoutes.appointmentDetailList, arguments: value); navigateWithName(context, AppRoutes.appointmentDetailList, arguments: value);
}, },
) )
.toWhiteContainer( .toWhiteContainer(
@ -88,7 +86,7 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.myBranches.tr(), title: LocaleKeys.myBranches.tr(),
subTitle: LocaleKeys.view_all.tr(), subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () { onSubtitleTapped: () {
context.read<DashboardVM>().onNavbarTapped(0); context.read<DashboardVMProvider>().onNavbarTapped(0);
}, },
).horPaddingMain(), ).horPaddingMain(),
const ServiceProviderWidget().horPaddingMain(), const ServiceProviderWidget().horPaddingMain(),
@ -114,7 +112,7 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.my_active_Ads.tr().toUpperCase(), title: LocaleKeys.my_active_Ads.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(), subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () { onSubtitleTapped: () {
context.read<DashboardVM>().onNavbarTapped(3); context.read<DashboardVMProvider>().onNavbarTapped(3);
context.read<AdVM>().updateIsExploreAds(true); context.read<AdVM>().updateIsExploreAds(true);
context.read<AdVM>().applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds); context.read<AdVM>().applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds);
}, },
@ -136,7 +134,7 @@ class HomeFragment extends StatelessWidget {
title: LocaleKeys.myRecommendedAds.tr().toUpperCase(), title: LocaleKeys.myRecommendedAds.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(), subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () { onSubtitleTapped: () {
context.read<DashboardVM>().onNavbarTapped(3); context.read<DashboardVMProvider>().onNavbarTapped(3);
context.read<AdVM>().updateIsExploreAds(true); context.read<AdVM>().updateIsExploreAds(true);
context.read<AdVM>().applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds); 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: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/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.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/theme/colors.dart';
@ -53,7 +52,8 @@ class ServiceProviderWidget extends StatelessWidget {
() { () {
serviceVM.homePageBranches[index].countryID = serviceVM.branches!.data!.countryID; serviceVM.homePageBranches[index].countryID = serviceVM.branches!.data!.countryID;
serviceVM.homePageBranches[index].countryName = serviceVM.branches!.data!.countryName; 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> { class _SubscriptionsPageState extends State<SubscriptionsPage> {
@override @override
void initState() { void initState() {
// TODO: implement initState
super.initState(); super.initState();
scheduleMicrotask(() { scheduleMicrotask(() {
context.read<SubscriptionsVM>().getSubscriptionBySP( context.read<SubscriptionsVM>().getSubscriptionBySP(

@ -1,24 +1,15 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer'; 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/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:car_provider_app/views/subscriptions/widget/my_subscriptions_card.dart';
import 'package:flutter/material.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/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.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/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/models/subscriptions_models/subscription_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.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/view_models/subscriptions_view_model.dart';
import 'package:mc_common_app/widgets/bottom_sheet.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/button/show_fill_button.dart';
@ -37,9 +28,9 @@ class _MySubscriptionsPageState extends State<MySubscriptionsPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
scheduleMicrotask(() { // scheduleMicrotask(() {
// context.read<SubscriptionsVM>().getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? ""); // context.read<SubscriptionsVM>().getMySubscriptionsBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "");
}); // });
} }
@override @override
@ -70,7 +61,6 @@ class _MySubscriptionsPageState extends State<MySubscriptionsPage> {
backgroundColor: MyColors.darkIconColor, backgroundColor: MyColors.darkIconColor,
isMainPage: model.mySubscriptionsBySp[index].isExpired ?? false, isMainPage: model.mySubscriptionsBySp[index].isExpired ?? false,
onRenewSubscriptionClick: () async { onRenewSubscriptionClick: () async {
print(sub.toJson());
showMyBottomSheet( showMyBottomSheet(
context, context,
child: UpgradePackageSheet( child: UpgradePackageSheet(
@ -151,7 +141,7 @@ class _MySubscriptionsPageState extends State<MySubscriptionsPage> {
maxWidth: double.infinity, maxWidth: double.infinity,
margin: const EdgeInsets.symmetric(horizontal: 21), margin: const EdgeInsets.symmetric(horizontal: 21),
onPressed: () { onPressed: () {
navigateWithName(context, ProviderAppRoutes.subscriptionsPage); navigateWithName(context, AppRoutes.subscriptionsPage);
}, },
), ),
21.height, 21.height,

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

@ -2,10 +2,12 @@ import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_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/models/subscriptions_models/subscription_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart'; import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/enums.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'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class AllSubscriptionsCard extends StatelessWidget { class AllSubscriptionsCard extends StatelessWidget {
@ -65,9 +67,9 @@ class AllSubscriptionsCard extends StatelessWidget {
], ],
), ),
6.height, 6.height,
showItem("Ads:", subscription.subscriptionAds.toString()), showItem("${LocaleKeys.ads.tr()}:", subscription.subscriptionAds.toString()),
showItem("Users:", subscription.subscriptionSubUsers.toString()), showItem("${LocaleKeys.users.tr()}:", subscription.subscriptionSubUsers.toString()),
showItem("Branches:", subscription.subscriptionBranches.toString()), showItem("${LocaleKeys.branches.tr()}:", subscription.subscriptionBranches.toString()),
14.height, 14.height,
Row( Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
@ -80,7 +82,7 @@ class AllSubscriptionsCard extends StatelessWidget {
children: [ children: [
subscription.price.toString().toText(fontSize: 29, isBold: true, color: textColor, letterSpacing: -1.77, height: 1), subscription.price.toString().toText(fontSize: 29, isBold: true, color: textColor, letterSpacing: -1.77, height: 1),
2.width, 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( Row(
children: [ 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!) if (pvm.isRenewable!)
Row( Row(
children: [ children: [

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

Loading…
Cancel
Save