Skip to content

Commit 848252e

Browse files
committed
display when a message has been sent successfully, only send 1 profile picture url per recipient per chat
1 parent 5c79dc2 commit 848252e

File tree

7 files changed

+124
-92
lines changed

7 files changed

+124
-92
lines changed
Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,59 @@
1-
namespace Jordnaer.Client.Extensions;
2-
3-
public static class DateTimeExtensions
4-
{
1+
namespace Jordnaer.Client.Extensions;
2+
3+
public static class DateTimeExtensions
4+
{
55
public static string DisplayExactTime(this DateTime date) =>
66
// Example of this format: 1/9 2017 kl. 07:45
7-
$"afsendt {date.ToLocalTime():d/M yyyy kl. HH:mm}";
8-
9-
public static string DisplayTimePassed(this DateTime date)
10-
{
11-
var timeSpan = DateTime.UtcNow.Subtract(date);
12-
13-
switch (timeSpan.TotalSeconds)
14-
{
15-
case < 15:
16-
return "lige sendt";
17-
case < 60:
18-
return $"sendt for {Math.Floor(timeSpan.TotalSeconds)} sekunder siden";
19-
}
20-
21-
switch (timeSpan.TotalMinutes)
22-
{
23-
case < 2:
24-
return $"sendt for 1 minut siden";
25-
case < 60:
26-
return $"sendt for {Math.Floor(timeSpan.TotalMinutes)} minutter siden";
27-
}
28-
29-
switch (timeSpan.TotalHours)
30-
{
31-
case < 2:
32-
return $"sendt for 1 time siden";
33-
case < 24:
34-
return $"sendt for {Math.Floor(timeSpan.TotalHours)} timer siden";
35-
}
36-
37-
switch (timeSpan.TotalDays)
38-
{
39-
case < 2:
40-
return "sendt igår";
41-
case < 7:
42-
return $"sendt for {Math.Floor(timeSpan.TotalDays)} dage siden";
43-
}
44-
45-
int weeks = (int)Math.Floor(timeSpan.TotalDays / 7);
46-
47-
if (weeks is 1)
48-
{
49-
return "sendt i sidste uge";
50-
}
51-
52-
if (timeSpan.TotalDays < 365)
53-
{
54-
return $"sendt for {weeks} uger siden";
55-
}
56-
57-
return $"afsendt {date.ToLocalTime():dd/MM/yyyy HH:mm:ss}";
58-
}
59-
}
7+
$"afsendt {date.ToLocalTime():d/M yyyy kl. HH:mm}";
8+
9+
public static string DisplayTimePassed(this DateTime date)
10+
{
11+
var timeSpan = DateTime.UtcNow.Subtract(date);
12+
13+
switch (timeSpan.TotalSeconds)
14+
{
15+
case < 15:
16+
return "lige sendt";
17+
case < 60:
18+
return $"sendt for {Math.Floor(timeSpan.TotalSeconds)} sekunder siden";
19+
}
20+
21+
switch (timeSpan.TotalMinutes)
22+
{
23+
case < 2:
24+
return $"sendt for 1 minut siden";
25+
case < 60:
26+
return $"sendt for {Math.Floor(timeSpan.TotalMinutes)} minutter siden";
27+
}
28+
29+
switch (timeSpan.TotalHours)
30+
{
31+
case < 2:
32+
return $"sendt for 1 time siden";
33+
case < 24:
34+
return $"sendt for {Math.Floor(timeSpan.TotalHours)} timer siden";
35+
}
36+
37+
switch (timeSpan.TotalDays)
38+
{
39+
case < 2:
40+
return "sendt igår";
41+
case < 7:
42+
return $"sendt for {Math.Floor(timeSpan.TotalDays)} dage siden";
43+
}
44+
45+
int weeks = (int)Math.Floor(timeSpan.TotalDays / 7);
46+
47+
if (weeks is 1)
48+
{
49+
return "sendt i sidste uge";
50+
}
51+
52+
if (timeSpan.TotalDays < 365)
53+
{
54+
return $"sendt for {weeks} uger siden";
55+
}
56+
57+
return $"afsendt {date.ToLocalTime():dd/MM/yyyy HH:mm:ss}";
58+
}
59+
}

