Skip to content

feat: 로그인/회원가입 페이지 구현 (#43)#46

Merged
0011810 merged 6 commits into
developfrom
feat/#43/login-signup
Jul 13, 2026
Merged

feat: 로그인/회원가입 페이지 구현 (#43)#46
0011810 merged 6 commits into
developfrom
feat/#43/login-signup

Conversation

@0011810

@0011810 0011810 commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Pull Request

작업 내용

  • 로그인/회원가입 페이지 UI 구현 및 인증 플로우 설정

작업 결과

  • 로그인: Google/GitHub 소셜 로그인, 이메일+비밀번호 로그인, 아이디 저장, 인풋별 에러 메시지
  • 회원가입: 이메일 → OTP 인증(6자리) → 정보 입력 단계별 플로우
  • 미들웨어: 비로그인 사용자 /login 리다이렉트, 로그인 상태에서 auth 페이지 접근 시 /workspaces 리다이렉트

변경 사항

Added

  • src/views/login, src/views/signup — LoginView, SignupView 컴포넌트
  • src/app/login/page.tsx, src/app/signup/page.tsx — 페이지 라우트
  • src/middleware.ts — Next.js 미들웨어 진입점
  • src/app/auth/callback/route.ts — 소셜 로그인 콜백 처리

Changed

  • src/widgets/landing/landing-header/ui/LandingHeader.tsx — 로그인/회원가입 링크 경로 수정

Fixed

실행화면

스크린샷 2026-07-13 오후 3 12 11 스크린샷 2026-07-13 오후 3 18 32 스크린샷 2026-07-13 오후 3 13 15 스크린샷 2026-07-13 오후 3 13 51

테스트

  • 로컬 실행 확인
  • 주요 시나리오 확인
  • 영향 범위 확인

리뷰 체크리스트

  • PR base branch가 올바릅니다. (feature/* -> develop, 배포 시 develop 또는 release/* -> main)
  • 브랜치명이 Type/#issue-number/description 형식을 따릅니다.
  • 커밋 메시지가 컨벤션을 따릅니다.
  • 불필요한 console.log, 주석, 임시 코드를 제거했습니다.
  • 타입 에러와 린트 에러를 확인했습니다.
  • CodeRabbit 1차 리뷰를 확인했습니다.
  • CodeRabbit 리뷰 반영 후 Discord에 공유했습니다.
  • 최소 1명 이상의 approve 후 merge합니다.

리뷰 요청사항

  • 미들웨어 라우트 보호 로직 확인 부탁드립니다. (src/shared/lib/middleware.ts)
  • 소셜 로그인 콜백의 세션 처리 및 프로필 저장 로직 확인 부탁드립니다. (src/app/auth/callback/route.ts)

관련 이슈

Closes #43

Summary by CodeRabbit

  • 새 기능
    • Google·GitHub 소셜 로그인과 이메일·비밀번호 로그인을 지원하고, 인증/콜백 오류를 한글로 안내합니다.
    • 이메일 OTP 기반 단계형 회원가입(OTP→정보→완료)과 OTP 타이머/재발송 제한을 추가했습니다.
    • 로그인·회원가입 및 인증 콜백 후 워크스페이스로 자동 이동하며, 필요 시 원래 경로로 되돌려 보냅니다.
  • 버그 수정
    • 인증 경로 리다이렉트 규칙을 개선해 보호 페이지 접근 시 로그인으로 정확히 안내합니다.
    • 회원가입 CTA 링크를 /signup으로 수정했습니다.

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

로그인·회원가입 페이지와 인증 콜백 라우트가 추가됐다. 이메일·비밀번호, OAuth, 이메일 OTP 가입을 지원하며, 미들웨어는 인증 상태에 따라 리다이렉트한다. 인증 성공 시 사용자 프로필을 저장하고 워크스페이스로 이동한다.

Changes

인증 라우팅 및 페이지 진입

Layer / File(s) Summary
인증 라우팅 및 페이지 진입
src/middleware.ts, src/shared/lib/middleware.ts, src/app/login/page.tsx, src/app/signup/page.tsx, src/views/login/index.ts, src/views/signup/index.ts, src/widgets/landing/...
공개 경로와 인증 페이지 접근을 처리하고 /login, /signup 페이지 및 관련 컴포넌트 연결을 추가했다.

로그인 및 OAuth 시작

Layer / File(s) Summary
로그인 및 OAuth 시작
src/shared/lib/use-oauth-sign-in.ts, src/views/login/ui/LoginView.tsx
이메일·비밀번호 로그인, 아이디 저장, Google·GitHub OAuth, 오류 표시와 로딩 상태를 구현했다.

OTP 회원가입 흐름

Layer / File(s) Summary
OTP 회원가입 흐름
src/views/signup/ui/SignupView.tsx
이메일 OTP 전송·검증, 재발송 타이머, 사용자 정보 입력, 비밀번호 업데이트와 프로필 저장을 단계별로 구현했다.

OAuth 콜백 및 프로필 저장

Layer / File(s) Summary
OAuth 콜백 및 프로필 저장
src/app/auth/callback/route.ts
인증 code로 세션을 교환하고 profiles에 사용자 정보를 upsert한 뒤 성공 또는 실패 URL로 리다이렉트한다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant LoginView
  participant SupabaseAuth
  participant AuthCallback
  participant Profiles
  participant Workspaces
  LoginView->>SupabaseAuth: OAuth 로그인 요청
  SupabaseAuth->>AuthCallback: 인증 code 전달
  AuthCallback->>SupabaseAuth: 세션 교환
  AuthCallback->>Profiles: 사용자 프로필 upsert
  AuthCallback->>Workspaces: 성공 리다이렉트
Loading

Possibly related PRs

  • TeampleRun/syncly#10: 인증 콜백과 미들웨어가 성공 후 이동하는 /workspaces 페이지를 추가해 이 인증 흐름과 연결된다.
  • TeampleRun/syncly#36: 인증 콜백이 저장하는 profiles.real_name을 워크스페이스 생성 RPC가 조회하는 데이터 흐름으로 연결된다.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 로그인/회원가입 페이지 구현과 이슈 #43의 핵심 변경을 명확히 요약합니다.
Description check ✅ Passed 필수 섹션이 대부분 채워져 있고 관련 이슈와 테스트, 체크리스트도 포함되어 템플릿을 충족합니다.
Linked Issues check ✅ Passed 로그인/회원가입 라우트, 소셜·이메일 로그인, OTP 회원가입, 리다이렉트, 아이디 저장이 구현되어 #43의 핵심 요구를 충족합니다.
Out of Scope Changes check ✅ Passed 요구사항과 무관한 별도 변경은 보이지 않으며 추가된 파일들도 로그인/회원가입 흐름에 직접 관련됩니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#43/login-signup

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/app/auth/callback/route.ts`:
- Around line 19-24: Update the profiles upsert in the auth callback so repeated
OAuth logins do not overwrite user-edited real_name or avatar_url values;
preserve existing profile fields when the record already exists while still
initializing missing values for new profiles.
- Around line 14-24: 인증 콜백의 data.user.email 비어 있음 처리를 명확히 정의하고, email이 없는 사용자는
profiles upsert 전에 안전하게 거부하거나 적절한 인증 오류 흐름으로 반환하세요. realName 계산의 비-null 단언과
profiles upsert의 email 비-null 단언을 제거해 런타임 크래시 및 NOT NULL 위반을 방지하고, 이메일이 있는 기존
경로는 그대로 유지하세요.
- Around line 5-7: Validate the next redirect in the auth callback using new
URL(next, origin), and only allow it when the parsed URL has the same origin as
origin; otherwise fall back to /workspaces. Update the redirect construction to
use the validated URL so values such as `@evil.com` cannot redirect to an external
host.

In `@src/shared/lib/middleware.ts`:
- Around line 46-50: Update the unauthenticated redirect in the middleware
condition `if (!user && !isPublic)` to append the originally requested
destination as a `redirect` query parameter before returning
`NextResponse.redirect`. Build it from the current request URL so the login flow
can restore the protected path, query string, and other relevant destination
details.
- Around line 41-57: Move the PUBLIC_PATHS and AUTH_PAGES arrays from the
middleware request-handling scope to module-level constants, while preserving
the existing isPublic and authenticated-page redirect behavior.

In `@src/views/login/ui/LoginView.tsx`:
- Around line 173-179: Update the password visibility toggle button in LoginView
to include an accessible aria-label describing its current action or state,
distinguishing between showing and hiding the password while preserving the
existing toggle behavior.
- Around line 58-70: Update signInWithGoogle and signInWithGitHub to capture the
signInWithOAuth result, check its error, and pass any failure to setError
consistently with signInWithEmail so social-login failures are shown to the
user.
- Around line 43-49: Update the email and rememberEmail state initialization in
LoginPage to use SSR-safe empty defaults, then read SAVED_EMAIL_KEY in a
mount-time useEffect and populate both states after hydration. Preserve the
current password initialization and controlled input behavior.

In `@src/views/signup/ui/SignupView.tsx`:
- Around line 146-165: Update handleInfoSubmit to trim name before any Supabase
calls, return early with the existing error state when the normalized name is
empty, and use the trimmed value for both updateUser’s full_name and
profiles.upsert’s real_name.
- Around line 156-167: SignupView의 getUser 및 profiles upsert 흐름에서 반환된 오류를 검사하고,
어느 작업이든 실패하면 오류를 표시한 뒤 즉시 중단하세요. 두 작업이 성공하고 유효한 user가 확인된 경우에만 profiles upsert를
완료한 후 setStep('done')을 호출하도록 수정하세요.
- Around line 85-97: Update signInWithGoogle and signInWithGitHub to use a
shared OAuth handler that checks the signInWithOAuth result and passes any error
to setError. Track the request state and disable both OAuth buttons while
authentication is in progress, preserving the existing provider and redirect
configuration.
- Around line 115-127: Update the signup flow around handleOtpVerify and the
authenticated /signup routing so a newly verified user remains in onboarding
until the profiles record is completed. Add or reuse a distinct onboarding path,
or make the server-side redirect check profile completion status, and preserve
the transition to the info step without redirecting to /workspaces prematurely.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: fd437e1a-e93c-4921-a664-a993c655369d

📥 Commits

Reviewing files that changed from the base of the PR and between 6965db1 and 7dd6165.

⛔ Files ignored due to path filters (3)
  • public/images/auth/icon-github.svg is excluded by !**/*.svg, !public/**
  • public/images/auth/icon-google.svg is excluded by !**/*.svg, !public/**
  • public/images/auth/login-symbol.png is excluded by !**/*.png, !public/**
📒 Files selected for processing (10)
  • src/app/auth/callback/route.ts
  • src/app/login/page.tsx
  • src/app/signup/page.tsx
  • src/middleware.ts
  • src/shared/lib/middleware.ts
  • src/views/login/index.ts
  • src/views/login/ui/LoginView.tsx
  • src/views/signup/index.ts
  • src/views/signup/ui/SignupView.tsx
  • src/widgets/landing/landing-header/ui/LandingHeader.tsx

Comment thread src/app/auth/callback/route.ts Outdated
Comment thread src/app/auth/callback/route.ts Outdated
Comment thread src/app/auth/callback/route.ts Outdated
Comment thread src/shared/lib/middleware.ts Outdated
Comment on lines +46 to +50
if (!user && !isPublic) {
const url = request.nextUrl.clone();
url.pathname = '/login';
return NextResponse.redirect(url);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🔵 Trivial | 💤 Low value

비로그인 리다이렉트 시 원래 목적지 보존 안 됨.

보호된 경로 접근 시 /login으로만 리다이렉트되고 원래 경로가 보존되지 않습니다. LoginView(다른 파일)가 로그인 성공 후 항상 /workspaces로 고정 이동한다면, 사용자는 원래 방문하려던 페이지로 돌아가지 못합니다. ?redirect= 쿼리 파라미터를 추가해 로그인 후 원래 경로로 복귀시키는 것을 고려해보세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/shared/lib/middleware.ts` around lines 46 - 50, Update the
unauthenticated redirect in the middleware condition `if (!user && !isPublic)`
to append the originally requested destination as a `redirect` query parameter
before returning `NextResponse.redirect`. Build it from the current request URL
so the login flow can restore the protected path, query string, and other
relevant destination details.

Comment thread src/views/login/ui/LoginView.tsx
Comment thread src/views/signup/ui/SignupView.tsx Outdated
Comment thread src/views/signup/ui/SignupView.tsx
Comment thread src/views/signup/ui/SignupView.tsx
Comment thread src/views/signup/ui/SignupView.tsx Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/views/signup/ui/SignupView.tsx`:
- Around line 85-96: Extract the duplicated handleOAuthSignIn logic from
SignupView and LoginView into a shared useOAuthSignIn hook under src/shared/lib,
preserving the existing provider type, redirect URL, Korean error conversion,
and loading/error state transitions. Update both views to use the shared hook
and remove their local handlers.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 6963d0ec-c820-4e14-8faa-adaa834ed065

📥 Commits

Reviewing files that changed from the base of the PR and between 7dd6165 and f5ae240.

📒 Files selected for processing (4)
  • src/app/auth/callback/route.ts
  • src/shared/lib/middleware.ts
  • src/views/login/ui/LoginView.tsx
  • src/views/signup/ui/SignupView.tsx

Comment thread src/views/signup/ui/SignupView.tsx Outdated

@seongjinss555 seongjinss555 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 하나 달아드렸는데 그거 수정 후에 머지하시면 될 것 같습니다~

Comment thread src/views/signup/ui/SignupView.tsx Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/views/signup/ui/SignupView.tsx`:
- Around line 66-84: Update SignupView’s session-check flow to track a
checkingSession state initialized as true, and render only a loading/empty state
while checkSession is pending. Set checkingSession to false after the
user/profile check completes, while preserving the existing
router.push('/workspaces') and setStep('info') outcomes.
- Around line 66-84: Update the signup session-routing logic around checkSession
to match the middleware behavior: authenticated users should be routed to
/workspaces regardless of whether their profile has real_name. Remove the
profile-dependent setStep('info') branch and preserve the unauthenticated signup
flow.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 021bc162-9e57-41da-99b1-f4392012887b

📥 Commits

Reviewing files that changed from the base of the PR and between f5ae240 and f5b51c8.

📒 Files selected for processing (3)
  • src/shared/lib/use-oauth-sign-in.ts
  • src/views/login/ui/LoginView.tsx
  • src/views/signup/ui/SignupView.tsx

Comment on lines +66 to +84
const { signInWithOAuth, oauthError, oauthLoading } = useOAuthSignIn();

useEffect(() => {
const checkSession = async () => {
const { data: { user } } = await supabase.auth.getUser();
if (!user) return;
const { data: profile } = await supabase
.from('profiles')
.select('real_name')
.eq('id', user.id)
.maybeSingle();
if (profile?.real_name) {
router.push('/workspaces');
} else {
setStep('info');
}
};
checkSession();
}, []);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

세션 확인이 끝나기 전 email 단계 화면이 순간 노출됩니다.

step 초기값이 'email'이라 checkSession이 비동기로 완료되기 전까지 "Syncly 시작하기" 폼이 먼저 그려집니다. OTP 인증 후 새로고침 등 이 로직이 노리는 바로 그 시나리오에서 사용자가 잘못된 화면을 잠깐 보게 됩니다. 확인 중임을 나타내는 상태로 초기 렌더를 가려주는 것이 좋습니다.

🩹 제안 수정
+  const [checkingSession, setCheckingSession] = useState(true);
+
   useEffect(() => {
     const checkSession = async () => {
       const { data: { user } } = await supabase.auth.getUser();
-      if (!user) return;
+      if (!user) {
+        setCheckingSession(false);
+        return;
+      }
       const { data: profile } = await supabase
         .from('profiles')
         .select('real_name')
         .eq('id', user.id)
         .maybeSingle();
       if (profile?.real_name) {
         router.push('/workspaces');
       } else {
         setStep('info');
+        setCheckingSession(false);
       }
     };
     checkSession();
   }, []);

그리고 checkingSessiontrue인 동안에는 아무것도(또는 로딩 스피너만) 렌더링하도록 return 문을 감싸주세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/views/signup/ui/SignupView.tsx` around lines 66 - 84, Update SignupView’s
session-check flow to track a checkingSession state initialized as true, and
render only a loading/empty state while checkSession is pending. Set
checkingSession to false after the user/profile check completes, while
preserving the existing router.push('/workspaces') and setStep('info') outcomes.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "== src/shared/lib/middleware.ts =="
cat -n src/shared/lib/middleware.ts
echo
echo "== src/middleware.ts =="
cat -n src/middleware.ts

Repository: TeampleRun/syncly

Length of output: 3858


checkSession 복귀 경로를 미들웨어와 맞춰야 합니다. src/shared/lib/middleware.ts가 인증된 사용자를 /signup에서 바로 /workspaces로 보내고 있어서, 프로필이 아직 없는 상태로 돌아와 info 단계를 복구하는 이 로직은 실행되지 않습니다. signup 접근 조건을 프로필 완료 여부에 맞게 분기하세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/views/signup/ui/SignupView.tsx` around lines 66 - 84, Update the signup
session-routing logic around checkSession to match the middleware behavior:
authenticated users should be routed to /workspaces regardless of whether their
profile has real_name. Remove the profile-dependent setStep('info') branch and
preserve the unauthenticated signup flow.

Source: Learnings

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/views/signup/ui/SignupView.tsx (1)

69-80: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

getUser()/maybeSingle()error를 처리하세요. 조회 실패도 프로필 없음으로 간주되어 info 단계로 넘어갑니다. 실패 시에는 오류를 표시하고 현재 단계로 유지/복구해야 합니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/views/signup/ui/SignupView.tsx` around lines 69 - 80, Update the
useEffect checkSession flow to inspect errors from both supabase.auth.getUser()
and the profiles query using maybeSingle(). On either lookup failure, display
the error and keep or restore the current signup stage; only treat a successful
response with no user or profile as the no-profile path that advances to the
info stage.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/views/signup/ui/SignupView.tsx`:
- Line 67: Update the email submit button in SignupView to use both loading
states, setting its disabled condition to account for loading and oauthLoading.
Keep the existing email submission behavior unchanged while preventing
submission during an active OAuth flow.

---

Outside diff comments:
In `@src/views/signup/ui/SignupView.tsx`:
- Around line 69-80: Update the useEffect checkSession flow to inspect errors
from both supabase.auth.getUser() and the profiles query using maybeSingle(). On
either lookup failure, display the error and keep or restore the current signup
stage; only treat a successful response with no user or profile as the
no-profile path that advances to the info stage.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3d974c2c-d94d-48ae-9f5b-bf6e771079a6

📥 Commits

Reviewing files that changed from the base of the PR and between f5b51c8 and cf60918.

📒 Files selected for processing (1)
  • src/views/signup/ui/SignupView.tsx

const [checkingSession, setCheckingSession] = useState(true);

const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);
const { signInWithOAuth, oauthError, oauthLoading } = useOAuthSignIn();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== SignupView outline =="
ast-grep outline src/views/signup/ui/SignupView.tsx --view expanded || true

echo
echo "== Relevant lines in SignupView =="
nl -ba src/views/signup/ui/SignupView.tsx | sed -n '1,320p'

echo
echo "== OAuth hook usage =="
rg -n "useOAuthSignIn|oauthLoading|loading|handleEmailNext|disabled" src/views/signup/ui/SignupView.tsx src -g '*.ts' -g '*.tsx'

Repository: TeampleRun/syncly

Length of output: 611


🏁 Script executed:

#!/bin/bash
set -euo pipefail
printf 'Requesting file inspection for src/views/signup/ui/SignupView.tsx\n'

Repository: TeampleRun/syncly

Length of output: 221


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
path = Path('src/views/signup/ui/SignupView.tsx')
text = path.read_text()
lines = text.splitlines()
for start, end in [(1, 220), (220, 340)]:
    print(f"\n--- lines {start}-{end} ---")
    for i in range(start, min(end, len(lines)) + 1):
        print(f"{i:4d}: {lines[i-1]}")
PY

Repository: TeampleRun/syncly

Length of output: 14076


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
path = Path('src/shared/lib/use-oauth-sign-in.ts')
text = path.read_text()
lines = text.splitlines()
for i, line in enumerate(lines, 1):
    print(f"{i:4d}: {line}")
PY

Repository: TeampleRun/syncly

Length of output: 1557


이메일 제출도 OAuth 진행 중에는 비활성화하세요.

handleEmailNextoauthLoading을 보지 않아서 소셜 로그인 시도 중에도 OTP 요청이 들어갈 수 있습니다. 이메일 submit 버튼도 disabled={loading || oauthLoading}로 맞추면 흐름이 겹치지 않습니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/views/signup/ui/SignupView.tsx` at line 67, Update the email submit
button in SignupView to use both loading states, setting its disabled condition
to account for loading and oauthLoading. Keep the existing email submission
behavior unchanged while preventing submission during an active OAuth flow.

@0011810
0011810 merged commit 2c13ffe into develop Jul 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 로그인/회원가입 페이지 구현

2 participants