Repository navigation
fix(mindrecord): 작성·탭 상호작용 7건 — 접기 전환·링크 검증·임시저장·텍스트 설정·오라우팅 #722
Description
📜 Overview (Required)
마음의 기록의 데일리질문·일기 작성 화면과 상단 탭에서 서로 다른 7개 상호작용이 무반응, 잘못된 이동 또는 검증 누락으로 이어진다. 2026-08-03 사용자 런타임 실측을 기준으로 현재 코드를 대조했다.
1. 데일리질문 ‘오늘의 추천 질문’ 접기 전환이 끊겨 보인다
질문 본문에만 AnimatedVisibility가 적용돼 있고, 부모 Column의 8dp 간격과 화살표의 0°/180° 회전은 같은 전환에 포함돼 있지 않다. 본문 퇴장, 배너 높이·간격 축소, 화살표 회전이 한 흐름으로 이어지도록 조율해야 한다.
2. 데일리질문 링크 입력이 임의 문자열을 허용한다
링크 추가 시 URL 형식이 아닌 텍스트도 오류 없이 완료되며 그대로 본문 링크가 된다. LinkBottomSheet는 입력값과 무관하게 완료 버튼이 항상 활성이고, WriteTextField는 전달값을 검증·escaping하지 않은 채 a 태그의 href와 본문에 직접 삽입한다. 지원하는 URL 형식만 허용하고, 잘못된 값에는 오류를 표시하며 HTML 속성에 넣기 전에 안전하게 인코딩해야 한다.
3. 빈 데일리질문을 임시저장하면 마음의 기록 홈으로 이동한다
WriteTextField는 화면 진입 직후 리치 에디터의 HTML을 ViewModel에 전달한다. 사용 중인 compose-rich-editor 1.0.0-rc13은 빈 문단도 <br>로 직렬화하므로, 화면은 비어 있어도 answer.isNotBlank() 검증을 통과한다. 임시저장이 성공 상태로 전이되면 공통 onSubmitSuccess가 작성 화면을 pop해 마음의 기록 홈으로 돌아간다. 화면상 본문이 비어 있으면 저장 요청과 화면 이탈을 막고 누락 안내를 표시해야 한다.
4. 데일리질문과 주간리포트 사이를 직접 이동하면 일기 탭에 멈춘다
데일리질문 상태에서 주간리포트를 누르거나 주간리포트 상태에서 데일리질문을 누르면 목적지가 아니라 가운데 일기 탭으로 이동한다. HomeScreen은 selectedIndex 변경으로 pager 애니메이션을 시작하면서 pagerState.currentPage를 다시 selectedIndex에 기록한다. 0↔2 전환 중 거치는 1번 페이지가 선택값을 덮어써 일기에 정착한다. HorizontalPager도 page 인자를 무시하고 전역 selectedCategory만 렌더한다. 탭과 pager의 선택 상태를 단일 방향으로 동기화해야 한다.
5. 일기 빈 폼의 등록 불가 사유가 안내되지 않는다
제목·본문·기분이 비어 있으면 등록 버튼은 canSubmit=false로 클릭 자체가 차단된다. 회색 비활성 상태 외에 어떤 필수값이 빠졌는지 알리는 필드 강조·문구·알림이 없어서 사용자는 버튼이 고장 난 것과 구분하기 어렵다. 등록을 막는 경우 누락 항목을 확인할 수 있는 피드백이 필요하다.
6. 일기 작성 하단 T 버튼이 무동작한다
T 버튼은 항상 노출되지만 텍스트 설정 패널은 showTextStyleToolbar와 IME 표시가 모두 참일 때만 렌더된다. 키보드가 보이지 않으면 토글 상태도 즉시 false로 초기화되며, T 버튼 콜백은 에디터 포커스나 키보드를 복원하지 않는다. T를 누르면 에디터 포커스·키보드와 함께 설정 패널을 열거나, 실행할 수 없는 상태에서는 버튼 노출과 동작을 일치시켜야 한다.
7. 일기 임시저장이 정식 등록 조건에 막혀 무반응한다
임시저장 텍스트는 항상 클릭 가능하지만 submit(isDraft=true)도 정식 등록과 같은 canSubmit을 사용한다. 제목·본문·기분 중 하나라도 비어 있으면 안내 없이 즉시 return하므로 미완성 내용을 보존하려는 임시저장이 완성된 글에서만 동작한다. 임시저장 최소 조건을 정식 등록과 분리하고, 저장할 수 없는 상태라면 비활성 표시나 사유 안내를 제공해야 한다.
📌 Child Issue(Optional)
No response
📍 Note (Optional)
- 기준: origin/develop 68dfef7.
- 주요 근거 위치:
- DailyQuestionBanner.kt:67, 103-118 — 간격·화살표는 즉시 전환되고 본문만 AnimatedVisibility 적용.
- LinkBottomSheet.kt:51, 68-72, 109, 137-145 / WriteTextField.kt:239-247 — URL 검증 없이 항상 완료 가능하며 문자열을 a 태그에 직접 삽입.
- WriteTextField.kt:77-79 / DailyQuestionWriteUiState.kt:18-19 — 화면상 빈 리치 텍스트를 직렬화된 HTML 문자열의 isNotBlank()로 판정.
- HomeScreen.kt:65-75, 157-179 — selectedIndex와 pagerState.currentPage의 양방향 갱신 및 page 인자 미사용.
- DiaryWriteUiState.kt:25-31 / DiaryWriteViewModel.kt:91-95 — 등록과 임시저장이 같은 완성 조건을 쓰고 실패 사유 없이 return.
- WriteTextField.kt:91-98, 177-204 — T 토글과 텍스트 설정 패널이 IME 표시 여부에 묶임.
- #565는 questionId 부재에 따른 데일리질문 저장 무음 중단을 다룬다. 연결 PR #719의 answer.isBlank() 검사도 <br> 같은 의미상 빈 HTML은 잡지 못하므로 3번은 남는다.
- #269는 일기 빈 폼의 등록 버튼 비활성을 QA 기대값으로 적었지만, 누락 항목 피드백·T 버튼·임시저장 동작은 추적하지 않는다.
- #592는 데일리질문 목록의 추천 질문 영역 미구현이며 1번의 작성 화면 접기 품질과 별개다.
- 시안 미대조 — 1번은 사용자 실측과 현재 애니메이션 구성에 근거한 동작 품질 결함이며, 나머지는 기능 동작·상태 전이 결함이다.
Activity
OnlyReadOneBook commentedon Aug 9, 2026
6번과 다른 T 버튼이 하나 더 있어 보강합니다. 6번은 하단 툴바의 T(패널을 여는 쪽)이고, 아래는 그 패널이 열린 뒤 패널 안에 있는 T 입니다.
KeyBoardToolBar.kt:178—IconActionButton(onClick = onTypeClick)로 배선돼 있습니다(라벨은Text("T")).TextStyleToolbar의onTypeClick: () -> Unit = {}(KeyBoardToolBar.kt:130)에 값을 넘기는 호출부가 0건입니다. 유일한 사용처인WriteTextField.kt:178이styleState·onClose·onBoldClick·onItalicClick등은 넘기면서onTypeClick만 빠뜨렸습니다.= {}디폴트 때문에 배선을 빠뜨려도 컴파일이 통과해, 같은 패널의 굵게·기울임은 동작하는데 이 버튼만 조용히 무동작입니다.6번을 고쳐 패널이 정상적으로 열려도 이 버튼은 여전히 아무 일도 하지 않으므로, 같은 작업에서 함께 보시는 편이 좋겠습니다. 이 버튼이 무엇을 해야 하는지(서체·글자 크기 전환 등)는 시안 확인이 선행이라 저는 배선 부재 사실까지만 실측했습니다.
발견 경위: 레포 전체
-> Unit = {}람다 디폴트 선언 137건을 선언부↔호출부 대조로 전수 판정하다 나온 3건 중 하나입니다.OnlyReadOneBook commentedon Aug 9, 2026
앞 코멘트에 하나 더 보탭니다. 같은 패널의 링크 버튼(
onLinkClick)도 같은 상태입니다.KeyBoardToolBar.kt:170—IconActionButton(onClick = onLinkClick)(링크 아이콘)TextStyleToolbar의onLinkClick: () -> Unit = {}(KeyBoardToolBar.kt:129)를 유일한 호출부WriteTextField.kt:178이 넘기지 않습니다.정리하면 패널 안 버튼 중 굵게·기울임은 배선돼 동작하고, 링크와 T 둘만 미배선입니다. 두 개가 같은 호출부의 같은 누락이라 한 번에 넘기면 됩니다.
Merge fix/736-request-count into fix/722-write-interactions
github-actions commentedon Aug 24, 2026
Auto-closed by merge of #992 into
fix/736-request-count.Merge refactor/547-weekly-date-parsing into fix/736-request-count
Merge origin/develop into fix/1067-link-url-validation