Skip to content

fix: 1.1.1 버전에서 발생한 QA 반영 및 버그 수정 - [TWI-80]#292

Merged
clxxrlove merged 20 commits into
developfrom
fix/#285/TWI-80
May 14, 2026
Merged

fix: 1.1.1 버전에서 발생한 QA 반영 및 버그 수정 - [TWI-80]#292
clxxrlove merged 20 commits into
developfrom
fix/#285/TWI-80

Conversation

@jihun32
Copy link
Copy Markdown
Contributor

@jihun32 jihun32 commented May 13, 2026

🔗 관련 이슈

📙 작업 내역

🎨 스크린샷 또는 시연 영상 (선택)

캘린더 인터랙션 & 수정하기 이동

ScreenRecording_05-13-2026.09-53-13_1.MP4

이모지 UI 수정

image

팝업 UI 수정

image

이모지 버튼 UI 수정

image

찌르기 버튼 수정

image

💬 추가 설명 or 리뷰 포인트 (선택)

  • QA 반영하다가 추가 버그 몇개 발견해서 계속 작업하다보니 볼륨이 커졌는데 다음부터 서브이슈 파서 잘 나눠볼게..ㅎ

@linear
Copy link
Copy Markdown

linear Bot commented May 13, 2026

TWI-80

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 13, 2026

Review Change Stack

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 6fbde391-dcf7-457e-aed7-e8a74bf6444e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

이 PR은 목표 편집 네비게이션 계약을 ID 기반에서 완전한 목표 데이터 모델로 전환하고, 포케 버튼 쿨다운 상태 관리 기능을 추가하며, 주간 캘린더 제스처를 드래그 기반 페이징으로 리팩터링하고, 설계 시스템 아이콘과 컴포넌트를 확장합니다.

Changes

MakeGoal 상태 모델 및 편집 흐름 리팩터링

계층 / 파일 요약
MakeGoal 데이터 모델 및 리듀서 상태 정의
Projects/Feature/MakeGoal/Interface/Sources/MakeGoal.swift, Projects/Feature/MakeGoal/Interface/Sources/MakeGoalReducer.swift
MakeGoalReducer.State.MakeGoal 구조체를 새로 도입하여 목표 메타데이터를 저장하고, State를 단일 goalData 필드로 리팩터링하며, Mode 열거형을 .add(GoalCategory), .edit(MakeGoal) 연관값 케이스로 변경합니다.
MakeGoalReducer 액션 및 구현 로직
Projects/Feature/MakeGoal/Sources/MakeGoalReducer+Impl.swift
리듀서 액션 처리를 goalData 필드 기반으로 변경하고, 기간/날짜 선택 로직을 통합하며, 목표 제출 요청을 goalData에서 파생합니다.
MakeGoalView UI 바인딩 업데이트
Projects/Feature/MakeGoal/Sources/MakeGoalView.swift
뷰 바인딩을 최상위 필드에서 store.goalData 구조체로 변경하고, 이모지 얇은 이미지 렌더링을 적용합니다.

설계 시스템 아이콘 및 컴포넌트 업데이트

