✨ Feat: 로그인/로그아웃/탈퇴 기능 연동 - #55
Conversation
POST /terms/agreements를 termsApi.agree와 useAgreeTermsMutation으로 붙였다. 응답 data가 항상 null이라 unwrapVoid를 쓴다. 이 도메인에는 GET이 없어 Query Key 파일은 만들지 않았다. TermsPage는 전체·개별 동의 토글과 필수 미동의 시 버튼 비활성까지 넣은 목업이다. 목록은 아직 GET /terms가 없어 상수로 두었지만 타입을 스펙에서 파생해, 나중에 훅으로 바꿀 때 필드가 어긋나면 컴파일에서 잡힌다. CI에서 --filter 나열을 없애고 루트 집계 스크립트를 부르게 했다. 손으로 지목하는 방식은 패키지를 추가할 때 yaml을 고쳐야 하고, 깜빡하면 조용히 검증에서 빠진다. 실제로 packages/assets의 테스트 4개와 assets·bridge의 typecheck가 한 번도 돌지 않고 있었다. 루트에 lint·test·build를 pnpm -r run 형태로 추가했다. 스크립트가 없는 패키지는 pnpm이 건너뛴다. 기존 typecheck의 --filter './apps/**' 나열도 같은 형태로 줄였다. 워크스페이스가 apps/*·packages/* 뿐이고 -r은 루트를 제외하므로 결과가 같다. 패키지별 스크립트는 그대로 둔다. 실제 명령은 그 일을 하는 패키지에 있고 루트는 부르기만 한다. 다만 packages/api의 openapi:update는 지웠다. 이건 반대로 루트가 실물을 갖고 있고 (--env-file로 인증 정보 주입, prettier, 타입 재생성까지) 패키지 쪽은 env 없이는 실패하는 반쪽 사본이었다. 잡을 하나로 합쳤다. web·mobile 필터가 둘 다 packages/**를 포함해서 대부분의 변경이 이미 잡을 여러 개 돌리고 있었고, install을 세 번에서 한 번으로 줄이는 편이 낫다.
Share, ImageMultiple만 웹 전용 SVGProps 형태로 남아 있어 pnpm generate를 돌리면 매번 형태가 바뀌었다. 나머지 15개와 같은 react-native-svg 형태로 통일한다. RecapHeader는 Share에 className을 넘기고 있었는데 SvgProps에는 className이 없어 color prop으로 교체한다.
설정 화면 계정 행에 쓰는 노란 원형 뱃지. 기존 KakaoLogo는 말풍선만 있는 로그인 버튼용이라 글리프가 달라 Figma 에셋을 그대로 받아 추가한다.
내 계정, 보안, 고객지원, 앱 정보 4개 섹션과 헤더. 동작 연결은 뒤로가기만 하고 메뉴 항목 핸들러, 이메일·버전 데이터는 아직 붙이지 않았다.
authApi.logout, userApi.withdraw 둘 다 인증이 필요해 공용 클라이언트를 쓴다. 호출부가 auth-session의 세션 정리와 한 덩어리라 mutation 훅은 만들지 않았다.
사진 그룹(연사) 구조, 분석 취소, 스티커 재생성 등 서버 스펙 변경을 반영한다.
web과 RN에 각각 구현한다. 웹뷰는 화면이 바뀌면 컨텍스트가 통째로 사라져 성공 후 이동처럼 웹뷰를 넘어가는 메시지는 RN 쪽이 띄워야 한다. sonner와 Radix Toast를 검토했지만 필요한 명령형 API는 어차피 직접 만들어야 하고 디자인이 단순한 알약 하나라 의존성 없이 구현했다.
확인 모달(Radix Dialog)을 거쳐 브릿지로 RN에 요청한다. 세션은 RN이 소유하므로 API 호출과 토큰 정리를 한 핸들러에서 처리하고, 성공 시 RN이 토스트를 띄운 뒤 로그인 화면으로 보낸다. 실패하면 세션을 유지해 다시 시도할 수 있게 하고 웹이 토스트를 띄운다. 계정 정보를 useMeQuery로 연결하고 프로바이더별 아이콘을 표시한다. 디자인(394:5057) 대조로 로그아웃 버튼 좌우 패딩과 뒤로가기 chevron 크기를 맞췄다. auth-api가 lib/api를 참조하며 생긴 순환 import는 동적 import로 끊었다.
로딩 오버레이의 임시 "보드로" 버튼을 걷어내고 웹뷰 onLoad 신호로 전환한다.
라우트 파라미터로 boardId를 받던 것을 GET /boards의 첫 보드를 쓰도록 바꾼다. 파라미터를 넘기지 않아 /boards/undefined를 호출하던 문제가 사라진다. 스티커가 없고 이전에 올린 적도 없으면 사진 업로드 모달을 띄운다.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
| "icon": "./assets/expo.icon", | ||
| "usesAppleSignIn": true, | ||
| "bundleIdentifier": "com.ppotto.mobile" | ||
| "bundleIdentifier": "com.ppotto" |
There was a problem hiding this comment.
아 번들아이디 그걸로바뀌었어요? 어쩐지 확인입니다
| @@ -0,0 +1,68 @@ | |||
| 'use client'; | |||
|
|
|||
| import * as Dialog from '@radix-ui/react-dialog'; | |||
There was a problem hiding this comment.
사소한 부분인데 로그아웃 요청하고 완료 토스트가 뜰 때까지 중간에 시간이 조금 걸리는데 아무 피드백이 없어서 사용자가 요청 씹혔나?싶을 수도 있을 것 같아요 로그아웃 버튼을 다시 누를 수도 있을것같고
예를 들면 로딩표시라든가 버튼 비활성화라든가 그런거 나중에 고민해봐도 좋을 것 같아요
cchaeyoung
left a comment
There was a problem hiding this comment.
묵은 사진 대방출! 모달은 임시인 건가요??
그리고 추가지만 안드로이드에서 애플 로그인 뜨지 않게 해야 해요..!
수고하셨습니다~!
| const TERMS_URL = | ||
| 'https://onyx-pick-058.notion.site/3b4145d1840e80358e69c80240cc6290?source=copy_link'; | ||
| const PRIVACY_POLICY_URL = | ||
| 'https://onyx-pick-058.notion.site/3b4145d1840e805a9704cebc76c3f4d4?source=copy_link'; |
There was a problem hiding this comment.
이용약관/개인정보처리방침 링크가 노션으로 되어있는데, 앱 내에서 표시하는 것이 아니라 최종적으로도 노션 페이지를 그대로 쓰는지 아니면 임시 링크인가요??
There was a problem hiding this comment.
노션 그대로씁니다!
별로 안중요한거라 ㅋㅋㅋ
| import { Modal } from '@/shared/ui/common/Modal'; | ||
| import { useToast } from '@/shared/ui/common/Toast'; | ||
|
|
||
| const APP_VERSION = '1.0.0'; |
There was a problem hiding this comment.
APP_VERSION이 문자열로 고정돼 있는데, 버전이 바뀔 수 있어서 이후에라도 한 곳에서만 관리하는 게 좋아 보입니다!
There was a problem hiding this comment.
이거 스토어 등록하면 스토어에서 버전정보 받아오게요..!
아 이건 온보딩 화면에서 앱 끄면 보드로 떨구는게 좋아보여서 그때 그냥 이런거 띄워놓으면 좋지 않을까해서 넣어놓은.. |

🔍 PR 요약
🧾 관련 이슈
#50
✨ Feat: 로그인/로그아웃/탈퇴 #50
🧠 의도 및 배경
사용자가 보드에 진입할 때 스티커가 있으면 로컬스토리에 완료 기록을 찍습니다.
최초 이미지 업로드 여부 = 보드 스티커 배열 길이 0 && 로컬스토지 완료 기록 으로 판단.
추후 이미지 업로드 성공 콜백으로 기록하는 방식으로 수정 예정 (아직 연동 안함)
최초 업로드 완료 여부를 서버에 기록해 두는게 더 나을 것 같지만 애초에 지금 재업로드 기능 자체가 좀 애매한 부분이 있어 임시로 이렇게 처리하였음
이미지 업로드까지 연동하고 올리면 양이 많아질 것 같아 중간에 한번 끊어서 올렸습니다.
🛠️ 주요 변경 사항
🚨 트러블슈팅 (선택)
📸 스크린샷 (선택)
2026-08-07.9.11.25.mov