Repository navigation
Conversation
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configuration
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Figma 모달 설명은 줄바꿈 위치까지 디자인에 포함돼 있는데 `\n`이 공백으로 접혀서 의도와 다른 위치에서 줄이 바뀌었다. 기존 사용처는 모두 한 줄 문구라 렌더링 변화가 없다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
행사 신청 완료·회원 탈퇴 완료·사물함 신청 완료가 모두 같은 Figma 메인 컴포넌트(Circle Check Motion 1712:192849)의 인스턴스다. 타임라인 길이와 반복 설정은 화면마다 다르게 걸려 있지만 키프레임 값이 같아서 보이는 모션이 동일하다. json을 기능별로 복사해 두면 디자이너가 모션을 고칠 때 재export를 몇 번씩 해야 해서, Lottie와 재생 컴포넌트를 각각 common/과 components/ui/로 옮긴다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
안내 카드 네 장이 모두 같은 Figma 컴포넌트(Delete Accoount Card 3491:151566)의 인스턴스라 WithdrawalNoticeCard 하나로 묶고 문구는 상수로 분리했다. 동의 체크박스를 켜야 탈퇴하기가 활성화되고, 누르면 확인 모달이 뜬다. WDS Button은 color가 primary/assistive뿐이라 Figma의 Status/Negative는 sx로 배경만 덮는다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
행사 신청 완료 화면과 같은 뼈대지만 신청 정보 카드가 없고 버튼이 하나뿐이라, 표본이 둘뿐인 지금은 화면 껍데기까지 묶지 않고 체크 모션만 공유한다. 탈퇴 후에는 로그아웃 상태라 로그인/온보딩으로 나가야 하지만 그 화면이 아직 없어서 홈으로 내보낸다. 인증을 붙일 때 EXIT_PATH만 바꾸면 된다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
사물함 화면 PR(#92)이 먼저 머지되면서 같은 작업이 양쪽에 생겼다. 중복된 것은 모두 main 쪽을 남긴다. - CompleteCheck.tsx, EventsApplicationCompleteScreen.tsx: 체크 모션을 공용으로 빼는 작업을 양쪽이 각자 했다. main은 거기서 더 나아가 결과 화면 공용 컴포넌트 (ResultScreen)까지 만들었으므로 main 쪽을 그대로 쓴다. - component-convention.md: Lottie 파일 위치 규칙을 양쪽이 같은 내용으로 고쳤다. - wds-component-usage.md, router.tsx, HomeScreen.tsx: 서로 다른 것을 더한 충돌이라 양쪽을 모두 남긴다.
main에 신청 결과 화면 공용 컴포넌트(ResultScreen)가 들어왔다. 버튼이 하나인 경우(secondaryAction 생략)와 체크 모션용 8px 간격(illustrationGap)을 이미 지원해서 탈퇴 완료 화면이 그대로 들어맞는다. 직접 조립한 마크업을 걷어낸다. 렌더링 결과는 같다 — 헤더↔체크 104px, 체크 72x72, 체크↔제목 8px, 제목↔부제 4px, 버튼 335x56으로 Figma(3524:152505)와 실측 일치를 확인했다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
홈 헤더와 WDS 컨벤션 문서에서 난 충돌을 해결한다. - HomeScreen: main이 이미 설정 버튼(IconSetting)을 갖고 있어서 main 쪽을 그대로 두고 빠져 있던 onClick만 채운다. 알림 버튼과 같이 viewTransition으로 화면을 쌓는다 - wds-component-usage.md: main의 홈·알림 절과 이 브랜치의 설정 절이 파일 끝에서 부딪힌 것이라 둘 다 남긴다
이 브랜치가 머지해 온 main이 #108(알림 화면) 머지 전이라 작업 중에는 안 보였는데, main에는 이미 같은 화면이 있다. 카테고리 4종의 문구·순서·초기값과 "전체 알림"을 파생시키는 방식까지 그대로 겹친다. Figma도 같은 화면을 설정 섹션(3524:152367)과 알림 섹션(3628:110837)에 복제해 뒀지만 화면은 하나여야 한다. 설정의 "알림 설정" 행이 알림 쪽 /notifications/settings로 들어가게 하고, 이 브랜치가 만든 복제본을 지운다. - NotificationSettingsScreen·NotificationToggleRow 삭제 - /settings/notifications 라우트 삭제 - NOTIFICATION_CATEGORIES 삭제 — 카테고리 문구·초기값은 features/notifications/constants/notifications.ts가 단일 출처다
리뷰에서 나온 것들을 한번에 정리한다. - SETTINGS_PATHS: 설정 화면 경로를 상수로 모은다. 홈 헤더와 설정 화면이 같이 쓰고, 홈 라우팅(#114)에서도 쓸 자리라 알림의 NOTIFICATIONS_PATH와 같은 방식으로 뒀다 - ACCOUNT_EXIT_PATH: 로그아웃과 탈퇴 완료가 나가는 곳이 같은 자리라 한 상수로 합친다. 로그인/온보딩(#110)이 들어오면 이 값만 "/auth"로 바꾸고 세션 정리를 붙이면 된다 - 로그아웃 확인 모달이 모달만 닫고 아무것도 안 하던 걸 실제로 내보내도록 고친다 - 화면을 쌓는 이동에 viewTransition을 켠다(coding-style.md의 화면 전환 규칙) - SettingsRow의 arrow prop 삭제 — 아무 호출부도 넘기지 않는 죽은 prop이고, "화면이 아직 없는 행"이라는 근거도 회원 탈퇴 화면이 생기면서 사라졌다 - 설정 섹션 Figma 노드 ID 갱신: 섹션이 통째로 다시 만들어져 옛 ID(3013:*, 1799:*)가 파일에서 조회되지 않는다. 현재 ID(3524:*)로 바꾸고 이 사실을 컨벤션 문서에 남긴다 - SETTINGS_ACCOUNT 주석이 코드와 달랐던 것(전화번호를 state 초기값으로 쓴다고 적혀 있었지만 상수를 직접 읽는다) 바로잡음
| // Figma: 설정 화면 계정 정보(nodeId 3524:152331)·앱 버전(3524:152356) 목데이터 — 실 API 연동 | ||
| // 전까지 사용. 전화번호 변경 화면은 아직 이 상수를 고치지 않아서, 번호를 바꿔도 설정 화면 | ||
| // 값은 그대로다(연동할 때 함께 처리한다). | ||
| export const SETTINGS_ACCOUNT = { |
There was a problem hiding this comment.
[c] 계정 정보(이름·이메일·전화번호)는 서버에서 받아올 데이터라 coding-style.md의 데이터 로딩 규칙대로 entities/로 옮기면 좋을 것 같습니다. 다른 기능들(archives·events·notices·notifications 등)은 모두 entities/<도메인>/ + mockupApi + use() 구조여서 설정만 방식이 달라지는 것 같아요.
용어 사전 기준으로는 users 도메인이라 아래처럼 두면 어떨까요? (파일·함수 이름은 예시입니다)
entities/users/
usersApi.ts // fetchMyAccount()
usersMock.ts
types.ts
설정 화면에서는 계정 정보 카드만 <Suspense>로 감싸고, components/의 데이터 컴포넌트에서 use()로 읽으면 될 것 같습니다. 이렇게 해두면 "전화번호를 바꿔도 설정 화면 값은 그대로" 문제도 나중에 API 함수 한 곳에서 해결할 수 있을 것 같아요.
APP_VERSION_LABEL(26번째 줄)은 "26.0.1 · 최신버전"처럼 데이터(버전, 최신 여부)와 화면 문구가 한 문자열에 들어 있습니다. { version, isLatest }로 받고 문구 조합은 화면에서 하는 편이 나을 것 같습니다.
혹시 홈(homeMock.ts)처럼 일부러 feature 상수로 두신 거라면 이유 알려주시면 감사하겠습니다!
| // 하이픈을 넣어준다. 유효 기준은 placeholder와 같은 010 + 8자리다. | ||
| const PHONE_PATTERN = /^010-\d{4}-\d{4}$/; | ||
|
|
||
| function formatPhone(value: string): string { |
There was a problem hiding this comment.
[c] formatPhone과 PHONE_PATTERN은 React와 무관한 순수 로직이라 화면 파일 밖으로 빼면 좋을 것 같습니다. 적어주신 대로 #112의 formatPhoneNumber와 하이픈 로직이 같아서, 지금 공용 위치(lib/phone.ts 등)에 먼저 빼두면 #112 쪽은 import만 하면 될 것 같아요. "나중에 머지되는 쪽이 정리"하는 방식보다 중복이 생길 틈이 없을 것 같습니다.
// lib/phone.ts
export const PHONE_NUMBER_MAX_LENGTH = 13; // 010-1234-5678
export function formatPhoneNumber(value: string): string { ... }
export function isValidPhoneNumber(value: string): boolean { ... }maxLength={13}(85번째 줄)도 포맷 길이에 묶인 값이라 같이 옮기면 의미가 잘 드러날 것 같습니다. 통과 기준(010+8자리 vs 숫자 11자리)은 이번에 #112와 맞춰서 하나로 정하면 좋을 것 같아요.
There was a problem hiding this comment.
여기서 구현 후에 #112에 리뷰 코멘트 작성했습니다!
| // 실제 세션 정리는 인증이 붙을 때 여기에 함께 붙인다(ACCOUNT_EXIT_PATH 주석 참고). | ||
| onConfirm={() => { | ||
| setLogoutOpen(false); | ||
| navigate(ACCOUNT_EXIT_PATH, { replace: true }); |
There was a problem hiding this comment.
[c] 로그아웃 확정과 탈퇴 완료(WithdrawalCompleteScreen.tsx:13)는 같은 "계정에서 나가기" 동작인데 각 화면에 따로 들어가 있습니다. 훅 하나로 묶어두면 어떨까요? ACCOUNT_EXIT_PATH 주석에 "#112 머지 후 두 호출부에 세션 정리를 같이 붙여야 한다"고 적혀 있는데, 지금 묶어두면 나중엔 훅 안쪽만 고치면 돼서 한쪽을 빠뜨릴 걱정이 없을 것 같습니다.
// features/settings/hooks/useAccountExit.ts
export function useAccountExit() {
const navigate = useNavigate();
// #112가 들어오면 세션 표시 정리를 여기에만 붙인다
return () => navigate(ACCOUNT_EXIT_PATH, { replace: true });
}두 화면이 같이 쓰는 동작을 훅으로 묶은 useLockersApplySubmit과 비슷한 방식입니다!
| />, | ||
| ); | ||
|
|
||
| const openExternalLink = (url: string) => { |
There was a problem hiding this comment.
[c] URL이 빈 문자열이어도 onClick이 항상 넘어가서, 지금은 "의견 보내기"와 "개인정보 처리방침"이 화살표 달린 버튼으로 보이는데 눌러도 반응이 없는 것 같습니다. 스크린리더도 버튼으로 읽어줘서 사용자 입장에서는 고장 난 것처럼 느껴질 수 있을 것 같아요.
링크가 있는지에 따른 분기를 호출부로 올리면, SettingsRow가 화살표 없는 행으로 그려줄 것 같습니다. 링크가 정해질 때까지 행을 숨기는 것도 방법일 것 같고요.
const { feedbackForm } = SETTINGS_EXTERNAL_LINKS;
<SettingsRow
label="의견 보내기"
onClick={feedbackForm ? () => openExternalLink(feedbackForm) : undefined}
/>PR 한계에 적어주신 WebView의 window.open 문제를 생각하면 openExternalLink 자체도 화면 밖(lib/bridge/ 근처 등)에 두는 게 좋을 것 같습니다. 이미 isInAppShell()과 postBridgeMessage가 있어서, 앱과 방식이 정해지면 화면은 그대로 두고 그 함수만 바꾸면 될 것 같아요.
| leading={ | ||
| <TopNavigationButton | ||
| aria-label="뒤로가기" | ||
| onClick={() => navigate(-1)} |
There was a problem hiding this comment.
[a] PR 리뷰 포인트 [a](뒤로가기 헤더 중복)에 대한 답변입니다.
뒤로가기 헤더 공용 훅은 별도 이슈로 빼는 데 동의합니다! 다만 이슈 범위에 딥링크 대비 처리도 같이 넣으면 좋을 것 같아요. 지금 history.state.idx로 뒤로 갈 곳이 없는지 보고 다른 경로로 보내는 코드가 5개 화면(Search·FeedbacksNew·EventsApplication·Notifications·NotificationsSettings)에 복사돼 있어서, 헤더 마크업보다 이쪽 중복이 더 큰 것 같습니다.
useBackNavigation(fallbackPath) // idx > 0이면 navigate(-1), 아니면 fallbackPath로 replace그리고 이번 설정 화면 3개(SettingsScreen·PhoneChangeScreen·WithdrawalScreen)는 navigate(-1)만 있어서, 주소로 바로 들어오면 뒤로가기가 동작하지 않을 것 같습니다. 설정이 앱에서 바로 열릴 일이 없다면 지금은 그대로 둬도 될 것 같은데, 어떻게 보시는지 궁금합니다!
| // 설정의 "알림 설정" 행은 알림 화면이 이미 가진 /notifications/settings로 보낸다 — | ||
| // Figma는 설정·알림 두 섹션에 같은 화면을 복제해 뒀지만 코드에서는 한 벌만 둔다. | ||
| handle: { hasBottomNav: false } satisfies ScreenRouteHandle, | ||
| path: "/settings", |
There was a problem hiding this comment.
[c] settings가 terminology.md 용어 사전에 없는 것 같아서 확인 부탁드립니다! coding-style.md에 "사전에 없는 새 도메인이면 먼저 그 문서에 추가한 뒤 코드에 반영한다"는 규칙이 있어서요. 계정 정보, 전화번호 변경, 탈퇴는 백엔드에서 users 쪽 엔드포인트일 가능성이 커 보이는데, 라우트와 폴더를 settings로 둘지 백엔드와 한번 맞춰보면 좋을 것 같습니다.
사소하지만 경로는 /withdraw(동사), 컴포넌트는 Withdrawal*(명사)로 형태가 달라서 하나로 맞추면 찾기 편할 것 같아요.
| */ | ||
| variant?: "account" | "menu"; | ||
| /** menu 행 라벨 색 — 로그아웃은 alternative, 회원 탈퇴는 negative */ | ||
| tone?: "normal" | "alternative" | "negative"; |
There was a problem hiding this comment.
[a] variant="account"일 때는 tone이 무시되는데, 타입상으로는 <SettingsRow variant="account" tone="negative" />도 통과됩니다. variant별로 props를 나누면 잘못된 조합을 컴파일 단계에서 막을 수 있을 것 같아요.
interface SettingsRowBaseProps {
label: string;
value?: string;
onClick?: () => void;
}
interface SettingsAccountRowProps extends SettingsRowBaseProps {
variant: "account";
}
interface SettingsMenuRowProps extends SettingsRowBaseProps {
variant?: "menu";
tone?: "normal" | "alternative" | "negative";
}
type SettingsRowProps = SettingsAccountRowProps | SettingsMenuRowProps;| } | ||
| onCancel={() => setConfirmOpen(false)} | ||
| // 탈퇴를 확정하면 되돌아올 화면이 아니라 완료 화면으로 치환한다 | ||
| onConfirm={() => |
There was a problem hiding this comment.
[a] 로그아웃 모달은 setLogoutOpen(false)로 닫은 뒤 이동하는데(SettingsScreen.tsx:138), 탈퇴 모달은 닫지 않고 바로 이동합니다. 동작 차이는 거의 없겠지만 두 곳 처리를 맞춰두면 읽기 편할 것 같습니다.
- 계정 정보와 앱 버전을 `entities/users/`로 옮기고 화면은 `use()`로 읽는다. 다른 기능과 같은
`<도메인>Api` + `mockupApi` + Suspense 구조다. 카드 안쪽만 데이터 컴포넌트로 빼서
껍데기·라벨은 그대로 그려지고, 받는 동안은 전용 스켈레톤이 행 자리를 채운다
- 앱 버전을 `{ version, isLatest }`로 나눠 받는다 — "26.0.1 · 최신버전" 문구 조합은 화면이 한다
- 전화번호 하이픈 포맷·유효성을 `lib/phone.ts`로 뺀다. #110(PR #112)의 연락처 입력과 같은
로직이라 그쪽이 import만 하면 되도록 먼저 공용 위치에 둔다. 통과 기준은 `010` 고정으로
맞췄다 — 01X는 2G 종료로 전부 010 번호이동이 끝나서 새로 입력될 일이 없다
- `SettingsRow` props를 variant별로 나눠 `variant="account"` + `tone` 조합이 타입에서 걸리게 한다
- 로그아웃 확정과 탈퇴 완료의 "계정에서 나가기"를 `useAccountExit` 훅 하나로 묶는다 —
세션 정리를 붙일 때 한쪽을 빠뜨리지 않게 한다
- 탈퇴 완료 화면을 주소로 바로 열면 홈으로 보낸다(사물함 신청 완료와 같은 처리). navigate
state는 꾸밀 수 있는 값이라 실제 본인 확인은 서버 몫이라는 걸 주석으로 남겼다
- 탈퇴 확인 모달도 로그아웃처럼 닫고 이동하도록 순서를 맞춘다
- 경로를 `/settings/withdrawal`로 바꿔 컴포넌트 이름(`Withdrawal*`)과 형태를 맞춘다
- `settings`가 용어 사전에 없는 이름이라는 점과, 백엔드 엔드포인트가 나오면 맞춰야 한다는 걸
경로 상수와 `usersApi`에 주석으로 남겼다
의견 보내기·개인정보 처리방침은 구글폼 주소가 아직 없어서 눌러도 아무 일이 없는데, 화살표가 붙은 버튼으로 보이고 스크린리더도 버튼으로 읽어 줘서 고장 난 것처럼 보였다. 주소가 비어 있으면 라벨을 Label/Assistive로 낮추고 `disabled` 버튼으로 그린다. 화살표는 따로 손대지 않는다 — 에셋 색(#C2C4C8)이 흰 배경 위 Label/Assistive(약 #C7C7C9)와 사실상 같은 밝기여서 라벨만 낮춰도 행 전체가 고르게 흐려진다. 비활성 색은 Figma가 비활성 버튼에 쓰는 Label/Assistive에 맞췄다. Label/Disable(16%)은 Copyright처럼 거의 안 보이는 자리에 쓰는 값이라 행 라벨로는 읽히지 않는다. 주소를 상수에 채우면 저절로 활성으로 돌아온다. Figma에는 이 상태가 없다 — 디자인은 주소가 있다고 보고 그려져 있어서, 디자이너 확인이 필요하면 이 커밋을 짚으면 된다.
설정 화면 안에 있던 openExternalLink를 lib/openExternalLink.ts로 옮긴다. 화면은 이 함수만 부르고, 여는 방식이 바뀌면 호출부를 건드리지 않고 여기만 고치면 된다. 앱 WebView에서는 window.open이 막히거나 WebView 안에서 그대로 열려 사용자가 외부 페이지에 갇힌다(앱에는 주소창도 뒤로가기도 없다). 앱 셸에 넘기는 분기는 아직 넣지 않았다 — 브리지 메시지는 앱 쪽 핸들러가 같이 들어가야 동작해서(bridge.ts의 메시지 추가 절차) 웹에만 넣으면 조용히 버려지고, 연결할 구글폼 주소도 아직 없다. 채워야 할 자리와 이유를 주석으로 남겼다.

#️⃣연관된 이슈
구현 화면
🎯 해결하려는 문제가 무엇인가요?
Figma 설정 섹션(nodeId
3524:152321)의 화면들이 코드에 전혀 없었다. 홈 헤더의 설정 아이콘(#98이 Figma3147:146294대로 그려 둔 것)도onClick이 비어 있어서, 눌러도 아무 일이 없었다.❓ 왜 해결해야 하나요?
계정 정보 확인, 알림 on/off, 전화번호 변경, 회원 탈퇴는 모두 설정 화면에서만 할 수 있는 동작이라 화면이 없으면 접근할 방법이 없다.
⭐ 어떻게 해결했나요?
커밋을 화면 단위로 나눴고, 각 커밋이 독립적으로 타입체크를 통과한다.
3524:152322) — 계정 정보 / 알림 설정 / 서비스 정보 / 로그아웃 네 장의 흰 카드 + Copyright. 카드는SettingsSection, 행은SettingsRow하나로 합쳤다(Figma의 Account Row·Navigation Row·Info Row·Action Row 넷이 높이·정렬이 같고 라벨 굵기와 색만 달라서variant/tone으로 구분).3524:152367)을 보고/settings/notifications에 따로 만들었는데, 그 사이 머지된 #108이 알림 섹션의 같은 프레임(3628:110837)을 보고 이미 만들어 둔 화면이었다. Figma가 설정·알림 두 섹션에 같은 화면을 복제해 둔 것(노드 구조·좌표·문구가 완전히 같다)이라 복제본을 지우고, 설정의 "알림 설정" 행이 #108의/notifications/settings로 들어가게 했다. 카테고리 문구·초기값도features/notifications/constants/notifications.ts가 단일 출처다.3524:152450) — 입력하는 대로 하이픈을 넣고(Figma 입력 중 상태3524:152465가010-1234-5형태),010+ 8자리를 다 채웠을 때만 "변경하기" 버튼이 활성화된다. 누르면 Figma처럼 완료 토스트(3524:152457)를 띄운다.3524:152473) — 안내 카드 네 장이 모두 같은 Figma 컴포넌트(Delete Accoount Card 3491:151566)의 인스턴스라WithdrawalNoticeCard하나로 묶고 문구는 상수로 분리했다. 동의 체크박스를 켜야 "탈퇴하기"가 활성화되고(#F4F4F5→ Status/Negative#FF4242), 누르면 확인 모달(3524:152517)이 뜬다.3524:152505) — 체크 모션 + 제목/부제 + "확인" 버튼.Circle Check Motion 1712:192849)의 인스턴스다.get_motion_context로 떠보니 타임라인 길이·반복 설정만 화면마다 다르고 키프레임 값(원 450ms back-out, 체크 550ms path trim)은 동일해서, Lottie json과 재생 컴포넌트를 각각assets/lottie/common/·components/ui/CompleteCheck.tsx로 옮겨 한 벌만 두도록 했다.3524:152426) — 공용ConfirmModal의tone="negative"가 Figma와 그대로 맞아 재사용했다. 확정하면ACCOUNT_EXIT_PATH로 내보낸다(아래 한계 참고).onClick을 채웠다. 알림 버튼과 같이viewTransition으로 화면을 쌓는다.Switch/TextField/IconSetting매핑과, 설정 행 화살표가 WDS가 아니라는 근거를wds-component-usage.md에 추가했다./figma-check로 교차검증해서 카드 padding·radius·행 간격·타이포·스위치 크기(39×24)·버튼 높이(56px)·비활성 색(#F4F4F5)까지 실측 대조했다. 탈퇴 화면도 안내 카드(94×335)·카드 간격 8px·헤더↔제목 12px·제목↔목록 16px, 완료 화면도 헤더↔체크 104px·체크 72×72·체크↔제목 8px·제목↔부제 4px까지 맞췄다.🧩 이 PR의 한계 & 트레이드오프
SETTINGS_EXTERNAL_LINKS상수에 빈 URL만 두고 값이 있을 때만 새 탭으로 열도록 했다. 주소를 받으면 상수만 채우면 된다. 다만 앱 WebView에서는window.open이 막히거나 앱 안에 갇힐 수 있어 외부 링크 처리 방식은 앱 쪽과 맞춰야 한다.ACCOUNT_EXIT_PATH상수 하나로 모아뒀다. #112가 머지되면 이 값을/auth로 바꾸고 세션 표시(stream:auth:logged-in)를 지우는 처리를 호출부 두 곳에 붙여야 한다 — 안 그러면AuthEntryGate를 그냥 통과해서 탈퇴·로그아웃 뒤에도 홈이 그대로 보인다. #112에 코멘트로 공유했다(지금entities/auth/session.ts에 표시를 지우는 함수 자체가 없다).onConfirm에 붙인다.whitespace-nowrap). 실 데이터 들어올 때 보기로 했다.010+ 8자리로 뒀다.011/016같은 구 번호도 받아야 하면 조정이 필요하다. #112의 온보딩 연락처 입력(formatPhoneNumber)과 하이픈 로직이 같고 통과 기준만 다르다(저쪽은 숫자 11자리면 통과). 나중에 머지되는 쪽이 공통 모듈로 빼기로 #112에서 이야기 중이다.⛓️ 기존 기능에 미치는 영향
HomeScreen헤더의 설정 버튼이 이제 동작한다(마크업은 그대로,onClick만 추가).EventsApplicationCompleteScreen이EventsCompleteCheck대신 공용CompleteCheck를 쓴다. import 경로만 바뀌었고 재생 설정(loop={false}, 모션 줄이기 처리)은 그대로다 — 72×72 SVG 렌더링과 콘솔 에러 0을 실제로 확인했다.ConfirmModal설명에whitespace-pre-line을 붙여\n을 살렸다. 기존 사용처 3곳(BililgeReturnSection·EventsApplicationScreen·FeedbacksNewScreen)은 모두 한 줄 문구라 렌더링 변화가 없다.🔀 Edge Case & 실패 시나리오
abc010가1234나5678→010-1234-5678).replace라, 뒤로가기로 탈퇴 폼이나 완료 화면에 되돌아오지 않는다.📋 검토한 대안과 선택 이유
/settings/notifications)에 그대로 두는 것도 검토했지만, 그러면 같은 화면이 두 경로로 존재하고 카테고리 문구·초기값도 두 벌이 된다. Figma가 두 섹션에 복제해 뒀을 뿐 화면은 하나이므로 [Feat/#106] 알림 화면 구현 #108 쪽 한 벌로 합치고 진입점만 둘로 뒀다.IconChevronRight로 대체하는 것도 검토했지만,search_design_system에 같은 이름(Arrow)이 없고 글리프 여백도 WDS와 달라서 Stream 전용 아이콘으로 보고 SVG를 받아 커밋했다.1737:218058)까지 만들 때 셋을 보고 묶는 편이 낫다.🔄 리뷰 반영 (머지 충돌 해결 + 중복 정리)
올린 뒤 main이 많이 나가서 다시 맞췄다. 커밋 3개로 나뉘어 있다.
Merge branch 'main'— 충돌 2건(HomeScreen.tsx,wds-component-usage.md) 해결refactor: 알림 설정 화면을 알림 기능 쪽 한 벌로 통합— #108과 중복된 복제본 제거refactor: 설정 화면 경로·이탈 경로를 상수로 빼고 갱신된 Figma 노드 ID 반영—SETTINGS_PATHS·ACCOUNT_EXIT_PATH분리, 아무 동작도 없던 로그아웃 확정 처리, 화면 쌓는 이동의viewTransition, 쓰이지 않던SettingsRow의arrowprop 제거Figma 노드 ID가 통째로 갈렸다. 설정 섹션이 재작업되면서 처음 참조했던 노드(
1799:85920섹션, 설정3013:116135, 알림 설정3013:116182, 전화번호 변경1799:87220, 로그아웃 모달1799:87183)가 파일에서 삭제돼 조회되지 않는다. 탈퇴 계열(3524:152473·3524:152505·3524:152517)만 그대로다. 현행 ID로 전부 바꿨고 이 사실을wds-component-usage.md에 남겼다. 디자인 내용 자체는 거의 그대로여서/figma-check실측은 일치했다 — 카드 높이 164/52/164/88·padding 16·radius 12·카드 간격 8·행 간격 20/16·입력 박스 48px·탈퇴 카드 335×94·간격 8까지 Figma와 같다.💬 리뷰 포인트
[c]Figma에서 **탈퇴 완료 화면의 체크 모션만loop**로 걸려 있습니다(행사·사물함은once). 완료 체크가 무한 반복되는 건 다른 화면과 어긋나 프로토타입용 설정이 남은 것으로 보고 1회 재생으로 맞췄습니다 — 의도된 것이면 알려주세요.[a]뒤로가기 헤더 10줄이 이 PR의 화면들 포함 10개 파일에 중복되어 있습니다.useBackScreenHeader(title)같은 공용 훅으로 뺄 만한데, 기존 화면까지 건드리는 리팩터라 이번 PR엔 넣지 않았습니다 — 별도 이슈로 뺄까요?