Added Services Widget on HomeScreen

aamir_dev
faizatflutter 11 months ago
parent cbbc86d998
commit cf13f4b44e

@ -1,26 +1,25 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.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/config/routes.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_provider.dart';
import 'package:mc_common_app/view_models/service_view_model.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/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/dialogs_and_bottomsheets.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/dashboard_view_model_provider.dart';
import 'package:mc_common_app/view_models/service_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/dropdown/dropdow_field.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:mc_common_app/widgets/row_with_arrow.dart'; import 'package:mc_common_app/widgets/row_with_arrow.dart';
import 'package:mc_common_app/widgets/tab/role_type_tab.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class BranchListPage extends StatelessWidget { class BranchListPage extends StatelessWidget {
@ -144,7 +143,7 @@ class BranchListPage extends StatelessWidget {
), ),
], ],
), ),
2.height, 5.height,
// branchModel.distanceKm == null // branchModel.distanceKm == null
// ? const SizedBox() // ? const SizedBox()
// : Row( // : Row(

@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'package:car_provider_app/main.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';

@ -1,15 +1,16 @@
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/view_models/service_view_model.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:car_provider_app/views/branch_management/services/duplication/sheet/items_selection_sheet.dart'; import 'package:car_provider_app/views/branch_management/services/duplication/sheet/items_selection_sheet.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/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:flutter_svg/flutter_svg.dart'; 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/models/services_models/item_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.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/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';
@ -17,12 +18,11 @@ import 'package:mc_common_app/widgets/dropdown/dropdown_text.dart';
import 'package:mc_common_app/widgets/empty_widget.dart'; import 'package:mc_common_app/widgets/empty_widget.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 'package:easy_localization/easy_localization.dart';
class MatchedServicesPage extends StatefulWidget { class MatchedServicesPage extends StatefulWidget {
final MatchServicesArguments? matchServicesArguments; final MatchServicesArguments? matchServicesArguments;
const MatchedServicesPage(this.matchServicesArguments, {Key? key}) : super(key: key); const MatchedServicesPage(this.matchServicesArguments, {super.key});
@override @override
State<MatchedServicesPage> createState() => _MatchedServicesPageState(); State<MatchedServicesPage> createState() => _MatchedServicesPageState();
@ -39,7 +39,11 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
} }
getMatchedServices() { getMatchedServices() {
serviceVM.getAllMatchedServices(widget.matchServicesArguments!.oldBranch, widget.matchServicesArguments!.newBranch, widget.matchServicesArguments!.categoryId); serviceVM.getAllMatchedServices(
widget.matchServicesArguments!.oldBranch,
widget.matchServicesArguments!.newBranch,
widget.matchServicesArguments!.categoryId,
);
} }
@override @override
@ -53,47 +57,41 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
height: double.infinity, height: double.infinity,
child: Column( child: Column(
children: [ children: [
DropDownText(widget.matchServicesArguments!.oldBranchName).toContainer( 12.height,
padding: const EdgeInsets.only( DropDownText(
left: 14, title: widget.matchServicesArguments!.oldBranchName,
right: 14, showDropDownIcon: false,
top: 21,
),
), ),
12.height, 12.height,
Row( GestureDetector(
mainAxisAlignment: MainAxisAlignment.spaceBetween, onTap: () {
children: [ // Toggle the checkbox value when the row is tapped
Row( bool newValue = !context.read<ServiceVM>().isAllSelected;
children: [ serviceVM.selectAllServices(newValue);
Checkbox( },
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
SizedBox(
height: 30,
width: 30,
child: Checkbox(
value: context.watch<ServiceVM>().isAllSelected, value: context.watch<ServiceVM>().isAllSelected,
onChanged: (v) { onChanged: (v) {
serviceVM.selectAllServices(v ?? false); serviceVM.selectAllServices(v ?? false);
}, },
), ),
LocaleKeys.selectAll.tr().toText(isBold: true) ),
], LocaleKeys.selectAll.tr().toText(fontSize: 14),
), ],
Container( ),
alignment: Alignment.centerRight,
margin: const EdgeInsets.symmetric(horizontal: 14, vertical: 7),
child: LocaleKeys.unselectAll.tr().toText(
color: MyColors.primaryColor,
isUnderLine: true,
isBold: true,
),
).onPress(() {
serviceVM.selectAllServices(false);
}),
],
), ),
12.height, 12.height,
Expanded( Expanded(
child: Consumer<ServiceVM>(builder: (context, model, _) { child: Consumer<ServiceVM>(builder: (context, ServiceVM serviceVM, _) {
if (model.matchedServices == null) { if (serviceVM.matchedServices == null) {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} else if (model.matchedServices!.isEmpty) { } else if (serviceVM.matchedServices!.isEmpty) {
return EmptyWidget(text: LocaleKeys.noServicesAvailable.tr(), isWrappedColumn: false); return EmptyWidget(text: LocaleKeys.noServicesAvailable.tr(), isWrappedColumn: false);
} }
return ListView.separated( return ListView.separated(
@ -103,13 +101,13 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Checkbox( Checkbox(
value: model.matchedServices![index].isExpandedOrSelected, value: serviceVM.matchedServices![index].isExpandedOrSelected,
onChanged: (v) { onChanged: (v) {
if (model.matchedServices![index].serviceItems!.isEmpty) { if (serviceVM.matchedServices![index].serviceItems!.isEmpty) {
Utils.showToast(LocaleKeys.noItemsToShow.tr()); Utils.showToast(LocaleKeys.noAvailableItems.tr());
} else { } else {
model.matchedServices![index].isExpandedOrSelected = v ?? false; serviceVM.matchedServices![index].isExpandedOrSelected = v ?? false;
model.updateServiceItem(index, model.matchedServices![index].isExpandedOrSelected); serviceVM.updateServiceItem(index, serviceVM.matchedServices![index].isExpandedOrSelected);
} }
}, },
), ),
@ -118,8 +116,9 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
model.matchedServices![index].serviceDescription.toString().toText(fontSize: 16, isBold: true), serviceVM.matchedServices![index].serviceDescription.toString().toText(fontSize: 16, isBold: true),
"${model.matchedServices![index].serviceItems!.where((c) => c.isUpdateOrSelected == true).length} items selected out of ${model.matchedServices![index].serviceItems!.length}".toText(color: MyColors.lightTextColor) "${serviceVM.matchedServices![index].serviceItems!.where((c) => c.isUpdateOrSelected == true).length} items selected out of ${serviceVM.matchedServices![index].serviceItems!.length}"
.toText(color: MyColors.lightTextColor)
], ],
), ),
), ),
@ -134,9 +133,9 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
showMyBottomSheet( showMyBottomSheet(
context, context,
child: ItemsSelectionSheet( child: ItemsSelectionSheet(
model.matchedServices![index].serviceItems ?? [], serviceVM.matchedServices![index].serviceItems ?? [],
onItemCopied: (List<ItemData> selected) { onItemCopied: (List<ItemData> selected) {
model.copyItems(index, selected); serviceVM.copyItems(index, selected);
}, },
), ),
); );
@ -147,7 +146,7 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
return 8.height; return 8.height;
}, },
padding: const EdgeInsets.symmetric(horizontal: 14), padding: const EdgeInsets.symmetric(horizontal: 14),
itemCount: model.matchedServices!.length, itemCount: serviceVM.matchedServices!.length,
); );
}), }),
), ),
@ -164,7 +163,7 @@ class _MatchedServicesPageState extends State<MatchedServicesPage> {
}, },
), ),
], ],
), ).padding(const EdgeInsets.symmetric(horizontal: 14)),
), ),
); );
} }

