Merge branch 'faiz_development_common' into master_new_changes
# Conflicts: # lib/classes/app_state.dart # lib/services/payments_service.dart # lib/view_models/payment_view_model.dart # lib/view_models/service_view_model.dart # lib/views/setting_options/setting_options_more.dart # lib/views/user/login_with_password_page.dartmaster_new_changes
commit
8d9c4091fb
Binary file not shown.
|
After Width: | Height: | Size: 3.0 KiB |
@ -0,0 +1,26 @@
|
||||
import 'package:mc_common_app/view_models/ad_view_model.dart';
|
||||
|
||||
class AppInfoModel {
|
||||
int? id;
|
||||
String? header;
|
||||
String? content;
|
||||
bool? isActive;
|
||||
int? channel;
|
||||
List<ImageModel>? appInfoImages;
|
||||
|
||||
AppInfoModel({this.id, this.header, this.content, this.isActive, this.channel, this.appInfoImages});
|
||||
|
||||
AppInfoModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
header = json['header'];
|
||||
content = json['content'];
|
||||
isActive = json['isActive'];
|
||||
channel = json['channel'];
|
||||
if (json['appInfoImages'] != null) {
|
||||
appInfoImages = <ImageModel>[];
|
||||
json['appInfoImages'].forEach((v) {
|
||||
appInfoImages!.add(ImageModel.fromJson(v));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,36 @@
|
||||
import 'package:mc_common_app/view_models/ad_view_model.dart';
|
||||
|
||||
class ContactInfoModel {
|
||||
int? id;
|
||||
String? companyName;
|
||||
String? mobileNo;
|
||||
String? phoneNo;
|
||||
String? email;
|
||||
String? address;
|
||||
String? latitude;
|
||||
String? longitude;
|
||||
int? channel;
|
||||
bool? isActive;
|
||||
List<ImageModel>? contactInfoImages;
|
||||
|
||||
ContactInfoModel({this.id, this.companyName, this.mobileNo, this.phoneNo, this.email, this.address, this.latitude, this.longitude, this.channel, this.isActive, this.contactInfoImages});
|
||||
|
||||
ContactInfoModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
companyName = json['companyName'];
|
||||
mobileNo = json['mobileNo'];
|
||||
phoneNo = json['phoneNo'];
|
||||
email = json['email'];
|
||||
address = json['address'];
|
||||
latitude = json['latitude'];
|
||||
longitude = json['longitude'];
|
||||
channel = json['channel'];
|
||||
isActive = json['isActive'];
|
||||
if (json['contactInfoImages'] != null) {
|
||||
contactInfoImages = <ImageModel>[];
|
||||
json['contactInfoImages'].forEach((v) {
|
||||
contactInfoImages!.add(ImageModel.fromJson(v));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
class FAQsModel {
|
||||
int? id;
|
||||
String? question;
|
||||
String? answer;
|
||||
int? sequenceNo;
|
||||
bool? isActive;
|
||||
int? channel;
|
||||
bool? isCollapsed;
|
||||
|
||||
FAQsModel({this.id, this.question, this.answer, this.sequenceNo, this.isActive, this.channel, this.isCollapsed});
|
||||
|
||||
FAQsModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
question = json['question'];
|
||||
answer = json['answer'];
|
||||
sequenceNo = json['sequenceNo'];
|
||||
isActive = json['isActive'];
|
||||
channel = json['channel'];
|
||||
isCollapsed = false;
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['id'] = id;
|
||||
data['question'] = question;
|
||||
data['answer'] = answer;
|
||||
data['sequenceNo'] = sequenceNo;
|
||||
data['isActive'] = isActive;
|
||||
data['channel'] = channel;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,27 @@
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/models/requests_models/request_model.dart';
|
||||
import 'package:mc_common_app/utils/enums.dart';
|
||||
|
||||
class ShippingRequestModel {
|
||||
int? id;
|
||||
int? requestID;
|
||||
RequestModel? request;
|
||||
int? shippingStatus;
|
||||
ShippingRequestStatusEnum? shippingStatusEnum;
|
||||
String? deliveredOn;
|
||||
String? comment;
|
||||
String? createdOn;
|
||||
|
||||
ShippingRequestModel({this.id, this.requestID, this.request, this.shippingStatus, this.deliveredOn, this.comment, this.createdOn});
|
||||
|
||||
ShippingRequestModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
requestID = json['requestID'];
|
||||
request = json['request'];
|
||||
shippingStatus = json['shippingStatus'];
|
||||
shippingStatusEnum = json['shippingStatus'] != null ? (json['shippingStatus'] as int).toShippingStatusEnum() : ShippingRequestStatusEnum.initiated;
|
||||
deliveredOn = json['deliveredOn'];
|
||||
comment = json['comment'];
|
||||
createdOn = json['createdOn'];
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,84 @@
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:mc_common_app/api/api_client.dart';
|
||||
import 'package:mc_common_app/classes/app_state.dart';
|
||||
import 'package:mc_common_app/classes/consts.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/models/general_models/generic_resp_model.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/app_info_model.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/contact_infos_model.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/faqs_model.dart';
|
||||
import 'package:mc_common_app/utils/utils.dart';
|
||||
|
||||
abstract class SettingOptionsRepo {
|
||||
Future<List<FAQsModel>> getAllFaqs();
|
||||
|
||||
Future<List<ContactInfoModel>> getAllContactInfos();
|
||||
|
||||
Future<List<AppInfoModel>> getAppInfoList();
|
||||
}
|
||||
|
||||
class SettingOptionsRepoImp extends SettingOptionsRepo {
|
||||
ApiClient apiClient = injector.get<ApiClient>();
|
||||
AppState appState = injector.get<AppState>();
|
||||
|
||||
@override
|
||||
Future<List<FAQsModel>> getAllFaqs() async {
|
||||
String token = appState.getUser.data!.accessToken ?? "";
|
||||
|
||||
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(
|
||||
(json) => GenericRespModel.fromJson(json),
|
||||
ApiConsts.getAllFAQs,
|
||||
token: token,
|
||||
);
|
||||
|
||||
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
|
||||
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
|
||||
return [];
|
||||
}
|
||||
|
||||
List<FAQsModel> list = List.generate(genericRespModel.data.length, (index) => FAQsModel.fromJson(genericRespModel.data[index]));
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<ContactInfoModel>> getAllContactInfos() async {
|
||||
String token = appState.getUser.data!.accessToken ?? "";
|
||||
|
||||
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(
|
||||
(json) => GenericRespModel.fromJson(json),
|
||||
ApiConsts.getContactInfo,
|
||||
token: token,
|
||||
);
|
||||
|
||||
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
|
||||
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
|
||||
return [];
|
||||
}
|
||||
|
||||
List<ContactInfoModel> list = List.generate(genericRespModel.data.length, (index) => ContactInfoModel.fromJson(genericRespModel.data[index]));
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<AppInfoModel>> getAppInfoList() async {
|
||||
String token = appState.getUser.data!.accessToken ?? "";
|
||||
|
||||
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(
|
||||
(json) => GenericRespModel.fromJson(json),
|
||||
ApiConsts.getAppInfo,
|
||||
token: token,
|
||||
);
|
||||
|
||||
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
|
||||
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
|
||||
return [];
|
||||
}
|
||||
|
||||
List<AppInfoModel> list = List.generate(genericRespModel.data.length, (index) => AppInfoModel.fromJson(genericRespModel.data[index]));
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,72 @@
|
||||
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:mc_common_app/api/api_client.dart';
|
||||
import 'package:mc_common_app/classes/app_state.dart';
|
||||
import 'package:mc_common_app/classes/consts.dart';
|
||||
import 'package:mc_common_app/config/dependency_injection.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/generic_resp_model.dart';
|
||||
import 'package:mc_common_app/models/shipping_models/shipping_status_model.dart';
|
||||
|
||||
import 'package:mc_common_app/utils/enums.dart';
|
||||
import 'package:mc_common_app/utils/utils.dart';
|
||||
|
||||
abstract class ShippingRepo {
|
||||
Future<List<ShippingRequestModel>> getShippingRequestListByStatus({ShippingRequestStatusEnum? shippingStatusEnum, int? requestId});
|
||||
|
||||
Future<GenericRespModel> updateShippingRequestStatus({required ShippingRequestStatusEnum shippingStatusEnum, required int shippingRequestId, String? comment});
|
||||
}
|
||||
|
||||
class ShippingRepoImp extends ShippingRepo {
|
||||
ApiClient apiClient = injector.get<ApiClient>();
|
||||
AppState appState = injector.get<AppState>();
|
||||
|
||||
@override
|
||||
Future<List<ShippingRequestModel>> getShippingRequestListByStatus({ShippingRequestStatusEnum? shippingStatusEnum, int? requestId}) async {
|
||||
String token = appState.getUser.data!.accessToken ?? "";
|
||||
Map<String, String> queryParameters = {
|
||||
"requestID": "${requestId ?? 0}",
|
||||
"shippingStatus": "${shippingStatusEnum != null ? shippingStatusEnum.getIdFromShippingStatusEnum() : 0}",
|
||||
};
|
||||
|
||||
GenericRespModel genericRespModel = await injector.get<ApiClient>().postJsonForObject(
|
||||
(json) => GenericRespModel.fromJson(json),
|
||||
ApiConsts.shippingRequestStatusGet,
|
||||
queryParameters,
|
||||
token: token,
|
||||
);
|
||||
|
||||
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
|
||||
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
|
||||
return [];
|
||||
}
|
||||
|
||||
List<ShippingRequestModel> list = List.generate(genericRespModel.data.length, (index) => ShippingRequestModel.fromJson(genericRespModel.data[index]));
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<GenericRespModel> updateShippingRequestStatus({required ShippingRequestStatusEnum shippingStatusEnum, required int shippingRequestId, String? comment}) async {
|
||||
String token = appState.getUser.data!.accessToken ?? "";
|
||||
Map<String, String> queryParameters = {
|
||||
"id": "$shippingRequestId",
|
||||
"shippingStatus": "${shippingStatusEnum.getIdFromShippingStatusEnum()}",
|
||||
"comment": comment ?? "",
|
||||
};
|
||||
|
||||
GenericRespModel genericRespModel = await injector.get<ApiClient>().postJsonForObject(
|
||||
(json) => GenericRespModel.fromJson(json),
|
||||
ApiConsts.shippingRequestStatusUpdate,
|
||||
queryParameters,
|
||||
token: token,
|
||||
);
|
||||
|
||||
if (genericRespModel.messageStatus != 1 || genericRespModel.data == null) {
|
||||
Utils.showToast(genericRespModel.message ?? LocaleKeys.somethingWrong.tr());
|
||||
}
|
||||
|
||||
return genericRespModel;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,59 @@
|
||||
import 'package:mc_common_app/main.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/app_info_model.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/contact_infos_model.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/faqs_model.dart';
|
||||
import 'package:mc_common_app/repositories/setting_options_repo.dart';
|
||||
import 'package:mc_common_app/utils/enums.dart';
|
||||
import 'package:mc_common_app/utils/utils.dart';
|
||||
import 'package:mc_common_app/view_models/base_view_model.dart';
|
||||
|
||||
class SettingOptionsVM extends BaseVM {
|
||||
final SettingOptionsRepo settingOptionsRepo;
|
||||
|
||||
SettingOptionsVM({required this.settingOptionsRepo});
|
||||
|
||||
List<FAQsModel> faqsList = [];
|
||||
|
||||
Future<void> getAllFaqs() async {
|
||||
setState(ViewState.busy);
|
||||
try {
|
||||
faqsList = await settingOptionsRepo.getAllFaqs();
|
||||
setState(ViewState.idle);
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
logger.i(e.toString());
|
||||
Utils.showToast(e.toString());
|
||||
setState(ViewState.idle);
|
||||
}
|
||||
}
|
||||
|
||||
List<ContactInfoModel> contactInfosList = [];
|
||||
|
||||
Future<void> getAllContactInfosList() async {
|
||||
setState(ViewState.busy);
|
||||
try {
|
||||
contactInfosList = await settingOptionsRepo.getAllContactInfos();
|
||||
setState(ViewState.idle);
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
logger.i(e.toString());
|
||||
Utils.showToast(e.toString());
|
||||
setState(ViewState.idle);
|
||||
}
|
||||
}
|
||||
|
||||
List<AppInfoModel> appInfoList = [];
|
||||
|
||||
Future<void> getAppInfoList() async {
|
||||
setState(ViewState.busy);
|
||||
try {
|
||||
appInfoList = await settingOptionsRepo.getAppInfoList();
|
||||
setState(ViewState.idle);
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
logger.i(e.toString());
|
||||
Utils.showToast(e.toString());
|
||||
setState(ViewState.idle);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,110 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/main.dart';
|
||||
import 'package:mc_common_app/models/general_models/enums_model.dart';
|
||||
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
|
||||
import 'package:mc_common_app/models/general_models/widgets_models.dart';
|
||||
import 'package:mc_common_app/models/shipping_models/shipping_status_model.dart';
|
||||
import 'package:mc_common_app/repositories/common_repo.dart';
|
||||
import 'package:mc_common_app/repositories/shipping_repo.dart';
|
||||
import 'package:mc_common_app/utils/enums.dart';
|
||||
import 'package:mc_common_app/utils/utils.dart';
|
||||
import 'package:mc_common_app/view_models/base_view_model.dart';
|
||||
|
||||
class ShippingManagementVM extends BaseVM {
|
||||
final ShippingRepo shippingRepo;
|
||||
final CommonRepo commonRepo;
|
||||
|
||||
ShippingManagementVM({required this.shippingRepo, required this.commonRepo});
|
||||
|
||||
List<ShippingRequestModel> shippingRequestsList = [];
|
||||
|
||||
List<EnumsModel> shippingStatusEnums = [];
|
||||
|
||||
List<FilterListModel> shippingRequestFilterOptions = [];
|
||||
List<FilterListModel> shippingRequestStatusesList = [];
|
||||
|
||||
String requestStatusComments = "";
|
||||
|
||||
void updateRequestStatusComments(var value) {
|
||||
requestStatusComments = value;
|
||||
}
|
||||
|
||||
resetFilters() {
|
||||
if (shippingRequestFilterOptions.isEmpty) return;
|
||||
for (var value in shippingRequestFilterOptions) {
|
||||
value.isSelected = false;
|
||||
}
|
||||
shippingRequestFilterOptions[0].isSelected = true;
|
||||
requestStatusComments = "";
|
||||
}
|
||||
|
||||
Future<void> populateShippingRequestFilterList() async {
|
||||
if (shippingRequestFilterOptions.isNotEmpty && shippingRequestStatusesList.isNotEmpty) return;
|
||||
|
||||
shippingStatusEnums = await commonRepo.getEnumTypeValues(enumTypeID: AppEnums.shippingStatusEnumId);
|
||||
shippingRequestFilterOptions.clear();
|
||||
shippingRequestStatusesList.clear();
|
||||
for (int i = 0; i < shippingStatusEnums.length; i++) {
|
||||
shippingRequestFilterOptions.add(FilterListModel(title: shippingStatusEnums[i].enumValueStr, isSelected: false, id: shippingStatusEnums[i].enumValue));
|
||||
shippingRequestStatusesList.add(FilterListModel(title: shippingStatusEnums[i].enumValueStr, isSelected: false, id: shippingStatusEnums[i].enumValue));
|
||||
}
|
||||
|
||||
shippingRequestFilterOptions.insert(0, FilterListModel(title: Utils.getNameByShippingRequestStatusEnum(0.toShippingStatusEnum()), isSelected: true, id: 0));
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> applyFiltersOnShippingRequests({required ShippingRequestStatusEnum shippingRequestStatusEnum}) async {
|
||||
for (var value in shippingRequestFilterOptions) {
|
||||
value.isSelected = false;
|
||||
}
|
||||
if (shippingRequestStatusEnum == ShippingRequestStatusEnum.allRequests) {
|
||||
shippingRequestFilterOptions[0].isSelected = true;
|
||||
await getShippingRequestsListByFilters();
|
||||
notifyListeners();
|
||||
return;
|
||||
}
|
||||
shippingRequestFilterOptions[shippingRequestStatusEnum.getIdFromShippingStatusEnum()].isSelected = true; // -1 to match with the index
|
||||
await getShippingRequestsListByFilters(shippingStatusEnum: shippingRequestStatusEnum);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void updateSelectionInShippingRequestStatuses(int index) {
|
||||
for (var value in shippingRequestStatusesList) {
|
||||
value.isSelected = false;
|
||||
}
|
||||
shippingRequestStatusesList[index].isSelected = true;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<void> getShippingRequestsListByFilters({ShippingRequestStatusEnum? shippingStatusEnum}) async {
|
||||
setState(ViewState.busy);
|
||||
try {
|
||||
shippingRequestsList = await shippingRepo.getShippingRequestListByStatus(shippingStatusEnum: shippingStatusEnum);
|
||||
setState(ViewState.idle);
|
||||
notifyListeners();
|
||||
} catch (e) {
|
||||
logger.i(e.toString());
|
||||
Utils.showToast(e.toString());
|
||||
setState(ViewState.idle);
|
||||
}
|
||||
}
|
||||
|
||||
Future<bool> onUpdateShippingStatusTapped({required BuildContext context, required ShippingRequestStatusEnum shippingStatusEnum, required int shippingRequestId}) async {
|
||||
|
||||
Utils.showLoading(context);
|
||||
try {
|
||||
GenericRespModel? genericRespModel = await shippingRepo.updateShippingRequestStatus(shippingStatusEnum: shippingStatusEnum, shippingRequestId: shippingRequestId);
|
||||
Utils.showToast(genericRespModel.message.toString());
|
||||
Utils.hideLoading(context);
|
||||
return genericRespModel.messageStatus == 1;
|
||||
} catch (e) {
|
||||
logger.i(e.toString());
|
||||
Utils.showToast(e.toString());
|
||||
Utils.hideLoading(context);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,113 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mc_common_app/classes/app_state.dart';
|
||||
import 'package:mc_common_app/config/routes.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/generated/locale_keys.g.dart';
|
||||
import 'package:mc_common_app/models/requests_models/provider_offers_model.dart';
|
||||
import 'package:mc_common_app/theme/colors.dart';
|
||||
import 'package:mc_common_app/utils/enums.dart';
|
||||
import 'package:mc_common_app/utils/navigator.dart';
|
||||
import 'package:mc_common_app/utils/utils.dart';
|
||||
import 'package:mc_common_app/view_models/chat_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';
|
||||
|
||||
class GeneralChatListPage extends StatelessWidget {
|
||||
final OfferListPageArguments generalChatListPageArguments;
|
||||
|
||||
const GeneralChatListPage({super.key, required this.generalChatListPageArguments});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final List<ServiceProvidersOffers> serviceProviderOffers = generalChatListPageArguments.serviceProviderOffers;
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(title: LocaleKeys.offers.tr()),
|
||||
body: serviceProviderOffers.isEmpty
|
||||
? Center(child: LocaleKeys.noOffersShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor))
|
||||
: ListView.separated(
|
||||
itemCount: serviceProviderOffers.length,
|
||||
padding: const EdgeInsets.all(16),
|
||||
itemBuilder: (context, index) {
|
||||
ServiceProvidersOffers offersModel = serviceProviderOffers[index];
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Utils.statusContainerChip(text: "Offer ${Utils.getNameByRequestOfferStatusEnum(offersModel.requestOfferStatusEnum!)}", chipColor: Utils.getChipColorByRequestOfferStatusEnum(offersModel.requestOfferStatusEnum!)),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
(offersModel.name ?? "").toText(fontSize: 16, isBold: true),
|
||||
Center(
|
||||
child: "${offersModel.offerCount}".toText(
|
||||
color: Colors.white,
|
||||
isBold: true,
|
||||
fontSize: 10,
|
||||
),
|
||||
).toContainer(
|
||||
backgroundColor: MyColors.redColor,
|
||||
borderRadius: 100,
|
||||
paddingAll: 1,
|
||||
width: 22,
|
||||
height: 22,
|
||||
),
|
||||
],
|
||||
),
|
||||
8.height,
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
"${offersModel.companyName}".toText(color: MyColors.lightTextColor, fontSize: 14),
|
||||
if (offersModel.createdOn != null && offersModel.createdOn!.isNotEmpty) ...[
|
||||
" | ${DateTime.parse(offersModel.createdOn!).getTimeAgo()}".toText(color: MyColors.lightTextColor, fontSize: 14),
|
||||
],
|
||||
// " | 1 hour ago".toText(
|
||||
// color: MyColors.lightTextColor,
|
||||
// fontSize: 12,
|
||||
// ),
|
||||
],
|
||||
),
|
||||
const Icon(Icons.arrow_forward, color: MyColors.darkIconColor, size: 18),
|
||||
],
|
||||
),
|
||||
],
|
||||
).onPress(() async {
|
||||
ChatViewArgumentsForRequest chatViewArgumentsForRequest = ChatViewArgumentsForRequest(
|
||||
chatTypeEnum: ChatTypeEnum.requestOffer,
|
||||
receiverId: "${offersModel.providerUserId}",
|
||||
senderId: AppState().getUser.data!.userInfo!.userId.toString(),
|
||||
requestId: generalChatListPageArguments.requestId,
|
||||
providerIndex: index,
|
||||
requestIndex: -1, // This will be only send in case of provider
|
||||
);
|
||||
|
||||
ChatViewArguments chatViewArguments = ChatViewArguments(chatTypeEnum: ChatTypeEnum.requestOffer, chatViewArgumentsForRequest: chatViewArgumentsForRequest);
|
||||
|
||||
final chatVM = context.read<ChatVM>();
|
||||
|
||||
await chatVM
|
||||
.getRequestsChatMessagesForCustomer(
|
||||
context: context,
|
||||
providerId: offersModel.providerId ?? 0,
|
||||
requestOfferId: 0,
|
||||
requestId: generalChatListPageArguments.requestId ?? 0,
|
||||
providerOfferIndex: index,
|
||||
)
|
||||
.whenComplete(
|
||||
() => navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments),
|
||||
);
|
||||
}).toContainer(isShadowEnabled: true);
|
||||
},
|
||||
separatorBuilder: (context, index) => 16.height,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,117 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/cupertino.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/generated/locale_keys.g.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/app_info_model.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/contact_infos_model.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/faqs_model.dart';
|
||||
import 'package:mc_common_app/theme/colors.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/setting_options_view_model.dart';
|
||||
import 'package:mc_common_app/views/advertisement/components/picked_images_container_widget.dart';
|
||||
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
|
||||
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class SettingOptionsAppInfo extends StatefulWidget {
|
||||
const SettingOptionsAppInfo({super.key});
|
||||
|
||||
@override
|
||||
State<SettingOptionsAppInfo> createState() => _SettingOptionsAppInfoState();
|
||||
}
|
||||
|
||||
class _SettingOptionsAppInfoState extends State<SettingOptionsAppInfo> {
|
||||
late SettingOptionsVM settingsOptionsVM;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
settingsOptionsVM = context.read<SettingOptionsVM>();
|
||||
scheduleMicrotask(() async {
|
||||
await settingsOptionsVM.getAppInfoList();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
Widget showData(String title, String value) {
|
||||
return Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
title.toText(
|
||||
fontSize: 13,
|
||||
color: MyColors.darkTextColor,
|
||||
),
|
||||
if (title.isNotEmpty) 5.width,
|
||||
Flexible(
|
||||
child: value.toText(
|
||||
fontSize: 13,
|
||||
color: MyColors.lightTextColor,
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
title: LocaleKeys.appInfo.tr(),
|
||||
isRemoveBackButton: false,
|
||||
isDrawerEnabled: false,
|
||||
onBackButtonTapped: () => Navigator.pop(context),
|
||||
),
|
||||
body: Consumer(
|
||||
builder: (BuildContext context, SettingOptionsVM settingsOptionsVM, Widget? child) {
|
||||
return Container(
|
||||
color: MyColors.backgroundColor,
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
child: Column(
|
||||
children: [
|
||||
16.height,
|
||||
Expanded(
|
||||
child: RefreshIndicator(
|
||||
onRefresh: () async => await settingsOptionsVM.getAllFaqs(),
|
||||
child: (settingsOptionsVM.state == ViewState.busy)
|
||||
? const Center(child: CircularProgressIndicator())
|
||||
: settingsOptionsVM.appInfoList.isEmpty
|
||||
? Padding(
|
||||
padding: const EdgeInsets.all(21),
|
||||
child: Center(child: LocaleKeys.somethingWrong.tr().toText(textAlign: TextAlign.center, fontSize: 16, color: MyColors.lightTextColor)),
|
||||
)
|
||||
: ListView.separated(
|
||||
itemCount: settingsOptionsVM.appInfoList.length,
|
||||
padding: const EdgeInsets.all(16),
|
||||
itemBuilder: (context, index) {
|
||||
AppInfoModel appInfoModel = settingsOptionsVM.appInfoList[index];
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
(appInfoModel.header ?? "").toString().toText(fontSize: 16),
|
||||
5.height,
|
||||
(appInfoModel.content ?? "").toString().toText(fontSize: 14, color: MyColors.lightTextColor),
|
||||
if (appInfoModel.appInfoImages != null && appInfoModel.appInfoImages!.isNotEmpty) ...[
|
||||
PickedFilesContainer(
|
||||
pickedFiles: appInfoModel.appInfoImages ?? [],
|
||||
isReview: true,
|
||||
onAddFilePressed: () {},
|
||||
),
|
||||
]
|
||||
],
|
||||
).toContainer(isShadowEnabled: true);
|
||||
},
|
||||
separatorBuilder: (context, index) => 16.height,
|
||||
),
|
||||
)),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,123 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/cupertino.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/generated/locale_keys.g.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/contact_infos_model.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/faqs_model.dart';
|
||||
import 'package:mc_common_app/theme/colors.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/setting_options_view_model.dart';
|
||||
import 'package:mc_common_app/views/advertisement/components/picked_images_container_widget.dart';
|
||||
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
|
||||
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class SettingOptionsContactUs extends StatefulWidget {
|
||||
const SettingOptionsContactUs({super.key});
|
||||
|
||||
@override
|
||||
State<SettingOptionsContactUs> createState() => _SettingOptionsContactUsState();
|
||||
}
|
||||
|
||||
class _SettingOptionsContactUsState extends State<SettingOptionsContactUs> {
|
||||
late SettingOptionsVM settingsOptionsVM;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
settingsOptionsVM = context.read<SettingOptionsVM>();
|
||||
scheduleMicrotask(() async {
|
||||
await settingsOptionsVM.getAllContactInfosList();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
Widget showData(String title, String value) {
|
||||
return Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
title.toText(
|
||||
fontSize: 13,
|
||||
color: MyColors.darkTextColor,
|
||||
),
|
||||
if (title.isNotEmpty) 5.width,
|
||||
Flexible(
|
||||
child: value.toText(
|
||||
fontSize: 13,
|
||||
color: MyColors.lightTextColor,
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
title: LocaleKeys.contactUs.tr(),
|
||||
isRemoveBackButton: false,
|
||||
isDrawerEnabled: false,
|
||||
onBackButtonTapped: () => Navigator.pop(context),
|
||||
),
|
||||
body: Consumer(
|
||||
builder: (BuildContext context, SettingOptionsVM settingsOptionsVM, Widget? child) {
|
||||
return Container(
|
||||
color: MyColors.backgroundColor,
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
child: Column(
|
||||
children: [
|
||||
16.height,
|
||||
Expanded(
|
||||
child: RefreshIndicator(
|
||||
onRefresh: () async => await settingsOptionsVM.getAllFaqs(),
|
||||
child: (settingsOptionsVM.state == ViewState.busy)
|
||||
? const Center(child: CircularProgressIndicator())
|
||||
: settingsOptionsVM.contactInfosList.isEmpty
|
||||
? Padding(
|
||||
padding: const EdgeInsets.all(21),
|
||||
child: Center(child: LocaleKeys.somethingWrong.tr().toText(textAlign: TextAlign.center, fontSize: 16, color: MyColors.lightTextColor)),
|
||||
)
|
||||
: ListView.separated(
|
||||
itemCount: settingsOptionsVM.contactInfosList.length,
|
||||
padding: const EdgeInsets.all(16),
|
||||
itemBuilder: (context, index) {
|
||||
ContactInfoModel contactInfoModel = settingsOptionsVM.contactInfosList[index];
|
||||
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
contactInfoModel.companyName.toString().toText(fontSize: 16),
|
||||
5.height,
|
||||
LocaleKeys.openMapLocation.tr().toText(isUnderLine: true, color: MyColors.darkPrimaryColor, fontSize: 10).onPress(() {}),
|
||||
showData("${LocaleKeys.phoneNumber.tr()}:", "${contactInfoModel.phoneNo}"),
|
||||
showData("${LocaleKeys.email.tr()}:", "${contactInfoModel.email}"),
|
||||
if (contactInfoModel.address != null && contactInfoModel.address!.isNotEmpty) ...[
|
||||
showData("${LocaleKeys.address.tr()}:", ''),
|
||||
"${contactInfoModel.address}".toText(height: 1.5, fontSize: 13, color: MyColors.lightTextColor),
|
||||
],
|
||||
if (contactInfoModel.contactInfoImages != null && contactInfoModel.contactInfoImages!.isNotEmpty) ...[
|
||||
PickedFilesContainer(
|
||||
pickedFiles: contactInfoModel.contactInfoImages ?? [],
|
||||
isReview: true,
|
||||
onAddFilePressed: () {},
|
||||
),
|
||||
]
|
||||
],
|
||||
).toContainer(isShadowEnabled: true);
|
||||
},
|
||||
separatorBuilder: (context, index) => 16.height,
|
||||
),
|
||||
)),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -1,61 +1,104 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mc_common_app/classes/consts.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/generated/locale_keys.g.dart';
|
||||
import 'package:mc_common_app/views/setting_options/widgets/custom_setting_options_tile.dart';
|
||||
import 'package:mc_common_app/models/setting_utils_models/faqs_model.dart';
|
||||
import 'package:mc_common_app/theme/colors.dart';
|
||||
import 'package:mc_common_app/utils/enums.dart';
|
||||
import 'package:mc_common_app/view_models/setting_options_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:easy_localization/easy_localization.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class SettingOptionsFAQs extends StatelessWidget {
|
||||
class SettingOptionsFAQs extends StatefulWidget {
|
||||
const SettingOptionsFAQs({super.key});
|
||||
|
||||
@override
|
||||
State<SettingOptionsFAQs> createState() => _SettingOptionsFAQsState();
|
||||
}
|
||||
|
||||
class _SettingOptionsFAQsState extends State<SettingOptionsFAQs> {
|
||||
late SettingOptionsVM settingsOptionsVM;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
settingsOptionsVM = context.read<SettingOptionsVM>();
|
||||
scheduleMicrotask(() async {
|
||||
await settingsOptionsVM.getAllFaqs();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
title: LocaleKeys.more.tr(),
|
||||
isRemoveBackButton: false,
|
||||
isDrawerEnabled: false,
|
||||
onBackButtonTapped: () => Navigator.pop(context),
|
||||
),
|
||||
body: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: ListView(
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.info, size: 20),
|
||||
titleText: LocaleKeys.faqs.tr(),
|
||||
needBorderBelow: true,
|
||||
onTap: () {}),
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.mail, size: 20),
|
||||
titleText: LocaleKeys.contactUs.tr(),
|
||||
needBorderBelow: true,
|
||||
onTap: () {}),
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.settings, size: 20),
|
||||
titleText: LocaleKeys.termPrivacy.tr(),
|
||||
onTap: () {}),
|
||||
],
|
||||
).toContainer(
|
||||
width: double.infinity,
|
||||
isShadowEnabled: true,
|
||||
paddingAll: 10,
|
||||
margin: const EdgeInsets.fromLTRB(24, 24, 24, 0),
|
||||
borderRadius: 0),
|
||||
],
|
||||
),
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
"Version: 1.0.0".toText(fontSize: 14),
|
||||
],
|
||||
).paddingAll(21),
|
||||
],
|
||||
),
|
||||
);
|
||||
appBar: CustomAppBar(
|
||||
title: LocaleKeys.faqs.tr(),
|
||||
isRemoveBackButton: false,
|
||||
isDrawerEnabled: false,
|
||||
onBackButtonTapped: () => Navigator.pop(context),
|
||||
),
|
||||
body: Consumer(
|
||||
builder: (BuildContext context, SettingOptionsVM settingsOptionsVM, Widget? child) {
|
||||
return Container(
|
||||
color: MyColors.backgroundColor,
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
child: Column(
|
||||
children: [
|
||||
16.height,
|
||||
Expanded(
|
||||
child: RefreshIndicator(
|
||||
onRefresh: () async => await settingsOptionsVM.getAllFaqs(),
|
||||
child: (settingsOptionsVM.state == ViewState.busy)
|
||||
? const Center(child: CircularProgressIndicator())
|
||||
: settingsOptionsVM.faqsList.isEmpty
|
||||
? Padding(
|
||||
padding: const EdgeInsets.all(21),
|
||||
child: Center(child: LocaleKeys.noFAQsToShow.tr().toText(textAlign: TextAlign.center, fontSize: 16, color: MyColors.lightTextColor)),
|
||||
)
|
||||
: ListView.separated(
|
||||
itemCount: settingsOptionsVM.faqsList.length,
|
||||
padding: const EdgeInsets.all(16),
|
||||
itemBuilder: (context, index) {
|
||||
FAQsModel faqModel = settingsOptionsVM.faqsList[index];
|
||||
return ExpansionTile(
|
||||
tilePadding: EdgeInsets.zero,
|
||||
shape: const Border(),
|
||||
title: (faqModel.question ?? "").toText(fontSize: 16).paddingOnly(left: 8, right: 8),
|
||||
onExpansionChanged: (value) {
|
||||
setState(() {
|
||||
settingsOptionsVM.faqsList[index].isCollapsed = value;
|
||||
});
|
||||
},
|
||||
backgroundColor: Colors.transparent,
|
||||
collapsedBackgroundColor: Colors.transparent,
|
||||
initiallyExpanded: settingsOptionsVM.faqsList[index].isCollapsed ?? false,
|
||||
trailing: (settingsOptionsVM.faqsList[index].isCollapsed ?? false) ? const Icon(Icons.keyboard_arrow_up) : const Icon(Icons.keyboard_arrow_down),
|
||||
subtitle: ("Channel: ${faqModel.channel.toString()}").toText(color: MyColors.lightTextColor).paddingOnly(left: 8, right: 8),
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
5.height,
|
||||
(faqModel.answer ?? "").toText(color: MyColors.lightTextColor, fontSize: 14, fontWeight: MyFonts.Medium),
|
||||
10.height,
|
||||
],
|
||||
).paddingOnly(left: 8, right: 8)
|
||||
],
|
||||
).toContainer(isShadowEnabled: true);
|
||||
},
|
||||
separatorBuilder: (context, index) => 12.height,
|
||||
),
|
||||
)),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,223 +0,0 @@
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:mc_common_app/classes/app_state.dart';
|
||||
import 'package:mc_common_app/classes/consts.dart';
|
||||
import 'package:mc_common_app/config/routes.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/generated/locale_keys.g.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/view_models/dashboard_view_model_customer.dart';
|
||||
import 'package:mc_common_app/view_models/user_view_model.dart';
|
||||
import 'package:mc_common_app/views/setting_options/widgets/custom_setting_options_tile.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/extensions/extensions_widget.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class SettingOptionsLanguage extends StatefulWidget {
|
||||
const SettingOptionsLanguage({super.key});
|
||||
|
||||
@override
|
||||
State<SettingOptionsLanguage> createState() => _SettingOptionsLanguageState();
|
||||
}
|
||||
|
||||
class _SettingOptionsLanguageState extends State<SettingOptionsLanguage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
title: LocaleKeys.more.tr(),
|
||||
isRemoveBackButton: false,
|
||||
isDrawerEnabled: false,
|
||||
onBackButtonTapped: () => Navigator.pop(context),
|
||||
),
|
||||
body: Column(
|
||||
children: [
|
||||
// (AppState().currentAppType == AppType.provider)
|
||||
// ?
|
||||
Expanded(
|
||||
child: ListView(
|
||||
shrinkWrap: true,
|
||||
padding: EdgeInsets.zero,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.quickreply_outlined, size: 20),
|
||||
titleText: LocaleKeys.requests.tr(),
|
||||
needBorderBelow: true,
|
||||
onTap: () {
|
||||
context.read<DashboardVmCustomer>().onNavbarTapped(4);
|
||||
Navigator.pop(context);
|
||||
}),
|
||||
if (AppState().currentAppType == AppType.customer) ...[
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.favorite, size: 20),
|
||||
titleText: LocaleKeys.favoriteList.tr(),
|
||||
needBorderBelow: true,
|
||||
onTap: () => navigateWithName(context, AppRoutes.favoriteListView),
|
||||
),
|
||||
],
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.settings, size: 20),
|
||||
titleText: LocaleKeys.settings.tr(),
|
||||
needBorderBelow: true,
|
||||
onTap: () {},
|
||||
//navigateWithName(context, AppRoutes.settingOptionsInviteFriends),
|
||||
),
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.question_mark_outlined, size: 20),
|
||||
titleText: LocaleKeys.help.tr(),
|
||||
needBorderBelow: true,
|
||||
onTap: () => navigateWithName(context, AppRoutes.settingOptionsHelp),
|
||||
),
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.person, size: 20),
|
||||
titleText: LocaleKeys.account.tr(),
|
||||
needBorderBelow: false,
|
||||
onTap: () {
|
||||
navigateWithName(context, AppRoutes.profileView);
|
||||
// context.read<DashboardVmCustomer>().onNavbarTapped(4);
|
||||
// Navigator.pop(context);
|
||||
}),
|
||||
],
|
||||
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0),
|
||||
10.height,
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.translate, size: 20),
|
||||
titleText: LocaleKeys.language.tr(),
|
||||
isForLanguage: true,
|
||||
onTap: () {
|
||||
context.read<UserVM>().changeLanguage(context);
|
||||
Future.delayed(Duration(seconds: 1), () {
|
||||
setState(() {});
|
||||
});
|
||||
},
|
||||
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0),
|
||||
10.height,
|
||||
(AppState().currentAppType == AppType.provider)
|
||||
? Column(
|
||||
children: [
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: SizedBox(
|
||||
width: 16,
|
||||
height: 16,
|
||||
child: SvgPicture.asset(
|
||||
MyAssets.icStar,
|
||||
color: MyColors.primaryColor,
|
||||
),
|
||||
),
|
||||
titleText: LocaleKeys.mySubscription.tr(),
|
||||
subTitle: AppState().getproviderSubscription.first.name,
|
||||
isForLanguage: false,
|
||||
needBorderBelow: true,
|
||||
onTap: () {
|
||||
navigateWithName(context, AppRoutes.mySubscriptionsPage);
|
||||
},
|
||||
),
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: SizedBox(
|
||||
width: 16,
|
||||
height: 16,
|
||||
child: SvgPicture.asset(
|
||||
MyAssets.icGroupStar,
|
||||
// color: MyColors.primaryColor,
|
||||
),
|
||||
),
|
||||
titleText: LocaleKeys.subscriptions.tr(),
|
||||
subTitle: null,
|
||||
isForLanguage: false,
|
||||
needBorderBelow: true,
|
||||
onTap: () {
|
||||
navigateWithName(context, AppRoutes.subscriptionsPage);
|
||||
},
|
||||
),
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: SizedBox(
|
||||
width: 16,
|
||||
height: 16,
|
||||
child: SvgPicture.asset(
|
||||
MyAssets.icGroupStar,
|
||||
// color: MyColors.primaryColor,
|
||||
),
|
||||
),
|
||||
titleText: LocaleKeys.defineLicenses.tr(),
|
||||
subTitle: null,
|
||||
isForLanguage: false,
|
||||
needBorderBelow: false,
|
||||
onTap: () {
|
||||
navigateWithName(context, AppRoutes.providerLicensePage);
|
||||
},
|
||||
),
|
||||
// CustomSettingOptionsTile(
|
||||
// leadingWidget: SizedBox(
|
||||
// width: 16,
|
||||
// height: 16,
|
||||
// child: SvgPicture.asset(
|
||||
// MyAssets.providersIcon,
|
||||
// // color: MyColors.primaryColor,
|
||||
// ),
|
||||
// ),
|
||||
// titleText: "Users",
|
||||
// subTitle: null,
|
||||
// isForLanguage: false,
|
||||
// needBorderBelow: false,
|
||||
// onTap: () {
|
||||
// navigateWithName(context, AppRoutes.dealerUser, arguments: AppState().getUser.data!.userInfo!.id.toString());
|
||||
// },
|
||||
// )
|
||||
],
|
||||
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0)
|
||||
: const SizedBox(),
|
||||
(AppState().currentAppType == AppType.provider) ? 10.height : const SizedBox(),
|
||||
],
|
||||
)),
|
||||
// : Expanded(
|
||||
// child: ListView(
|
||||
// children: [
|
||||
// Column(
|
||||
// children: [
|
||||
// CustomSettingOptionsTile(
|
||||
// leadingWidget: const Icon(Icons.person, size: 20),
|
||||
// titleText: "My Requests",
|
||||
// needBorderBelow: true,
|
||||
// onTap: () {
|
||||
// context.read<DashboardVmCustomer>().onNavbarTapped(4);
|
||||
// Navigator.pop(context);
|
||||
// }),
|
||||
// CustomSettingOptionsTile(leadingWidget: const Icon(Icons.favorite, size: 20), titleText: "Favorite list", needBorderBelow: true, onTap: () {}),
|
||||
// CustomSettingOptionsTile(
|
||||
// leadingWidget: const Icon(Icons.settings, size: 20), titleText: "Settings", onTap: () => navigateWithName(context, AppRoutes.settingOptionsInviteFriends)),
|
||||
// ],
|
||||
// ).toContainer(width: double.infinity, isShadowEnabled: true, paddingAll: 10, margin: const EdgeInsets.fromLTRB(24, 24, 24, 0), borderRadius: 0),
|
||||
// CustomSettingOptionsTile(leadingWidget: const Icon(Icons.translate, size: 20), titleText: "Language", isForLanguage: true, onTap: () {})
|
||||
// .toContainer(width: double.infinity, isShadowEnabled: true, paddingAll: 10, marginAll: 21, borderRadius: 0),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
(AppState().currentAppType == AppType.provider) ? Text(LocaleKeys.provider.tr()) : Text(LocaleKeys.customer.tr()),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: ShowFillButton(
|
||||
borderColor: MyColors.redColor,
|
||||
txtColor: MyColors.redColor,
|
||||
isFilled: false,
|
||||
fontSize: 16,
|
||||
maxHeight: 55,
|
||||
title: LocaleKeys.logOut.tr(),
|
||||
onPressed: () {
|
||||
context.read<UserVM>().logout(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
).paddingAll(0),
|
||||
],
|
||||
).paddingAll(21),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,210 @@
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:mc_common_app/classes/app_state.dart';
|
||||
import 'package:mc_common_app/classes/consts.dart';
|
||||
import 'package:mc_common_app/config/routes.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/generated/locale_keys.g.dart';
|
||||
import 'package:mc_common_app/main.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/view_models/user_view_model.dart';
|
||||
import 'package:mc_common_app/views/setting_options/widgets/custom_setting_options_tile.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/extensions/extensions_widget.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class SettingOptionsMore extends StatefulWidget {
|
||||
const SettingOptionsMore({super.key});
|
||||
|
||||
@override
|
||||
State<SettingOptionsMore> createState() => _SettingOptionsMoreState();
|
||||
}
|
||||
|
||||
class _SettingOptionsMoreState extends State<SettingOptionsMore> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
title: LocaleKeys.more.tr(),
|
||||
isRemoveBackButton: false,
|
||||
isDrawerEnabled: false,
|
||||
onBackButtonTapped: () => Navigator.pop(context),
|
||||
),
|
||||
body: Column(
|
||||
children: [
|
||||
// (AppState().currentAppType == AppType.provider)
|
||||
// ?
|
||||
Expanded(
|
||||
child: ListView(
|
||||
shrinkWrap: true,
|
||||
padding: EdgeInsets.zero,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
if (AppState().currentAppType == AppType.customer) ...[
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.favorite, size: 20),
|
||||
titleText: LocaleKeys.favoriteList.tr(),
|
||||
needBorderBelow: true,
|
||||
onTap: () => navigateWithName(context, AppRoutes.favoriteListView),
|
||||
),
|
||||
] else ...[
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.local_shipping, size: 20),
|
||||
titleText: LocaleKeys.shippingManagement.tr(),
|
||||
needBorderBelow: true,
|
||||
onTap: () {
|
||||
navigateWithName(context, AppRoutes.shippingManagementView);
|
||||
},
|
||||
),
|
||||
],
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.settings, size: 20),
|
||||
titleText: LocaleKeys.settings.tr(),
|
||||
needBorderBelow: false,
|
||||
onTap: () => navigateWithName(context, AppRoutes.settingOptionsInviteFriends),
|
||||
),
|
||||
|
||||
],
|
||||
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0),
|
||||
10.height,
|
||||
if (!disableThingsForQA) ...[
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: const Icon(Icons.translate, size: 20),
|
||||
titleText: LocaleKeys.language.tr(),
|
||||
isForLanguage: true,
|
||||
onTap: () {
|
||||
context.read<UserVM>().changeLanguage(context);
|
||||
Future.delayed(const Duration(seconds: 1), () {
|
||||
setState(() {});
|
||||
});
|
||||
},
|
||||
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0),
|
||||
10.height,
|
||||
],
|
||||
(AppState().currentAppType == AppType.provider)
|
||||
? Column(
|
||||
children: [
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: SizedBox(
|
||||
width: 16,
|
||||
height: 16,
|
||||
child: SvgPicture.asset(
|
||||
MyAssets.icStar,
|
||||
color: MyColors.primaryColor,
|
||||
),
|
||||
),
|
||||
titleText: LocaleKeys.mySubscription.tr(),
|
||||
subTitle: AppState().getproviderSubscription.first.name ?? "",
|
||||
isForLanguage: false,
|
||||
needBorderBelow: true,
|
||||
onTap: () {
|
||||
navigateWithName(context, AppRoutes.mySubscriptionsPage);
|
||||
},
|
||||
),
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: SizedBox(
|
||||
width: 16,
|
||||
height: 16,
|
||||
child: SvgPicture.asset(
|
||||
MyAssets.icGroupStar,
|
||||
// color: MyColors.primaryColor,
|
||||
),
|
||||
),
|
||||
titleText: LocaleKeys.subscriptions.tr(),
|
||||
subTitle: null,
|
||||
isForLanguage: false,
|
||||
needBorderBelow: true,
|
||||
onTap: () {
|
||||
navigateWithName(context, AppRoutes.subscriptionsPage);
|
||||
},
|
||||
),
|
||||
CustomSettingOptionsTile(
|
||||
leadingWidget: SizedBox(
|
||||
width: 16,
|
||||
height: 16,
|
||||
child: SvgPicture.asset(
|
||||
MyAssets.icGroupStar,
|
||||
// color: MyColors.primaryColor,
|
||||
),
|
||||
),
|
||||
titleText: LocaleKeys.defineLicenses.tr(),
|
||||
subTitle: null,
|
||||
isForLanguage: false,
|
||||
needBorderBelow: false,
|
||||
onTap: () {
|
||||
navigateWithName(context, AppRoutes.providerLicensePage);
|
||||
},
|
||||
),
|
||||
// CustomSettingOptionsTile(
|
||||
// leadingWidget: SizedBox(
|
||||
// width: 16,
|
||||
// height: 16,
|
||||
// child: SvgPicture.asset(
|
||||
// MyAssets.providersIcon,
|
||||
// // color: MyColors.primaryColor,
|
||||
// ),
|
||||
// ),
|
||||
// titleText: "Users",
|
||||
// subTitle: null,
|
||||
// isForLanguage: false,
|
||||
// needBorderBelow: false,
|
||||
// onTap: () {
|
||||
// navigateWithName(context, AppRoutes.dealerUser, arguments: AppState().getUser.data!.userInfo!.id.toString());
|
||||
// },
|
||||
// )
|
||||
],
|
||||
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0)
|
||||
: const SizedBox(),
|
||||
(AppState().currentAppType == AppType.provider) ? 10.height : const SizedBox(),
|
||||
],
|
||||
)),
|
||||
// : Expanded(
|
||||
// child: ListView(
|
||||
// children: [
|
||||
// Column(
|
||||
// children: [
|
||||
// CustomSettingOptionsTile(
|
||||
// leadingWidget: const Icon(Icons.person, size: 20),
|
||||
// titleText: "My Requests",
|
||||
// needBorderBelow: true,
|
||||
// onTap: () {
|
||||
// context.read<BaseVM>().onNavbarTapped(4);
|
||||
// Navigator.pop(context);
|
||||
// }),
|
||||
// CustomSettingOptionsTile(leadingWidget: const Icon(Icons.favorite, size: 20), titleText: "Favorite list", needBorderBelow: true, onTap: () {}),
|
||||
// CustomSettingOptionsTile(
|
||||
// leadingWidget: const Icon(Icons.settings, size: 20), titleText: "Settings", onTap: () => navigateWithName(context, AppRoutes.settingOptionsInviteFriends)),
|
||||
// ],
|
||||
// ).toContainer(width: double.infinity, isShadowEnabled: true, paddingAll: 10, margin: const EdgeInsets.fromLTRB(24, 24, 24, 0), borderRadius: 0),
|
||||
// CustomSettingOptionsTile(leadingWidget: const Icon(Icons.translate, size: 20), titleText: "Language", isForLanguage: true, onTap: () {})
|
||||
// .toContainer(width: double.infinity, isShadowEnabled: true, paddingAll: 10, marginAll: 21, borderRadius: 0),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: ShowFillButton(
|
||||
borderColor: MyColors.redColor,
|
||||
txtColor: MyColors.redColor,
|
||||
isFilled: false,
|
||||
fontSize: 16,
|
||||
maxHeight: 55,
|
||||
title: LocaleKeys.logOut.tr(),
|
||||
onPressed: () {
|
||||
context.read<UserVM>().logout(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
).paddingAll(0),
|
||||
],
|
||||
).paddingAll(21),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,199 @@
|
||||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/generated/locale_keys.g.dart';
|
||||
import 'package:mc_common_app/models/general_models/widgets_models.dart';
|
||||
import 'package:mc_common_app/models/shipping_models/shipping_status_model.dart';
|
||||
import 'package:mc_common_app/theme/colors.dart';
|
||||
import 'package:mc_common_app/utils/enums.dart';
|
||||
import 'package:mc_common_app/utils/navigator.dart';
|
||||
import 'package:mc_common_app/utils/utils.dart';
|
||||
import 'package:mc_common_app/view_models/shipping_management_view_model.dart';
|
||||
import 'package:mc_common_app/widgets/button/show_fill_button.dart';
|
||||
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/categories_list.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/txt_field.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
|
||||
class ShippingManagementView extends StatefulWidget {
|
||||
const ShippingManagementView({super.key});
|
||||
|
||||
@override
|
||||
State<ShippingManagementView> createState() => _ShippingManagementViewState();
|
||||
}
|
||||
|
||||
class _ShippingManagementViewState extends State<ShippingManagementView> {
|
||||
late ShippingManagementVM shippingViewModel;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
shippingViewModel = context.read<ShippingManagementVM>();
|
||||
scheduleMicrotask(() async {
|
||||
if (shippingViewModel.shippingRequestFilterOptions.isNotEmpty) {
|
||||
await shippingViewModel.populateShippingRequestFilterList();
|
||||
}
|
||||
await shippingViewModel.getShippingRequestsListByFilters();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
Future buildUpdateShippingStatusBottomSheet({required int shippingRequestId}) {
|
||||
return showModalBottomSheet(
|
||||
context: context,
|
||||
isScrollControlled: true,
|
||||
enableDrag: true,
|
||||
builder: (BuildContext context) {
|
||||
return Consumer(builder: (BuildContext context, ShippingManagementVM shippingManagementVM, Widget? child) {
|
||||
return InfoBottomSheet(
|
||||
title: LocaleKeys.pleaseSpecify.tr().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,
|
||||
ListView.separated(
|
||||
shrinkWrap: true,
|
||||
itemCount: shippingManagementVM.shippingRequestStatusesList.length,
|
||||
separatorBuilder: (BuildContext context, int index) {
|
||||
return const Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 3.0),
|
||||
child: Divider(thickness: 0.5),
|
||||
);
|
||||
},
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
List<FilterListModel> list = shippingManagementVM.shippingRequestStatusesList;
|
||||
FilterListModel shippingFilterListModel = list[index];
|
||||
return CircleCheckBoxWithTitle(
|
||||
isChecked: shippingFilterListModel.isSelected,
|
||||
title: shippingFilterListModel.title,
|
||||
onSelected: () {
|
||||
shippingManagementVM.updateSelectionInShippingRequestStatuses(index);
|
||||
},
|
||||
selectedColor: MyColors.darkPrimaryColor,
|
||||
);
|
||||
},
|
||||
),
|
||||
12.height,
|
||||
TxtField(
|
||||
maxLines: 4,
|
||||
value: shippingManagementVM.requestStatusComments,
|
||||
errorValue: "",
|
||||
keyboardType: TextInputType.text,
|
||||
hint: LocaleKeys.comment.tr(),
|
||||
onChanged: (v) => shippingManagementVM.updateRequestStatusComments(v),
|
||||
),
|
||||
],
|
||||
),
|
||||
25.height,
|
||||
ShowFillButton(
|
||||
title: LocaleKeys.submit.tr(),
|
||||
onPressed: () async {
|
||||
FilterListModel value = shippingManagementVM.shippingRequestStatusesList.firstWhere((element) => element.isSelected);
|
||||
ShippingRequestStatusEnum shippingStatusEnum = value.id.toShippingStatusEnum();
|
||||
bool status = await shippingManagementVM.onUpdateShippingStatusTapped(shippingStatusEnum: shippingStatusEnum, shippingRequestId: shippingRequestId, context: context);
|
||||
if (status) {
|
||||
pop(context);
|
||||
await shippingManagementVM.getShippingRequestsListByFilters();
|
||||
}
|
||||
},
|
||||
maxWidth: double.infinity,
|
||||
),
|
||||
19.height,
|
||||
],
|
||||
),
|
||||
));
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
shippingViewModel.resetFilters();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Consumer(builder: (BuildContext context, ShippingManagementVM shippingVm, Widget? child) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(title: LocaleKeys.shippingManagement.tr()),
|
||||
body: Container(
|
||||
color: MyColors.backgroundColor,
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
child: Column(
|
||||
children: [
|
||||
16.height,
|
||||
FiltersList(
|
||||
filterList: shippingVm.shippingRequestFilterOptions,
|
||||
onFilterTapped: (index, selectedFilterId) {
|
||||
shippingVm.applyFiltersOnShippingRequests(shippingRequestStatusEnum: selectedFilterId.toShippingStatusEnum());
|
||||
},
|
||||
),
|
||||
8.height,
|
||||
Expanded(
|
||||
child: RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
int index = shippingVm.shippingRequestFilterOptions.indexWhere((element) => element.isSelected);
|
||||
await shippingVm.getShippingRequestsListByFilters(shippingStatusEnum: index.toShippingStatusEnum());
|
||||
},
|
||||
child: (shippingVm.state == ViewState.busy)
|
||||
? const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
)
|
||||
: shippingVm.shippingRequestsList.isEmpty
|
||||
? Center(child: LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor))
|
||||
: ListView.separated(
|
||||
itemCount: shippingVm.shippingRequestsList.length,
|
||||
padding: const EdgeInsets.all(16),
|
||||
itemBuilder: (context, index) {
|
||||
ShippingRequestModel shippingRequest = shippingVm.shippingRequestsList[index];
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Utils.statusContainerChip(
|
||||
text: Utils.getNameByShippingRequestStatusEnum(shippingRequest.shippingStatusEnum ?? ShippingRequestStatusEnum.initiated),
|
||||
chipColor: Utils.getChipColorByShippingRequestStatusEnum(shippingRequest.shippingStatusEnum ?? ShippingRequestStatusEnum.initiated),
|
||||
),
|
||||
("Request Name | ${shippingRequest.id.toString()}").toText(fontSize: 16),
|
||||
8.height,
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
"customer name".toText(color: MyColors.lightTextColor, fontSize: 14),
|
||||
if (shippingRequest.createdOn != null && shippingRequest.createdOn!.isNotEmpty) ...[
|
||||
" | ${DateTime.parse(shippingRequest.createdOn!).getTimeAgo()}".toText(color: MyColors.lightTextColor, fontSize: 14),
|
||||
],
|
||||
],
|
||||
),
|
||||
const Icon(Icons.arrow_forward, color: MyColors.darkIconColor, size: 18),
|
||||
],
|
||||
),
|
||||
],
|
||||
).onPress(() {
|
||||
buildUpdateShippingStatusBottomSheet(shippingRequestId: shippingRequest.id!);
|
||||
}).toContainer(isShadowEnabled: true);
|
||||
},
|
||||
separatorBuilder: (context, index) => 16.height,
|
||||
),
|
||||
)),
|
||||
],
|
||||
),
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,114 @@
|
||||
import 'dart:developer';
|
||||
|
||||
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/generated/locale_keys.g.dart';
|
||||
import 'package:mc_common_app/models/chat_models/chat_message_model.dart';
|
||||
import 'package:mc_common_app/theme/colors.dart';
|
||||
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
|
||||
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||
|
||||
class MediaViewerScreen extends StatefulWidget {
|
||||
final List<MessageImageModel> images; // List of image URLs or file paths
|
||||
|
||||
const MediaViewerScreen({Key? key, required this.images}) : super(key: key);
|
||||
|
||||
@override
|
||||
MediaViewerScreenState createState() => MediaViewerScreenState();
|
||||
}
|
||||
|
||||
class MediaViewerScreenState extends State<MediaViewerScreen> {
|
||||
int selectedIndex = 0; // Track selected image index
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
debugPrint("loaded");
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(title: LocaleKeys.pictures.tr()),
|
||||
body: Column(
|
||||
children: [
|
||||
// Main Image Display (selected image)
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Center(
|
||||
child: InteractiveViewer(
|
||||
|
||||
panEnabled: true,
|
||||
// Allow panning
|
||||
scaleEnabled: true,
|
||||
// Allow zooming
|
||||
minScale: 1.0,
|
||||
// Minimum zoom level
|
||||
maxScale: 4.0,
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
child: (widget.images[selectedIndex].isFromNetwork ?? false)
|
||||
? widget.images[selectedIndex].imageUrl.buildNetworkImage(
|
||||
fit: BoxFit.cover,
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
)
|
||||
: widget.images[selectedIndex].imagePath.buildFileImage(
|
||||
fit: BoxFit.cover,
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
// Thumbnail List at the bottom
|
||||
Container(
|
||||
height: 100, // Set height for thumbnail list
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: ListView.builder(
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemCount: widget.images.length,
|
||||
itemBuilder: (context, index) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
setState(() {
|
||||
selectedIndex = index; // Change the selected image
|
||||
});
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8.0),
|
||||
child: Container(
|
||||
width: 80, // Thumbnail size
|
||||
height: 80,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: selectedIndex == index ? MyColors.darkPrimaryColor : MyColors.greyShadowColor, // Highlight selected image
|
||||
width: selectedIndex == index ? 2 : 1,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
child: (widget.images[index].isFromNetwork ?? false)
|
||||
? widget.images[index].imageUrl.buildNetworkImage(
|
||||
fit: BoxFit.cover,
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
)
|
||||
: widget.images[index].imagePath.buildFileImage(
|
||||
fit: BoxFit.cover,
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
10.height,
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue