Compare commits

..

6 Commits

Author SHA1 Message Date
Mirza.Shafique@cloudsolutions.com.sa 501cd60814 Merge branch 'master' into mirza_dev
# Conflicts:
#	android/build.gradle
#	android/gradle/wrapper/gradle-wrapper.properties
#	lib/config/provider_routes.dart
#	lib/main.dart
#	lib/repositories/branch_repo.dart
#	lib/repositories/items_repo.dart
#	lib/repositories/subscription_repo.dart
#	lib/view_models/service_view_model.dart
#	lib/views/dashboard/dashboard_page.dart
#	lib/views/dashboard/fragments/home_fragment.dart
#	lib/views/dashboard/fragments/request_list_fragment.dart
#	lib/views/settings/branch/branch_detail_page.dart
#	lib/views/settings/branch/define_branch_page.dart
#	lib/views/settings/services/create_item_page.dart
#	pubspec.lock
2 years ago
Mirza.Shafique@cloudsolutions.com.sa 1af42fdcf7 path fix 2 years ago
Faiz Hashmi 37ec048a2c chat moDULE ANd other testing before demo 2 years ago
Faiz Hashmi b00b93a7ab chat module 2 years ago
Faiz Hashmi 8235f0b8af refined models 2 years ago
Faiz Hashmi 221b481114 refined models 2 years ago

@ -1,5 +1,4 @@
import 'package:car_provider_app/views/appoinments/appoinment_detail_list_page.dart'; import 'package:car_provider_app/views/appoinments/appoinment_detail_list_page.dart';
import 'package:car_provider_app/views/appoinments/merge_appointment_page.dart';
import 'package:car_provider_app/views/appoinments/update_appointment_page.dart'; import 'package:car_provider_app/views/appoinments/update_appointment_page.dart';
import 'package:car_provider_app/views/requests/request_detail_page.dart'; import 'package:car_provider_app/views/requests/request_detail_page.dart';
import 'package:car_provider_app/views/requests/send_offer_page.dart'; import 'package:car_provider_app/views/requests/send_offer_page.dart';
@ -25,14 +24,11 @@ import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ad_details_model.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/model/provider_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/views/advertisement/ads_detail_view.dart'; import 'package:mc_common_app/views/advertisement/ads_detail_view.dart';
import 'package:mc_common_app/views/advertisement/create_ad_view.dart'; import 'package:mc_common_app/views/advertisement/create_ad_view.dart';
import '../views/appoinments/add_new_service_appointment_page.dart';
import '../views/appoinments/appointment_page.dart';
import '../views/dashboard/dashboard_page.dart'; import '../views/dashboard/dashboard_page.dart';
class ProviderAppRoutes { class ProviderAppRoutes {
@ -73,9 +69,7 @@ class ProviderAppRoutes {
static final Map<String, WidgetBuilder> routes = { static final Map<String, WidgetBuilder> routes = {
//Home page //Home page
AppRoutes.dashboard: (context) => const DashboardPage(), AppRoutes.dashboard: (context) => const DashboardPage(),
AppRoutes.adsDetailView: (context) => AdsDetailView( AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel),
adDetails:
ModalRoute.of(context)!.settings.arguments as AdDetailsModel),
AppRoutes.createAdView: (context) => const CreateAdView(), AppRoutes.createAdView: (context) => const CreateAdView(),
//setting //setting
@ -101,8 +95,10 @@ class ProviderAppRoutes {
mergeAppointments: (context) => MergeAppointmentListPage(), mergeAppointments: (context) => MergeAppointmentListPage(),
//Requests //Requests
requestsDetailPage: (context) => const RequestDetailPage(), AppRoutes.requestsDetailPage: (context) => RequestDetailPage(
sendOfferPage: (context) => const SendOfferPage(), requestDetailPageArguments: ModalRoute.of(context)!.settings.arguments as RequestDetailPageArguments,
),
AppRoutes.sendOfferPage: (context) => const SendOfferPage(),
//Subscriptions //Subscriptions
AppRoutes.mySubscriptionsPage: (context) => const MySubscriptionsPage(), AppRoutes.mySubscriptionsPage: (context) => const MySubscriptionsPage(),
@ -130,10 +126,10 @@ class ProviderAppRoutes {
addSchedule: (context) => AddSchedulesPage(), addSchedule: (context) => AddSchedulesPage(),
//Branch Duplication //Branch Duplication
matchServices: (context) => MatchedServicesPage( matchServices: (context) => MatchedServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as MatchServicesArguments)),
(ModalRoute.of(context)!.settings.arguments) == null
? null AppRoutes.chatView: (context) => ChatView(
: (ModalRoute.of(context)!.settings.arguments chatViewArguments: ModalRoute.of(context)!.settings.arguments as ChatViewArguments,
as MatchServicesArguments)), ),
}; };
} }

@ -15,18 +15,15 @@ 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/dependencies.dart'; import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/models/general_models/post_params_model.dart'; import 'package:mc_common_app/models/post_params_model.dart';
import 'package:mc_common_app/repositories/ads_repo.dart'; import 'package:mc_common_app/repositories/ads_repo.dart';
import 'package:mc_common_app/repositories/appointment_repo.dart';
import 'package:mc_common_app/repositories/common_repo.dart'; import 'package:mc_common_app/repositories/common_repo.dart';
import 'package:mc_common_app/repositories/provider_repo.dart';
import 'package:mc_common_app/repositories/request_repo.dart'; import 'package:mc_common_app/repositories/request_repo.dart';
import 'package:mc_common_app/repositories/user_repo.dart'; import 'package:mc_common_app/repositories/user_repo.dart';
import 'package:mc_common_app/services/common_services.dart'; import 'package:mc_common_app/services/common_services.dart';
import 'package:mc_common_app/theme/app_theme.dart'; import 'package:mc_common_app/theme/app_theme.dart';
import 'package:mc_common_app/utils/enums.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/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/view_models/base_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/view_models/user_view_model.dart'; import 'package:mc_common_app/view_models/user_view_model.dart';
@ -71,8 +68,7 @@ Future<void> main() async {
), ),
), ),
ChangeNotifierProvider<SubscriptionsVM>( ChangeNotifierProvider<SubscriptionsVM>(
create: (_) => create: (_) => SubscriptionsVM(subscriptionRepo: injector.get<SubscriptionRepo>()),
SubscriptionsVM(subscriptionRepo: injector.get<SubscriptionRepo>()),
), ),
ChangeNotifierProvider<ItemsVM>( ChangeNotifierProvider<ItemsVM>(
create: (_) => ItemsVM( create: (_) => ItemsVM(
@ -92,13 +88,13 @@ Future<void> main() async {
commonRepo: injector.get<CommonRepo>(), commonRepo: injector.get<CommonRepo>(),
), ),
), ),
// ChangeNotifierProvider<RequestsVM>( ChangeNotifierProvider<RequestsVM>(
// create: (_) => RequestsVM( create: (_) => RequestsVM(
// commonServices: injector.get<CommonAppServices>(), commonServices: injector.get<CommonAppServices>(),
// commonRepo: injector.get<CommonRepo>(), commonRepo: injector.get<CommonRepo>(),
// requestRepo: injector.get<RequestRepo>(), requestRepo: injector.get<RequestRepo>(),
// ), ),
// ), ),
ChangeNotifierProvider<AppointmentsVM>( ChangeNotifierProvider<AppointmentsVM>(
create: (_) => AppointmentsVM( create: (_) => AppointmentsVM(
scheduleRepo: injector.get<AppointmentRepo>(), scheduleRepo: injector.get<AppointmentRepo>(),
@ -107,6 +103,12 @@ Future<void> main() async {
commonRepo: injector.get<CommonRepo>(), commonRepo: injector.get<CommonRepo>(),
), ),
), ),
ChangeNotifierProvider<ChatVM>(
create: (_) => ChatVM(
chatRepo: injector.get<ChatRepo>(),
requestRepo: injector.get<RequestRepo>(),
),
),
], ],
child: const MyApp(), child: const MyApp(),
).setupLocale()); ).setupLocale());
@ -128,19 +130,12 @@ class MyApp extends StatelessWidget {
injector.get<AppState>().setAppType(AppType.provider); injector.get<AppState>().setAppType(AppType.provider);
AppState().setPostParamsModel( AppState().setPostParamsModel(
PostParamsModel( PostParamsModel(
languageID: languageID: EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2,
EasyLocalization.of(context)?.locale.languageCode == "ar"
? 1
: 2,
), ),
); );
ThemeData data = AppTheme.getTheme( ThemeData data = AppTheme.getTheme(isArabic: EasyLocalization.of(context)?.locale.languageCode == "ar");
isArabic:
EasyLocalization.of(context)?.locale.languageCode == "ar");
return MaterialApp( return MaterialApp(
theme: AppTheme.getTheme( theme: AppTheme.getTheme(isArabic: EasyLocalization.of(context)?.locale.languageCode == "ar"),
isArabic:
EasyLocalization.of(context)?.locale.languageCode == "ar"),
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
localizationsDelegates: context.localizationDelegates, localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales, supportedLocales: context.supportedLocales,

@ -4,6 +4,7 @@ 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/dependencies.dart'; import 'package:mc_common_app/config/dependencies.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/models/subscriptions_models/subscription_model.dart';
abstract class SubscriptionRepo { abstract class SubscriptionRepo {

@ -61,7 +61,7 @@ class DashboardVM extends BaseVM {
String userName = await SharedPrefManager.getPhoneOrEmail(); String userName = await SharedPrefManager.getPhoneOrEmail();
Location.getCurrentLocation( Location.getCurrentLocation(
(LatLng? latlng) { (LatLng? latlng) {
AppState().currentLocation = latlng ?? new LatLng(0, 0); AppState().currentLocation = latlng ?? const LatLng(0, 0);
}, },
); );
notifyListeners(); notifyListeners();

@ -11,13 +11,10 @@ import 'package:car_provider_app/views/dashboard/widget/drawer_widget.dart';
import 'package:car_provider_app/views/settings/branch/branch_list_page.dart'; import 'package:car_provider_app/views/settings/branch/branch_list_page.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/dependencies.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.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/requests_view_model.dart'; 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/common_widgets/app_bar.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';
@ -42,26 +39,29 @@ class _DashboardPageState extends State<DashboardPage> {
super.initState(); super.initState();
dashboardVM = Provider.of<DashboardVM>(context, listen: false); dashboardVM = Provider.of<DashboardVM>(context, listen: false);
scheduleMicrotask(() { scheduleMicrotask(() {
// context.read<RequestsVM>().populateRequestsFilterList(); context.read<RequestsVM>().populateRequestsFilterList();
_onRefresh(); _onRefresh();
}); });
} }
Future<void> _onRefresh() async { Future<void> _onRefresh() async {
final requestsVM = context.read<RequestsVM>();
final chatVM = context.read<ChatVM>();
// context.read<AdVM>().populateAdsFilterList(); // context.read<AdVM>().populateAdsFilterList();
context.read<ServiceVM>().getBranchAndServices(); context.read<ServiceVM>().getBranchAndServices();
AdVM adVm = Provider.of<AdVM>(context, listen: false); AdVM adVm = Provider.of<AdVM>(context, listen: false);
AppointmentsVM appointmentsVM = AppointmentsVM appointmentsVM =
Provider.of<AppointmentsVM>(context, listen: false); Provider.of<AppointmentsVM>(context, listen: false);
if (appointmentsVM.myAppointments.isEmpty) { if (appointmentsVM.myAppointments.isEmpty) {
await appointmentsVM.getProviderMyAppointments({ await appointmentsVM.getProviderMyAppointments({
"ServiceProviderID": injector "ServiceProviderID": injector
.get<AppState>() .get<AppState>()
.getUser .getUser
.data .data
?.userInfo ?.userInfo
?.providerId ?.providerId
.toString() ?? .toString() ??
"0" "0"
}); });
} }
@ -71,6 +71,13 @@ class _DashboardPageState extends State<DashboardPage> {
if (adVm.exploreAds.isEmpty) { if (adVm.exploreAds.isEmpty) {
await adVm.getExploreAds(); await adVm.getExploreAds();
} }
if (requestsVM.myRequests.isEmpty) {
await requestsVM.getRequests(appType: AppType.provider);
}
await chatVM.buildHubConnection(context);
} }
@override @override
@ -102,11 +109,7 @@ class _DashboardPageState extends State<DashboardPage> {
dashboardVM.updateIndex(2); dashboardVM.updateIndex(2);
}, },
), ),
RequestListFragment( const MyRequestsFragment(),
onBackButtonTapped: () {
dashboardVM.updateIndex(2);
},
),
]; ];
return Scaffold( return Scaffold(

@ -6,6 +6,7 @@ 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/view_models/ad_view_model.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/views/advertisement/ads_list.dart'; import 'package:mc_common_app/views/advertisement/ads_list.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';
@ -116,6 +117,7 @@ class AdsFragment extends StatelessWidget {
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
onPressed: () { onPressed: () {
context.read<AdVM>().getVehicleTypes(); context.read<AdVM>().getVehicleTypes();
context.read<RequestsVM>().populateRequestsFilterList();
navigateWithName(context, AppRoutes.createAdView); navigateWithName(context, AppRoutes.createAdView);
}, },

@ -0,0 +1,69 @@
import 'dart:developer';
import 'package:car_provider_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/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/views/requests/widget/request_item.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.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 {
final bool isNeedAppBar;
const MyRequestsFragment({super.key, this.isNeedAppBar = true});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: !isNeedAppBar ? null : CustomAppBar(title: LocaleKeys.myServiceBranches.tr()),
body: Container(
color: MyColors.backgroundColor,
width: double.infinity,
height: double.infinity,
child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
return Column(
children: [
16.height,
FiltersList(
filterList: requestsVM.requestsTypeFilterOptions,
onFilterTapped: (index, selectedFilterId) {
requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum());
},
),
8.height,
Expanded(
child: RefreshIndicator(
onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.provider),
child: requestsVM.state == ViewState.busy
? const Center(child: CircularProgressIndicator())
: requestsVM.myFilteredRequests.isEmpty
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
"No Requests to show.".toText(fontSize: 16, color: MyColors.lightTextColor),
],
)
: ListView.separated(
itemBuilder: (context, index) {
return RequestItem(request: requestsVM.myFilteredRequests[index], appType: AppType.provider, requestIndex: index);
},
separatorBuilder: (context, index) {
return 16.height;
},
itemCount: requestsVM.myFilteredRequests.length,
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8),
),
))
],
);
}),
),
);
}
}

