203 lines
7.5 KiB
Dart
203 lines
7.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:ftc_mobile_app/ftc_mobile_app.dart';
|
|
import 'package:ftc_mobile_app/models/chat/ChatModel.dart';
|
|
import 'package:ftc_mobile_app/view/screens/chat/arguments/chat_screen_args.dart';
|
|
import 'package:ftc_mobile_app/web_services/chat_services.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
|
|
import '../../custom_widgets/my_circle_image.dart';
|
|
|
|
class InboxScreen extends StatefulWidget {
|
|
const InboxScreen({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
State<InboxScreen> createState() => _InboxScreenState();
|
|
}
|
|
|
|
class _InboxScreenState extends State<InboxScreen> {
|
|
final InboxScreenController controller = Get.put(InboxScreenController());
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return CustomScaffold(
|
|
backgroundColor: CustomAppColors.kPrimaryColor,
|
|
screenKey: controller.screenKey,
|
|
// onBackButton: controller.onBackButtonPressed,
|
|
onScreenTap: controller.removeFocus,
|
|
showAppBar: false,
|
|
body: Obx(() {
|
|
final list = controller.chatsAndGroups();
|
|
list.sort((a, b) => b.date.compareTo(a.date));
|
|
|
|
final canLoadMore = controller.canLoadMore.value;
|
|
|
|
return SmartRefresher(
|
|
key: const ValueKey("clients_list"),
|
|
controller: controller.listRC,
|
|
scrollController: controller.listSC,
|
|
header: FrequentFunctions.waterDropHeader,
|
|
enablePullUp: canLoadMore,
|
|
onRefresh: controller.onRefresh,
|
|
onLoading: controller.onLoading,
|
|
child: (list.isEmpty)
|
|
? Container(
|
|
color: Colors.white,
|
|
child: const Center(
|
|
child: Text("Your inbox is empty"),
|
|
),
|
|
)
|
|
: ListView.separated(
|
|
shrinkWrap: true,
|
|
itemCount: list.length,
|
|
padding: REdgeInsets.symmetric(horizontal: 20),
|
|
separatorBuilder: (_, int index) => 8.verticalSpace,
|
|
itemBuilder: (BuildContext context, int index) {
|
|
return SenderListWidget(
|
|
messagesListModel: controller.chatsAndGroups[index],
|
|
onTap: (messagesListModel) async {
|
|
await Navigator.pushNamed(
|
|
context,
|
|
CustomRouteNames.kChatScreenRoute,
|
|
arguments: ChatScreenArgs(
|
|
name: messagesListModel.title,
|
|
profilePicPath: messagesListModel.image,
|
|
otherUserId: messagesListModel.otherUserId,
|
|
groupData: messagesListModel.groupData,
|
|
onLastMessageUpdate: (m) =>
|
|
_onLastMessageUpdate(index, m),
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
),
|
|
);
|
|
}),
|
|
floatingActionButton: FloatingActionButton(
|
|
onPressed: () {
|
|
Navigator.pushNamed(
|
|
context, CustomRouteNames.kSelectUserForChatScreenRoute);
|
|
},
|
|
child: const Icon(Icons.add),
|
|
),
|
|
);
|
|
}
|
|
|
|
_onLastMessageUpdate(int index, ChatModel model) {
|
|
if (mounted) {
|
|
controller.chatsAndGroups[index].previewOfLastMessage =
|
|
model.message ?? "";
|
|
controller.chatsAndGroups[index].date =
|
|
model.date ?? DateTime.now().millisecondsSinceEpoch;
|
|
|
|
controller.chatsAndGroups.refresh();
|
|
}
|
|
}
|
|
}
|
|
|
|
class SenderListWidget extends StatefulWidget {
|
|
const SenderListWidget({
|
|
super.key,
|
|
required this.messagesListModel,
|
|
required this.onTap,
|
|
});
|
|
|
|
final MessagesListModel messagesListModel;
|
|
final ValueChanged<MessagesListModel> onTap;
|
|
|
|
@override
|
|
State<SenderListWidget> createState() => _SenderListWidgetState();
|
|
}
|
|
|
|
class _SenderListWidgetState extends State<SenderListWidget> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return InkWell(
|
|
onTap: () => widget.onTap(widget.messagesListModel),
|
|
child: Container(
|
|
padding: REdgeInsets.symmetric(vertical: 9),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
MyCircleImage(
|
|
imageSize: 53.r,
|
|
url: "${WebUrls.baseUrl}${widget.messagesListModel.image}",
|
|
errorWidget: CustomImageWidget(
|
|
imagePath: AssetsManager.kPersonMainIcon,
|
|
imageColor: CustomAppColors.kDarkBlueTextColor,
|
|
height: 53.r,
|
|
width: 53.r,
|
|
),
|
|
),
|
|
12.horizontalSpace,
|
|
Expanded(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
children: [
|
|
CustomTextWidget(
|
|
text: widget.messagesListModel.title,
|
|
fontColor: CustomAppColors.kDarkBlueTextColor,
|
|
fontSize: 16.sp,
|
|
fontWeight: FontWeight.w600,
|
|
isExpanded: false,
|
|
),
|
|
4.verticalSpace,
|
|
(widget.messagesListModel.messageType ==
|
|
MessageType.message.name)
|
|
? CustomTextWidget(
|
|
text: widget.messagesListModel.previewOfLastMessage,
|
|
fontColor: widget.messagesListModel.isRecent == true
|
|
? CustomAppColors.kDarkBlueTextColor
|
|
: CustomAppColors.kLightGreyColor,
|
|
fontSize: 12.sp,
|
|
maxLines: 1,
|
|
fontWeight: FontWeight.w600,
|
|
textAlign: TextAlign.left,
|
|
isExpanded: false,
|
|
)
|
|
: FrequentFunctions.noWidget,
|
|
],
|
|
),
|
|
),
|
|
Container(
|
|
padding: REdgeInsets.only(right: 2),
|
|
child: Column(
|
|
children: [
|
|
CustomTextWidget(
|
|
text: FrequentFunctions.toTimesAgo(
|
|
DateTime.fromMillisecondsSinceEpoch(
|
|
widget.messagesListModel.date)
|
|
.toIso8601String()),
|
|
fontColor: CustomAppColors.kLightGreyColor,
|
|
fontSize: 12.sp,
|
|
fontWeight: FontWeight.w600,
|
|
isExpanded: false,
|
|
),
|
|
widget.messagesListModel.noOfMessages != 0
|
|
? Padding(
|
|
padding: EdgeInsets.only(top: 8.0.h),
|
|
child: CircleAvatar(
|
|
minRadius: 8.sp,
|
|
maxRadius: 8.sp,
|
|
backgroundColor: CustomAppColors.kBlackColor,
|
|
child: CustomTextWidget(
|
|
text: "${widget.messagesListModel.noOfMessages}",
|
|
isExpanded: false,
|
|
fontSize: 8.sp,
|
|
fontColor: CustomAppColors.kPrimaryColor,
|
|
),
|
|
),
|
|
)
|
|
: Container(),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|