계층 / 파일 요약
얇은 이미지 아이콘 자산 및 매핑
Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_*_thin.imageset/Contents.json, Projects/Shared/DesignSystem/Sources/Resources/Image/GoalIcon.swift, Projects/Shared/DesignSystem/Sources/Resources/Image/Images.swift
8개의 얇은 이미지 자산을 추가하고, GoalIcon.thinImage 계산 속성 및 Image.Icon 확장을 정의합니다.
버튼 비활성화 상태 및 스타일 적용
Projects/Shared/DesignSystem/Sources/Components/Button/TXButtonShape.swift, Projects/Shared/DesignSystem/Sources/Components/Button/Round/TXRoundButton.swift
TXButtonShape.TXRoundState.disabled 케이스를 추가하고, TXRoundButton에서 상태 기반 탭 처리 및 스타일을 구현합니다.
새로운 플러스 아이콘 및 홈 버튼 업데이트
Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/ic_plus_l.imageset/Contents.json, Projects/Shared/DesignSystem/Sources/Resources/Image/Images.swift, Projects/Feature/MainTab/Sources/View/MainTabView.swift
ic_plus_l.imageset 자산을 추가하고, Image.Icon.Symbol.plusL 매핑을 정의하며, 홈 플로팅 버튼 아이콘을 업데이트합니다.
카드 컴포넌트 속성 확장
Projects/Shared/DesignSystem/Sources/Components/Card/Goal/GoalCardItem.swift, Projects/Shared/DesignSystem/Sources/Components/Card/GoalEdit/GoalEditCardItem.swift
GoalCardItem.CardisButtonDisabled 속성을 추가하고, GoalEditCardItem에 선택적 goalIcon 속성을 추가합니다.
모달 레이아웃 및 로딩 UI 리팩터링
Projects/Shared/DesignSystem/Sources/Components/Modal/TXModalView.swift, Projects/Shared/DesignSystem/Sources/Components/Modal/Content/TXInfoModalContent.swift, Projects/Shared/DesignSystem/Sources/Components/Indicator/Loading/TXLoadingPresenter.swift
모달을 고정 너비에서 무한 최대 너비로 변경하고, 로딩 프레젠터를 리팩터링하여 dim 배경을 항상 렌더링하면서 불투명도로 가시성을 제어합니다.

편집 네비게이션 계약 및 라우팅 변경

계층 / 파일 요약
편집 네비게이션 위임 계약 변경
Projects/Feature/Home/Interface/Sources/Goal/EditGoalListReducer.swift, Projects/Feature/Stats/Interface/Sources/Detail/StatsDetailReducer.swift
EditGoalListReducer.Delegate.goToGoalEditStatsDetailReducer.Action.Delegate.goToGoalEdit 위임 케이스를 ID 기반에서 MakeGoalReducer.State.MakeGoal 페이로드로 변경합니다.
편집 페이로드 구성 및 네비게이션 위임
Projects/Feature/Home/Sources/Goal/EditGoalListReducer+Impl.swift, Projects/Feature/Stats/Sources/Detail/StatsDetailReducer+Impl.swift
완전한 MakeGoalReducer.State.MakeGoal 인스턴스를 구성하여 위임 네비게이션으로 전달하고, 반복 주기, 날짜 문자열, 얇은 아이콘을 계산합니다.
코디네이터 라우팅 및 상태 초기화 업데이트
Projects/Feature/Home/Sources/Root/HomeCoordinator+Impl.swift, Projects/Feature/Stats/Sources/Coordinator/StatsCoordinator+Impl.swift
홈 및 스탯 코디네이터에서 makeGoal 상태를 mode: .edit(goalData) 기반으로 초기화하고, .onDisappear 정리 로직을 업데이트합니다.

포케 버튼 쿨다운 상태 관리

계층 / 파일 요약
포케 쿨다운 액션 추가
Projects/Feature/Home/Interface/Sources/Home/HomeReducer.swift
HomeReducer.Action.setPokeButtonDisabled 액션을 추가합니다.
포케 쿨다운 상태 적용 및 유지
Projects/Feature/Home/Sources/Home/HomeReducer+Impl.swift
포케 요청 시 버튼을 즉시 비활성화하고, 실패 시 복구하며, 목표 로드/캐시 시 쿨다운 상태를 일관되게 반영합니다.
포케 버튼 비활성화 상태 UI 렌더링
Projects/Shared/DesignSystem/Sources/Components/Card/Goal/GoalCardView.swift
카드 뷰에서 isButtonDisabled 플래그를 읽고, 버튼 상태를 .disabled 또는 .standard로 설정합니다.

주간 캘린더 스와이프 및 페이징 리팩터링

