mirror of
https://gitlab.com/veilid/veilidchat.git
synced 2025-02-13 05:31:28 -05:00
clean up mounts
This commit is contained in:
parent
0cf2b947be
commit
ce4601b575
@ -2,7 +2,6 @@ import 'dart:async';
|
|||||||
|
|
||||||
import 'package:async_tools/async_tools.dart';
|
import 'package:async_tools/async_tools.dart';
|
||||||
import 'package:awesome_extensions/awesome_extensions.dart';
|
import 'package:awesome_extensions/awesome_extensions.dart';
|
||||||
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_chat_types/flutter_chat_types.dart' as types;
|
import 'package:flutter_chat_types/flutter_chat_types.dart' as types;
|
||||||
@ -21,19 +20,19 @@ class ChatComponent extends StatelessWidget {
|
|||||||
const ChatComponent._(
|
const ChatComponent._(
|
||||||
{required TypedKey localUserIdentityKey,
|
{required TypedKey localUserIdentityKey,
|
||||||
required TypedKey remoteConversationRecordKey,
|
required TypedKey remoteConversationRecordKey,
|
||||||
required IList<proto.Message> messages,
|
required MessagesCubit messagesCubit,
|
||||||
required types.User localUser,
|
required types.User localUser,
|
||||||
required types.User remoteUser,
|
required types.User remoteUser,
|
||||||
super.key})
|
super.key})
|
||||||
: _localUserIdentityKey = localUserIdentityKey,
|
: _localUserIdentityKey = localUserIdentityKey,
|
||||||
_remoteConversationRecordKey = remoteConversationRecordKey,
|
_remoteConversationRecordKey = remoteConversationRecordKey,
|
||||||
_messages = messages,
|
_messagesCubit = messagesCubit,
|
||||||
_localUser = localUser,
|
_localUser = localUser,
|
||||||
_remoteUser = remoteUser;
|
_remoteUser = remoteUser;
|
||||||
|
|
||||||
final TypedKey _localUserIdentityKey;
|
final TypedKey _localUserIdentityKey;
|
||||||
final TypedKey _remoteConversationRecordKey;
|
final TypedKey _remoteConversationRecordKey;
|
||||||
final IList<proto.Message> _messages;
|
final MessagesCubit _messagesCubit;
|
||||||
final types.User _localUser;
|
final types.User _localUser;
|
||||||
final types.User _remoteUser;
|
final types.User _remoteUser;
|
||||||
|
|
||||||
@ -78,24 +77,22 @@ class ChatComponent extends StatelessWidget {
|
|||||||
id: conversation.contact.identityPublicKey.toVeilid().toString(),
|
id: conversation.contact.identityPublicKey.toVeilid().toString(),
|
||||||
firstName: editedName);
|
firstName: editedName);
|
||||||
|
|
||||||
|
// Get the messages cubit
|
||||||
|
final messagesCubit = context
|
||||||
|
.select<ActiveConversationMessagesBlocMapCubit, MessagesCubit?>(
|
||||||
|
(x) => x.tryOperate(remoteConversationRecordKey,
|
||||||
|
closure: (cubit) => cubit));
|
||||||
|
|
||||||
// Get the messages to display
|
// Get the messages to display
|
||||||
// and ensure it is safe to operate() on the MessageCubit for this chat
|
// and ensure it is safe to operate() on the MessageCubit for this chat
|
||||||
final avmessages = context.select<
|
if (messagesCubit == null) {
|
||||||
ActiveConversationMessagesBlocMapCubit,
|
|
||||||
AsyncValue<IList<proto.Message>>?>(
|
|
||||||
(x) => x.state[remoteConversationRecordKey]);
|
|
||||||
if (avmessages == null) {
|
|
||||||
return waitingPage();
|
return waitingPage();
|
||||||
}
|
}
|
||||||
final messages = avmessages.data?.value;
|
|
||||||
if (messages == null) {
|
|
||||||
return avmessages.buildNotData();
|
|
||||||
}
|
|
||||||
|
|
||||||
return ChatComponent._(
|
return ChatComponent._(
|
||||||
localUserIdentityKey: localUserIdentityKey,
|
localUserIdentityKey: localUserIdentityKey,
|
||||||
remoteConversationRecordKey: remoteConversationRecordKey,
|
remoteConversationRecordKey: remoteConversationRecordKey,
|
||||||
messages: messages,
|
messagesCubit: messagesCubit,
|
||||||
localUser: localUser,
|
localUser: localUser,
|
||||||
remoteUser: remoteUser,
|
remoteUser: remoteUser,
|
||||||
key: key);
|
key: key);
|
||||||
@ -115,24 +112,21 @@ class ChatComponent extends StatelessWidget {
|
|||||||
return textMessage;
|
return textMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _addMessage(BuildContext context, proto.Message message) async {
|
Future<void> _addMessage(proto.Message message) async {
|
||||||
if (message.text.isEmpty) {
|
if (message.text.isEmpty) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await context.read<ActiveConversationMessagesBlocMapCubit>().operate(
|
await _messagesCubit.addMessage(message: message);
|
||||||
_remoteConversationRecordKey,
|
|
||||||
closure: (messagesCubit) => messagesCubit.addMessage(message: message));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _handleSendPressed(
|
Future<void> _handleSendPressed(types.PartialText message) async {
|
||||||
BuildContext context, types.PartialText message) async {
|
|
||||||
final protoMessage = proto.Message()
|
final protoMessage = proto.Message()
|
||||||
..author = _localUserIdentityKey.toProto()
|
..author = _localUserIdentityKey.toProto()
|
||||||
..timestamp = Veilid.instance.now().toInt64()
|
..timestamp = Veilid.instance.now().toInt64()
|
||||||
..text = message.text;
|
..text = message.text;
|
||||||
//..signature = signature;
|
//..signature = signature;
|
||||||
|
|
||||||
await _addMessage(context, protoMessage);
|
await _addMessage(protoMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _handleAttachmentPressed() async {
|
Future<void> _handleAttachmentPressed() async {
|
||||||
@ -146,9 +140,15 @@ class ChatComponent extends StatelessWidget {
|
|||||||
final textTheme = Theme.of(context).textTheme;
|
final textTheme = Theme.of(context).textTheme;
|
||||||
final chatTheme = makeChatTheme(scale, textTheme);
|
final chatTheme = makeChatTheme(scale, textTheme);
|
||||||
|
|
||||||
|
final avmessages = _messagesCubit.state;
|
||||||
|
final messages = avmessages.data?.value;
|
||||||
|
if (messages == null) {
|
||||||
|
return avmessages.buildNotData();
|
||||||
|
}
|
||||||
|
|
||||||
// Convert protobuf messages to chat messages
|
// Convert protobuf messages to chat messages
|
||||||
final chatMessages = <types.Message>[];
|
final chatMessages = <types.Message>[];
|
||||||
for (final message in _messages) {
|
for (final message in messages) {
|
||||||
final chatMessage = messageToChatMessage(message);
|
final chatMessage = messageToChatMessage(message);
|
||||||
chatMessages.insert(0, chatMessage);
|
chatMessages.insert(0, chatMessage);
|
||||||
}
|
}
|
||||||
@ -194,8 +194,8 @@ class ChatComponent extends StatelessWidget {
|
|||||||
//onMessageTap: _handleMessageTap,
|
//onMessageTap: _handleMessageTap,
|
||||||
//onPreviewDataFetched: _handlePreviewDataFetched,
|
//onPreviewDataFetched: _handlePreviewDataFetched,
|
||||||
onSendPressed: (message) {
|
onSendPressed: (message) {
|
||||||
singleFuture(this,
|
singleFuture(
|
||||||
() async => _handleSendPressed(context, message));
|
this, () async => _handleSendPressed(message));
|
||||||
},
|
},
|
||||||
//showUserAvatars: false,
|
//showUserAvatars: false,
|
||||||
//showUserNames: true,
|
//showUserNames: true,
|
||||||
|
@ -123,8 +123,7 @@ class _ContactInvitationDisplayDialogState
|
|||||||
},
|
},
|
||||||
).paddingAll(16),
|
).paddingAll(16),
|
||||||
])),
|
])),
|
||||||
error: (e, s) =>
|
error: errorPage)));
|
||||||
Text(translate('send_invite_dialog.failed_to_generate')))));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -102,7 +102,6 @@ class ContactInvitationItemWidget extends StatelessWidget {
|
|||||||
onTap: disabled
|
onTap: disabled
|
||||||
? null
|
? null
|
||||||
: () async {
|
: () async {
|
||||||
// ignore: use_build_context_synchronously
|
|
||||||
if (!context.mounted) {
|
if (!context.mounted) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -66,8 +66,7 @@ class SendInviteDialogState extends State<SendInviteDialog> {
|
|||||||
if (pin == null) {
|
if (pin == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// ignore: use_build_context_synchronously
|
if (!mounted) {
|
||||||
if (!context.mounted) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final matchpin = await showDialog<String>(
|
final matchpin = await showDialog<String>(
|
||||||
@ -84,8 +83,7 @@ class SendInviteDialogState extends State<SendInviteDialog> {
|
|||||||
_encryptionKey = pin;
|
_encryptionKey = pin;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// ignore: use_build_context_synchronously
|
if (!mounted) {
|
||||||
if (!context.mounted) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
showErrorToast(
|
showErrorToast(
|
||||||
@ -105,8 +103,7 @@ class SendInviteDialogState extends State<SendInviteDialog> {
|
|||||||
if (password == null) {
|
if (password == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// ignore: use_build_context_synchronously
|
if (!mounted) {
|
||||||
if (!context.mounted) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final matchpass = await showDialog<String>(
|
final matchpass = await showDialog<String>(
|
||||||
@ -123,8 +120,7 @@ class SendInviteDialogState extends State<SendInviteDialog> {
|
|||||||
_encryptionKey = password;
|
_encryptionKey = password;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// ignore: use_build_context_synchronously
|
if (!mounted) {
|
||||||
if (!context.mounted) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
showErrorToast(
|
showErrorToast(
|
||||||
@ -148,10 +144,7 @@ class SendInviteDialogState extends State<SendInviteDialog> {
|
|||||||
encryptionKey: _encryptionKey,
|
encryptionKey: _encryptionKey,
|
||||||
message: _messageTextController.text,
|
message: _messageTextController.text,
|
||||||
expiration: _expiration);
|
expiration: _expiration);
|
||||||
// ignore: use_build_context_synchronously
|
|
||||||
if (!context.mounted) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await showDialog<void>(
|
await showDialog<void>(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (context) => BlocProvider(
|
builder: (context) => BlocProvider(
|
||||||
@ -159,9 +152,7 @@ class SendInviteDialogState extends State<SendInviteDialog> {
|
|||||||
child: ContactInvitationDisplayDialog(
|
child: ContactInvitationDisplayDialog(
|
||||||
message: _messageTextController.text,
|
message: _messageTextController.text,
|
||||||
)));
|
)));
|
||||||
// if (ret == null) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
navigator.pop();
|
navigator.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user