189 lines
6.3 KiB
Plaintext
189 lines
6.3 KiB
Plaintext
@page "/admin/settings"
|
|
@attribute [Authorize]
|
|
@using System.ComponentModel.DataAnnotations
|
|
@using System.Collections.Generic
|
|
@using TaxBaik.Web.Services
|
|
@using TaxBaik.Domain.Interfaces
|
|
@inject IApiClient ApiClient
|
|
@inject IJSRuntime JS
|
|
|
|
<PageTitle>설정</PageTitle>
|
|
|
|
<section class="admin-page-hero">
|
|
<div>
|
|
<div class="admin-eyebrow">System</div>
|
|
<h1 class="admin-page-title">설정</h1>
|
|
<p class="admin-page-subtitle">공개 사이트 연락처와 관리자 계정 보안을 관리합니다.</p>
|
|
</div>
|
|
</section>
|
|
|
|
<div class="admin-detail-grid">
|
|
<section class="admin-surface">
|
|
<div class="admin-section-header compact">
|
|
<div>
|
|
<h3 class="admin-section-title">사이트 정보</h3>
|
|
<p class="muted">홈페이지와 문의 알림에 노출되는 기본 정보입니다.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<form class="admin-form" @onsubmit="SaveSettings" @onsubmit:preventDefault="true">
|
|
<label>전화번호<input class="admin-input" @bind="phone" /></label>
|
|
<label>이메일<input class="admin-input" @bind="email" /></label>
|
|
<label>카카오 채널 URL<input class="admin-input" @bind="kakaoUrl" /></label>
|
|
<label>인스타그램<input class="admin-input" @bind="instagramUrl" /></label>
|
|
<div class="admin-dialog-actions">
|
|
<button type="submit" class="site-button primary">사이트 정보 저장</button>
|
|
</div>
|
|
</form>
|
|
</section>
|
|
|
|
<section class="admin-surface">
|
|
<div class="admin-section-header compact">
|
|
<div>
|
|
<h3 class="admin-section-title">계정 관리</h3>
|
|
<p class="muted">비밀번호는 12자 이상으로 관리합니다.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<form class="admin-form" @onsubmit="ChangePassword" @onsubmit:preventDefault="true">
|
|
<label>현재 비밀번호<input class="admin-input" type="password" @bind="currentPassword" /></label>
|
|
<label>새 비밀번호<input class="admin-input" type="password" @bind="newPassword" /></label>
|
|
<label>새 비밀번호 확인<input class="admin-input" type="password" @bind="confirmNewPassword" /></label>
|
|
<div class="admin-dialog-actions">
|
|
<button type="submit" class="site-button primary" disabled="@isChangingPassword">
|
|
@(isChangingPassword ? "변경 중..." : "비밀번호 변경")
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</section>
|
|
</div>
|
|
|
|
@code {
|
|
private string phone = "010-4122-8268";
|
|
private string email = "taxbaik5668@gmail.com";
|
|
private string kakaoUrl = "http://pf.kakao.com/_xoxchTX";
|
|
private string instagramUrl = "https://www.instagram.com/taxtory5668/";
|
|
private string currentPassword = "";
|
|
private string newPassword = "";
|
|
private string confirmNewPassword = "";
|
|
private bool isChangingPassword;
|
|
private bool isLoadingSettings;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
await LoadSettingsAsync();
|
|
}
|
|
|
|
private async Task LoadSettingsAsync()
|
|
{
|
|
isLoadingSettings = true;
|
|
|
|
try
|
|
{
|
|
var settings = await ApiClient.GetAsync<Dictionary<string, string>>("site-settings");
|
|
if (settings is null || settings.Count == 0)
|
|
return;
|
|
|
|
if (settings.TryGetValue("PhoneNumber", out var loadedPhone) && !string.IsNullOrWhiteSpace(loadedPhone))
|
|
phone = loadedPhone;
|
|
|
|
if (settings.TryGetValue("EmailAddress", out var loadedEmail) && !string.IsNullOrWhiteSpace(loadedEmail))
|
|
email = loadedEmail;
|
|
|
|
if (settings.TryGetValue("KakaoChannelUrl", out var loadedKakao) && !string.IsNullOrWhiteSpace(loadedKakao))
|
|
kakaoUrl = loadedKakao;
|
|
|
|
if (settings.TryGetValue("InstagramUrl", out var loadedInstagram) && !string.IsNullOrWhiteSpace(loadedInstagram))
|
|
instagramUrl = loadedInstagram;
|
|
}
|
|
catch
|
|
{
|
|
await JS.InvokeVoidAsync("alert", "사이트 설정을 불러오지 못했습니다.");
|
|
}
|
|
finally
|
|
{
|
|
isLoadingSettings = false;
|
|
}
|
|
}
|
|
|
|
private async Task SaveSettings()
|
|
{
|
|
if (isLoadingSettings)
|
|
return;
|
|
|
|
var response = await ApiClient.PutAsync<SaveSettingsResponse>("site-settings", new
|
|
{
|
|
Phone = phone,
|
|
Email = email,
|
|
KakaoUrl = kakaoUrl,
|
|
InstagramUrl = instagramUrl
|
|
});
|
|
|
|
if (response?.Message is null)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", "설정 저장에 실패했습니다.");
|
|
return;
|
|
}
|
|
|
|
await JS.InvokeVoidAsync("alert", response.Message);
|
|
}
|
|
|
|
private async Task ChangePassword()
|
|
{
|
|
if (isChangingPassword)
|
|
return;
|
|
|
|
if (string.IsNullOrWhiteSpace(currentPassword) || string.IsNullOrWhiteSpace(newPassword))
|
|
{
|
|
await JS.InvokeVoidAsync("alert", "현재 비밀번호와 새 비밀번호를 입력하세요.");
|
|
return;
|
|
}
|
|
|
|
if (newPassword != confirmNewPassword)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", "새 비밀번호 확인이 일치하지 않습니다.");
|
|
return;
|
|
}
|
|
|
|
isChangingPassword = true;
|
|
|
|
try
|
|
{
|
|
var response = await ApiClient.PostAsync<ChangePasswordResponse>("auth/change-password", new
|
|
{
|
|
CurrentPassword = currentPassword,
|
|
NewPassword = newPassword
|
|
});
|
|
|
|
if (response?.Message == null)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", "비밀번호 변경에 실패했습니다.");
|
|
return;
|
|
}
|
|
|
|
await JS.InvokeVoidAsync("alert", response.Message);
|
|
currentPassword = "";
|
|
newPassword = "";
|
|
confirmNewPassword = "";
|
|
}
|
|
catch
|
|
{
|
|
await JS.InvokeVoidAsync("alert", "비밀번호 변경 중 오류가 발생했습니다.");
|
|
}
|
|
finally
|
|
{
|
|
isChangingPassword = false;
|
|
}
|
|
}
|
|
|
|
private class ChangePasswordResponse
|
|
{
|
|
public string Message { get; set; } = "";
|
|
}
|
|
|
|
private class SaveSettingsResponse
|
|
{
|
|
public string Message { get; set; } = "";
|
|
}
|
|
}
|