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
+
+
+
+ Подключение Яндекс.Музыки
+
+
+
+
+
+ Нажмите на кнопку и разрешите доступ приложению.
+ {_index++;}"
+ FullWidth>
+ Войти в Яндекс
+
+
+
+
+ Скопируйте значение 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
+}