Skip to content
This repository was archived by the owner on Oct 16, 2024. It is now read-only.

Commit 3a75406

Browse files
committed
Improved all chat ui and added some chat features
1 parent 9f753fd commit 3a75406

File tree

8 files changed

+224
-48
lines changed

8 files changed

+224
-48
lines changed

Views/Chats/Chat.xaml

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,48 @@
33
x:Class="CherryMerryGram.Views.Chats.Chat"
44
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
55
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
6-
xmlns:local="using:CherryMerryGram.Views.Chats"
76
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
87
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
98
mc:Ignorable="d"
109
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
1110

12-
<StackPanel>
13-
<StackPanel x:Name="TopBar" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Top">
14-
<Button x:Name="Back" Content="Back" />
15-
<TextBlock x:Name="ChatTitle" />
16-
<Button x:Name="Call" Content="Call" Click="Call_OnClick" />
17-
</StackPanel>
11+
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Padding="10">
12+
<Grid.RowDefinitions>
13+
<RowDefinition />
14+
<RowDefinition />
15+
<RowDefinition />
16+
</Grid.RowDefinitions>
1817

19-
<ScrollViewer HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
20-
<StackPanel x:Name="MessagesList"/>
21-
</ScrollViewer>
18+
<Grid VerticalAlignment="Top" Row="0">
19+
<Border Background="Gray">
20+
<StackPanel x:Name="TopBar" Orientation="Horizontal">
21+
<Button x:Name="Back" Content="Back" Click="Back_OnClick" HorizontalAlignment="Left" />
22+
<StackPanel Orientation="Vertical" HorizontalAlignment="Center">
23+
<TextBlock x:Name="ChatTitle" FontSize="18" FontStyle="Oblique"/>
24+
<TextBlock x:Name="ChatMembers" FontSize="14"/>
25+
</StackPanel>
26+
<Button x:Name="Call" Content="Call" Click="Call_OnClick" HorizontalAlignment="Right" />
27+
</StackPanel>
28+
</Border>
29+
</Grid>
2230

23-
<StackPanel x:Name="UserActionsPanel" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Bottom">
24-
<TextBox x:Name="UserMessageInput" PlaceholderText="Enter your message"/>
25-
<Button x:Name="Stickers" Content="Stickers" Width="70" MaxHeight="25" MaxWidth="25" />
26-
<Button x:Name="SendMessage" Content="Send" Width="70" MaxHeight="25" MaxWidth="25" Click="SendMessage_OnClick" />
27-
</StackPanel>
28-
</StackPanel>
29-
</Page>
31+
<Grid VerticalAlignment="Top" Row="1">
32+
<Border>
33+
<Border.Background>
34+
<ImageBrush x:Name="ThemeBackground" />
35+
</Border.Background>
36+
<ScrollViewer HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
37+
<StackPanel x:Name="MessagesList"/>
38+
</ScrollViewer>
39+
</Border>
40+
</Grid>
41+
42+
<Grid Row="2">
43+
<StackPanel x:Name="UserActionsPanel" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Bottom">
44+
<TextBox x:Name="UserMessageInput" PlaceholderText="Enter your message"/>
45+
<Button x:Name="Stickers" Content="Stickers" Width="70" MaxHeight="25" MaxWidth="25" />
46+
<Button x:Name="SendMessage" Content="Send" Width="70" MaxHeight="25" MaxWidth="25" Click="SendMessage_OnClick" />
47+
</StackPanel>
48+
</Grid>
49+
</Grid>
50+
</Page>

Views/Chats/Chat.xaml.cs

Lines changed: 69 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,93 @@
55
using System.Threading.Tasks;
66
using TdLib;
77
using Microsoft.UI.Xaml;
8+
using Microsoft.UI.Xaml.Media.Imaging;
89

