@page "/tafsir/{Slug}" @page "/tafsir/{Slug}/surah/{SurahNumber:int}" @page "/tafsir/{Slug}/surah/{SurahNumber:int}/ayah/{AyahNumber:int}" @inject TafsirApiClient Api @inject IDeviceIdStore DeviceStore @inject NavigationManager Nav @inject PlayerSessionService Player
@if (view == View.Surahs) { @if (loadingSurahs) { } else {
@foreach (var s in surahs) {
}
} } else if (view == View.Ayahs) {

سوره @(selectedSurah?.NameFa ?? "…")

@if (loadingAyahs) { } else {
@foreach (var a in ayahs) { }
} } else if (view == View.Detail) {
@if (loadingDetail || detail is null) { } else {

@detail.TextAr

@if (!string.IsNullOrWhiteSpace(detail.TextFa)) {

@detail.TextFa

}
@if (!string.IsNullOrWhiteSpace(detail.NotesHtml)) {
نکته‌ها
@((MarkupString)detail.NotesHtml)
} @if (!string.IsNullOrWhiteSpace(detail.MessagesHtml)) {
پیام‌ها
@((MarkupString)detail.MessagesHtml)
} @if (!string.IsNullOrWhiteSpace(detail.VideoEmbedUrl)) {
فیلم
} }
}
@code { private enum View { Surahs, Ayahs, Detail } [Parameter] public string Slug { get; set; } = ""; [Parameter] public int? SurahNumber { get; set; } [Parameter] public int? AyahNumber { get; set; } private string title = "تفسیر"; private string author = ""; private Guid tafsirId; private bool loadingMeta = true; private bool loadingSurahs; private bool loadingAyahs; private bool loadingDetail; private string? routeKey; private View view = View.Surahs; private List surahs = []; private List ayahs = []; private SurahListItemDto? selectedSurah; private AyahDetailDto? detail; private string deviceId = ""; private bool ready; protected override async Task OnAfterRenderAsync(bool firstRender) { if (!firstRender) return; ready = true; deviceId = await DeviceStore.GetOrCreateAsync(); await LoadRouteAsync(); } protected override async Task OnParametersSetAsync() { if (!ready) return; await LoadRouteAsync(); } private async Task LoadRouteAsync() { var key = $"{Slug}|{SurahNumber}|{AyahNumber}"; if (routeKey == key) return; routeKey = key; if (AyahNumber is not null && SurahNumber is not null) view = View.Detail; else if (SurahNumber is not null) view = View.Ayahs; else view = View.Surahs; loadingMeta = true; loadingSurahs = view == View.Surahs; loadingAyahs = view == View.Ayahs; loadingDetail = view == View.Detail; detail = null; await InvokeAsync(StateHasChanged); try { if (string.IsNullOrWhiteSpace(deviceId)) deviceId = await DeviceStore.GetOrCreateAsync(); var tafsirs = await Api.GetTafsirsAsync(); var tafsir = tafsirs.FirstOrDefault(t => t.Slug == Slug); title = tafsir?.Title ?? "تفسیر"; author = tafsir?.Author ?? ""; tafsirId = tafsir?.Id ?? Guid.Empty; loadingMeta = false; await InvokeAsync(StateHasChanged); if (view == View.Detail && SurahNumber is int s && AyahNumber is int a) await LoadDetail(s, a); else if (view == View.Ayahs && SurahNumber is int sn) await LoadAyahs(sn); else await LoadSurahs(); } finally { loadingMeta = false; loadingSurahs = false; loadingAyahs = false; loadingDetail = false; await InvokeAsync(StateHasChanged); } } private void GoBack() { if (view == View.Detail && SurahNumber is int s) Nav.NavigateTo($"/tafsir/{Slug}/surah/{s}"); else if (view == View.Ayahs) Nav.NavigateTo($"/tafsir/{Slug}"); else Nav.NavigateTo("/"); } private void OpenSurah(int n) => Nav.NavigateTo($"/tafsir/{Slug}/surah/{n}"); private void OpenAyah(int n) { var s = SurahNumber ?? detail?.SurahNumber ?? selectedSurah?.Number ?? 1; Nav.NavigateTo($"/tafsir/{Slug}/surah/{s}/ayah/{n}"); } private void GoPrevAyah() { if (detail?.PrevAyah is int p) OpenAyah(p); } private void GoNextAyah() { if (detail?.NextAyah is int n) OpenAyah(n); } private async Task LoadSurahs() { loadingSurahs = true; await InvokeAsync(StateHasChanged); surahs = (await Api.GetSurahsAsync(deviceId, tafsirId == Guid.Empty ? null : tafsirId)).ToList(); loadingSurahs = false; } private async Task LoadAyahs(int surahNumber) { loadingAyahs = true; await InvokeAsync(StateHasChanged); if (surahs.Count == 0) surahs = (await Api.GetSurahsAsync(deviceId, tafsirId == Guid.Empty ? null : tafsirId)).ToList(); selectedSurah = surahs.FirstOrDefault(x => x.Number == surahNumber); ayahs = (await Api.GetAyahsAsync(Slug, surahNumber, deviceId)).ToList(); loadingAyahs = false; } private async Task LoadDetail(int surahNumber, int ayahNumber) { loadingDetail = true; await InvokeAsync(StateHasChanged); detail = await Api.GetAyahAsync(Slug, surahNumber, ayahNumber); loadingDetail = false; await InvokeAsync(StateHasChanged); if (detail is null) return; tafsirId = detail.TafsirId; var resumePos = Player.HasTrack && Player.SurahNumber == surahNumber && Player.AyahNumber == ayahNumber ? Player.PositionSeconds : 0; await Player.SetTrackAsync(detail, resumePos); } private async Task ToggleSurahBookmark(SurahListItemDto s) { if (tafsirId == Guid.Empty) return; if (s.IsBookmarked) await Api.RemoveSurahBookmarkAsync(tafsirId, s.Number, deviceId); else await Api.AddSurahBookmarkAsync(new ToggleSurahBookmarkRequest(tafsirId, s.Number, deviceId)); surahs = (await Api.GetSurahsAsync(deviceId, tafsirId)).ToList(); } }