계층 / 파일 요약
캘린더 드래그 제스처 및 페이징 상태
Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendar.swift
주간 드래그 변환, 페이징 오프셋, 페이징 상태를 추가하고, 높은 우선순위 제스처로 스와이프를 처리하도록 변경합니다.
주간 페이지 렌더링 및 오프셋 적용
Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendar.swift
3개의 주간 페이지를 렌더링하고, 페이징 오프셋과 드래그 변환을 적용하며, 클리핑을 설정하는 weeklyPageContentweeklyPage를 도입합니다.
스와이프 핸들링 및 페이징 로직
Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendar.swift
드래그 동안 변환을 업데이트하고, 종료 시 스와이프 방향을 계산하여 페이징 애니메이션 및 날짜 업데이트를 처리합니다.
뷰 및 리듀서에서 캘린더 스와이프 이벤트 처리
Projects/Feature/Home/Sources/Goal/EditGoalListView.swift, Projects/Feature/Home/Sources/Home/HomeView.swift
홈 및 편집 목표 목록 뷰에서 onSwipe 핸들러를 배선하고, .weekCalendarSwipe(swipe) 액션을 디스패치합니다.

통계 도메인 및 상세 뷰 업데이트

계층 / 파일 요약
StatsDetail 엔티티 및 DTO goalIcon 필드 추가
Projects/Domain/Stats/Interface/Sources/Entity/StatsDetail.swift, Projects/Domain/Stats/Interface/Sources/DTO/StatsDetailCalendarResponseDTO.swift, Projects/Domain/Stats/Interface/Sources/StatsClient.swift
StatsDetail 엔티티에 goalIcon: String 속성을 추가하고, DTO 변환과 클라이언트 미리보기에서 이 필드를 채웁니다.
StatsDetailView 레이아웃 및 텍스트 제약
Projects/Feature/Stats/Sources/Detail/StatsDetailView.swift
요약 콘텐츠에 layoutPriority(1)을 추가하고, 텍스트를 단일 줄로 제한하며, 고정 크기 레이아웃을 적용합니다.
통계 상세에서 얇은 아이콘 이미지 사용
Projects/Feature/Stats/Sources/Detail/StatsDetailReducer+Impl.swift
편집 드롭다운에서 detail.goalIcon의 얇은 이미지를 파생하여 사용합니다.
카메라 전면 미러링 구현
Projects/Core/CaptureSession/Sources/CaptureSessionManager.swift
CaptureSessionManager에 현재 카메라 위치를 추적하고, 사진 캡처 시 전면 카메라에 대해 조건부로 비디오 미러링을 활성화합니다.

기타 UI 개선 및 문서 정리

계층 / 파일 요약
반응 바 ZStack 리팩터링 및 높이 조정
Projects/Feature/GoalDetail/Sources/Detail/ReactionBarView.swift
반응 바를 shadowViewreactionBar 하위 뷰로 분해하고, 높이를 67에서 77로 증가하며, 캡슐 스트로크 색상을 업데이트합니다.
목표 상세 네비게이션 바 zIndex 설정
Projects/Feature/GoalDetail/Sources/Detail/GoalDetailView.swift
네비게이션 바에 .zIndex(1)을 추가하여 시각적 계층을 제어합니다.
분석 이벤트 프로토콜 문서 정리
Projects/Core/Analytics/Interface/Sources/AnalyticsEvent.swift
AnalyticsEvent 프로토콜 주석에서 코드 예제 블록을 제거하고 간단한 설명으로 축소합니다.
날짜 문자열 변환 확장 추가
Projects/Shared/Util/Sources/Extension/String+Extensions.swift
String 확장에 displayTextToAPIDateString 계산 속성을 추가하여 표시 텍스트를 API 날짜 형식으로 변환합니다.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • Keepiluv/Keepiluv-iOS#102: 초기 MakeGoalReducer 및 홈→makeGoal 라우팅 도입과 이번 PR의 goalData 모델 및 네비게이션 계약 변경이 직접 연결됨
  • Keepiluv/Keepiluv-iOS#169: PR #169의 StatsDetail/StatsClient 파이프라인 도입과 이번 PR의 goalIcon 필드 추가 및 매핑이 동일한 도메인 확장임
  • Keepiluv/Keepiluv-iOS#142: PR #142의 EditGoalListReducer 위임 변경과 이번 PR의 goToGoalEdit(MakeGoalReducer.State.MakeGoal) 계약 변경이 직접 관련됨

Suggested labels

🐞 fix

