Repository navigation
클래스 이용권 확인 및 재등록 경로 연결 - #52
Conversation
- 확인 화면과 추가 등록 화면을 코디네이터 push로 연결 - 재등록 후 기존 이용 기간을 갱신하고 경로 제거 응답을 검증 - Figma 대조 기록과 화면 캡처 테스트 추가
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
TCA delegate 액션 네이밍 컨벤션 위반(showOverview, addRegistration)이 발견되었습니다. Delegate 액션은 자식 Reducer 내부에서 발생한 이벤트를 설명해야 하며, 의도된 효과(performLogin, loadData, setRecords)를 설명해서는 안 됩니다. 현재 액션명은 부모 Reducer가 특정 작업을 수행하도록 요청하는 '의도된 효과'를 나타내고 있습니다. 이 외의 변경 사항은 프로젝트 가이드라인을 준수합니다.
| @CasePathable | ||
| public enum DelegateAction: Equatable { | ||
| case dismiss | ||
| case showOverview(Date, Date) |
There was a problem hiding this comment.
🟡 [P3] Minor
Delegate 액션은 자식 Reducer에서 발생한 이벤트를 명확히 설명해야 합니다. showOverview는 부모 Reducer에 특정 효과를 요청하는 것으로 해석될 수 있어 TCA 액션 네이밍 컨벤션에 맞지 않습니다. showOverview가 등록 완료 후 확인 화면을 보여주는 용도라면, registrationConfirmed와 같이 이벤트 발생을 알리는 형태로 변경하는 것이 좋습니다.
| case showOverview(Date, Date) | |
| case registrationConfirmed(startDate: Date, endDate: Date) |
| public enum DelegateAction: Equatable { | ||
| case dismiss | ||
| case showOverview(Date, Date) | ||
| case addRegistration |
There was a problem hiding this comment.
🟡 [P3] Minor
Delegate 액션은 자식 Reducer에서 발생한 이벤트를 명확히 설명해야 합니다. addRegistration은 부모 Reducer에 특정 효과를 요청하는 것으로 해석될 수 있어 TCA 액션 네이밍 컨벤션에 맞지 않습니다. 추가 등록을 요청하는 의도를 명확히 하려면 addRegistrationRequested와 같이 변경하는 것이 좋습니다.
| case addRegistration | |
| case addRegistrationRequested |
| let registrationStartDate = state.registrationStartDate, | ||
| let expirationDate = state.expirationDate | ||
| else { return .none } | ||
| return .send(.delegate(.showOverview(registrationStartDate, expirationDate))) |
There was a problem hiding this comment.
🟡 [P3] Minor
Delegate 액션의 네이밍 컨벤션에 따라 액션을 수정해야 합니다. 관련 수정 제안은 LINE 62를 참조하세요.
| return .send(.delegate(.showOverview(registrationStartDate, expirationDate))) | |
| return .send(.delegate(.registrationConfirmed(startDate: registrationStartDate, endDate: expirationDate))) |
|
|
||
| case .view(.addRegistrationTapped): | ||
| guard state.phase == .overview else { return .none } | ||
| return .send(.delegate(.addRegistration)) |
There was a problem hiding this comment.
🟡 [P3] Minor
Delegate 액션의 네이밍 컨벤션에 따라 액션을 수정해야 합니다. 관련 수정 제안은 LINE 63을 참조하세요.
| return .send(.delegate(.addRegistration)) | |
| return .send(.delegate(.addRegistrationRequested)) |
| state.routes.push(.ticket(.init(instanceID: uuid()))) | ||
| return .none | ||
|
|
||
| case let .routeAction(routeID, action: .ticket(.delegate(.showOverview(startDate, endDate)))): |
There was a problem hiding this comment.
🟡 [P3] Minor
Delegate 액션의 네이밍 컨벤션에 따라 액션을 수정해야 합니다. 관련 수정 제안은 ClassTicketFeature.swift LINE 62를 참조하세요.
| case let .routeAction(routeID, action: .ticket(.delegate(.showOverview(startDate, endDate)))): | |
| case let .routeAction(routeID, action: .ticket(.delegate(.registrationConfirmed(startDate: startDate, endDate: endDate)))): |
|
|
||
| await store.send(.router(.routeAction( | ||
| id: 1, | ||
| action: .ticket(.delegate(.showOverview(firstStart, firstEnd))) |
There was a problem hiding this comment.
🟡 [P3] Minor
Delegate 액션의 네이밍 컨벤션에 따라 액션을 수정해야 합니다. 관련 수정 제안은 ClassTicketFeature.swift LINE 62를 참조하세요.
| action: .ticket(.delegate(.showOverview(firstStart, firstEnd))) | |
| action: .ticket(.delegate(.registrationConfirmed(startDate: firstStart, endDate: firstEnd))) |
|
|
||
| await store.send(.router(.routeAction( | ||
| id: 2, | ||
| action: .ticket(.delegate(.addRegistration)) |
There was a problem hiding this comment.
🟡 [P3] Minor
Delegate 액션의 네이밍 컨벤션에 따라 액션을 수정해야 합니다. 관련 수정 제안은 ClassTicketFeature.swift LINE 63을 참조하세요.
| action: .ticket(.delegate(.addRegistration)) | |
| action: .ticket(.delegate(.addRegistrationRequested)) |
| } | ||
| await store.send(.router(.routeAction( | ||
| id: 3, | ||
| action: .ticket(.delegate(.showOverview(secondStart, secondEnd))) |
There was a problem hiding this comment.
🟡 [P3] Minor
Delegate 액션의 네이밍 컨벤션에 따라 액션을 수정해야 합니다. 관련 수정 제안은 ClassTicketFeature.swift LINE 62를 참조하세요.
| action: .ticket(.delegate(.showOverview(secondStart, secondEnd))) | |
| action: .ticket(.delegate(.registrationConfirmed(startDate: secondStart, endDate: secondEnd))) |
| let store = TestStore(initialState: state) { ClassTicketFeature() } | ||
|
|
||
| await store.send(.view(.confirmTapped)) | ||
| await store.receive(\.delegate, .showOverview(start, end)) |
There was a problem hiding this comment.
🟡 [P3] Minor
Delegate 액션의 네이밍 컨벤션에 따라 액션을 수정해야 합니다. 관련 수정 제안은 ClassTicketFeature.swift LINE 62를 참조하세요.
| await store.receive(\.delegate, .showOverview(start, end)) | |
| await store.receive(\.delegate, .registrationConfirmed(startDate: start, endDate: end)) |
| #expect(store.state.navigationTitle == "클래스 이용권") | ||
| #expect(store.state.periodText == "2026.10.09 – 2027.04.08") | ||
| await store.send(.view(.addRegistrationTapped)) | ||
| await store.receive(\.delegate, .addRegistration) |
There was a problem hiding this comment.
🟡 [P3] Minor
Delegate 액션의 네이밍 컨벤션에 따라 액션을 수정해야 합니다. 관련 수정 제안은 ClassTicketFeature.swift LINE 63을 참조하세요.
| await store.receive(\.delegate, .addRegistration) | |
| await store.receive(\.delegate, .addRegistrationRequested) |
이용권 등록 완료 후 확인 화면이 열리지 않고, 추가 등록 뒤에는 이전 이용 기간이 남을 수 있었습니다. 등록 완료 시 확인 화면을 push하고 추가 등록도 새 입력 화면으로 push하며, 재등록이 성공하면 기존 확인 경로의 기간을 즉시 갱신합니다.
Figma 확정 시안
13244:49243과 402pt 화면 캡처를 대조한 결과와 의도적인 Mock 문구·탭 차이는docs/class-figma-audit-20261019.md에 기록했습니다. 실제 앱 진입 캡처에서 상단 안전 영역의 약 10~13pt 차이는 후속 확인이 필요합니다.검증: iPhone 18 Pro iOS 27 시뮬레이터에서 앱 코디네이터·캡처 51개, 재등록 경로 11개, Class 모듈 이용권 8개 테스트가 각각 실패 0건으로 통과했습니다. Claude 교차 점검은 APPROVED이며, 검토자는 테스트 실행과 Figma 원본 확인을 직접 수행하지 못했다고 밝혔습니다.