⚠ This page is served via a proxy. Original site: https://github.com
This service does not collect credentials or authentication data.
Skip to content

Conversation

@choijungp
Copy link
Contributor

@choijungp choijungp commented Jan 27, 2026

🌁 Background

QA에서 찾은 '탈퇴하기' 기능 관련 이슈들을 처리했어요 ~~~

📱 Screenshot

1. 유의사항 확인 전, 탈퇴하기 버튼 비활성화

Before After
Simulator Screen Recording - iPhone 16 Pro - 2026-01-27 at 16 15 59 Simulator Screen Recording - iPhone 16 Pro - 2026-01-27 at 16 18 35

After에서 탈퇴하기 진짜 눌렀어유 근데 안되는것임 !!!! ㅎㅎ. ...

2. 탈퇴 사유 작성 시, 키보드에 가려지는 화면 offset 조정

Before After
Simulator Screen Recording - iPhone 16 Pro - 2026-01-27 at 16 13 57 Simulator Screen Recording - iPhone 16 Pro - 2026-01-27 at 16 09 31

👩‍💻 Contents

  • 유의사항 확인 전, 탈퇴하기 버튼 비활성화
  • 탈퇴 사유 작성 시, 화면 클릭 시 키보드 내리기
  • 탈퇴 사유 작성 시, 키보드에 가려지는 화면 offset 조정
  • 탈퇴 사유 작성 후 다시 키보드 활성화 시 탈퇴하기 버튼이 비활성화 되는 버그 수정

📝 Review Note

댓쏘이지한 큐에이부터 ... 찬찬히 해치워나갈게유 ㅋ.ㅋ
아자아자 파이팅 ~~

📣 Related Issue

  • close #T3-206

Summary by CodeRabbit

  • 버그 수정

    • 출금 화면에서 키보드가 표시될 때 버튼 접근성이 개선되었습니다.
    • 화면 탭으로 키보드를 해제할 수 있도록 개선되었습니다.
    • 텍스트 입력 시 키보드 표시/숨김 동작이 더 안정적으로 동작합니다.
    • 화면 전환 시 키보드 상태 관리가 개선되어 예기치 않은 레이아웃 이동이 줄어듭니다.
    • 버튼 초기 활성화 상태가 논리적으로 일치하도록 조정되어 동작 일관성이 향상되었습니다
  • 잡무(Chores)

    • 빌드/테스트 워크플로우 설정이 간소화되어 빌드 절차가 정리되었습니다.

✏️ Tip: You can customize this high-level summary in your review settings.

@choijungp choijungp requested a review from taipaise January 27, 2026 07:19
@choijungp choijungp self-assigned this Jan 27, 2026
@coderabbitai
Copy link

coderabbitai bot commented Jan 27, 2026

Walkthrough

PrimaryButton 초기화에서 전달된 상태에 따라 isEnabled를 설정하도록 변경되었습니다. WithdrawViewController에는 내부 딕셔너리명 변경과 키보드 노출/숨김 처리(알림 등록·해제, 탭으로 키보드 종료, 뷰 보정)가 추가되었습니다. CI 워크플로는 Mise 제거 후 Tuist 직접 설치/사용으로 전환되었습니다.

Changes

코호트 / 파일(s) 변경 요약
PrimaryButton 초기화
Projects/Presentation/Sources/Common/Component/PrimaryButton.swift
초기화 시 isEnabled = (buttonState != .disabled)로 버튼 활성 상태를 초깃값에 맞춰 설정
WithdrawViewController — 키보드 처리 및 리네이밍
Projects/Presentation/Sources/Withdraw/View/WithdrawViewController.swift
내부 딕셔너리명 withdrawButtonswithdrawReasonButtons로 변경; 키보드 알림 등록/해제(configureKeyboardNotification, removeKeyboardNotification), 키보드 등장/사라짐 처리(keyboardWillAppear/keyboardWillDisappear), 탭 제스처로 키보드 종료, viewWillDisappear에서 알림 제거; textViewDidBeginEditing에서 기존 텍스트가 있을 경우 즉시 inputWithdrawReason 디스패치
CI 워크플로 변경
.github/workflows/build_test.yml
Mise 설치/사용 단계 제거; Homebrew 기반 Tuist 설치로 전환하고 tuist installtuist generate --no-open 등 명령을 직접 실행하도록 변경; 시뮬레이터 대상 지정 방식 단순화

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant User as "사용자"
    participant VC as "WithdrawViewController"
    participant Sys as "iOS Keyboard\n(System)"
    participant Dispatcher as "입력 Dispatcher"

    rect rgba(100,149,237,0.5)
    User->>VC: 텍스트뷰 탭 (편집 시작)
    VC->>Sys: becomeFirstResponder()
    Sys-->>VC: keyboardWillAppear(notification)
    VC->>VC: keyboardWillAppear 처리\n(뷰 위치 보정, 버튼 가시성 보장)
    end

    rect rgba(60,179,113,0.5)
    User->>Sys: 키보드 입력
    Sys->>VC: textViewDidBeginEditing / 입력 이벤트
    VC->>Dispatcher: inputWithdrawReason (기존 텍스트가 있으면 즉시 디스패치)
    end

    rect rgba(220,20,60,0.5)
    User->>VC: 배경 탭 (키보드 닫기)
    VC->>VC: dismissKeyboard()
    VC->>Sys: resignFirstResponder()
    Sys-->>VC: keyboardWillDisappear(notification)
    VC->>VC: keyboardWillDisappear 처리\n(뷰 원래 위치 복구)
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰📨 전달된 상태에 따라 깨어난 버튼
탭으로 잠든 키보드, 부드럽게 사라지고
이름 바꿈은 길을 밝히고, 뷰는 제자리를 찾아
작은 수정에도 코드는 춤추네
당근 향기와 함께, 훌쩍 기쁜 날 🥕🐇

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 계정 탈퇴('탈퇴하기') 기능의 QA 이슈 수정이라는 주요 변경사항을 명확하게 요약하고 있으며, 변경 사항의 핵심 의도를 잘 전달합니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/withdraw

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.

