diff --git a/PlaylistShared.Pwa/Components/Profile/YandexTokenDialog.razor b/PlaylistShared.Pwa/Components/Profile/YandexTokenDialog.razor new file mode 100644 index 0000000..9a1184a --- /dev/null +++ b/PlaylistShared.Pwa/Components/Profile/YandexTokenDialog.razor @@ -0,0 +1,93 @@ +@using System.Text.RegularExpressions +@using PlaylistShared.Shared.DTO +@inject HttpClient Http +@inject ISnackbar Snackbar + + + + Подключение Яндекс.Музыки + + + + + + Нажмите на кнопку и разрешите доступ приложению. + + Войти в Яндекс + + + + + Скопируйте значение access_token или весь URL из адресной строки после перенаправления. + + https://music.yandex.ru/#access_token=ВАШ_ТОКЕН&... + + + + Сохранить + + + + + + + + + + + + +@code { + [CascadingParameter] IMudDialogInstance MudDialog { get; set; } + private string _rawInput = ""; + private int _index; + private bool _tokenErr = false; + + private async Task HandleWheel(WheelEventArgs e) + { + + if (e.DeltaY > 0 && _index < 1) // Прокрутка вниз -> Вперед + { + _index++; + } + else if (e.DeltaY < 0 && _index > 0) // Прокрутка вверх -> Назад + { + _index--; + } + } + + private async Task Submit() + { + var token = ExtractToken(_rawInput); + if (string.IsNullOrWhiteSpace(token)) + { + _tokenErr = true; + Snackbar.Add("Токен не найден", Severity.Error); + return; + } + + _tokenErr = false; + + var response = await Http.PostAsJsonAsync("/api/yandextoken/set", new SetYandexTokenRequest { Token = token }); + if (response.IsSuccessStatusCode) + { + Snackbar.Add("Токен успешно обновлен", Severity.Success); + MudDialog.Close(DialogResult.Ok(true)); + } + else + { + Snackbar.Add("Ошибка обновления токена. Повторите позже.", Severity.Error); + } + } + + private string ExtractToken(string input) => + input.Contains("access_token=") ? Regex.Match(input, @"access_token=([^&]+)").Groups[1].Value : input.Trim(); + + public class SetYandexTokenRequest { public string Token { get; set; } } +} diff --git a/PlaylistShared.Pwa/Components/Profile/YandexTokenInstructions.razor b/PlaylistShared.Pwa/Components/Profile/YandexTokenInstructions.razor deleted file mode 100644 index bf35fc0..0000000 --- a/PlaylistShared.Pwa/Components/Profile/YandexTokenInstructions.razor +++ /dev/null @@ -1,78 +0,0 @@ -@* Компонент с инструкцией по получению токена Яндекс.Музыки *@ - - - - Токен нужен для доступа к вашим плейлистам. Получите его один раз: - - - - - - 1 - - Перейдите по ссылке - - - - - 1 - - Авторизуйтесь в Яндексе (если ещё не вошли) - - - - - 1 - - Нажмите «Разрешить» - - - - - 1 - - Скопируйте access_token из адресной строки после перенаправления - - - - - - Пример: https://music.yandex.ru/#access_token=ВАШ_ТОКЕН&... - - - - Токен даёт доступ к вашим плейлистам. Никому его не сообщайте. - - - - Ваш токен сохраняется в зашифрованном виде и никому не передаётся. - - - - \ No newline at end of file diff --git a/PlaylistShared.Pwa/Icons/CustomIcons.cs b/PlaylistShared.Pwa/Icons/CustomIcons.cs new file mode 100644 index 0000000..cf59335 --- /dev/null +++ b/PlaylistShared.Pwa/Icons/CustomIcons.cs @@ -0,0 +1,8 @@ +namespace PlaylistShared.Pwa; + +public static class CustomIcons +{ + // SVG путь для логотипа Яндекса (буква Я в круге или просто Я) + public const string Yandex = "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm.72 15.79h-2.14v-1.58c-.37.49-.87.89-1.48 1.18-.61.29-1.29.44-2.03.44-1.2 0-2.13-.34-2.8-.1-1.02-.66-1.52-1.61-1.52-2.84 0-1.25.43-2.22 1.28-2.91.85-.69 2.05-1.04 3.59-1.04h1.1v-.84c0-.62-.15-1.07-.46-1.34-.31-.27-.79-.41-1.44-.41-.53 0-1.02.08-1.48.24-.46.16-.9.41-1.32.74v-1.8c.48-.25 1.01-.45 1.58-.59.57-.14 1.15-.21 1.74-.21 1.45 0 2.53.33 3.23 1 .7.67 1.05 1.66 1.05 2.97v6.29zm-2.14-5.18h-.9c-.8 0-1.4.15-1.8.44-.4.29-.6.74-.6 1.34 0 .55.16.96.48 1.23.32.27.76.41 1.32.41.51 0 .97-.13 1.37-.39.4-.26.6-.64.6-1.14v-1.89z"; +} + diff --git a/PlaylistShared.Pwa/Pages/Profile.razor b/PlaylistShared.Pwa/Pages/Profile.razor index baa1b0c..cb44551 100644 --- a/PlaylistShared.Pwa/Pages/Profile.razor +++ b/PlaylistShared.Pwa/Pages/Profile.razor @@ -1,65 +1,52 @@ @page "/profile" -Профиль - Playlist Share - -@using Microsoft.AspNetCore.Authorization -@using PlaylistShared.Pwa.Components.Profile -@using PlaylistShared.Shared.DTO @attribute [Authorize] @inject HttpClient Http -@inject ISnackbar Snackbar +@inject IDialogService DialogService +@using PlaylistShared.Pwa.Components.Profile +@using PlaylistShared.Shared.Profile - - - - Личный кабинет - - - - - - Здесь вы можете указать токен доступа к Яндекс.Музыке. - - - + Профиль - + + @* + + + + Данные аккаунта + + Сменить почту + + + *@ - - Сохранить токен - - - Статус: @_statusText - - + + + + + + Яндекс.Музыка + + @_statusText + + + + @(_hasToken ? "Переподключить" : "Установить") + + + + + - - - - Как получить токен Яндекс.Музыки - - - - - @code { - private string _token = ""; + private string _email = "user@example.com"; // Загрузите из стейта или API private string _statusText = "Загрузка..."; - private bool _instructionDrawerOpen = false; + private bool _hasToken; - protected override async Task OnInitializedAsync() - { - await LoadStatus(); - } + protected override async Task OnInitializedAsync() => await LoadStatus(); private async Task LoadStatus() { @@ -68,36 +55,19 @@ var response = await Http.GetFromJsonAsync>("/api/yandextoken/status"); if (response?.Success == true) { - _statusText = response.Data.HasToken - ? $"Токен установлен{(response.Data.IsValid ? "" : " (просрочен)")}" - : "Токен не установлен"; + _hasToken = response.Data.HasToken; + _statusText = _hasToken ? "Аккаунт подключен" : "Аккаунт не подключен"; } } - catch { _statusText = "Не удалось загрузить статус"; } + catch { _statusText = "Ошибка загрузки статуса"; } } - private async Task SaveToken() + private async Task OpenTokenDialog() { - if (string.IsNullOrWhiteSpace(_token)) - { - Snackbar.Add("Введите токен", Severity.Warning); - return; - } + var options = new DialogOptions { CloseOnEscapeKey = true, MaxWidth = MaxWidth.Small, FullWidth = true }; + var dialog = await DialogService.ShowAsync("", options); + var result = await dialog.Result; - var request = new SetYandexTokenRequest { Token = _token }; - var response = await Http.PostAsJsonAsync("/api/yandextoken/set", request); - if (response.IsSuccessStatusCode) - { - Snackbar.Add("Токен сохранён", Severity.Success); - await LoadStatus(); - _token = ""; - } - else - { - Snackbar.Add("Ошибка сохранения токена", Severity.Error); - } + if (!result.Canceled) await LoadStatus(); } - - public class YandexTokenStatus { public bool HasToken { get; set; } public bool IsValid { get; set; } } - public class SetYandexTokenRequest { public string Token { get; set; } } -} \ No newline at end of file +}