User Profile API's & Image

aamir_dev
Aamir.Muhammad 4 months ago
parent 82a5af9170
commit ea9c8ae346

@ -156,7 +156,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1300;
LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
@ -360,7 +360,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@ -379,7 +379,7 @@
DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -439,7 +439,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@ -488,7 +488,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@ -509,7 +509,7 @@
DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -533,7 +533,7 @@
DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
LastUpgradeVersion = "1510"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

@ -12,6 +12,7 @@ import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/general_models/widgets_models.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
@ -24,7 +25,7 @@ import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
import 'fragments/branches_fragment.dart';
class DashboardPage extends StatefulWidget {
@ -107,19 +108,19 @@ class _DashboardPageState extends State<DashboardPage> {
String getPageTitle(int index) {
if (index == 0) {
return "Branches";
return LocaleKeys.branches.tr();
}
if (index == 1) {
return "Appointments";
return LocaleKeys.appointments.tr();
}
if (index == 2) {
return "";
}
if (index == 3) {
return "Ads";
return LocaleKeys.ads.tr();
}
if (index == 4) {
return "My Requests";
return LocaleKeys.myRequests.tr();
}
return "";
}

@ -4,6 +4,7 @@ import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
@ -14,6 +15,7 @@ import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class AdsFragment extends StatelessWidget {
AdsFragment({Key? key}) : super(key: key);
@ -54,7 +56,7 @@ class AdsFragment extends StatelessWidget {
child: ShowFillButton(
isFilled: adVM.isExploreAdsTapped,
maxHeight: 55,
title: "Explore Ads",
title: LocaleKeys.exploreAds.tr(),
txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
onPressed: () {
print("ads: ${AppState().getUser.data!.accessToken}");
@ -72,7 +74,7 @@ class AdsFragment extends StatelessWidget {
isFilled: !adVM.isExploreAdsTapped,
txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
maxHeight: 55,
title: "My Ads",
title: LocaleKeys.myAds.tr(),
onPressed: () {
adVM.updateIsExploreAds(false);
},

@ -1,4 +1,5 @@
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_customer.dart';
import 'package:mc_common_app/views/appointments/widgets/customer_appointment_slider_widget.dart';
@ -12,6 +13,8 @@ import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class AppointmentsFragment extends StatelessWidget {
const AppointmentsFragment({Key? key}) : super(key: key);
@ -45,7 +48,7 @@ class AppointmentsFragment extends StatelessWidget {
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
"No Appointments to show.".toText(fontSize: 16, color: MyColors.lightTextColor),
LocaleKeys.noAppointmentstoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
],
)
: ListView.builder(

@ -41,34 +41,44 @@ class BranchesFragment extends StatelessWidget {
context.read<AppointmentsVM>().getAllNearBranches(isNeedToRebuild: true, isFromRefresh: true);
},
child: Container(
width: double.infinity,
height: MediaQuery.of(context).size.height / 1.37,
child: appointmentsVM.state == ViewState.busy
? const Center(child: CircularProgressIndicator())
: appointmentsVM.nearbyBranches.isEmpty
? Center(child: LocaleKeys.no_branch.tr().toText(fontSize: 16, color: MyColors.lightTextColor))
: ListView.separated(
itemCount: appointmentsVM.nearbyBranches.length,
itemBuilder: (context, index) {
BranchDetailModel branchDetailModel = appointmentsVM.nearbyBranches[index];
width: double.infinity,
height: MediaQuery.of(context).size.height / 1.37,
child: appointmentsVM.state == ViewState.busy
? const Center(
child: CircularProgressIndicator(),
)
: appointmentsVM.nearbyBranches.isEmpty
? Center(
child: LocaleKeys.no_branch.tr().toText(
fontSize: 16,
color: MyColors.lightTextColor,
),
)
: ListView.separated(
itemCount: appointmentsVM.nearbyBranches.length,
itemBuilder: (context, index) {
BranchDetailModel branchDetailModel = appointmentsVM.nearbyBranches[index];
return ProviderDetailsCard(
onCardTapped: () {
navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel);
},
providerImageUrl: MyAssets.bnCar,
title: branchDetailModel.branchName ?? "",
providerLocation: branchDetailModel.distanceKm.toString() + " KM",
providerName: branchDetailModel.serviceProviderName ?? "",
providerRatings: "4.9",
services: branchDetailModel.branchServices,
);
},
separatorBuilder: (context, index) {
return 12.height;
},
padding: const EdgeInsets.all(12),
)),
return ProviderDetailsCard(
onCardTapped: () {
navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel);
},
providerImageUrl: MyAssets.bnCar,
title: branchDetailModel.branchName ?? "",
providerLocation: branchDetailModel.distanceKm.toString() + " KM",
providerName: branchDetailModel.serviceProviderName ?? "",
providerRatings: "4.9",
services: branchDetailModel.branchServices,
);
},
separatorBuilder: (context, index) {
return 12.height;
},
padding: const EdgeInsets.all(
12,
),
),
),
),
),
],

@ -1,6 +1,7 @@
import 'package:car_customer_app/views/dashboard/widgets/drawer_widget.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart';
@ -11,6 +12,8 @@ import 'package:mc_common_app/widgets/common_widgets/my_service_provider.dart';
import 'package:mc_common_app/widgets/common_widgets/view_all_widget.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class HomeFragment extends StatelessWidget {
const HomeFragment({Key? key}) : super(key: key);
@ -30,8 +33,8 @@ class HomeFragment extends StatelessWidget {
children: [
16.height,
ViewAllWidget(
title: "Upcoming Appointment".toUpperCase(),
subTitle: "View All",
title: LocaleKeys.upcoming_appointment.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVmCustomer>().onNavbarTapped(1);
context.read<AppointmentsVM>().applyFilterOnAppointmentsVM(appointmentStatusEnum: AppointmentStatusEnum.allAppointments);
@ -40,8 +43,8 @@ class HomeFragment extends StatelessWidget {
CustomerAppointmentSliderWidget(myUpComingAppointments: context.read<AppointmentsVM>().myUpComingAppointments),
7.height,
ViewAllWidget(
title: "My Recent Service Providers".toUpperCase(),
subTitle: "View All",
title: LocaleKeys.my_recent_providers.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVmCustomer>().onNavbarTapped(0);
context.read<AppointmentsVM>().applyFilterOnBranches(index: 0);
@ -58,8 +61,8 @@ class HomeFragment extends StatelessWidget {
children: [
15.height,
ViewAllWidget(
title: "My Active Ads".toUpperCase(),
subTitle: "View All",
title: LocaleKeys.my_active_Ads.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVmCustomer>().onNavbarTapped(3);
context.read<AdVM>().updateIsExploreAds(false);
@ -78,8 +81,8 @@ class HomeFragment extends StatelessWidget {
children: [
15.height,
ViewAllWidget(
title: "My Recommended Ads".toUpperCase(),
subTitle: "View All",
title: LocaleKeys.myRecommendedAds.tr().toUpperCase(),
subTitle: LocaleKeys.view_all.tr(),
onSubtitleTapped: () {
context.read<DashboardVmCustomer>().onNavbarTapped(3);
context.read<AdVM>().updateIsExploreAds(true);

@ -1,3 +1,4 @@
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/config/routes.dart';
@ -9,6 +10,8 @@ import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/views/requests/widget/request_item.dart';
import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class MyRequestsFragment extends StatelessWidget {
const MyRequestsFragment({super.key});
@ -40,7 +43,7 @@ class MyRequestsFragment extends StatelessWidget {
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
"No Requests to show.".toText(fontSize: 16, color: MyColors.lightTextColor),
LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
],
)
: ListView.separated(

@ -29,10 +29,10 @@ class _CustomDrawerState extends State<CustomDrawer> {
showDialog<ImageSource>(
context: context,
builder: (context) => AlertDialog(
content: const Text("Choose image source"),
content: Text(LocaleKeys.chooseImageSource.tr()),
actions: [
TextButton(child: const Text("Camera"), onPressed: () => widget.dashboardVM.pickImageFromPhone(context, 0)),
TextButton(child: const Text("Gallery"), onPressed: () => widget.dashboardVM.pickImageFromPhone(context, 1)),
TextButton(child: Text(LocaleKeys.camera.tr()), onPressed: () => widget.dashboardVM.pickImageFromPhone(context, 0)),
TextButton(child: Text(LocaleKeys.gallery.tr()), onPressed: () => widget.dashboardVM.pickImageFromPhone(context, 1)),
],
),
);
@ -92,7 +92,7 @@ class _CustomDrawerState extends State<CustomDrawer> {
Utils.showLoading(context);
ImageResponse response = await widget.dashboardVM.updateUserImage("");
if (response.messageStatus == 1) {
Utils.showToast("Image is Deleted");
Utils.showToast(LocaleKeys.imageIsDeleted.tr());
setState(() {
AppState().getUser.data!.userInfo!.userImageUrl = response.data;
});
@ -118,7 +118,7 @@ class _CustomDrawerState extends State<CustomDrawer> {
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
"userName".toText(
LocaleKeys.profile_reset_password_username.toText(
isBold: true,
fontSize: 20,
letterSpacing: -1.44,

@ -37,7 +37,7 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
title: "Branch Detail",
title: LocaleKeys.branchDetail.tr(),
onBackButtonTapped: () {
context.read<AppointmentsVM>().resetCategorySelectionBottomSheet();
Navigator.pop(context);
@ -70,7 +70,7 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
),
Row(
children: [
("Time" + ":").toText(color: MyColors.lightTextColor, fontSize: 12),
(LocaleKeys.time.tr() + ":").toText(color: MyColors.lightTextColor, fontSize: 12),
4.width,
"${widget.branchDetailModel.openTime} - ${widget.branchDetailModel.closeTime}".toText(fontSize: 12, isBold: true),
],
@ -83,13 +83,12 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
//TODO: Needs to implement url launcher
"Open Map Location".toText(
fontSize: 12,
isBold: true,
color: MyColors.primaryColor,
isUnderLine: true,
),
LocaleKeys.openMapLocation.tr().toText(
fontSize: 12,
isBold: true,
color: MyColors.primaryColor,
isUnderLine: true,
),
4.width,
Image.asset(
MyAssets.icRightUpPng,
@ -103,12 +102,12 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
"Provider Profile".toText(
fontSize: 12,
isBold: true,
color: MyColors.primaryColor,
isUnderLine: true,
),
LocaleKeys.providerProfile.tr().toText(
fontSize: 12,
isBold: true,
color: MyColors.primaryColor,
isUnderLine: true,
),
2.width,
Icon(
Icons.arrow_forward,
@ -122,12 +121,12 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
],
),
20.height,
"Services Offer".toText(
fontSize: 16,
color: MyColors.lightTextColor,
isBold: true,
),
if (widget.branchDetailModel.branchServices!.length == 0) "No Services Available".toText(fontSize: 12, isBold: true),
LocaleKeys.servicesOffer.tr().toText(
fontSize: 16,
color: MyColors.lightTextColor,
isBold: true,
),
if (widget.branchDetailModel.branchServices!.length == 0) LocaleKeys.noServicesAvailable.tr().toText(fontSize: 12, isBold: true),
showServicesList(),
],
).toWhiteContainer(
@ -140,7 +139,7 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
),
),
ShowFillButton(
title: "Book Appointment",
title: LocaleKeys.bookAppointment.tr(),
maxWidth: double.infinity,
margin: EdgeInsets.all(21),
onPressed: () {
@ -166,9 +165,9 @@ class _BranchDetailPageState extends State<BranchDetailPage> {
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
showItem("Allowing home service:", (widget.branchDetailModel.branchServices![index].isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem("Home service range", widget.branchDetailModel.branchServices![index].customerLocationRange.toString() + "KM"),
showItem("Charges per KM", widget.branchDetailModel.branchServices![index].customerLocationRange.toString() + "SAR"),
showItem(LocaleKeys.allowingHomeService.tr() + " :", (widget.branchDetailModel.branchServices![index].isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem(LocaleKeys.homeServiceRange.tr() + " :", widget.branchDetailModel.branchServices![index].customerLocationRange.toString() + "KM"),
showItem(LocaleKeys.chargesPerKM.tr() + " :", widget.branchDetailModel.branchServices![index].customerLocationRange.toString() + LocaleKeys.sar.tr()),
8.height,
((widget.branchDetailModel.branchServices![index].itemsCount != null && widget.branchDetailModel.branchServices![index].itemsCount! > 0)
? widget.branchDetailModel.branchServices![index].itemsCount.toString() + " items"

@ -34,7 +34,7 @@ class _ProviderProfilePageState extends State<ProviderProfilePage> {
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
title: "Provider Details",
title: LocaleKeys.providerDetails.tr(),
),
body: Container(
width: double.infinity,
@ -70,7 +70,7 @@ class _ProviderProfilePageState extends State<ProviderProfilePage> {
4.height,
//TODO: company description not added form provider app yet
// model.providerModel!.data!.companyDescription!.toText(color: MyColors.lightTextColor, fontSize: 12),
"Some description about the provider and their years of experience and their reputation".toText(color: MyColors.lightTextColor, fontSize: 12),
LocaleKeys.someDescriptionExperienceandtheirReputation.tr().toText(color: MyColors.lightTextColor, fontSize: 12),
],
).toWhiteContainer(
width: double.infinity,
@ -78,7 +78,7 @@ class _ProviderProfilePageState extends State<ProviderProfilePage> {
),
12.height,
model.providerProfileModel!.serviceProviderBranch == null
? const Center(child: Text("No Branch Found"))
? Center(child: Text(LocaleKeys.noBranchFound))
: model.providerProfileModel!.serviceProviderBranch!.isEmpty
? Center(child: Text(LocaleKeys.no_branch.tr()))
: ListView.separated(

@ -1,3 +1,4 @@
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/services_models/item_model.dart';
import 'package:mc_common_app/view_models/appointments_view_model.dart';
import 'package:flutter/material.dart';
@ -7,6 +8,8 @@ import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/widgets/empty_widget.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class ItemsListSheet extends StatefulWidget {
final int serviceId;
@ -49,11 +52,11 @@ class _ItemsListSheetState extends State<ItemsListSheet> {
children: [
serviceItemModel.name.toString().toText(fontSize: 16, isBold: true),
4.height,
showItem("Available for appointment:", (serviceItemModel.isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem("Allowing Workshop service:", (serviceItemModel.isAppointmentCompanyLoc ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem("Allowing home service:", (serviceItemModel.isAppointmentCustomerLoc ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem(LocaleKeys.availableforAppointment.tr() + ":", (serviceItemModel.isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem(LocaleKeys.allowingWorkshopService.tr() + ":", (serviceItemModel.isAppointmentCompanyLoc ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem(LocaleKeys.allowingHomeService.tr() + ":", (serviceItemModel.isAppointmentCustomerLoc ?? false) ? "Yes" : "No", valueColor: Colors.green),
12.height,
"Service Amount".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
LocaleKeys.serviceAmount.tr().toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
@ -61,7 +64,7 @@ class _ItemsListSheetState extends State<ItemsListSheet> {
2.width,
Padding(
padding: const EdgeInsets.only(bottom: 4),
child: "SAR".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
child: LocaleKeys.sar.tr().toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
),
],
),

@ -36,7 +36,7 @@ dependencies:
cupertino_icons: ^1.0.2
mc_common_app:
path: /Volumes/Data/Projects/Flutter/car_common_app
path: /Users/amir/StudioProjects/car_common_app
dev_dependencies:
flutter_test:

Loading…
Cancel
Save