Added Settings Modules
parent
0230afc5c7
commit
6e74801852
@ -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,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,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,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,
|
||||
),
|
||||
)),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue