import 'dart:async'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../../api/marianumcloud/talk/createRoom/createRoom.dart'; import '../../../api/marianumcloud/talk/createRoom/createRoomParams.dart'; import '../../../model/chatList/chatListProps.dart'; import '../../../notification/notifyUpdater.dart'; import '../../../storage/base/settingsProvider.dart'; import '../../../widget/confirmDialog.dart'; import '../../../widget/loadingSpinner.dart'; import 'chatTile.dart'; import 'joinChat.dart'; import 'searchChat.dart'; class ChatList extends StatefulWidget { const ChatList({Key? key}) : super(key: key); @override State createState() => _ChatListState(); } class _ChatListState extends State { late SettingsProvider settings; @override void initState() { super.initState(); settings = Provider.of(context, listen: false); WidgetsBinding.instance.addPostFrameCallback((timeStamp) { _query(); if(!settings.val().notificationSettings.enabled && !settings.val().notificationSettings.askUsageDismissed) { settings.val(write: true).notificationSettings.askUsageDismissed = true; ConfirmDialog( icon: Icons.notifications_active_outlined, title: "Benachrichtigungen aktivieren", content: "Auf wunsch kannst du Push-Benachrichtigungen aktivieren. Deine Einstellungen kannst du jederzeit ändern.", confirmButton: "Weiter", onConfirm: () { FirebaseMessaging.instance.requestPermission( provisional: false ).then((value) { switch (value.authorizationStatus) { case AuthorizationStatus.authorized: NotifyUpdater.enableAfterDisclaimer(settings).asDialog(context); break; case AuthorizationStatus.denied: showDialog(context: context, builder: (context) => const AlertDialog( content: Text("Du kannst die Benachrichtigungen später jederzeit in den App-Einstellungen aktivieren."), )); break; default: break; } }); }, ).asDialog(context); } }); } void _query({bool renew = false}) { Provider.of(context, listen: false).run(renew: renew); } @override Widget build(BuildContext context) { ChatListProps? latestData; return Scaffold( appBar: AppBar( title: const Text("Talk"), actions: [ IconButton( icon: const Icon(Icons.search), onPressed: () async { if(latestData == null) return; showSearch(context: context, delegate: SearchChat(latestData!.getRoomsResponse.data.toList())); }, ) ], ), floatingActionButton: FloatingActionButton( heroTag: "createChat", backgroundColor: Theme.of(context).primaryColor, onPressed: () async { showSearch(context: context, delegate: JoinChat()).then((username) { if(username == null) return; ConfirmDialog( title: "Chat starten", content: "Möchtest du einen Chat mit Nutzer '$username' starten?", confirmButton: "Chat starten", onConfirm: () { CreateRoom(CreateRoomParams( roomType: 1, invite: username, )).run().then((value) { _query(renew: true); }); }, ).asDialog(context); }); }, child: const Icon(Icons.add_comment_outlined), ), body: Consumer( builder: (context, data, child) { if(data.primaryLoading()) return const LoadingSpinner(); latestData = data; List chats = []; for (var chatRoom in data.getRoomsResponse.sortBy( lastActivity: true, favoritesToTop: Provider.of(context).val().talkSettings.sortFavoritesToTop, unreadToTop: Provider.of(context).val().talkSettings.sortUnreadToTop, ) ) { bool hasDraft = settings.val().talkSettings.drafts.containsKey(chatRoom.token); chats.add(ChatTile(data: chatRoom, query: _query, hasDraft: hasDraft)); } return RefreshIndicator( color: Theme.of(context).primaryColor, onRefresh: () { _query(renew: true); return Future.delayed(const Duration(seconds: 3)); }, child: ListView(children: chats), ); }, ), ); } }