src/web/Client/Features/Chat/LargeChatComponent.razor

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,27 @@
6868
{
6969
<MudListItem>
7070
<MudTooltip Placement="Placement.Top" ShowOnClick ShowOnHover="false" Arrow Text="@message.SentUtc.DisplayExactTime()">
71-
<MudTooltip ShowOnHover Arrow Text="@message.SentUtc.DisplayTimePassed()">
71+
<MudTooltip ShowOnHover Arrow Text="@message.SentUtc.DisplayTimePassed()">
7272
<MudChip Class="pl-0 pb-0 chat-chip">
7373
<MudAvatar Size="Size.Medium" Class="mr-2">
74-
<MudImage Src="@message.Sender.ProfilePictureUrl" loading="lazy" Alt="Avatar" />
74+
<MudImage Src="@GetRecipientsProfilePictureUrl(message)" loading="lazy" Alt="Avatar" />
7575
</MudAvatar>
7676
@message.Text
7777
</MudChip>
7878
</MudTooltip>
7979
</MudTooltip>
80-
</MudListItem>
80+
</MudListItem>
8181
}
8282

8383
</Virtualize>
84+
@if (LastMessageWasSentSuccessfully)
85+
{
86+
<div title="Din besked er blevet sendt" class="message-sent-successfully-container">
87+
<MudIcon Icon="@Icons.Material.Outlined.CheckCircleOutline"
88+
Class="message-sent-successfully" />
89+
</div>
90+
}
91+
8492
<MudTextField @bind-Value="_userText"
8593
FullWidth
8694
Immediate
@@ -111,6 +119,29 @@
111119
private bool _isActiveChatPublished = true;
112120
private bool _isLoading = true;
113121

122+
private Dictionary<Guid, Guid> _lastSuccessfullySentMessageForChat = new();
123+
private bool LastMessageWasSentSuccessfully
124+
{
125+
get
126+
{
127+
if (_activeChat is null)
128+
{
129+
return false;
130+
}
131+
var lastMessage = _activeChat.Messages.LastOrDefault();
132+
if (lastMessage is null)
133+
{
134+
return false;
135+
}
136+
var lastMessageIsFromCurrentUser = lastMessage.SenderId == _currentUser!.Id;
137+
138+
var lastMessageWasSuccessfullySent = _lastSuccessfullySentMessageForChat.TryGetValue(_activeChat.Id, out var lastSuccessfullySentMessage) &&
139+
lastSuccessfullySentMessage == lastMessage.Id;
140+
141+
return lastMessageIsFromCurrentUser && lastMessageWasSuccessfullySent;
142+
}
143+
}
144+
114145
// TODO: Select currently displayed chat using this, when we update to dotnet 8
115146
[SupplyParameterFromQuery]
116147
public Guid? ChatId { get; set; }
@@ -149,9 +180,9 @@
149180
{
150181
return;
151182
}
152-
if (message.Sender.Id == _currentUser.Id)
183+
if (message.SenderId == _currentUser.Id)
153184
{
154-
// TODO: Message should be shown as sent
185+
_lastSuccessfullySentMessageForChat[chat.Id] = message.Id;
155186
return;
156187
}
157188

@@ -165,7 +196,7 @@
165196
}
166197
else
167198
{
168-
_chats = _chats.OrderByDescending(chat => chat.UnreadMessageCount).ToList();
199+
_chats = _chats.OrderByDescending(c => c.UnreadMessageCount).ToList();
169200
chat.UnreadMessageCount++;
170201
StateHasChanged();
171202
}
@@ -223,7 +254,7 @@
223254
ChatId = _activeChat.Id,
224255
Id = NewId.NextGuid(),
225256
SentUtc = DateTime.UtcNow,
226-
Sender = _currentUserSlim,
257+
SenderId = _currentUserSlim.Id,
227258
Text = _userText
228259
};
229260

@@ -251,7 +282,7 @@
251282
}
252283
}
253284

254-
private bool IsMessageFromSelf(ChatMessageDto message) => message.Sender.Id == _currentUser!.Id;
285+
private bool IsMessageFromSelf(ChatMessageDto message) => message.SenderId == _currentUser!.Id;
255286

256287
private async Task StartNewChat(IEnumerable<UserSlim> users)
257288
{
@@ -293,4 +324,10 @@
293324

294325
await SelectChat(newChat);
295326
}
327+
328+
private string GetRecipientsProfilePictureUrl(ChatMessageDto message)
329+
{
330+
return _activeChat?.Recipients.FirstOrDefault(recipient => recipient.Id == message.SenderId)?.ProfilePictureUrl ?? ProfileConstants.Default_Profile_Picture;
331+
}
332+
296333
}

src/web/Client/wwwroot/css/chat.css

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,15 @@
2828
overflow: auto;
2929
height: 100%;
3030
}
31+
32+
.message-sent-successfully-container {
33+
display: flex;
34+
justify-content: end;
35+
margin-right: 10px;
36+
margin-top: -20px;
37+
padding-bottom: 5px;
38+
}
39+
40+
.message-sent-successfully {
41+
font-size: 14px;
42+
}