@ -1,8 +1,6 @@
import 'package:mc_common_app/config/routes.dart'; import 'package:easy_localization/easy_localization.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/config/routes.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/generated/locale_keys.g.dart';
@ -10,11 +8,9 @@ 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/view_models/service_view_model.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 'package:easy_localization/easy_localization.dart';
import 'package:flutter_svg/svg.dart';
import 'package:geolocator/geolocator.dart';
class MatchServicesArguments { class MatchServicesArguments {
int oldBranch, newBranch, categoryId; int oldBranch, newBranch, categoryId;
@ -24,9 +20,9 @@ class MatchServicesArguments {
} }
class ApprovedBranchesListSheet extends StatelessWidget { class ApprovedBranchesListSheet extends StatelessWidget {
int newBranch, categoryId; final int branchId, categoryId;
ApprovedBranchesListSheet({required this.newBranch, required this.categoryId, Key? key}) : super(key: key); const ApprovedBranchesListSheet({required this.branchId, required this.categoryId, super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -37,10 +33,8 @@ class ApprovedBranchesListSheet extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
"Select Branch".toText(fontSize: 20, isBold: true), LocaleKeys.selectBranch.tr().toText(fontSize: 20, isBold: true),
"Select the branch to copy their items to this branch. You can modify the selection at any time.".toText( LocaleKeys.selectBranchToCopyServices.tr().toText(fontSize: 12),
fontSize: 12,
),
12.height, 12.height,
Expanded( Expanded(
child: Consumer<ServiceVM>( child: Consumer<ServiceVM>(
@ -50,25 +44,20 @@ class ApprovedBranchesListSheet extends StatelessWidget {
} else { } else {
List<BranchDetailModel> branches = []; List<BranchDetailModel> branches = [];
if (model.branches!.data != null) { if (model.branches!.data != null) {
branches = model.branches!.data!.serviceProviderBranch!.where((element) => model.selectedBranchStatus == element.statusId).toList(); branches = model.branches!.data!.serviceProviderBranch!.where((element) => element.branchStatus == BranchStatusEnum.approvedOrActive && element.id != branchId).toList();
} }
return branches.isEmpty return branches.isEmpty
? Center(child: Text(LocaleKeys.no_branch.tr())) ? Center(child: Text(LocaleKeys.noBranchFound.tr()))
: ListView.separated( : ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
return Row( return Row(
children: [ children: [
Container( SizedBox(
width: 74, width: 70,
height: 50, height: 55,
decoration: const BoxDecoration( child: ClipRRect(
color: MyColors.darkPrimaryColor, borderRadius: const BorderRadius.all(Radius.circular(8)),
borderRadius: BorderRadius.all(Radius.circular(8)), child: branches[index].branchProfileImage.buildNetworkImage(fit: BoxFit.cover),
),
padding: const EdgeInsets.all(6),
child: SvgPicture.asset(
MyAssets.icBranches,
color: Colors.white,
), ),
), ),
12.width, 12.width,
@ -77,22 +66,6 @@ class ApprovedBranchesListSheet extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
Row(
children: [
const Icon(
Icons.place,
size: 12,
color: MyColors.darkPrimaryColor,
),
Geolocator.distanceBetween(AppState().currentLocation.latitude, AppState().currentLocation.latitude, double.parse(branches[index].latitude ?? "0"),
double.parse(branches[index].longitude ?? "0"))
.toStringAsFixed(2)
.toText(
fontSize: 12,
color: MyColors.darkPrimaryColor,
)
],
),
Text( Text(
branches[index].branchName ?? "", branches[index].branchName ?? "",
style: const TextStyle( style: const TextStyle(
@ -100,15 +73,12 @@ class ApprovedBranchesListSheet extends StatelessWidget {
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
), ),
"Tap to select".toText(fontSize: 10, color: MyColors.grey70Color), "${LocaleKeys.totalNumberOfServices.tr()} ${branches[index].branchServices!.length}".toText(fontSize: 10, color: MyColors.grey70Color),
], ],
), ),
), ),
12.width, 12.width,
const Icon( const Icon(Icons.arrow_forward_rounded, size: 16),
Icons.arrow_forward_rounded,
size: 16,
),
], ],
).toContainer(isShadowEnabled: true).onPress(() async { ).toContainer(isShadowEnabled: true).onPress(() async {
// branches[index].countryID = model.branchs!.data!.countryID; // branches[index].countryID = model.branchs!.data!.countryID;
@ -119,7 +89,7 @@ class ApprovedBranchesListSheet extends StatelessWidget {
arguments: MatchServicesArguments( arguments: MatchServicesArguments(
oldBranch: branches[index].id ?? 0, oldBranch: branches[index].id ?? 0,
oldBranchName: branches[index].branchName ?? "", oldBranchName: branches[index].branchName ?? "",
newBranch: newBranch, newBranch: branchId,
categoryId: categoryId, categoryId: categoryId,
), ),
); );

@ -104,7 +104,7 @@ class _ServicesListPageState extends State<ServicesListPage> {
showMyBottomSheet( showMyBottomSheet(
context, context,
child: ApprovedBranchesListSheet( child: ApprovedBranchesListSheet(
newBranch: int.parse(categoryData.branchId ?? ''), branchId: int.parse(categoryData.branchId ?? ''),
categoryId: categoryData.id ?? 0, categoryId: categoryData.id ?? 0,
), ),
); );

@ -1,17 +1,13 @@
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:easy_localization/easy_localization.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/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/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/appointments_models/appointment_list_model.dart'; import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/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/dashboard_view_model_provider.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';
@ -19,10 +15,9 @@ 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: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';
class HomeFragment extends StatelessWidget { class HomeFragment extends StatelessWidget {
const HomeFragment({Key? key}) : super(key: key); const HomeFragment({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -64,23 +59,15 @@ class HomeFragment extends StatelessWidget {
context.read<DashboardVMProvider>().onNavbarTapped(1); context.read<DashboardVMProvider>().onNavbarTapped(1);
}, },
).horPaddingMain(), ).horPaddingMain(),
// const AppointmentSliderWidget().horPaddingMain(), CommonAppointmentSliderWidget(
onAppointmentClick: (AppointmentListModel value) => navigateWithName(
//TODO TESTING PENDING context,
if (AppState().currentAppType == AppType.provider && context.read<AppointmentsVM>().myUpComingAppointments.isEmpty) ...[ AppRoutes.appointmentDetailList,
LocaleKeys.noUpcomingAppointments.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium).paddingAll(21), arguments: value,
] else ...[ )).toWhiteContainer(width: double.infinity, backgroundColor: Colors.transparent).margin(
CommonAppointmentSliderWidget( left: 21,
onAppointmentClick: (AppointmentListModel value) { right: 21,
navigateWithName(context, AppRoutes.appointmentDetailList, arguments: value); ),
},
)
.toWhiteContainer(
width: double.infinity,
backgroundColor: Colors.transparent,
)
.margin(left: 21, right: 21),
],
24.height, 24.height,
ViewAllWidget( ViewAllWidget(
title: LocaleKeys.myBranches.tr(), title: LocaleKeys.myBranches.tr(),

@ -42,7 +42,9 @@ dependencies:
mc_common_app: mc_common_app:
# path: D:\Development\car_common_app # path: D:\Development\car_common_app
# path: /Users/amir/StudioProjects/car_common_app # path: /Users/amir/StudioProjects/car_common_app
path: /Volumes/Data/Projects/Flutter/car_common_app # path: /Volumes/Data/Projects/Flutter/car_common_app
path: /Users/faizhashmi/Development/Projects/MyProjects/CloudSolutions/car_common_app

Loading…
Cancel
Save