Skip to content
This repository has been archived by the owner on Jul 31, 2021. It is now read-only.

Commit

Permalink
match page - loading screen before chat, fix unsent message not disap…
Browse files Browse the repository at this point in the history
…pearing, search by name instead of username, display username in profile page, unsent message message border (and refactor messagetilecontent)
  • Loading branch information
mkofdwu committed Feb 23, 2021
1 parent fb4df56 commit 5edf03d
Show file tree
Hide file tree
Showing 12 changed files with 433 additions and 474 deletions.
12 changes: 9 additions & 3 deletions lib/pages/chat/chat.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:tundr/models/message.dart';
import 'package:tundr/pages/chat/message_sender.dart';
import 'package:tundr/pages/chat/widgets/chat_description.dart';
import 'package:tundr/pages/chat/widgets/message_field.dart';
import 'package:tundr/pages/chat/widgets/message_tile_content.dart';
import 'package:tundr/pages/chat/widgets/popup_menu.dart';

import 'package:tundr/store/user.dart';
Expand All @@ -20,7 +21,6 @@ import 'package:tundr/widgets/buttons/tile_icon.dart';
import 'package:tundr/widgets/my_feature.dart';

import 'widgets/message_tile.dart';
import 'widgets/unsent_message_tile.dart';

class ChatPage extends StatefulWidget {
final Chat chat;
Expand All @@ -42,7 +42,6 @@ class _ChatPageState extends State<ChatPage> {
Media _messageMedia;
Message _referencedMessage;
bool _showChatOptions = false;
// final List<Message> _unsentMessages = [];
MessageSender messageSender;
bool _wasBlocked = false;

Expand Down Expand Up @@ -171,8 +170,15 @@ class _ChatPageState extends State<ChatPage> {
itemCount: unsentMessages.length + messages.length,
itemBuilder: (context, i) {
if (i < unsentMessages.length) {
return UnsentMessageTile(
return MessageTileContent(
message: unsentMessages[unsentMessages.length - i - 1],
fromMe: true,
statusIcon: SizedBox(
width: 10,
height: 10,
child: CircularProgressIndicator(strokeWidth: 1),
),
onViewReferencedMessage: () {},
);
}
final messageIndex = i - unsentMessages.length;
Expand Down
9 changes: 4 additions & 5 deletions lib/pages/chat/message_sender.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class MessageSender {
if (chat.type == ChatType.nonExistent) {
// chat hasn't been created yet
if (unsentMessages.length == 1) {
await _createChatThenSendUnsentMessages(message);
await _createChatThenSendUnsentMessages();
} else {
// do nothing, wait for chat to be created
}
Expand All @@ -38,11 +38,13 @@ class MessageSender {
await ChatsService.updateChatDetails(uid, chat.id, {'type': 3});
}
unsentMessages.remove(message);
if (onUpdate != null) onUpdate();
}
}

Future<void> _createChatThenSendUnsentMessages(Message firstMessage) async {
Future<void> _createChatThenSendUnsentMessages() async {
// this is the first message sent, create a chat
final firstMessage = unsentMessages[0];
await _uploadMessageMedia(firstMessage);
chat.id = await ChatsService.startConversation(
chat.otherProfile.uid,
Expand All @@ -56,9 +58,6 @@ class MessageSender {
unsentMessages.remove(unsent);
}
chat.type = ChatType.normal;

// TEMPORARY FIX:
// for some reason the unsent messages update previously but not here
if (onUpdate != null) onUpdate();
}

Expand Down
123 changes: 19 additions & 104 deletions lib/pages/chat/widgets/message_tile.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:intl/intl.dart';
import 'package:tundr/models/message.dart';
import 'package:tundr/pages/chat/widgets/reply_gesture.dart';
import 'package:tundr/pages/media/media_view.dart';
import 'package:tundr/constants/my_palette.dart';
import 'package:tundr/enums/message_option.dart';
import 'package:tundr/utils/from_theme.dart';
import 'package:tundr/utils/get_network_image.dart';
import 'package:tundr/utils/show_options_dialog.dart';
import 'package:tundr/widgets/media/media_thumbnail.dart';
import 'referenced_message_tile.dart';

import 'message_tile_content.dart';

class MessageTile extends StatefulWidget {
final Message message;
Expand Down Expand Up @@ -53,13 +51,6 @@ class _MessageTileState extends State<MessageTile> {
}
}

void _openMedia(BuildContext context) => Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MediaViewPage(media: widget.message.media),
),
);

Widget _buildOtherProfilePic(context) => Container(
width: 40,
height: 40,
Expand Down Expand Up @@ -91,99 +82,23 @@ class _MessageTileState extends State<MessageTile> {
SizedBox(width: 14),
GestureDetector(
onLongPress: () => _showMessageOptions(context),
child: Column(
crossAxisAlignment: widget.fromMe
? CrossAxisAlignment.end
: CrossAxisAlignment.start,
children: <Widget>[
Container(
constraints: BoxConstraints(maxWidth: 200),
padding:
widget.fromMe ? const EdgeInsets.all(8) : EdgeInsets.zero,
decoration: widget.fromMe
? fromTheme(
context,
dark: BoxDecoration(color: MyPalette.white),
light: BoxDecoration(
color: MyPalette.white,
borderRadius: BorderRadius.circular(10),
boxShadow: [MyPalette.primaryShadow],
),
)
: null,
child: Column(
crossAxisAlignment: widget.fromMe
? CrossAxisAlignment.end
: CrossAxisAlignment.start,
children: <Widget>[
if (widget.message.referencedMessage != null)
Padding(
padding: const EdgeInsets.only(bottom: 8),
child: GestureDetector(
child: ReferencedMessageTile(
message: widget.message.referencedMessage,
),
onTap: widget.onViewReferencedMessage,
),
),
if (widget.message.media != null)
Padding(
padding: const EdgeInsets.only(bottom: 8),
child: GestureDetector(
child: SizedBox(
width: 200,
height: 260,
child: ClipRRect(
borderRadius: fromTheme(
context,
dark: BorderRadius.zero,
light: BorderRadius.circular(6),
),
child: MediaThumbnail(widget.message.media),
),
),
onTap: () => _openMedia(context),
),
),
Text(
widget.message.text,
style: TextStyle(
color: widget.fromMe
? MyPalette.black
: Theme.of(context).colorScheme.onPrimary,
fontSize: 16,
),
),
],
),
),
SizedBox(height: 5),
Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
DateFormat.jm().format(widget.message.sentOn),
style: TextStyle(
color: MyPalette.grey,
fontSize: 12,
),
),
SizedBox(width: 3),
if (widget.fromMe)
Icon(
widget.message.readOn == null
? Icons.done
: Icons.done_all,
size: 16,
color: widget.message.readOn == null ||
!widget
.readReceipts // if the user disables read receipts they will also be unable to see
? MyPalette.grey
: MyPalette.gold,
),
],
),
],
child: MessageTileContent(
message: widget.message,
fromMe: widget.fromMe,
onViewReferencedMessage: widget.onViewReferencedMessage,
statusIcon: widget.fromMe
? Icon(
widget.message.readOn == null
? Icons.done
: Icons.done_all,
size: 16,
color: widget.message.readOn == null ||
!widget
.readReceipts // if the user disables read receipts they will also be unable to see
? MyPalette.grey
: MyPalette.gold,
)
: null,
),
),
],
Expand Down
114 changes: 114 additions & 0 deletions lib/pages/chat/widgets/message_tile_content.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:tundr/constants/my_palette.dart';
import 'package:tundr/models/message.dart';
import 'package:tundr/pages/media/media_view.dart';
import 'package:tundr/utils/from_theme.dart';

import 'package:tundr/widgets/media/media_thumbnail.dart';
import 'referenced_message_tile.dart';

class MessageTileContent extends StatelessWidget {
final Message message;
final bool fromMe;
final Widget statusIcon;
final Function onViewReferencedMessage;

MessageTileContent({
@required this.message,
@required this.fromMe,
@required this.statusIcon,
@required this.onViewReferencedMessage,
});

void _openMedia(BuildContext context) => Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MediaViewPage(media: message.media),
),
);

@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment:
fromMe ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: <Widget>[
Container(
constraints: BoxConstraints(maxWidth: 200),
padding: fromMe ? const EdgeInsets.all(8) : EdgeInsets.zero,
decoration: fromMe
? fromTheme(
context,
dark: BoxDecoration(color: MyPalette.white),
light: BoxDecoration(
color: MyPalette.white,
borderRadius: BorderRadius.circular(10),
boxShadow: [MyPalette.primaryShadow],
),
)
: null,
child: Column(
crossAxisAlignment:
fromMe ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: <Widget>[
if (message.referencedMessage != null)
Padding(
padding: const EdgeInsets.only(bottom: 8),
child: GestureDetector(
child: ReferencedMessageTile(
message: message.referencedMessage,
),
onTap: onViewReferencedMessage,
),
),
if (message.media != null)
Padding(
padding: const EdgeInsets.only(bottom: 8),
child: GestureDetector(
child: SizedBox(
width: 200,
height: 260,
child: ClipRRect(
borderRadius: fromTheme(
context,
dark: BorderRadius.zero,
light: BorderRadius.circular(6),
),
child: MediaThumbnail(message.media),
),
),
onTap: () => _openMedia(context),
),
),
Text(
message.text,
style: TextStyle(
color: fromMe
? MyPalette.black
: Theme.of(context).colorScheme.onPrimary,
fontSize: 16,
),
),
],
),
),
SizedBox(height: 5),
Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
DateFormat.jm().format(message.sentOn),
style: TextStyle(
color: MyPalette.grey,
fontSize: 12,
),
),
SizedBox(width: 4),
if (statusIcon != null) statusIcon,
],
),
],
);
}
}
Loading

0 comments on commit 5edf03d

Please sign in to comment.