[Feat] 토닥이 진입 스플래시 및 ChatScreen 추가 - #87
Conversation
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
e92b83a to
4b234da
Compare
- MainActivity에서 Greeting/Scaffold 제거, ChatScreen 직접 호출 (설계 2-3) - ThinkingIndicator: 점 3개 순차 애니메이션 (designsystem 미포함, chat 전용) - ChatGreetingOverlay: 3초 자동 페이드아웃 + X 즉시 닫기, greeting 개행 유무 방어 처리 (설계 2-5) - ChatScreen: 진입 상태(캐릭터+제목+추천칩 6개) / 대화 상태(LazyColumn, 자동 스크롤) / hiltViewModel() 배선 - CharacterAvatar: 이미지 asset 미확보로 primary100 색 원 플레이스홀더 (설계 2-7) - @Preview 6종: 진입·그리팅(개행 있음/없음)·THINKING·TYPING·대화 이어보기 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
P1: - ktlintCheck 4개 모듈 전부 실패 → ktlintFormat + ThinkingIndicatorDefaults의 const val 네이밍(MinAlpha/CycleMillis → MIN_ALPHA/CYCLE_MILLIS), 자동 수정 불가한 120자 초과 3곳(테스트 JSON 픽스처, 테스트 함수명) 수동 분리 - onSendClick이 가드 체크 전에 input을 비워 스트리밍 중/quota 소진 시 사용자 입력이 무음 소실 → send()의 클리어 타이밍을 가드 통과 이후로 이동 P2: - 전송 실패 시 낙관적 사용자 메시지가 PENDING으로 영구 잔존 → FAILED로 표시 - ChatScreen의 자동 스크롤이 streamingText 16ms 틱마다 animateScrollToItem을 재시작해 덜컹거림 → scrollToItem(애니메이션 없음)으로 교체 - delta 없이(start+done만) 스트림 종료 시 빈 어시스턴트 메시지가 추가됨 → 가드 추가, 회귀 테스트 1건 신설(기존 conversationId 전파 테스트는 Delta 픽스처를 보강해 원래 의도대로 복원) P3(미사용 install(SSE), ChatStreamException 패키지 위치, 서로게이트 페어 절단)는 선택 반영 대상으로 이번엔 보류. 검증: app:assembleDebug, feature:chat:assembleDebug, 전체 유닛 테스트, ktlintCheck 전부 통과.
기존 ChatScreen을 상태를 관리하는 ChatRoute와 순수 UI 컴포넌트인 ChatScreen으로 분리한다. ChatPhase와 별도 문자열로 파편화되어 있던 스트리밍 상태를 StreamingChatState sealed interface로 통합하여 관리한다. - 스트리밍 에러 및 일반 에러 발생 시 스낵바를 노출하도록 사이드 이펙트 처리 로직 추가 - feature/chat 모듈에 Material 3 의존성 추가 및 에러 메시지 정의 - 캐릭터 아바타 컴포저블을 별도 함수로 추출하여 재사용성 확보 # Conflicts: # feature/chat/build.gradle.kts
채팅 시 키보드가 입력창을 가리지 않도록 MainActivity에 `adjustResize` 설정을 추가한다. 채팅 헤더, 상태 메시지, 에러 문구 등 채팅에 필요한 문자열과 운세 카테고리별(관계, 연애, 성취, 금전, 건강) 안내 문구 및 이미지 리소스를 추가한다.
SnackbarHostState를 MainActivity로 상속하여 스낵바 표시 로직을 중앙 집중화하고, 디자인 시스템의 TodakunSnackbar를 적용한다. - ChatGreetingOverlay와 ThinkingIndicator를 component 패키지로 이동한다. - ChatGreetingOverlay가 ChatCategory를 직접 받아 카테고리에 맞는 제목, 본문 및 캐릭터 이미지를 출력하도록 개편한다. - ChatScreen에서 입력창(InputField)의 높이를 동적으로 측정하여 메시지 리스트의 하단 패딩에 반영하고, 키보드(IME) 가시성 변화에 따른 스크롤 로직을 개선한다. - 기존의 임시 캐릭터 아바타를 실제 드로어블 에셋을 사용하는 ProfileCharacterImage로 교체한다. - SendChatMessageUseCase에 UI 개발 및 테스트를 위한 모의(Mock) 스트림 응답 로직을 추가한다.
`ChatCategory.toCharacterResourceId()`를 유틸리티 함수로 분리하여 `ChatGreetingOverlay`와 `ChatScreen`에서 공유한다. - `ChatEntryContent`를 `ChatMessageList`의 `item`으로 통합하여 초기 진입 화면과 메시지 목록의 스크롤 상태 관리를 일원화한다. - 선택된 카테고리에 맞는 캐릭터 이미지를 표시하고, `graphicsLayer`를 사용해 특정 카테고리 선택 시 이미지를 1.4배 확대한다. - `prevCategory` 상태를 추가하여 카테고리 값이 `null`로 변경되어도 직전에 선택했던 캐릭터 이미지가 유지되도록 개선한다. - `StreamingChatState`가 `Idle`이 아닌 모든 경우에 인디케이터(Thinking/Typing)를 표시하도록 로직을 수정한다.
단순히 흐려졌다 진해지던 애니메이션을 점이 위아래로 튀어 오르며 색상이 변하는 방식으로 변경하고, 우측에 '생각 중' 텍스트 레이블을 추가한다. Figma 디자인 사양에 맞춰 도트 크기, 간격, 바운스 높이 및 타이밍을 조정한다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01299PBN5qzgPtdnPH2e25rs
메시지에 액션(ChatAction)이 포함된 경우 채팅 버블 내에 `TodakunChatActionCard`를 표시하며, 날짜 형식을 지정하는 확장 함수를 추가한다. 또한 채팅 헤더와 입력창 버튼들의 리플 효과(indication)를 제거하여 디자인 가이드를 반영한다. - `TodakunChatInputField`, `TodakunChatHeader` 내 클릭 가능한 요소에 `indication = null` 적용 - 채팅 메시지 내 `ChatAction` 유무에 따른 `TodakunChatActionCard` 렌더링 로직 추가 - `LocalDate.toActionDateText()` 확장 함수 추가 (yyyy . M . d (E) 형식) - 스플래시 및 히스토리 화면용 문자열 리소스 추가
채팅 메시지 내에서 카테고리와 날짜 정보를 표시하고 후속 작업을 유도하는 TodakunChatActionCard를 추가한다. CalendarActionButton은 LocalRippleConfiguration을 null로 설정해 기본 리플 효과를 제거했으며, isPressed 상태에 따라 배경색에 gray975(16% 알파)를 composite하여 직접 눌림 피드백을 제공한다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01299PBN5qzgPtdnPH2e25rs
Assistant 메시지와 Thinking/Typing 인디케이터 상단에 24.dp 간격을 추가하여 레이아웃을 개선한다. 메시지 렌더링 시 `else` 분기 대신 `MessageRole.ASSISTANT`를 명시적으로 처리하도록 변경한다.
채팅 할당량(quota) 정보를 불러오는 동안 브랜드 로고와 캐릭터 이미지가 포함된 스플래시 화면을 노출한다. `state.quota`가 null인 초기 로딩 상태에서 ChatSplashScreen을 렌더링하도록 ChatRoute의 로직을 변경했다.
4b234da to
f21de29
Compare
|
@CodeRabbit review |
|
feature:chat 모듈에 정의되어 있던 채팅 UI 관련 문자열 리소스들을 core:designsystem 모듈로 옮겨 공통으로 관리한다. 이에 따라 ThinkingIndicator, ChatRoute 등 관련 컴포넌트에서 참조하는 R 클래스 패키지를 변경하고, ChatRoute의 미사용 임포트를 정리한다.
TodakunChatActionCard의 이름을 용도에 맞춰 TodakunChatCalenderActionCard로 변경한다. 카드 버튼 클릭 시 CalendarContract를 사용하여 시스템 캘린더의 일정 추가 화면으로 연결되도록 구현한다. 별도의 콜백 전달 대신 ChatScreen 내에서 직접 Intent를 시작하도록 로직을 변경한다.
관련 이슈
#78
작업 내용
변경사항 / 상세
중점 리뷰사항
스크린샷 (선택)
Screen_Recording_20260807_014500_todakun.mp4