using System.Windows; using System.Windows.Threading; using Microsoft.EntityFrameworkCore; using SimpleWiki.Data; using SimpleWiki.Models; using SimpleWiki.Services; namespace SimpleWiki.Views; public partial class MainWindow : Window { private readonly User _currentUser; private bool _isArticleBrowserReady; private string _pendingArticleHtml = string.Empty; public MainWindow(User currentUser) { InitializeComponent(); _currentUser = currentUser; _pendingArticleHtml = MarkdownService.ToHtmlDocument("Simple Wiki", "## Загрузка..."); Loaded += MainWindow_Loaded; ContentRendered += MainWindow_ContentRendered; } private void MainWindow_ContentRendered(object? sender, EventArgs e) { _isArticleBrowserReady = true; Dispatcher.BeginInvoke(RenderArticleIfReady, DispatcherPriority.ApplicationIdle); } private void MainWindow_Loaded(object sender, RoutedEventArgs e) { FullNameTextBlock.Text = _currentUser.FullName; EmailTextBlock.Text = _currentUser.Email; RoleTextBlock.Text = _currentUser.Role == Roles.Admin ? "Роль: администратор" : "Роль: пользователь"; CreatedAtTextBlock.Text = $"Дата регистрации: {_currentUser.CreatedAt.ToLocalTime():dd.MM.yyyy HH:mm}"; var isAdmin = _currentUser.Role == Roles.Admin; AdminToolbar.Visibility = isAdmin ? Visibility.Visible : Visibility.Collapsed; LoadArticles(); } private void LoadArticles(string? query = null) { using var db = new AppDbContext(); var items = db.Articles .Include(x => x.Author) .OrderByDescending(x => x.UpdatedAt ?? x.CreatedAt) .AsQueryable(); if (!string.IsNullOrWhiteSpace(query)) { var term = query.Trim().ToLower(); items = items.Where(x => x.Title.ToLower().Contains(term) || x.Summary.ToLower().Contains(term)); } var articles = items.ToList(); ArticlesListBox.ItemsSource = articles; if (articles.Count > 0) { ArticlesListBox.SelectedIndex = 0; } else { ArticleTitleTextBlock.Text = "Статей пока нет"; ArticleSummaryTextBlock.Text = "Бебебе"; ArticleMetaTextBlock.Text = string.Empty; _pendingArticleHtml = MarkdownService.ToHtmlDocument("Empty", "## Пусто\n\nПока нечего читать."); RenderArticleIfReady(); } } private void ArticlesListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { if (ArticlesListBox.SelectedItem is not Article selectedArticle) { return; } using var db = new AppDbContext(); var article = db.Articles .Include(x => x.Author) .FirstOrDefault(x => x.Id == selectedArticle.Id); if (article is null) { return; } ArticleTitleTextBlock.Text = article.Title; ArticleSummaryTextBlock.Text = article.Summary; ArticleMetaTextBlock.Text = $"Автор: {article.Author?.FullName} | Создано: {article.CreatedAt.ToLocalTime():dd.MM.yyyy HH:mm}" + (article.UpdatedAt.HasValue ? $" | Обновлено: {article.UpdatedAt.Value.ToLocalTime():dd.MM.yyyy HH:mm}" : string.Empty); _pendingArticleHtml = MarkdownService.ToHtmlDocument(article.Title, article.MarkdownContent); RenderArticleIfReady(); } private void RenderArticleIfReady() { if (!_isArticleBrowserReady) { return; } ArticleBrowser.NavigateToString(_pendingArticleHtml); } private void SearchTextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) { LoadArticles(SearchTextBox.Text); } private void AddArticleButton_Click(object sender, RoutedEventArgs e) { var editor = new ArticleEditorWindow(_currentUser); if (editor.ShowDialog() == true) { LoadArticles(SearchTextBox.Text); } } private void EditArticleButton_Click(object sender, RoutedEventArgs e) { if (ArticlesListBox.SelectedItem is not Article article) { MessageBox.Show("Сначала выберите статью.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var editor = new ArticleEditorWindow(_currentUser, article.Id); if (editor.ShowDialog() == true) { LoadArticles(SearchTextBox.Text); } } private void DeleteArticleButton_Click(object sender, RoutedEventArgs e) { if (ArticlesListBox.SelectedItem is not Article article) { MessageBox.Show("Сначала выберите статью.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var result = MessageBox.Show($"Удалить статью '{article.Title}'?", "Подтверждение", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) { return; } using var db = new AppDbContext(); var entity = db.Articles.FirstOrDefault(x => x.Id == article.Id); if (entity is null) { return; } db.Articles.Remove(entity); db.SaveChanges(); LoadArticles(SearchTextBox.Text); } private void LogoutButton_Click(object sender, RoutedEventArgs e) { SessionService.CurrentUser = null; new LoginWindow().Show(); Close(); } }