src/web/Server/Features/Chat/ChatApi.cs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,7 @@ async Task<bool> CurrentUserIsNotPartOfChat()
112112
.OrderBy(message => message.SentUtc)
113113
.Skip(skip)
114114
.Take(take)
115-
.Select(message => message.ToChatMessageDto(new UserSlim
116-
{
117-
DisplayName = $"{message.Sender.FirstName} {message.Sender.LastName}",
118-
Id = message.SenderId,
119-
// TODO: only 1 url should be sent per unique chat participant
120-
ProfilePictureUrl = message.Sender.ProfilePictureUrl
121-
}))
115+
.Select(message => message.ToChatMessageDto())
122116
.ToListAsync(cancellationToken);
123117

124118
return TypedResults.Ok(chatMessages);
@@ -148,7 +142,7 @@ async Task<Results<NoContent, BadRequest, UnauthorizedHttpResult>> (
148142
LastMessageSentUtc = chat.LastMessageSentUtc,
149143
Id = chat.Id,
150144
StartedUtc = chat.StartedUtc,
151-
Messages = chat.Messages.Select(message => message.ToChatMessage(chat.Id)).ToList()
145+
Messages = chat.Messages.Select(static message => message.ToChatMessage()).ToList()
152146
});
153147

154148
foreach (var message in chat.Messages)
@@ -194,7 +188,7 @@ async Task<Results<NoContent, BadRequest, UnauthorizedHttpResult>> (
194188
return TypedResults.BadRequest();
195189
}
196190

197-
if (chatMessage.Sender.Id != currentUser.Id)
191+
if (chatMessage.SenderId != currentUser.Id)
198192
{
199193
return TypedResults.Unauthorized();
200194
}
@@ -206,7 +200,7 @@ async Task<Results<NoContent, BadRequest, UnauthorizedHttpResult>> (
206200
{
207201
ChatId = chatMessage.ChatId,
208202
Id = chatMessage.Id,
209-
SenderId = chatMessage.Sender.Id,
203+
SenderId = chatMessage.SenderId,
210204
Text = chatMessage.Text,
211205
AttachmentUrl = chatMessage.AttachmentUrl,
212206
SentUtc = chatMessage.SentUtc
@@ -218,7 +212,7 @@ async Task<Results<NoContent, BadRequest, UnauthorizedHttpResult>> (
218212
.ToListAsync(cancellationToken);
219213

220214
context.UnreadMessages.AddRange(recipientIds
221-
.Where(recipientId => recipientId != chatMessage.Sender.Id)
215+
.Where(recipientId => recipientId != chatMessage.SenderId)
222216
.Select(recipientId => new UnreadMessage
223217
{
224218
RecipientId = recipientId,

src/web/Shared/Chat/ChatMessageDto.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public class ChatMessageDto
66

77
public required Guid ChatId { get; init; }
88

9-
public required UserSlim Sender { get; init; }
9+
public required string SenderId { get; init; }
1010

1111
public required string Text { get; init; }
1212

src/web/Shared/Extensions/ChatMessageDtoExtensions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ namespace Jordnaer.Shared;
22

33
public static class ChatMessageDtoExtensions
44
{
5-
public static ChatMessage ToChatMessage(this ChatMessageDto message, Guid chatId) => new()
5+
public static ChatMessage ToChatMessage(this ChatMessageDto message) => new()
66
{
77
Id = message.Id,
8-
ChatId = chatId,
9-
SenderId = message.Sender.Id,
8+
ChatId = message.ChatId,
9+
SenderId = message.SenderId,
1010
Text = message.Text,
1111
AttachmentUrl = message.AttachmentUrl,
1212
SentUtc = message.SentUtc

src/web/Shared/Extensions/ChatMessageExtensions.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,7 @@ public static ChatMessageDto ToChatMessageDto(this ChatMessage chatMessage) =>
88
Id = chatMessage.Id,
99
ChatId = chatMessage.ChatId,
1010
AttachmentUrl = chatMessage.AttachmentUrl,
11-
Sender = chatMessage.Sender.ToUserSlim(),
12-
Text = chatMessage.Text,
13-
SentUtc = chatMessage.SentUtc
14-
};
15-
16-
public static ChatMessageDto ToChatMessageDto(this ChatMessage chatMessage, UserSlim sender) =>
17-
new()
18-
{
19-
Id = chatMessage.Id,
20-
ChatId = chatMessage.ChatId,
21-
AttachmentUrl = chatMessage.AttachmentUrl,
22-
Sender = sender,
11+
SenderId = chatMessage.SenderId,
2312
Text = chatMessage.Text,
2413
SentUtc = chatMessage.SentUtc
2514
};

0 commit comments

Comments
 (0)