@ -1,110 +0,0 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/views/requests/widget/request_item.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/categories_list.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/tab/menu_tabs.dart';
import 'package:provider/provider.dart';
class RequestListFragment extends StatelessWidget {
VoidCallback onBackButtonTapped;
RequestListFragment({required this.onBackButtonTapped, Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
profileImageUrl: MyAssets.carBanner,
title: "Requests",
onBackButtonTapped: onBackButtonTapped,
actions: [
IconButton(
onPressed: () {},
icon: const Icon(Icons.search),
),
10.width,
],
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: Column(
children: [
21.height,
MenuTabs(
0,
[
DropValue(0, "Special Request", ""),
DropValue(1, "My Offers", ""),
],
onSelect: (DropValue dropValue) {},
selectedColor: MyColors.darkPrimaryColor,
),
12.height,
// Expanded(
// child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
// return Column(
// children: [
// ShowFillButton(
// title: "title",
// onPressed: () {
// context.read<RequestsVM>().getRequests();
// }),
// 16.height,
// FiltersList(
// filterList: requestsVM.requestsFilterOptions,
// onFilterTapped: (index, selectedFilterId) => requestsVM.applyFilterOnRequestsVM(index: index),
// ),
// 8.height,
// Expanded(
// child: requestsVM.isRequestLoading
// ? const Center(child: CircularProgressIndicator())
// : requestsVM.requests.isEmpty
// ? Center(
// child: "No Request Available".toText(
// isBold: true,
// ),
// )
// : ListView.separated(
// itemBuilder: (context, index) {
// return RequestItem(requestsVM.requests[index]);
// },
// separatorBuilder: (context, index) {
// return 16.height;
// },
// itemCount: requestsVM.requests.length,
// padding: const EdgeInsets.only(
// left: 16,
// right: 16,
// bottom: 16,
// top: 8,
// ),
// ),
// )
// ],
// );
// }),
// ),
// const Padding(
// padding: EdgeInsets.symmetric(horizontal: 21),
// child: RequestListCardWidget(
// count: 12,
// ),
// )
],
),
),
);
}
}

