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: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/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/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/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:easy_localization/easy_localization.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});
|
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
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: CustomAppBar(
|
appBar: CustomAppBar(
|
||||||
title: LocaleKeys.more.tr(),
|
title: LocaleKeys.faqs.tr(),
|
||||||
isRemoveBackButton: false,
|
isRemoveBackButton: false,
|
||||||
isDrawerEnabled: false,
|
isDrawerEnabled: false,
|
||||||
onBackButtonTapped: () => Navigator.pop(context),
|
onBackButtonTapped: () => Navigator.pop(context),
|
||||||
),
|
),
|
||||||
body: Column(
|
body: Consumer(
|
||||||
|
builder: (BuildContext context, SettingOptionsVM settingsOptionsVM, Widget? child) {
|
||||||
|
return Container(
|
||||||
|
color: MyColors.backgroundColor,
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
|
16.height,
|
||||||
Expanded(
|
Expanded(
|
||||||
child: ListView(
|
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: [
|
children: [
|
||||||
Column(
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
CustomSettingOptionsTile(
|
5.height,
|
||||||
leadingWidget: const Icon(Icons.info, size: 20),
|
(faqModel.answer ?? "").toText(color: MyColors.lightTextColor, fontSize: 14, fontWeight: MyFonts.Medium),
|
||||||
titleText: LocaleKeys.faqs.tr(),
|
10.height,
|
||||||
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(
|
).paddingOnly(left: 8, right: 8)
|
||||||
width: double.infinity,
|
|
||||||
isShadowEnabled: true,
|
|
||||||
paddingAll: 10,
|
|
||||||
margin: const EdgeInsets.fromLTRB(24, 24, 24, 0),
|
|
||||||
borderRadius: 0),
|
|
||||||
],
|
],
|
||||||
|
).toContainer(isShadowEnabled: true);
|
||||||
|
},
|
||||||
|
separatorBuilder: (context, index) => 12.height,
|
||||||
),
|
),
|
||||||
),
|
)),
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
"Version: 1.0.0".toText(fontSize: 14),
|
|
||||||
],
|
|
||||||
).paddingAll(21),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
},
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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