@page "/expand" @page "/expand/{messageId}" @inherits LocalizableComponentBase
@if (IsLoading) {

@Localizer["loading"]

} else if (IsNotFound) {

@Localizer["This message doesn't exist."]

} else { @foreach (var message in Ancestors) { } @foreach (var message in Descendants) { } }
@code { [Inject] IStorage DbStorage { get; set; } [Inject] ILocalStorageService LocalStorage { get; set; } [Inject] IBlazorDownloadFileService BlazorDownloadFileService { get; set; } [Inject] MessagesService MessagesService { get; set; } [Parameter] public string MessageId { get; set; } List Ancestors { get; set; } = []; Message CurrentMessage { get; set; } = new(); List Descendants { get; set; } = []; bool IsNotFound { get; set; } TimeSortingType TimeSortingType { get; set; } = TimeSortingType.Ascending; // Parameters rather than initialization: following a link to another message reuses this page. protected override async Task OnParametersSetAsync() { if (string.IsNullOrEmpty(MessageId)) { Navigation.NavigateTo(""); return; } IsLoading = true; var filters = await LocalStorage.GetItemAsync(nameof(ActionBarFilter)) ?? new(); TimeSortingType = filters.TimeSortingType; if (CascadingState.IsOffline) { WhenOnline(LoadData); StartOnlinePolling(); IsLoading = false; return; } await LoadData(); IsLoading = false; } // The thread: the message from IndexedDB, the ones around it mock (Faker) until the app reads PrivaPub's context. async Task LoadData() { var message = await DbStorage.GetMessage(MessageId); IsNotFound = message is null; if (IsNotFound) return; CurrentMessage = message; (Ancestors, Descendants) = Faker.Thread(message); } async Task OnMessageReply(MessageForm messageForm) { var result = await MessagesService.SubmitMessage(messageForm, CascadingState.User); if (result.IsInvalid) { Toast.AddResponseError(result); return; } Descendants.Add(result.Data as Message); } async Task OnMessageBoost(Message message) { if (message.IsBoostedByCurrentUser) return; var result = await MessagesService.BoostUnboostMessage(message); if (result.IsInvalid) Toast.AddResponseError(result); } async Task OnMessageFavourite(Message message) { var result = await MessagesService.FavouriteUnfavouriteMessage(message); if (result.IsInvalid) Toast.AddResponseError(result); } async Task OnMessageDelete(Message message) { var result = await MessagesService.DeleteMessage(message); if (result.IsInvalid) { Toast.AddResponseError(result); return; } Toast.AddResponseSuccess(Localizer["Message deleted."]); if (message == CurrentMessage) { Navigation.NavigateTo(""); return; } Ancestors.Remove(message); Descendants.Remove(message); } async Task OnMessageMediaDownload(Media media) { await BlazorDownloadFileService.DownloadFileAsync(media.FileName, media.Blob, media.ContentType); } async Task OnUserBlock(MessageUser messageUser) { var result = await MessagesService.BlockUserFromMessage(messageUser); if (result.IsInvalid) { Toast.AddResponseError(result); return; } Toast.AddResponseSuccess(Localizer["{0} blocked.", messageUser.DisplayName]); } async Task OnUserDirectMessage(Message message) { var result = await MessagesService.ReplyMessage(message, MessageType.Direct); if (result.IsInvalid) Toast.AddResponseError(result); } async Task OnUserSilence(MessageUser messageUser) { var result = await MessagesService.SilenceUserFromMessage(messageUser); if (result.IsInvalid) { Toast.AddResponseError(result); return; } Toast.AddResponseSuccess(Localizer["{0} muted.", messageUser.DisplayName]); } }