@ -1,103 +0,0 @@
import 'package:car_provider_app/config/provider_routes.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class RequestListCardWidget extends StatelessWidget {
final int count;
const RequestListCardWidget({Key? key, required this.count}) : super(key: key);
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: count,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: const EdgeInsets.only(bottom: 15),
child: buildRequestContainer(context),
);
});
}
Widget buildRequestContainer(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
"Toyota Crolla".toText(fontSize: 16, isBold: true),
showItem("Model:", "2019"),
],
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start,
children: [
"Riyadh".toText(
color: MyColors.lightTextColor,
),
"9 Hours Ago".toText(color: MyColors.lightTextColor),
],
),
],
),
showItem("Customer Name", "Abdullah"),
showItem("Description", "Looking for the car as soon as possible"),
showItem("Price Range:", ""),
Row(
children: [
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
"30,000".toText(fontSize: 16, isBold: true),
2.width,
"SAR:".toText(
color: MyColors.lightTextColor,
),
],
),
),
const Icon(Icons.arrow_forward)
],
),
],
).toWhiteContainer(
width: double.infinity,
allPading: 12,
onTap: () {
navigateWithName(context, ProviderAppRoutes.requestsDetailPage);
},
);
}
Widget showItem(String title, String value) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (title.isNotEmpty)
title.toText(
color: MyColors.lightTextColor,
),
if (title.isNotEmpty) 2.width,
if (value.isNotEmpty) Expanded(child: value.toText(isBold: true)),
],
);
}
}

