241 lines
8.4 KiB
Dart
241 lines
8.4 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:refilc/api/providers/update_provider.dart';
|
|
import 'package:refilc/ui/date_widget.dart';
|
|
import 'package:refilc_kreta_api/providers/message_provider.dart';
|
|
import 'package:refilc/api/providers/user_provider.dart';
|
|
import 'package:refilc/theme/colors/colors.dart';
|
|
import 'package:refilc_kreta_api/models/message.dart';
|
|
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/rounded_bottom_sheet.dart';
|
|
import 'package:refilc_mobile_ui/common/empty.dart';
|
|
import 'package:refilc_mobile_ui/common/filter_bar.dart';
|
|
import 'package:refilc_mobile_ui/common/profile_image/profile_button.dart';
|
|
import 'package:refilc_mobile_ui/common/profile_image/profile_image.dart';
|
|
import 'package:refilc/ui/filter/sort.dart';
|
|
// import 'package:refilc_mobile_ui/common/soon_alert/soon_alert.dart';
|
|
import 'package:refilc_mobile_ui/common/widgets/message/message_viewable.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'messages_page.i18n.dart';
|
|
import 'send_message/send_message.dart';
|
|
|
|
class MessagesPage extends StatefulWidget {
|
|
const MessagesPage({super.key});
|
|
|
|
@override
|
|
MessagesPageState createState() => MessagesPageState();
|
|
}
|
|
|
|
class MessagesPageState extends State<MessagesPage>
|
|
with TickerProviderStateMixin {
|
|
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
|
|
|
late UserProvider user;
|
|
late MessageProvider messageProvider;
|
|
late UpdateProvider updateProvider;
|
|
late String firstName;
|
|
late TabController tabController;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
tabController = TabController(length: 4, vsync: this);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
user = Provider.of<UserProvider>(context);
|
|
messageProvider = Provider.of<MessageProvider>(context);
|
|
updateProvider = Provider.of<UpdateProvider>(context);
|
|
|
|
List<String> nameParts = user.displayName?.split(" ") ?? ["?"];
|
|
firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0];
|
|
|
|
return Scaffold(
|
|
key: _scaffoldKey,
|
|
body: Padding(
|
|
padding: const EdgeInsets.only(top: 12.0),
|
|
child: NestedScrollView(
|
|
physics: const BouncingScrollPhysics(
|
|
parent: AlwaysScrollableScrollPhysics()),
|
|
headerSliverBuilder: (context, _) => [
|
|
SliverAppBar(
|
|
pinned: true,
|
|
floating: false,
|
|
snap: false,
|
|
centerTitle: false,
|
|
surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
|
|
actions: [
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 8.0, vertical: 5.0),
|
|
child: IconButton(
|
|
splashRadius: 24.0,
|
|
onPressed: () async {
|
|
// Navigator.of(context, rootNavigator: true)
|
|
// .push(PageRouteBuilder(
|
|
// pageBuilder: (context, animation, secondaryAnimation) =>
|
|
// PremiumFSTimetable(
|
|
// controller: controller,
|
|
// ),
|
|
// ))
|
|
// .then((_) {
|
|
// SystemChrome.setPreferredOrientations(
|
|
// [DeviceOrientation.portraitUp]);
|
|
// setSystemChrome(context);
|
|
// });
|
|
// SoonAlert.show(context: context);
|
|
await showSendMessageSheet(context);
|
|
},
|
|
icon: Icon(
|
|
FeatherIcons.send,
|
|
color: AppColors.of(context).text,
|
|
),
|
|
),
|
|
),
|
|
|
|
// Profile Icon
|
|
Padding(
|
|
padding: const EdgeInsets.only(right: 24.0),
|
|
child: ProfileButton(
|
|
child: ProfileImage(
|
|
heroTag: "profile",
|
|
name: firstName,
|
|
backgroundColor: Theme.of(context)
|
|
.colorScheme
|
|
.primary, //ColorUtils.stringToColor(user.displayName ?? "?"),
|
|
badge: updateProvider.available,
|
|
role: user.role,
|
|
profilePictureString: user.picture,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
automaticallyImplyLeading: false,
|
|
shadowColor: Theme.of(context).shadowColor,
|
|
title: Padding(
|
|
padding: const EdgeInsets.only(left: 8.0),
|
|
child: Text(
|
|
"Messages".i18n,
|
|
style: TextStyle(
|
|
color: AppColors.of(context).text,
|
|
fontSize: 32.0,
|
|
fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
bottom: FilterBar(
|
|
items: [
|
|
Tab(text: "Inbox".i18n),
|
|
Tab(text: "Sent".i18n),
|
|
Tab(text: "Trash".i18n),
|
|
Tab(text: "Draft".i18n),
|
|
],
|
|
controller: tabController,
|
|
disableFading: true,
|
|
),
|
|
),
|
|
],
|
|
body: TabBarView(
|
|
physics: const BouncingScrollPhysics(),
|
|
controller: tabController,
|
|
children: List.generate(
|
|
4, (index) => filterViewBuilder(context, index))),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
List<DateWidget> getFilterWidgets(MessageType activeData) {
|
|
List<DateWidget> items = [];
|
|
switch (activeData) {
|
|
case MessageType.inbox:
|
|
for (var message in messageProvider.messages) {
|
|
if (message.type == MessageType.inbox) {
|
|
items.add(DateWidget(
|
|
date: message.date,
|
|
widget: MessageViewable(message),
|
|
));
|
|
}
|
|
}
|
|
break;
|
|
case MessageType.sent:
|
|
for (var message in messageProvider.messages) {
|
|
if (message.type == MessageType.sent) {
|
|
items.add(DateWidget(
|
|
date: message.date,
|
|
widget: MessageViewable(message),
|
|
));
|
|
}
|
|
}
|
|
break;
|
|
case MessageType.trash:
|
|
for (var message in messageProvider.messages) {
|
|
if (message.type == MessageType.trash) {
|
|
items.add(DateWidget(
|
|
date: message.date,
|
|
widget: MessageViewable(message),
|
|
));
|
|
}
|
|
}
|
|
break;
|
|
case MessageType.draft:
|
|
for (var message in messageProvider.messages) {
|
|
if (message.type == MessageType.draft) {
|
|
items.add(DateWidget(
|
|
date: message.date,
|
|
widget: MessageViewable(message),
|
|
));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return items;
|
|
}
|
|
|
|
Widget filterViewBuilder(context, int activeData) {
|
|
List<Widget> filterWidgets = sortDateWidgets(context,
|
|
dateWidgets: getFilterWidgets(MessageType.values[activeData]),
|
|
hasShadow: true);
|
|
|
|
return Padding(
|
|
padding: const EdgeInsets.only(top: 12.0),
|
|
child: RefreshIndicator(
|
|
color: Theme.of(context).colorScheme.secondary,
|
|
onRefresh: () {
|
|
return Future.wait([
|
|
messageProvider.fetch(type: MessageType.inbox),
|
|
messageProvider.fetch(type: MessageType.sent),
|
|
messageProvider.fetch(type: MessageType.trash),
|
|
]);
|
|
},
|
|
child: ListView.builder(
|
|
padding: EdgeInsets.zero,
|
|
physics: const BouncingScrollPhysics(),
|
|
itemBuilder: (context, index) => filterWidgets.isNotEmpty
|
|
? Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 24.0, vertical: 6.0),
|
|
child: filterWidgets[index],
|
|
)
|
|
: Empty(subtitle: "empty".i18n),
|
|
itemCount: max(filterWidgets.length, 1),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<void> showSendMessageSheet(BuildContext context) async {
|
|
await messageProvider.fetchAllRecipients();
|
|
|
|
_scaffoldKey.currentState?.showBottomSheet(
|
|
(context) => RoundedBottomSheet(
|
|
borderRadius: 14.0,
|
|
child: SendMessageSheet(messageProvider.recipients)),
|
|
backgroundColor: const Color(0x00000000),
|
|
elevation: 12.0,
|
|
);
|
|
}
|
|
}
|