Skip to content

[Feat] 토닥이 진입 스플래시 및 ChatScreen 추가 - #87

Draft
oungsi2000 wants to merge 13 commits into
feat/77-chat-viewmodelfrom
feat/78-chat-screen
Draft

[Feat] 토닥이 진입 스플래시 및 ChatScreen 추가#87
oungsi2000 wants to merge 13 commits into
feat/77-chat-viewmodelfrom
feat/78-chat-screen

Conversation

@oungsi2000

@oungsi2000 oungsi2000 commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

관련 이슈

#78

작업 내용

  • 토닥이 채팅 Splash와 ChatScreen을 추가하였습니다

변경사항 / 상세

  • 채팅 화면은 키보드 가시성에 따라 위로 올라가야 한다고 생각했습니다. android:windowSoftInputMode="adjustResize"를 설정하지 않으니 키보드가 올라갈 때, 패딩이 튀는 현상이 발생하여 추가했습니다.
  • 스낵바가 필요로 하는 부분이 있는데, 외부에서 snackbarHost를 주입받도록 구성했습니다. 추후 하나의 Scaffold에서 주입시키면 좋을 것 같습니다

중점 리뷰사항

  • 토닥이 진입 스플래시의 조건을 ChatEntry의 응답이 성공했을때를 기준으로 두었습니다!
  • 하나의 LazyColumn에서 예시 질문, 채팅을 다 소화하고 있는데 더 좋은 방식이 있는지 궁금합니다.

스크린샷 (선택)

Screen_Recording_20260807_014500_todakun.mp4

@oungsi2000 oungsi2000 self-assigned this Aug 6, 2026
@oungsi2000 oungsi2000 added the feature 새로운 기능 추가 label Aug 6, 2026
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

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: 61b1b238-16e8-4c53-b4d0-e21748bb5704

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

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.

@oungsi2000
oungsi2000 force-pushed the feat/78-chat-screen branch from e92b83a to 4b234da Compare August 6, 2026 16:27
oungsi2000 and others added 11 commits August 7, 2026 01:58
- 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의 로직을 변경했다.
@oungsi2000
oungsi2000 force-pushed the feat/78-chat-screen branch from 4b234da to f21de29 Compare August 6, 2026 17:10
@oungsi2000

Copy link
Copy Markdown
Collaborator Author

@CodeRabbit review

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

feature:chat 모듈에 정의되어 있던 채팅 UI 관련 문자열 리소스들을 core:designsystem 모듈로 옮겨 공통으로 관리한다.
이에 따라 ThinkingIndicator, ChatRoute 등 관련 컴포넌트에서 참조하는 R 클래스 패키지를 변경하고, ChatRoute의 미사용 임포트를 정리한다.
TodakunChatActionCard의 이름을 용도에 맞춰 TodakunChatCalenderActionCard로 변경한다.
카드 버튼 클릭 시 CalendarContract를 사용하여 시스템 캘린더의 일정 추가 화면으로 연결되도록 구현한다.
별도의 콜백 전달 대신 ChatScreen 내에서 직접 Intent를 시작하도록 로직을 변경한다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature 새로운 기능 추가

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant