From 3ffec93958dc6295f5e02adab535763669712609 Mon Sep 17 00:00:00 2001
From: "Seonkyu.kim"
Date: Mon, 9 Jun 2025 17:45:53 +0900
Subject: [PATCH] =?UTF-8?q?[=E2=9C=A8]=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?=
=?UTF-8?q?=EB=B0=8F=20=ED=99=94=EB=A9=B4=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80?=
=?UTF-8?q?=EA=B2=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 회원가입 후 자동 로그인
2. 로그인 후 페이지 처리
3. 로딩 인디케이터 동작 구조 변경
---
Program/Layout/MainLayout.razor | 5 +-
Program/Layout/MainLayout.razor.cs | 19 ++----
Program/Views/Project/Auth.razor | 24 +++++--
Program/Views/Project/Auth.razor.cs | 50 +++++++++++----
Program/Views/Project/Register.razor | 48 ++++++++++----
Program/Views/Project/Register.razor.cs | 62 ++++++++++++++-----
.../{TopNav.razor => TopProjectNav.razor} | 25 +++++---
...TopNav.razor.cs => TopProjectNav.razor.cs} | 16 +++--
wwwroot/index.html | 20 ++++--
9 files changed, 192 insertions(+), 77 deletions(-)
rename Program/Views/Project/{TopNav.razor => TopProjectNav.razor} (75%)
rename Program/Views/Project/{TopNav.razor.cs => TopProjectNav.razor.cs} (59%)
diff --git a/Program/Layout/MainLayout.razor b/Program/Layout/MainLayout.razor
index 337b557..d784598 100644
--- a/Program/Layout/MainLayout.razor
+++ b/Program/Layout/MainLayout.razor
@@ -5,9 +5,10 @@
@* *@
- @if (!isHideTop)
+
+ @if (!isHidePrjTop)
{
-
+
}
diff --git a/Program/Layout/MainLayout.razor.cs b/Program/Layout/MainLayout.razor.cs
index 766970f..4f8cb25 100644
--- a/Program/Layout/MainLayout.razor.cs
+++ b/Program/Layout/MainLayout.razor.cs
@@ -13,11 +13,11 @@ public partial class MainLayout : LayoutComponentBase, IDisposable
[Inject]
LoadingService LoadingService { get; set; } = default!;
- // protected bool isHideTop => Navigation.Uri.Contains("/auth");
- protected bool isHideTop => Navigation.ToBaseRelativePath(Navigation.Uri).Equals("auth", StringComparison.OrdinalIgnoreCase);
+ // 경로의 시작 부분
+ // protected bool isHidePrjTop => Navigation.ToBaseRelativePath(Navigation.Uri).StartsWith("auth", StringComparison.OrdinalIgnoreCase);
- public static bool IsLoading { get; set; }
- public static IndicateType CurrentType { get; set; } = IndicateType.Page;
+ // 경로의 끝 부분
+ protected bool isHidePrjTop => Navigation.ToBaseRelativePath(Navigation.Uri).EndsWith("auth", StringComparison.OrdinalIgnoreCase);
protected override void OnInitialized()
{
@@ -35,15 +35,4 @@ public partial class MainLayout : LayoutComponentBase, IDisposable
LoadingService.OnChange -= StateHasChanged;
Navigation.LocationChanged -= HandleLocationChanged;
}
-
- public static void ShowLoading(IndicateType type = IndicateType.Page)
- {
- IsLoading = true;
- CurrentType = type;
- }
-
- public static void HideLoading()
- {
- IsLoading = false;
- }
}
\ No newline at end of file
diff --git a/Program/Views/Project/Auth.razor b/Program/Views/Project/Auth.razor
index 51f2e88..64926a8 100644
--- a/Program/Views/Project/Auth.razor
+++ b/Program/Views/Project/Auth.razor
@@ -1,12 +1,26 @@
@page "/auth"
+@page "/academy/auth"
로그인
-
+ @if (NavigationManager.Uri.Contains("/academy/auth"))
+ {
+
+ }
+ else
+ {
+
+ }
\ No newline at end of file
diff --git a/Program/Views/Project/Auth.razor.cs b/Program/Views/Project/Auth.razor.cs
index 6861e31..56ae901 100644
--- a/Program/Views/Project/Auth.razor.cs
+++ b/Program/Views/Project/Auth.razor.cs
@@ -6,24 +6,52 @@ using Microsoft.JSInterop;
namespace Front.Program.Views.Project;
-public partial class Auth : ComponentBase
+public partial class Auth : ComponentBase, IDisposable
{
[Inject] NavigationManager NavigationManager { get; set; } = default!;
[Inject] LoadingService LoadingService { get; set; } = default!;
- // [Inject] IJSRuntime JS { get; set; } = default!;
- // [Inject] CookieService Cookie { get; set; } = default!;
[Inject] HttpClient Http { get; set; } = default!;
+ [Inject] IJSRuntime JS { get; set; } = default!;
- public async Task KakaoLogin()
+ protected override void OnInitialized()
{
- LoadingService.ShowLoading();
- var url = "/api/v1/out/user/kakao/auth";
- var response = await Http.GetFromJsonAsync(url);
- var kakaoUrl = response.GetProperty("url").GetString();
- Console.WriteLine(kakaoUrl);
- if (!string.IsNullOrEmpty(kakaoUrl))
+ // LocationChanged 이벤트 구독
+ NavigationManager.LocationChanged += HandleLocationChanged;
+ }
+
+ private void HandleLocationChanged(object? sender, Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs e)
+ {
+ // 페이지 이동이 발생했을 때 로딩 상태 해제
+ Console.WriteLine($"페이지 이동 감지: {NavigationManager.Uri}");
+ LoadingService.HideLoading();
+ }
+
+ public void Dispose()
+ {
+ // 이벤트 구독 해제
+ NavigationManager.LocationChanged -= HandleLocationChanged;
+ }
+
+ public async Task KakaoLogin(string? path = null)
+ {
+ try
{
- NavigationManager.NavigateTo(kakaoUrl, true);
+ LoadingService.ShowLoading();
+
+ var url = $"/api/v1/out/user/kakao/auth?redirectPath={Uri.EscapeDataString(path ?? "/about")}";
+ var response = await Http.GetFromJsonAsync(url);
+ var kakaoUrl = response.GetProperty("url").GetString();
+
+ if (!string.IsNullOrEmpty(kakaoUrl))
+ {
+ // JavaScript를 통해 페이지 이동
+ await JS.InvokeVoidAsync("eval", $"window.location.replace('{kakaoUrl}')");
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"카카오 로그인 오류: {ex.Message}");
+ LoadingService.HideLoading();
}
}
}
\ No newline at end of file
diff --git a/Program/Views/Project/Register.razor b/Program/Views/Project/Register.razor
index 76b6dae..1b4b74e 100644
--- a/Program/Views/Project/Register.razor
+++ b/Program/Views/Project/Register.razor
@@ -21,7 +21,7 @@
@@ -31,15 +31,41 @@
@@ -49,7 +75,7 @@
*
diff --git a/Program/Views/Project/Register.razor.cs b/Program/Views/Project/Register.razor.cs
index 49e1a94..903cdce 100644
--- a/Program/Views/Project/Register.razor.cs
+++ b/Program/Views/Project/Register.razor.cs
@@ -5,6 +5,7 @@ using System.Net.Http.Json;
using System.Net.Http.Headers;
using System.Net.Http.Json;
using Front.Program.Layout;
+using Front.Program.Services;
namespace Front.Program.Views.Project;
@@ -14,10 +15,14 @@ public partial class Register : ComponentBase
[Inject] private NavigationManager NavigationManager { get; set; } = default!;
[Inject] private HttpClient Http { get; set; } = default!;
[Inject] private IConfiguration Configuration { get; set; } = default!;
+ [Inject] private LoadingService LoadingService { get; set; } = default!;
private ElementReference dateInputRef;
private string name = "";
+ private string birthYear = "";
+ private string birthMonth = "";
+ private string birthDay = "";
private DateTime? birth;
private string email = "";
private string phone = "";
@@ -89,6 +94,27 @@ public partial class Register : ComponentBase
}
}
+ private void UpdateBirthDate()
+ {
+ if (int.TryParse(birthYear, out int year) &&
+ int.TryParse(birthMonth, out int month) &&
+ int.TryParse(birthDay, out int day))
+ {
+ try
+ {
+ birth = new DateTime(year, month, day);
+ }
+ catch (ArgumentOutOfRangeException)
+ {
+ birth = null;
+ }
+ }
+ else
+ {
+ birth = null;
+ }
+ }
+
private async Task ConfirmData()
{
if (string.IsNullOrWhiteSpace(name))
@@ -103,6 +129,9 @@ public partial class Register : ComponentBase
return;
}
+ // 생일 업데이트
+ UpdateBirthDate();
+
// 전화번호 조합
if (phonePart1.Length == 3 && phonePart2.Length == 4 && phonePart3.Length == 4)
{
@@ -139,7 +168,7 @@ public partial class Register : ComponentBase
try
{
- MainLayout.ShowLoading();
+ LoadingService.ShowLoading();
// 쿠키에서 토큰 가져오기
var token = await JS.InvokeAsync("eval", "document.cookie.split('; ').find(row => row.startsWith('Web_AM_Connect_Key='))?.split('=')[1] || ''");
Console.WriteLine($"쿠키에서 가져온 토큰: '{token}'");
@@ -149,7 +178,7 @@ public partial class Register : ComponentBase
await JS.InvokeVoidAsync("alert", "인증 정보가 없습니다.");
NavigationManager.NavigateTo("/");
- MainLayout.HideLoading();
+ LoadingService.HideLoading();
return;
}
@@ -186,30 +215,27 @@ public partial class Register : ComponentBase
// 세션 스토리지 정리
await JS.InvokeVoidAsync("sessionStorage.removeItem", "snsId");
- MainLayout.HideLoading();
+ LoadingService.HideLoading();
await JS.InvokeVoidAsync("alert", "회원가입이 완료되었습니다.");
NavigationManager.NavigateTo("/");
}
else
{
- MainLayout.HideLoading();
- await JS.InvokeVoidAsync("alert", $"회원가입 실패: {message}");
+ LoadingService.HideLoading();
+ await JS.InvokeVoidAsync("alert", $"회원가입에 실패하였습니다.\n잠시 후 다시 시도해주세요.");
}
}
else
{
- MainLayout.HideLoading();
- Console.WriteLine($"API 호출 실패: {response.StatusCode}");
- var errorContent = await response.Content.ReadAsStringAsync();
- Console.WriteLine($"에러 내용: {errorContent}");
- await JS.InvokeVoidAsync("alert", "서버 오류가 발생했습니다.");
+ LoadingService.HideLoading();
+ await JS.InvokeVoidAsync("alert", "회원가입 중 오류가 발생했습니다.\n잠시 후 다시 시도해주세요.");
}
}
catch (Exception ex)
{
- MainLayout.HideLoading();
+ LoadingService.HideLoading();
Console.WriteLine($"예외 발생: {ex.Message}");
- await JS.InvokeVoidAsync("alert", $"오류가 발생했습니다: {ex.Message}");
+ await JS.InvokeVoidAsync("alert", "회원가입 중 오류가 발생했습니다.\n잠시 후 다시 시도해주세요.");
}
}
@@ -228,8 +254,16 @@ public partial class Register : ComponentBase
private async Task OpenDatePicker()
{
- if (birth == null) birth = DateTime.Now;
- await JS.InvokeVoidAsync("openDatePicker", dateInputRef);
+ try
+ {
+ if (birth == null) birth = DateTime.Now;
+ // showPicker 대신 click() 이벤트를 발생시켜 달력을 표시
+ await JS.InvokeVoidAsync("eval", $"document.querySelector('input[type=\"date\"]').click()");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"달력 표시 오류: {ex.Message}");
+ }
}
private void OnBirthChanged(ChangeEventArgs e)
{
diff --git a/Program/Views/Project/TopNav.razor b/Program/Views/Project/TopProjectNav.razor
similarity index 75%
rename from Program/Views/Project/TopNav.razor
rename to Program/Views/Project/TopProjectNav.razor
index a1d9c43..00d8958 100644
--- a/Program/Views/Project/TopNav.razor
+++ b/Program/Views/Project/TopProjectNav.razor
@@ -11,13 +11,19 @@
isOpen = !isOpen">Join
isOpen = !isOpen">What's New
-
+ @if (!isLoggedIn)
+ {
+
+ }
+
+
+