@page "/settings" @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: true)) @attribute [Authorize] @using System.Collections.Generic @using TaxBaik.Web.Services @using TaxBaik.Domain.Interfaces @inject IApiClient ApiClient @inject ISnackbar Snackbar 설정 System 설정 공개 사이트 연락처와 관리자 계정 보안을 관리합니다. 사이트 정보 홈페이지와 문의 알림에 노출되는 기본 정보입니다. 사이트 정보 저장 계정 관리 비밀번호는 12자 이상으로 관리합니다. @(isChangingPassword ? "변경 중..." : "비밀번호 변경") @code { private bool isChangingPassword; private bool isLoadingSettings; private SiteSettingsFormModel form = new() { Phone = "010-4122-8268", Email = "taxbaik5668@gmail.com", KakaoUrl = "http://pf.kakao.com/_xoxchTX", InstagramUrl = "https://www.instagram.com/taxtory5668/" }; private PasswordChangeFormModel passwordForm = new(); protected override async Task OnInitializedAsync() { await LoadSettingsAsync(); } private async Task LoadSettingsAsync() { isLoadingSettings = true; try { var settings = await ApiClient.GetAsync>("site-settings"); if (settings is null || settings.Count == 0) return; if (settings.TryGetValue("PhoneNumber", out var loadedPhone) && !string.IsNullOrWhiteSpace(loadedPhone)) form.Phone = loadedPhone; if (settings.TryGetValue("EmailAddress", out var loadedEmail) && !string.IsNullOrWhiteSpace(loadedEmail)) form.Email = loadedEmail; if (settings.TryGetValue("KakaoChannelUrl", out var loadedKakao) && !string.IsNullOrWhiteSpace(loadedKakao)) form.KakaoUrl = loadedKakao; if (settings.TryGetValue("InstagramUrl", out var loadedInstagram) && !string.IsNullOrWhiteSpace(loadedInstagram)) form.InstagramUrl = loadedInstagram; } catch { Snackbar.Add("사이트 설정을 불러오지 못했습니다.", Severity.Warning); } finally { isLoadingSettings = false; } } private async Task SaveSettings() { if (isLoadingSettings) return; var response = await ApiClient.PutAsync("site-settings", new { Phone = form.Phone, Email = form.Email, KakaoUrl = form.KakaoUrl, InstagramUrl = form.InstagramUrl }); if (response?.Message is null) { Snackbar.Add("설정 저장에 실패했습니다.", Severity.Error); return; } Snackbar.Add(response.Message, Severity.Success); } private async Task ChangePassword() { if (isChangingPassword) return; if (string.IsNullOrWhiteSpace(passwordForm.CurrentPassword) || string.IsNullOrWhiteSpace(passwordForm.NewPassword)) { Snackbar.Add("현재 비밀번호와 새 비밀번호를 입력하세요.", Severity.Warning); return; } if (passwordForm.NewPassword != passwordForm.ConfirmNewPassword) { Snackbar.Add("새 비밀번호 확인이 일치하지 않습니다.", Severity.Warning); return; } isChangingPassword = true; try { var response = await ApiClient.PostAsync("auth/change-password", new { CurrentPassword = passwordForm.CurrentPassword, NewPassword = passwordForm.NewPassword }); if (response?.Message == null) { Snackbar.Add("비밀번호 변경에 실패했습니다.", Severity.Error); return; } Snackbar.Add(response.Message, Severity.Success); passwordForm = new PasswordChangeFormModel(); } catch { Snackbar.Add("비밀번호 변경 중 오류가 발생했습니다.", Severity.Error); } finally { isChangingPassword = false; } } private class ChangePasswordResponse { public string Message { get; set; } = ""; } private class SaveSettingsResponse { public string Message { get; set; } = ""; } }