Suggested reviewers

  • clxxrlove
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/#285/TWI-80

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@clxxrlove
Copy link
Copy Markdown
Member

@coderabbitai summary

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 13, 2026

✅ Actions performed

Summary regeneration triggered.

Copy link
Copy Markdown
Member

@clxxrlove clxxrlove left a comment

Choose a reason for hiding this comment

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

수고했어! 코멘트 단거 간단히 검토해줘~~

아 그리고 PR 달때 타이틀에 리니어 이슈넘버 안적어줘도 트래킹 됨!!
글고 이거 이슈 직접 생성했던데 (미안...) 워크플로우에 쓰던 깃허브 시크릿이 죽었었음 다시 넣어서 고쳐놨어

Comment on lines +98 to +99
startDate: card.startDate.displayTextToAPIDateString,
endDate: card.endDate.displayTextToAPIDateString
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

display string으로 변환했다가 다시 역파싱하는게 조금 어색한듯
GoalEditCardItem에서 표시용 String만 들고있는거보다 raw값을 들고 있으면 좀 괜찮을 거 같은데 어때?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

entity로 만들면 이것도 해결 될듯

startDate: card.startDate.displayTextToAPIDateString,
endDate: card.endDate.displayTextToAPIDateString
)
return .send(.delegate(.goToGoalEdit(goalData)))
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

여기 보면 (위에 goalData 포함해서) MakeGoalReducer.State.MakeGoal는 MakeGoal화면의 내부 상태인데, 이걸 외부에서 생성해서 주입하면 상태가 많이 복잡해질거 같아. 결합도도 꽤 높아지는거 같고.
MakeGoal에서 리팩토링 조금 잘못하면 여기저기 Feature가 많이 깨질거 같아
차라리 도메인단에 타입 만들어서 안전하게 주입하는건 어때?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

오키 Entity로 분리해서 reducer State에 source of truth로 놓고 그거 기반으로 수정할게

Comment on lines +35 to +36
weeklyPeriodCount: Int = 1,
monthlyPeriodCount: Int = 1
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

self.weeklyPeriodCount = repeatCycle == .weekly ? category.repeatCount : minimumPeriodCount
self.monthlyPeriodCount = repeatCycle == .monthly ? category.repeatCount : minimumPeriodCount

원래는 이랬는데 1로 그냥 주는건 의도된건가?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

다시 이렇게 반영할게

) {
updatePokeButtonDisabled(in: &state.items, goalId: goalId, isDisabled: isDisabled)

let cacheKey = TXCalendarUtil.apiDateString(for: state.calendarDate)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

찌르기 API 응답이 이미 돌아온 시점에 사용자가 다른 날짜로 이동하면 cacheKey가 잘못 업데이트 될수도 있을거같아

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

ㅇㅋㅇㅋ 반영할게

@jihun32
Copy link
Copy Markdown
Contributor Author

jihun32 commented May 13, 2026

수고했어! 코멘트 단거 간단히 검토해줘~~

아 그리고 PR 달때 타이틀에 리니어 이슈넘버 안적어줘도 트래킹 됨!! 글고 이거 이슈 직접 생성했던데 (미안...) 워크플로우에 쓰던 깃허브 시크릿이 죽었었음 다시 넣어서 고쳐놨어

ㅋㅋㅋㅋ 괜찮아
코멘트 남겨놓은 거 봤는데 나도 구조가 좀 복잡하다고 느꼈는데 좀 더 깔끔하게 나오도록 고민해볼게
그리고 오늘 리뷰 반영은 힘들 거 같아서 내일 배포 ㄱㄱ

@jihun32
Copy link
Copy Markdown
Contributor Author

jihun32 commented May 14, 2026

@clxxrlove
리뷰 반영했슴다

Copy link
Copy Markdown
Member

@clxxrlove clxxrlove left a comment

Choose a reason for hiding this comment

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

고생했어...!!

@clxxrlove clxxrlove merged commit 06d470f into develop May 14, 2026
2 checks passed
@clxxrlove clxxrlove deleted the fix/#285/TWI-80 branch May 14, 2026 12:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants