using FireChat.Database; using FireChat.Helpers; using FireChat.Models; using MahApps.Metro.Controls; using System; using System.ComponentModel; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace FireChat.Windows { /// <summary> /// Interaction logic for ChatWindow.xaml /// </summary> public partial class ChatWindow : MetroWindow { private ChatDatabase _database; private string _username; private string _nickname; public ChatWindow(ChatDatabase database, string username, string nickname) { InitializeComponent(); _database = database; _username = username; _nickname = nickname; } private void ChatWindow_Loaded(object sender, RoutedEventArgs e) { Title = Title.Replace("{username}", _username); Title = Title.Replace("{nickname}", _nickname); StartListening(); } private async void StartListening() { await _database.SetMessageAddedListener((messageModel) => { ChatMessageModel msg = new ChatMessageModel(messageModel); chatListView.Invoke(delegate { chatListView.Items.Add(msg); // We should check if we are not scrolled up for UX but whatever if (chatListView.Items.Count > 0) { chatListView.ScrollIntoView(chatListView.Items[chatListView.Items.Count - 1]); } }); }); } protected override void OnClosing(CancelEventArgs e) { _database.RemoveMessageAddedListener(); base.OnClosing(e); } private void quitButton_Click(object sender, RoutedEventArgs e) { this.Close(); } private void logoutButton_Click(object sender, RoutedEventArgs e) { GoToLoginWindow(); } private void GoToLoginWindow() { var loginWindow = new LoginWindow(_database); ; loginWindow.Left = this.Left; loginWindow.Top = this.Top; loginWindow.Show(); this.Close(); } private async void deleteAccountButton_Click(object sender, System.Windows.RoutedEventArgs e) { var answer = MessageBoxHelper.ShowQuestion("Are you sure you want to delete your account?nYour messages will not be deleted."); if (answer != MessageBoxResult.Yes) { return; } if (await _database.DeleteUserAsync(_username)) { MessageBoxHelper.ShowSuccess("Account deleted successfully."); GoToLoginWindow(); } else { MessageBoxHelper.ShowError("An error occurred while deleting your account."); } } private async void sendButton_Click(object sender, RoutedEventArgs e) { IsEnabled = false; await SendCurrentMessageAsync(); IsEnabled = true; messageBox.Focus(); } private async Task SendCurrentMessageAsync() { if (string.IsNullOrWhiteSpace(messageBox.Text)) { return; } var messageModel = new ChatMessageModel(_username, _nickname, messageBox.Text, DateTime.Now); messageModel.SenderNickname = anonymousCheckbox.IsChecked == true ? "Anonymous" : _nickname; if (!await _database.SendMessageAsync(messageModel)) { MessageBoxHelper.ShowError("An error occurred while sending the message."); return; } messageBox.Text = string.Empty; } protected override async void OnKeyDown(KeyEventArgs e) { if (e.Key == Key.Enter) { IsEnabled = false; await SendCurrentMessageAsync(); IsEnabled = true; messageBox.Focus(); e.Handled = true; } base.OnKeyDown(e); } } }