Skip to content

Phase 2: 로직↔프레젠테이션 이음새 정리 (데이터 훅 · store · context) - #169

Open
IGhost-P wants to merge 7 commits into
refactor/stabilize-and-typecheckfrom
refactor/logic-presentation-seam
Open

Phase 2: 로직↔프레젠테이션 이음새 정리 (데이터 훅 · store · context)#169
IGhost-P wants to merge 7 commits into
refactor/stabilize-and-typecheckfrom
refactor/logic-presentation-seam

Conversation

@IGhost-P

Copy link
Copy Markdown
Member

리뉴얼 4단계 중 Phase 2. 프레젠테이션이 Phase 3에서 Tamagui로 재작성되므로, 살아남는 계층(로직·데이터 흐름)만 깨끗이 해 재작성이 얇은 로직 계층에 그냥 꽂히게 합니다. 설계는 docs/superpowers/specs/2026-07-20-logic-presentation-seam-design.md.

⚠️ 이 PR은 #168(stabilize-and-typecheck) 위에 스택됩니다. base가 refactor/stabilize-and-typecheck이니 #168 머지 후 develop으로 리베이스하세요.

무엇을 했나

  • 데이터 훅 — 화면이 fetch·상태·새로고침을 직접 오케스트레이션하던 것을 훅 뒤로:
    • useSchedules(selectedDay){ schedules, markedDates, removeSchedule }. Home 118→40줄.
    • useTimezones(){ timezones, addTimezone, removeTimezone }. TimeZone 얇아짐.
  • PopContext 제거 — 저장 후 전역 불린으로 새로고침을 흉내 내던 해킹을 changeStore(subscribe/emitChanged)로 교체. useScheduleForm.save가 통지하고 useSchedules가 구독해 재조회. PopContext/popState 완전 삭제.
  • selectedDay prop drilling 제거 — 달력 선택일이 Home→상세모달 6~7단계를 흐르던 것을 SelectedDayContext로. 상세모달이 Portal이라 Provider를 App의 PortalProvider 위에 배치.
  • ModalTimeInfo 로직 추출 — 두 도시 시각 계산을 순수 getModalTimeInfo로. PM 표시 회귀 수정(아래).

회귀 수정: 상세 모달 PM→AM

ModalTimer가 12시간제 문자열을 다시 쪼개 재포맷하다 PM을 떨어뜨려, 서울 23:00이 상세 모달에 11:00 AM으로 표시됐습니다. develop에선 24시간제를 넘겨받아 우연히 맞았는데, #168의 Date-fix 커밋에서 12시간제로 바뀌며 드러났습니다. 이제 올바른 12시간제를 만들어 직접 렌더합니다.

검증

  • 타입 에러 0, lint 0, 테스트 134 → 151 (신규: changeStore·useTimezones·useSchedules·selectedDay·modalTimeInfo)
  • 실기기(시뮬레이터, Hermes) 확인:
    • 홈 일정 목록 렌더·요일 표시 정상 (useSchedules 이관)
    • 상세 모달 11:00 PM 정확 표시 (PM 회귀 수정 확인)
    • 별칭 존(Kolkata)까지 정상

리뷰 포인트

  • changeStore는 로컬 SQLite·소량 데이터에 맞춘 무의존 최소 구현입니다(계정/동기화 도입 시 TanStack Query로 갈아탈 수 있게 데이터 접근 경계를 훅에 모아뒀습니다).
  • atom/molecule 재분류와 SwipeContentScheduleCard 계층 역전은 의도적으로 남겼습니다 — Phase 3(Tamagui)에서 프레젠테이션과 함께 다룹니다.

🤖 Generated with Claude Code

IGhost-P and others added 7 commits July 20, 2026 14:36
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
데이터가 바뀌었다는 신호만 흘려보내는 작은 subscribe/emitChanged 스토어.
데이터 훅이 구독해 화면 간 저장·삭제를 반영하는 데 쓴다. 전역 불린으로
새로고침을 흉내 내던 PopContext를 이후 단계에서 이걸로 대체한다.

테스트 5개.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
templates/TimeZone이 initTimezoneTable·findTimezones·add·remove와 cardState를
직접 다루던 것을, useTimezones 훅 뒤로 옮겼습니다. 화면은 '목록 + 액션'만
받습니다. 미사용이던 TimeZoneList의 setCardState prop도 제거했습니다.

훅 테스트 3개. 전체 142개 통과.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
templates/Home이 일정 조회·마킹·삭제·알림 정리를 직접 하던 것을 useSchedules
훅 뒤로 옮겼습니다. Home은 118줄에서 41줄로 얇아졌습니다.

전역 불린 캐시 무효화(PopContext + setPop(true))를 changeStore로 교체:
- useScheduleForm.save가 저장 후 scheduleStore.emitChanged() 호출
- useSchedules가 구독해 자동 재조회
- SettingSchedule은 이제 store를 모르고 navigation.pop()만

훅 테스트 4개. 전체 146개 통과. (PopContext 껍데기 제거는 다음 커밋)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
changeStore로 대체돼 소비자가 사라진 PopContext/PopProvider를 걷어냈습니다.
App.tsx의 Provider, context 배럴 export, popState.tsx와 그 테스트 삭제.

전체 143개 통과.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
달력에서 고른 날짜가 Home부터 상세 모달까지 6~7단계를 props로 흘러다녔습니다.
SelectedDayContext를 도입해 깊은 소비자가 직접 읽게 했습니다.

상세 모달은 @gorhom/portal로 렌더되므로 Home 레벨 context는 포털을 못 넘습니다.
그래서 Provider를 App의 PortalProvider보다 위에 두었습니다.

- SwipeContent·ScheduleCard·ModalTime: selectedDay prop 제거(단순 통과였음)
- DetailModal·ModalTimeInfo: useSelectedDay()로 직접 읽음
- Home·AgendaBox: 직접 관계라 유지(달력이 실제로 사용)
- DayOfWeek의 selectedDay(요일 배열)는 이름만 같은 다른 것 — 유지

context 테스트 4개. 전체 147개 통과.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
상세 모달의 두 도시 시각 계산을 atom 컴포넌트 밖 utils/modalTimeInfo로
빼냈습니다(useTimeZone 의존 제거). 컴포넌트는 계산된 도시명·날짜·시각을
받아 렌더만 합니다.

겸사겸사 회귀 하나를 고쳤습니다. ModalTimer가 12시간제 문자열을 다시
쪼개 재포맷하다 PM을 AM으로 뒤집고 있었습니다(예: 서울 23:00이 상세
모달에 11:00 AM으로 표시). develop에선 24시간제를 넘겨받아 우연히
맞았는데, Date-fix 커밋에서 12시간제로 바뀌며 드러난 문제입니다.
이제 올바른 12시간제를 만들어 그대로 렌더합니다.

테스트 4개(별칭 존 Kolkata 포함). 전체 151개 통과.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.

1 participant