@ -1,19 +1,124 @@
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/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/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/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/chat_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.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/info_bottom_sheet.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/txt_field.dart';
import '../../config/provider_routes.dart'; import 'package:provider/provider.dart';
import '../dashboard/widget/request_list_card_widget.dart';
class RequestDetailPage extends StatelessWidget { class RequestDetailPage extends StatelessWidget {
const RequestDetailPage({Key? key}) : super(key: key); final RequestDetailPageArguments requestDetailPageArguments;
const RequestDetailPage({Key? key, required this.requestDetailPageArguments}) : super(key: key);
Future buildSendOfferBottomSheet(BuildContext context) {
final requestDetail = requestDetailPageArguments.requestModel;
return showModalBottomSheet(
context: context,
isScrollControlled: true,
enableDrag: true,
builder: (BuildContext context) {
return Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
return InfoBottomSheet(
title: "Make an offer".toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
description: Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
12.height,
TxtField(
value: requestsVM.offerPrice,
errorValue: requestsVM.offerPriceError,
keyboardType: TextInputType.number,
hint: "Enter amount",
onChanged: (v) => requestsVM.updateOfferPrice(v),
),
12.height,
TxtField(
maxLines: 5,
value: requestsVM.offerDescription,
errorValue: requestsVM.offerDescriptionError,
keyboardType: TextInputType.text,
hint: "Description",
onChanged: (v) => requestsVM.updateOfferDescription(v),
),
],
),
25.height,
ShowFillButton(
title: "Submit",
onPressed: () {
requestsVM.onSendOfferPressed(
context: context,
receiverId: requestDetail.customerID,
message: requestsVM.offerDescription,
requestId: requestDetail.id,
offerPrice: requestsVM.offerPrice,
requestModel: requestDetail,
requestIndex: requestDetailPageArguments.requestIndex,
isFromChatScreen: false,
);
},
maxWidth: double.infinity,
),
19.height,
],
),
));
});
},
);
}
Widget buildBottomButton({required RequestStatus requestStatus, required String statusText, required BuildContext context, required Function() onViewChatTapped}) {
switch (requestStatus) {
case RequestStatus.submitted:
case RequestStatus.inProgress:
case RequestStatus.paid:
case RequestStatus.shipping:
return ShowFillButton(
maxWidth: double.infinity,
margin: const EdgeInsets.all(15),
maxHeight: 55,
title: "View Chat",
isBold: false,
onPressed: onViewChatTapped,
);
case RequestStatus.completed:
case RequestStatus.cancelled:
case RequestStatus.expired:
case RequestStatus.pending:
return buildDisabledButton(statusText);
}
}
Widget buildDisabledButton(String text) {
return ShowFillButton(
backgroundColor: MyColors.grey98Color.withOpacity(0.3),
txtColor: MyColors.lightTextColor,
maxWidth: double.infinity,
margin: const EdgeInsets.all(15),
maxHeight: 55,
title: text,
isBold: false,
onPressed: () {},
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -42,14 +147,52 @@ class RequestDetailPage extends StatelessWidget {
left: 21, left: 21,
), ),
), ),
ShowFillButton( if (!requestDetailPageArguments.requestModel.isChatted) ...[
title: "Send Offer", ShowFillButton(
maxWidth: double.infinity, maxWidth: double.infinity,
margin: const EdgeInsets.all(21), margin: const EdgeInsets.all(15),
onPressed: () { maxHeight: 55,
navigateWithName(context, ProviderAppRoutes.sendOfferPage); title: "Send Offer",
}, isBold: false,
), fontSize: 18,
onPressed: () => buildSendOfferBottomSheet(context),
),
] else ...[
buildBottomButton(
requestStatus: requestDetailPageArguments.requestModel.requestStatus,
statusText: "Offer ${requestDetailPageArguments.requestModel.requestStatusName}",
context: context,
onViewChatTapped: () async {
ChatViewArguments chatViewArguments = ChatViewArguments(
chatTypeEnum: ChatTypeEnum.requestOffer,
receiverId: requestDetailPageArguments.requestModel.customerID,
senderId: AppState().getUser.data!.userInfo!.userId.toString(),
requestId: requestDetailPageArguments.requestModel.id,
providerIndex: -1,
// This will be only sent in case of customer
requestModel: requestDetailPageArguments.requestModel,
requestIndex: requestDetailPageArguments.requestIndex, // This will be only sent in case of provider
);
final chatVM = context.read<ChatVM>();
await chatVM
.getUsersChatMessagesForProvider(
customerId: requestDetailPageArguments.requestModel.customerId,
context: context,
requestOfferId: 0,
requestId: requestDetailPageArguments.requestModel.id,
customerRequestIndex: requestDetailPageArguments.requestIndex,
)
.whenComplete(
() => navigateWithName(
context,
AppRoutes.chatView,
arguments: chatViewArguments,
),
);
},
),
],
], ],
), ),
), ),
@ -57,6 +200,7 @@ class RequestDetailPage extends StatelessWidget {
} }
Widget buildRequestContainer(BuildContext context) { Widget buildRequestContainer(BuildContext context) {
final requestDetail = requestDetailPageArguments.requestModel;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -69,8 +213,9 @@ class RequestDetailPage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
"Toyota Crolla".toText(fontSize: 16, isBold: true), requestDetail.vehicleTypeName.toText(fontSize: 16, isBold: true),
showItem("Model:", "2019"), showItem("Manufacturer:", requestDetail.brand),
showItem("Model:", "${requestDetail.year}"),
], ],
), ),
), ),
@ -78,28 +223,40 @@ class RequestDetailPage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
"Riyadh".toText( "${requestDetail.city ?? ""} ${requestDetail.countryName}".toText(
color: MyColors.lightTextColor, color: MyColors.lightTextColor,
), ),
"9 Hours Ago".toText(color: MyColors.lightTextColor), requestDetail.createdOn.getTimeAgo().toText(color: MyColors.lightTextColor),
], ],
), ),
], ],
), ),
showItem("Customer Name", "Abdullah"), showItem("Customer Name", requestDetail.customerName),
showItem("Description", "Looking for the car as soon as possible"), showItem("Description", requestDetail.description),
showItem("Price Range:", ""), showItem("Price Range:", ""),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
"30,000".toText(fontSize: 16, isBold: true), Row(
2.width, crossAxisAlignment: CrossAxisAlignment.end,
"SAR:".toText( children: [
color: MyColors.lightTextColor, "${requestDetail.price.toInt()}".toText(fontSize: 25, isBold: true),
2.width,
"SAR".toText(color: MyColors.lightTextColor, fontSize: 16, height: 2.3),
],
),
Row(
children: [
Utils.statusContainerChip(
text: "Offer ${requestDetail.requestStatusName}",
chipColor: MyColors.grey98Color.withOpacity(0.3),
textColor: MyColors.lightTextColor,
),
],
), ),
], ],
), ),