910
namespace CherryMerryGram.Views.Chats
1011
{
1112
public sealed partial class Chat : Page
1213
{
1314
private static TdClient _client = MainWindow._client;
14-
private static IEnumerable<Task<TdApi.Chat>> _chat;
15-
private static long _chatId;
15+
public long ChatId;
16+
private List<TdApi.Message> _messagesList = [];
1617

1718
public Chat()
1819
{
1920
this.InitializeComponent();
21+
22+
_client.UpdateReceived += async (_, update) => { await ProcessUpdates(update); };
2023
}
2124

22-
public void UpdateChat(long chatId)
25+
private async Task ProcessUpdates(TdApi.Update update)
26+
{
27+
switch (update)
28+
{
29+
case TdApi.Update.UpdateNewMessage: { await GetMessages(ChatId); break; }
30+
case TdApi.Update.UpdateChatTitle: { await UpdateChat(ChatId); break; }
31+
}
32+
}
33+
34+
public Task UpdateChat(long chatId)
2335
{
24-
_chatId = chatId;
2536
var chat = _client.GetChatAsync(chatId);
2637
ChatTitle.Text = chat.Result.Title;
27-
GetMessages(chatId);
38+
39+
//_client.ExecuteAsync(new TdApi.DownloadFile { FileId = chat.Result.Background.Background.Id, Priority = 1 });
40+
41+
//ThemeBackground.ImageSource = new BitmapImage();
42+
43+
/*switch (chat.Result.Type)
44+
{
45+
case TdApi.ChatType.ChatTypeBasicGroup:
46+
{
47+
var basicGroup = _client.ExecuteAsync(new TdApi.GetBasicGroupFullInfo {BasicGroupId = ChatId});
48+
if (basicGroup == null) return Task.CompletedTask;
49+
ChatMembers.Text = $"{basicGroup.Result.Members.Length} members";
50+
break;
51+
}
52+
case TdApi.ChatType.ChatTypeSupergroup:
53+
{
54+
var superGroup = _client.ExecuteAsync(new TdApi.GetSupergroupFullInfo {SupergroupId = ChatId});
55+
if (superGroup == null) return Task.CompletedTask;
56+
ChatMembers.Text = $"{superGroup.Result.MemberCount} members";
57+
break;
58+
}
59+
default:
60+
{
61+
ChatMembers.Visibility = Visibility.Collapsed;
62+
break;
63+
}
64+
}*/
65+
66+
return Task.CompletedTask;
2867
}
2968

30-
private void GetMessages(long chatId)
69+
public Task GetMessages(long chatId)
3170
{
3271
var messages = _client.ExecuteAsync(new TdApi.GetChatHistory
3372
{
3473
ChatId = chatId,
3574
Limit = 100
3675
});
76+
77+
GenerateMessage();
3778

38-
foreach (var message in messages.Result.Messages_.Reverse())
79+
return Task.CompletedTask;
80+
81+
void GenerateMessage()
3982
{
40-
var chatMessage = new ChatMessage();
41-
chatMessage.UpdateMessage(message);
42-
MessagesList.Children.Add(chatMessage);
83+
foreach (var message in messages.Result.Messages_.Reverse())
84+
{
85+
var chatMessage = new ChatMessage();
86+
chatMessage.UpdateMessage(message);
87+
MessagesList.Children.Add(chatMessage);
88+
_messagesList.Add(message);
89+
90+
if (_messagesList.Count == messages.Result.Messages_.Length ||
91+
_messagesList.Contains(message)) continue;
92+
GenerateMessage();
93+
return;
94+
}
4395
}
4496
}
4597

@@ -68,7 +120,7 @@ private async void SendMessage_OnClick(object sender, RoutedEventArgs e)
68120
{
69121
await _client.ExecuteAsync(new TdApi.SendMessage
70122
{
71-
ChatId = _chatId,
123+
ChatId = ChatId,
72124
InputMessageContent = new TdApi.InputMessageContent.InputMessageText
73125
{
74126
Text = new TdApi.FormattedText
@@ -78,14 +130,14 @@ await _client.ExecuteAsync(new TdApi.SendMessage
78130
}
79131
});
80132

81-
UserMessageInput.Text = "";
133+
UserMessageInput.ClearValue(null);
82134
}
83135

84136
private void Call_OnClick(object sender, RoutedEventArgs e)
85137
{
86138
try
87139
{
88-
var chat = _client.GetChatAsync(_chatId);
140+
var chat = _client.GetChatAsync(ChatId);
89141
var messageSenderId = GetId(chat.Result.MessageSenderId);
90142

91143
_client.ExecuteAsync(new TdApi.CreateCall { IsVideo = false, Protocol = new TdApi.CallProtocol(), UserId = messageSenderId });
@@ -95,5 +147,9 @@ private void Call_OnClick(object sender, RoutedEventArgs e)
95147
Console.WriteLine(exception);
96148
}
97149
}
150+
151+
private void Back_OnClick(object sender, RoutedEventArgs e)
152+
{
153+
}
98154
}
99155
}

Views/Chats/ChatEntry.xaml.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace CherryMerryGram.Views.Chats
1010
{
1111
public sealed partial class ChatEntry : Page
1212
{
13-
public StackPanel ChatPage;
13+
public Grid ChatPage;
1414
private static Chat _chatWidget;
1515

1616
private static readonly TdClient _client = MainWindow._client;
@@ -81,8 +81,10 @@ private void Button_OnClick(object sender, RoutedEventArgs e)
8181
}
8282

8383
_chatWidget = new Chat();
84-
ChatPage?.Children.Add(_chatWidget);
84+
_chatWidget.ChatId = _chatId;
8585
_chatWidget.UpdateChat(_chatId);
86+
_chatWidget.GetMessages(_chatId);
87+
ChatPage?.Children.Add(_chatWidget);
8688
}
8789

8890
private static Task<TdApi.User> GetUser(TdApi.Message message)

Views/Chats/ChatMessage.xaml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
mc:Ignorable="d"
1010
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
1111

12-
<StackPanel Orientation="Horizontal" Margin="0, 5, 0, 5">
12+
<StackPanel x:Name="Message" Orientation="Horizontal" Margin="0, 5, 0, 5">
1313
<Border x:Name="BorderProfilePicture" Width="32" Height="32" CornerRadius="30" Margin="5">
1414
<Border.Background>
1515
<ImageBrush x:Name="ProfilePicture" />
@@ -30,4 +30,19 @@
3030
</StackPanel>
3131
</Border>
3232
</StackPanel>
33+
34+
<Page.Resources>
35+
<CommandBarFlyout Placement="Right" x:Name="CommandBarFlyout1">
36+
<AppBarButton x:Name="Reply" Label="Reply" ToolTipService.ToolTip="Share" Click="Reply_OnClick"/>
37+
<AppBarButton x:Name="Forward" Label="Forward" ToolTipService.ToolTip="Save" Click="Forward_OnClick"/>
38+
<AppBarButton x:Name="Edit" Label="Edit" ToolTipService.ToolTip="Save" Click="Edit_OnClick"/>
39+
<AppBarButton x:Name="Delete" Label="Delete" ToolTipService.ToolTip="Delete" Click="Delete_OnClick"/>
40+
<AppBarButton x:Name="Pin" Label="Pin" ToolTipService.ToolTip="Delete" Click="Pin_OnClick"/>
41+
<AppBarButton x:Name="MessageLink" Label="Copy message link" ToolTipService.ToolTip="Delete" Click="MessageLink_OnClick"/>
42+
<CommandBarFlyout.SecondaryCommands>
43+
<AppBarButton x:Name="ResizeButton1" Label="Resize"/>
44+
<AppBarButton x:Name="MoveButton1" Label="Move"/>
45+
</CommandBarFlyout.SecondaryCommands>
46+
</CommandBarFlyout>
47+
</Page.Resources>
3348
</Page>

Views/Chats/ChatMessage.xaml.cs

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using TdLib;
66
using CherryMerryGram;
77
using Microsoft.UI.Xaml;
8+
using Microsoft.UI.Xaml.Controls.Primitives;
89
using Microsoft.UI.Xaml.Input;
910
using Microsoft.UI.Xaml.Media.Imaging;
1011

@@ -13,14 +14,34 @@ namespace CherryMerryGram.Views.Chats
1314
public sealed partial class ChatMessage : Page
1415
{
1516
private static TdClient _client = MainWindow._client;
17+
private bool _isContextMenuOpen = false;
18+
19+
private long _chatId;
20+
private long _messageId;
21+
1622

1723
public ChatMessage()
1824
{
1925
this.InitializeComponent();
26+
27+
_client.UpdateReceived += async (_, update) => { await ProcessUpdates(update); };
2028
}
21-
22-
public async void UpdateMessage(TdApi.Message message)
29+
30+
private async Task ProcessUpdates(TdApi.Update update)
2331
{
32+
switch (update)
33+
{
34+
case TdApi.Update.UpdateMessageEdited:
35+
await UpdateMessageAfterEdit();
36+
break;
37+
}
38+
}
39+
40+
public async void UpdateMessage(TdApi.Message message)
41+
{
42+
_chatId = message.ChatId;
43+
_messageId = message.Id;
44+
2445
var user = GetUser(message);
2546
var chatMember = GetChatMember(message.ChatId, message.SenderId);
2647
var chat = GetChat(message.ChatId);
@@ -96,6 +117,23 @@ public async void UpdateMessage(TdApi.Message message)
96117
};
97118
}
98119

120+
private Task UpdateMessageAfterEdit()
121+
{
122+
var message = _client.ExecuteAsync(new TdApi.GetMessage
123+
{
124+
ChatId = _chatId,
125+
MessageId = _messageId
126+
});
127+
128+
MessageContent.Text = message.Result.Content switch
129+
{
130+
TdApi.MessageContent.MessageText messageText => MessageContent.Text = messageText.Text.Text,
131+
_ => MessageContent.Text
132+
};
133+
134+
return Task.CompletedTask;
135+
}
136+
99137
private static Task<TdApi.User> GetUser(TdApi.Message message)
100138
{
101139
long userId = message.SenderId switch {
@@ -133,14 +171,59 @@ public async void UpdateMessage(TdApi.Message message)
133171
return chat;
134172
}
135173

174+
private void ShowMenu(bool isTransient)
175+
{
176+
_isContextMenuOpen = isTransient;
177+
FlyoutShowOptions myOption = new FlyoutShowOptions();
178+
myOption.ShowMode = isTransient ? FlyoutShowMode.Transient : FlyoutShowMode.Standard;
179+
CommandBarFlyout1.ShowAt(Message, myOption);
180+
}
181+
136182
private void UIElement_OnRightTapped(object sender, RightTappedRoutedEventArgs e)
137183
{
138-
throw new System.NotImplementedException();
184+
ShowMenu(!_isContextMenuOpen);
139185
}
140186

141187
private void UIElement_OnDoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
142188
{
143189
throw new System.NotImplementedException();
144190
}
191+
192+
private void Reply_OnClick(object sender, RoutedEventArgs e)
193+
{
194+
throw new NotImplementedException();
195+
}
196+
197+
private void Forward_OnClick(object sender, RoutedEventArgs e)
198+
{
199+
throw new NotImplementedException();
200+
}
201+
202+
private void Edit_OnClick(object sender, RoutedEventArgs e)
203+
{
204+
_client.ExecuteAsync(new TdApi.EditMessageText
205+
{
206+
207+
});
208+
}
209+
210+
private void Delete_OnClick(object sender, RoutedEventArgs e)
211+
{
212+
_client.ExecuteAsync(new TdApi.DeleteMessages
213+
{
214+
ChatId = _chatId,
215+
MessageIds = new[] { _messageId }
216+
});
217+
}
218+
219+
private void Pin_OnClick(object sender, RoutedEventArgs e)
220+
{
221+
_client.PinChatMessageAsync(_chatId, _messageId, true);
222+
}
223+
224+
private void MessageLink_OnClick(object sender, RoutedEventArgs e)
225+
{
226+
_client.GetMessageLinkAsync(_chatId, _messageId);
227+
}
145228
}
146229
}

0 commit comments

Comments
 (0)