Skip to content

[FIX] 홈/채팅/대화목록/카드 결과 화면 UX 버그 모음 수정 - #40

Merged
cchanmi merged 6 commits into
developfrom
feature/home-nickname-flash
Aug 20, 2026
Merged

cchanmi merged 6 commits into
developfrom
feature/home-nickname-flash

Conversation

@cchanmi

@cchanmi cchanmi commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator

Describe

홈/채팅/대화목록/카드 결과 화면에서 발견된 UX 버그 6건을 한 브랜치에서 모아 수정했습니다.

Works made

  1. 홈 진입 시 닉네임 플레이스홀더 전환 노출 — 콜드 스타트 후 홈 진입 시 "OO" 플레이스홀더가 실제 닉네임으로 바뀌는 게 보이던 문제. greeting을 항상 마운트해 레이아웃을 고정하고, 값이 준비된 뒤에만 크로스 디졸브로 나타나게 함. MessageComposerView는 프로필 조회 성공/로딩/실패와 무관하게 항상 렌더링
  2. 답장 전송 시 답장 모드가 늦게 꺼짐 — 채팅에서 답장 후 전송하면, 감정 캐릭터 응답이 올 때까지 답장 미리보기/취소 버튼이 화면에 남아있던 문제. input/pendingUserMessage와 동일하게 전송 시작 시점에 즉시 replyTarget을 비우고, 실패 시엔 그 사이 사용자가 새 답장을 고르지 않았을 때만 복원.
  3. 홈 화면 토큰 소진 시 입력 안 막힘 — 채팅은 토큰을 다 쓰면 입력을 막았지만 홈은 그대로 가능했던 문제. HomeViewModelGetTokenUsageUseCase 추가, 화면 진입/재진입마다(캐싱 없이) 토큰 사용량 확인 후 채팅과 동일한 문구로 입력/감정선택/전송을 막음.
  4. 대화 목록 설정 아이콘 미연결 — 대화 목록 뷰 설정 버튼 클릭 시SettingView 연결.
  5. 카드 버리기 스와이프 연출 개선 — 종이를 아래로 스와이프해 버릴 때 opacity로 흐려지던 연출을, 종이/화살표를 항상 쓰레기통보다 뒤 계층에 고정해 실제로 쓰레기통 뒤로 떨어지는 것처럼 보이게 변경. 놓았을 때 손 뗀 위치에서 바로 화면이 닫히던 것도 함께 수정 — 버리기로 판정되면 화면 밖까지 떨어지는 애니메이션을 재생한 뒤 닫히도록 함.

콜드 스타트 후 홈 진입 시 닉네임이 "OO" 플레이스홀더에서 실제 값으로
바뀌는 게 보이는 문제를 해결.

- greeting은 항상 마운트해 레이아웃(자리)을 고정하고, 프로필이 준비되기
  전엔 opacity 0으로만 감춤 — MessageComposerView가 밀리며 움직이지 않음
- 닉네임 텍스트가 확정되는 트랜잭션과 opacity 애니메이션 트랜잭션을
  분리(isGreetingReady + onChange)해서, 텍스트 폭이 바뀌며 스냅되는 것
  없이 화면이 제자리에서 크로스 디졸브로 나타남
- MessageComposerView는 프로필 조회 성공/로딩/실패 여부와 무관하게 항상
  렌더링 — 조회 실패 시에도 메시지 입력이 막히지 않음
replyTarget이 sendMessageUseCase.execute() 완료(캐릭터 답장 생성까지 포함)
이후에만 nil로 바뀌어서, 답장 미리보기/취소 버튼이 캐릭터 응답이 올 때까지
화면에 남아있던 문제. input/pendingUserMessage와 동일하게 전송 시작
시점에 즉시 비우고, 실패 시엔 그 사이에 사용자가 새 답장을 고르지
않았을 때만 복원하도록 함(input 복원과 동일한 가드).
지금까지 ChatView는 토큰을 다 쓰면 입력창을 막고 안내 문구를 보여줬지만
HomeView는 그대로 입력이 가능했다. HomeViewModel에 GetTokenUsageUseCase를
추가해 화면 진입/재진입마다(채팅에서 토큰을 다 쓰고 돌아왔을 수 있어
캐싱하지 않음) 토큰 사용량을 확인하고, 다 썼으면 MessageComposerView에
동일 문구("오늘의 토큰을 모두 사용했어요")를 플레이스홀더로 보여주며
입력/감정선택/전송을 막는다. send()에도 가드를 추가해 이중 방어한다.
기어 아이콘이 탭 액션 없이 이미지로만 있어서 눌러도 아무 반응이 없었음.
onTappedSettingButton 콜백을 추가하고 HomeView와 동일한 방식으로
SettingView에 navigationDestination 연결.
파일은 존재했지만 project.pbxproj에 빌드 대상으로 등록돼 있지 않아서,
xcodebuild test를 아무리 돌려도 이 파일의 테스트 12개가 조용히 0개
실행되고 있었음(빌드/테스트 결과엔 실패로도 안 잡힘). 다른 테스트
파일과 동일한 방식으로 PBXBuildFile/PBXFileReference/그룹/Sources
빌드 페이즈에 등록.
동적으로 계층을 바꾸는 방식(dragOffset 임계값 넘으면 trashBin 뒤로
재배치)은 SwiftUI가 if/else 분기 전환 시 종이 뷰를 다시 만들면서
진행 중이던 오프셋 애니메이션이 끊겨, 일정 지점 아래로는 종이가 안
내려가는 문제가 있었음.

대신 종이/화살표를 항상 trashBin보다 뒤 계층에 고정해서, 아래로
스와이프하면 자연스럽게 쓰레기통 뒤로(안으로) 들어가는 것처럼 보이게
함 — 뷰가 다시 만들어지지 않으니 드래그/드롭 애니메이션이 끊기지 않는다.
opacity(forDragOffset:)/isBehindTrashBin(dragOffset:) 모두 제거.

놓았을 때 손 뗀 위치에서 바로 닫히던 것도 이전 커밋에서 고친 대로
drop()으로 끝까지 떨어지는 애니메이션 재생 후 onComplete() 호출을
유지한다.
@cchanmi cchanmi self-assigned this Aug 20, 2026
@cchanmi
cchanmi merged commit ae3046a into develop Aug 20, 2026
1 check failed
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