@ -1,4 +1,4 @@
import 'package:car_provider_app/views/settings/branch/dealer/widget/add_phone_num_wiget.dart'; import 'package:car_provider_app/view_models/service_view_model.dart';
import 'package:car_provider_app/views/settings/branch/dealer/widget/assign_dealer_user_sheet.dart'; import 'package:car_provider_app/views/settings/branch/dealer/widget/assign_dealer_user_sheet.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,8 +14,6 @@ import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
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 '../../../../view_models/service_view_model.dart';
class DealerUserPage extends StatefulWidget { class DealerUserPage extends StatefulWidget {
String branchId; String branchId;

@ -12,7 +12,6 @@ import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/user_view_model.dart'; import 'package:mc_common_app/view_models/user_view_model.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/dropdown/dropdow_field.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/tab/login_email_tab.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';
@ -88,10 +87,11 @@ class _AddPhoneNumWidgetState extends State<AddPhoneNumWidget> {
onPressed: () { onPressed: () {
//User Role: Dealer|Manager for a branch //User Role: Dealer|Manager for a branch
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (validation()) if (validation()) {
userVM.performBasicOtpRegisterPage(context, countryCode: countryCode, phoneNum: phoneNum, role: 7, isNeedToPassToken: true, reloadPage: () { userVM.performBasicOtpRegisterPage(context, countryCode: countryCode, phoneNum: phoneNum, role: 7, isNeedToPassToken: true, reloadPage: () {
pop(context); pop(context);
}); });
}
}, },
), ),
), ),