❤️ Share

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

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@Projects/Presentation/Sources/Withdraw/View/WithdrawViewController.swift`:
- Around line 66-69: viewWillDisappear에서만 removeKeyboardNotification()을 호출하고
configureKeyboardNotification()는 configureAttribute()에서 한 번만 호출되어 화면이 다시 나타날 때
키보드 알림이 등록되지 않을 수 있으니, 키보드 알림의 등록/해제를 일관된 생명주기로 옮기세요: configureAttribute()에서
configureKeyboardNotification() 호출을 제거하고 viewWillAppear(_: )에서
configureKeyboardNotification()를 등록하며 기존 viewWillDisappear(_:)의
removeKeyboardNotification()은 유지하여 알림 등록/해제 패턴을 일치시킵니다; 대상 함수/메서드:
configureKeyboardNotification(), removeKeyboardNotification(),
configureAttribute(), viewWillAppear(_:), viewWillDisappear(_:).
🧹 Nitpick comments (1)
Projects/Presentation/Sources/Withdraw/View/WithdrawViewController.swift (1)

341-358: 매직 넘버를 상수로 추출하는 것을 권장합니다.

Line 353의 + 50은 버튼과 키보드 사이의 여백을 위한 값으로 보입니다. 코드 가독성과 유지보수를 위해 Layout enum에 상수로 정의하는 것을 권장합니다.

제안하는 수정
  private enum Layout {
      // ... existing constants ...
+     static let keyboardButtonPadding: CGFloat = 50
  }
- let offset = buttonBottom - visibleHeight + 50
+ let offset = buttonBottom - visibleHeight + Layout.keyboardButtonPadding

Comment on lines +66 to +69
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
removeKeyboardNotification()
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

키보드 알림 등록/해제 시점 불일치 가능성

configureKeyboardNotification()configureAttribute()에서 한 번만 호출되지만, removeKeyboardNotification()viewWillDisappear에서 매번 호출됩니다. 만약 이 화면이 navigation stack에서 다시 나타나는 경우, 키보드 알림이 재등록되지 않아 키보드 처리가 동작하지 않을 수 있습니다.

탈퇴 플로우 특성상 화면을 벗어났다가 다시 돌아오는 경우가 드물지만, 일관성을 위해 viewWillAppear에서 등록하고 viewWillDisappear에서 해제하는 패턴을 권장합니다.

제안하는 수정 방법
+ override func viewWillAppear(_ animated: Bool) {
+     super.viewWillAppear(animated)
+     configureKeyboardNotification()
+ }
+
  override func viewWillDisappear(_ animated: Bool) {
      super.viewWillDisappear(animated)
      removeKeyboardNotification()
  }

그리고 configureAttribute()에서 configureKeyboardNotification() 호출을 제거합니다.

Also applies to: 160-160, 311-323

🤖 Prompt for AI Agents
In `@Projects/Presentation/Sources/Withdraw/View/WithdrawViewController.swift`
around lines 66 - 69, viewWillDisappear에서만 removeKeyboardNotification()을 호출하고
configureKeyboardNotification()는 configureAttribute()에서 한 번만 호출되어 화면이 다시 나타날 때
키보드 알림이 등록되지 않을 수 있으니, 키보드 알림의 등록/해제를 일관된 생명주기로 옮기세요: configureAttribute()에서
configureKeyboardNotification() 호출을 제거하고 viewWillAppear(_: )에서
configureKeyboardNotification()를 등록하며 기존 viewWillDisappear(_:)의
removeKeyboardNotification()은 유지하여 알림 등록/해제 패턴을 일치시킵니다; 대상 함수/메서드:
configureKeyboardNotification(), removeKeyboardNotification(),
configureAttribute(), viewWillAppear(_:), viewWillDisappear(_:).

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In @.github/workflows/build_test.yml:
- Around line 33-34: The CI run calls "tuist install" then "tuist generate
--no-open" while the repo contains Tuist/Package.resolved, so make "tuist
install" deterministic by adding the --force-resolved-versions flag; update the
workflow to run "tuist install --force-resolved-versions" followed by "tuist
generate --no-open" to enforce the exact versions in Tuist/Package.resolved
(including transitive deps).
- Around line 19-22: The "Install Tuist" workflow step currently runs an
unpinned curl|bash installer which is a supply-chain risk; change it to install
a fixed Tuist version by either (A) using the mise action (jdx/mise-action@v2)
and commit a .tool-versions entry like "tuist x.y.z" so the workflow uses the
pinned version, or (B) install a specific formula via Homebrew (e.g., brew
install --formula tuist@4) in that step; optionally add a post-install
verification using the official verify.sh script to validate the installer.

Comment on lines +33 to +34
tuist install
tuist generate --no-open
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# First, examine the workflow file
cat -n .github/workflows/build_test.yml | head -50

Repository: YAPP-Github/Bitnagil-iOS

Length of output: 1476


🏁 Script executed:

# Search for Tuist-related configuration files
fd -e lock -e lockfile -e "tuist" 2>/dev/null | head -20

Repository: YAPP-Github/Bitnagil-iOS

Length of output: 50


🏁 Script executed:

# Check for any Tuist configuration files
find . -name ".tuist*" -o -name "Tuist.json" -o -name "tuist.lock" 2>/dev/null

Repository: YAPP-Github/Bitnagil-iOS

Length of output: 50


🌐 Web query:

Tuist lockfile deterministic dependency resolution CI reproducibility

💡 Result:

Tuist’s dependency “lockfile” story is essentially SwiftPM’s Package.resolved:

  • What locks versions (incl. transitives): Tuist resolves dependencies via Swift Package Manager and relies on Package.resolved to pin the exact versions (including transitive dependencies). Ensure Package.resolved is committed (not gitignored), otherwise CI/dev machines may pick up newer transitive releases and break builds. [1]
  • How to make CI deterministic: On CI, run:
    • tuist install --force-resolved-versions
      This forces resolution to the exact versions in Package.resolved to avoid non-determinism in resolution. [2]
  • When versions change: tuist install effectively runs swift package resolve (generally respecting Package.resolved), while tuist install --update runs swift package update and can move versions forward within the ranges in Package.swift. [3]
  • CI reproducibility + caching: If you cache dependencies, Tuist recommends caching the SwiftPM clone/build directory (often .build) and keying it off the Package.resolved path used by Xcode/SwiftPM; you can also pass -clonedSourcePackagesDirPath .build via Tuist config / xcodebuild to keep clones in a predictable location for caching. [4]

Practical checklist for reproducible CI

  1. Commit Package.resolved.
  2. Use tuist install --force-resolved-versions in CI.
  3. Only run updates intentionally (e.g., tuist install --update in a dedicated “deps update” workflow/PR).
  4. Cache .build (or your configured clone dir) keyed by Package.resolved. [1][2][4]

Sources: Tuist best practices (CI flag) [2], Tuist community threads on transitive locking & install/update behavior [1][3], Tuist registry CI/caching guide [4].


🏁 Script executed:

# Check for Package.resolved file
fd "Package.resolved" 2>/dev/null

Repository: YAPP-Github/Bitnagil-iOS

Length of output: 90


🏁 Script executed:

# Check for Package.swift to understand dependency management
fd "Package.swift" 2>/dev/null

Repository: YAPP-Github/Bitnagil-iOS

Length of output: 87


tuist install--force-resolved-versions 플래그 추가 필요

리포지토리에 Tuist/Package.resolved 파일이 있으므로 의존성 버전이 잠금되어 있습니다. 다만, 현재 CI 워크플로우의 tuist install 명령어는 플래그 없이 실행되어 매번 해상도 과정을 거칠 수 있습니다.

CI 재현성을 보장하려면 다음과 같이 수정하세요:

tuist install --force-resolved-versions
tuist generate --no-open

이 플래그는 Package.resolved의 정확한 버전(이행 의존성 포함)을 강제하여 CI의 결정적 동작을 보장합니다.

🤖 Prompt for AI Agents
In @.github/workflows/build_test.yml around lines 33 - 34, The CI run calls
"tuist install" then "tuist generate --no-open" while the repo contains
Tuist/Package.resolved, so make "tuist install" deterministic by adding the
--force-resolved-versions flag; update the workflow to run "tuist install
--force-resolved-versions" followed by "tuist generate --no-open" to enforce the
exact versions in Tuist/Package.resolved (including transitive deps).

Copy link
Collaborator

@taipaise taipaise left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!!! 레츠 기릿~~!!!

@choijungp choijungp merged commit ba3a066 into develop Jan 27, 2026
2 checks passed
@choijungp choijungp deleted the fix/withdraw branch January 27, 2026 13:23
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.

3 participants