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 @@ Join What's New - + @if (!isLoggedIn) + { + + } + + + + @if (!isLoggedIn) + { + + } } diff --git a/Program/Views/Project/TopNav.razor.cs b/Program/Views/Project/TopProjectNav.razor.cs similarity index 59% rename from Program/Views/Project/TopNav.razor.cs rename to Program/Views/Project/TopProjectNav.razor.cs index 100f5cb..5279b02 100644 --- a/Program/Views/Project/TopNav.razor.cs +++ b/Program/Views/Project/TopProjectNav.razor.cs @@ -3,14 +3,23 @@ using Microsoft.JSInterop; namespace Front.Program.Views.Project; -public partial class TopNav : ComponentBase +public partial class TopProjectNav : ComponentBase { - //로그인버튼을 누르면 페이지를 이동할거야 [Inject] NavigationManager NavigationManager { get; set; } = default!; + + [Inject] IJSRuntime JS { get; set; } = default!; protected bool isOpen = false; + protected bool isLoggedIn = false; + + protected override async Task OnInitializedAsync() + { + // 쿠키에서 로그인 상태 확인 + var isLoginCookie = await JS.InvokeAsync("eval", "document.cookie.split('; ').find(row => row.startsWith('IsLogin='))?.split('=')[1]"); + isLoggedIn = isLoginCookie == "true"; + } public void OnClickMenuDown() { @@ -28,7 +37,4 @@ public partial class TopNav : ComponentBase if (isOpen) isOpen = !isOpen; NavigationManager.NavigateTo("/auth"); } - - - } \ No newline at end of file diff --git a/wwwroot/index.html b/wwwroot/index.html index 71445ee..f3eeec4 100644 --- a/wwwroot/index.html +++ b/wwwroot/index.html @@ -12,7 +12,7 @@ -
+