@ -14,6 +14,7 @@ import 'package:mc_common_app/widgets/button/show_fill_button.dart';
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';
// ignore: must_be_immutable
class AssignDealerUserSheet extends StatefulWidget { class AssignDealerUserSheet extends StatefulWidget {
String branchId; String branchId;
VoidCallback callBackFunc; VoidCallback callBackFunc;
@ -179,11 +180,11 @@ class _AssignDealerUserSheetState extends State<AssignDealerUserSheet> {
bool validation() { bool validation() {
bool isValid = false; bool isValid = false;
provider.allProviderDealersList.forEach((element) { for (var element in provider.allProviderDealersList) {
if (element.isBranchUser) { if (element.isBranchUser) {
isValid = true; isValid = true;
} }
}); }
return isValid; return isValid;
} }
} }

@ -1,12 +1,7 @@
import 'dart:convert';
import 'dart:io';
import 'package:car_provider_app/view_models/service_view_model.dart'; import 'package:car_provider_app/view_models/service_view_model.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:car_provider_app/view_models/branch_view_model.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.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';

@ -1,10 +1,9 @@
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/view_models/service_view_model.dart';
import 'package:car_provider_app/views/settings/schedule/widgets/chips_picker_item.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/chips_picker_item.dart';
import 'package:car_provider_app/views/settings/schedule/widgets/select_days_sheet.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/select_days_sheet.dart';
import 'package:car_provider_app/views/settings/schedule/widgets/select_services_sheet.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/select_services_sheet.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/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/appointments_models/schedule_model.dart'; import 'package:mc_common_app/models/appointments_models/schedule_model.dart';

@ -28,8 +28,6 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
void initState() { void initState() {
// TODO: implement initState // TODO: implement initState
super.initState(); super.initState();
print("fffffffffkk");
print(widget.branchId);
context.read<ScheduleVM>().getSchedules(widget.branchId ?? ""); context.read<ScheduleVM>().getSchedules(widget.branchId ?? "");
} }

@ -46,9 +46,6 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
print(widget.matchServicesArguments!.oldBranch);
print(widget.matchServicesArguments!.newBranch);
print(widget.matchServicesArguments!.categoryId);
return Scaffold( return Scaffold(
appBar: const CustomAppBar( appBar: const CustomAppBar(
title: "Select Services", title: "Select Services",

@ -1,4 +1,3 @@
import 'package:car_provider_app/view_models/service_view_model.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';
@ -8,7 +7,6 @@ import 'package:mc_common_app/utils/navigator.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/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_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';
class ItemsSelectionSheet extends StatefulWidget { class ItemsSelectionSheet extends StatefulWidget {
final List<ItemData> serviceItems; final List<ItemData> serviceItems;
@ -151,6 +149,5 @@ class _ItemsSelectionSheetState extends State<ItemsSelectionSheet> {
updateTempItem(int index, bool value) { updateTempItem(int index, bool value) {
tempItems![index].isUpdateOrSelected = value; tempItems![index].isUpdateOrSelected = value;
setState(() {}); setState(() {});
;
} }
} }

@ -6,8 +6,6 @@ import 'package:mc_common_app/extensions/int_extensions.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/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/tab/menu_tabs.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class MySubscriptionsPage extends StatelessWidget { class MySubscriptionsPage extends StatelessWidget {

@ -1,8 +1,8 @@
import 'package:car_provider_app/view_models/subscriptions_view_model.dart'; import 'package:car_provider_app/view_models/subscriptions_view_model.dart';
import 'package:car_provider_app/views/subscriptions/widget/subscriptions_card.dart'; import 'package:car_provider_app/views/subscriptions/widget/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/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';

@ -5,9 +5,9 @@ import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart'; import 'package:mc_common_app/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/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class SubscriptionsCard extends StatelessWidget { class SubscriptionsCard extends StatelessWidget {
Subscription subscription; Subscription subscription;
bool isSubscribed; bool isSubscribed;

@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1 version: 1.0.0+1
environment: environment:
sdk: ">=2.12.0 <3.0.0" sdk: ">=2.17.0 <3.0.0"
# Dependencies specify other packages that your package needs in order to work. # Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions # To automatically upgrade your package dependencies to the latest versions

Loading…
Cancel
Save