Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
c4d2f41
refactor(mindrecord): 로딩 스피너 5곳을 core:ui LoadingBody 로 모은다
Sadturtleman Aug 30, 2026
5ad6679
refactor(mindrecord): 참조 0건 카드 3건을 시안 대조 후 삭제한다
Sadturtleman Aug 30, 2026
20b6d41
refactor(mindrecord,home): no-op 콜백 디폴트 50건을 걷고 가려져 있던 배선 누락 2건을 고친다
Sadturtleman Aug 30, 2026
dbb5741
fix(test): 계측·screenshotTest 호출부에도 걷어낸 디폴트를 명시한다
Sadturtleman Aug 31, 2026
d4ae742
Merge remote-tracking branch 'origin/develop' into refactor/1540-mind…
Sadturtleman Aug 31, 2026
93ef049
Merge origin/develop into refactor/1540-mindrecord-presentation-cleanup
Sadturtleman Aug 31, 2026
e25ae7a
Merge origin/develop into refactor/1540-mindrecord-presentation-cleanup
Sadturtleman Aug 31, 2026
2cbbb16
Merge origin/develop into refactor/1540-mindrecord-presentation-cleanup
Sadturtleman Aug 31, 2026
ea3755e
fix(mindrecord): 읽기 전용 카드에 클릭 semantics 를 붙이지 않는다
Sadturtleman Sep 1, 2026
4951c6e
style(mindrecord): 파라미터 KDoc 이 두 겹으로 남은 것을 합친다
Sadturtleman Sep 1, 2026
fbd69a1
test(mindrecord): 목록 항목까지 스크롤한 뒤 눌러 달 전달을 검증한다
Sadturtleman Sep 1, 2026
0fd1683
Merge remote-tracking branch 'origin/develop' into refactor/1540-mind…
Sadturtleman Sep 1, 2026
897cade
Merge remote-tracking branch 'origin/develop' into refactor/1540-mind…
Sadturtleman Sep 3, 2026
3948c01
test(mindrecord): develop 에서 온 호출부에도 걷어낸 디폴트를 명시한다 (#1540)
Sadturtleman Sep 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,12 @@ class DailyQuestionResumeFailureAndroidTest {

composeRule.setContent {
AfternoteTheme {
DailyQuestionWriteScreen(viewModel = viewModel, onSubmitSuccess = {})
DailyQuestionWriteScreen(
viewModel = viewModel,
onSubmitSuccess = {},
onBackClick = {},
onDraftListClick = {},
)
}
}

Expand Down Expand Up @@ -128,7 +133,12 @@ class DailyQuestionResumeFailureAndroidTest {

composeRule.setContent {
AfternoteTheme {
DailyQuestionWriteScreen(viewModel = viewModel, onSubmitSuccess = {})
DailyQuestionWriteScreen(
viewModel = viewModel,
onSubmitSuccess = {},
onBackClick = {},
onDraftListClick = {},
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,11 @@ class TimeLetterMindRecordCompletionAndroidTest {

composeRule.setContent {
AfternoteTheme {
DailyQuestionAnswerListScreen(viewModel = activeViewModel, onItemClick = { _, _ -> })
DailyQuestionAnswerListScreen(
viewModel = activeViewModel,
onItemClick = { _, _ -> },
onEditClick = {},
)
}
}

Expand Down Expand Up @@ -432,7 +436,11 @@ class TimeLetterMindRecordCompletionAndroidTest {
val activeWriteViewModel = writeViewModel
AfternoteTheme {
if (activeWriteViewModel == null) {
DailyQuestionAnswerListScreen(viewModel = listViewModel, onItemClick = { _, _ -> })
DailyQuestionAnswerListScreen(
viewModel = listViewModel,
onItemClick = { _, _ -> },
onEditClick = {},
)
} else {
DailyQuestionWriteScreen(
viewModel = activeWriteViewModel,
Expand All @@ -441,6 +449,8 @@ class TimeLetterMindRecordCompletionAndroidTest {
writeViewModel = null
listViewModel.refreshOnReturn()
},
onBackClick = {},
onDraftListClick = {},
)
}
}
Expand Down Expand Up @@ -550,11 +560,15 @@ class TimeLetterMindRecordCompletionAndroidTest {
errorReporter = FakeErrorReporter(),
)
},
onBackClick = {},
onDailyQuestionDraftClick = {},
)
} else {
DiaryWriteScreen(
viewModel = activeWriteViewModel,
onSubmitSuccess = { submitSuccessCalls += 1 },
onBackClick = {},
onDraftListClick = {},
)
}
}
Expand Down
28 changes: 28 additions & 0 deletions docs/qa/assumptions.md
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,34 @@ navigate 대상 한 줄.
`EditorFormState.currentServiceOptions` 다. 기존 값 정리(마이그레이션·삭제)가 확정되면
보존 동작을 그 정책으로 바꾼다.

## #1540 — no-op 콜백 디폴트 청소에서 드러난 배선 누락 2건

디폴트를 걷어내자 **컴파일러가 실호출부 2곳을 드러냈다.** 둘 다 사용자에게 버튼이 보이는데
눌러도 아무 일이 없던 자리다. 고친 방향과 근거를 남긴다.

### 1. `TextStyleToolbar` 의 링크·«T» 버튼 (추측 아님)

`WriteTextField` 가 `onLinkClick`·`onTypeClick` 을 넘기지 않아 no-op 이었다. **같은 파일의
`BottomToolbar` 가 같은 두 버튼을 갖고 있어** 배선을 그대로 가져왔다 — 스타일 툴바가 열리면
하단 툴바를 덮으므로 같은 두 affordance 를 유지해야 한다.

| 버튼 | BottomToolbar | 이번에 TextStyleToolbar 에 붙인 것 |
|---|---|---|
| 링크 아이콘(`core_ui_ic_link`) | `sheet = KeyboardSheet.MediaSelect` | 동일 |
| «T» | `showTextStyleToolbar = !showTextStyleToolbar` | 동일(= 열린 툴바를 닫는다) |

### 2. 주간 리포트 HISTORY 의 «더보기» (판단이 들어감)

`WeeklyReportScreen` 이 `DailyQuestionListCard(answer = …)` 만 넘겨, 수정·삭제 메뉴가 뜨는데
둘 다 no-op 이었다.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[nit] 이 절은 «더보기» 숨김만 적고, 재리뷰에서 추가된 카드 탭(#759 상세 이동)도 안 붙인다는 판단은 WeeklyReportScreen.kt 주석에만 있습니다. 나중에 「주간 리포트에서 상세로 못 가네」가 나올 때 문서 근거가 되도록 한 줄 보태 주세요.

**배선하지 않고 감췄다.** 주간 리포트는 읽기 전용 요약이고 편집·삭제는 데일리질문 목록의
몫이라고 봤다. 배선하려면 VM 삭제 경로와 편집 내비게이션이 새로 필요해 refactor 범위를
벗어난다. #1540 이 든 처방(「`= {}` 로 죽은 버튼을 그리는 대신 nullable + UI 숨김」)과도 같다.

읽기 전용이 아니라 **편집 가능이 맞다면** 이 판단이 틀린 것이므로, 그때는 `onEdit`·`onDelete`
에 실핸들러를 넘기면 메뉴가 그대로 돌아온다(컴포넌트는 이미 nullable 로 열려 있다).

## #700 — 홈 시안 정본 (해소) + 타임레터 NEXT STEP 문구 (추측 진행)

**정본은 확정됐다 — 추측이 아니다.** 파일에 페이지가 둘뿐이고(`정리 Screen Design`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ fun WeeklySummaryGrid(
* `null` 은 «아직 모름» 이라 숫자 대신 대시를 그린다. 0 은 확정값이라 그대로 그린다.
*/
recordedCount: Int?,
onImageClick: () -> Unit = {},
onCountCardClick: () -> Unit = {},
onImageClick: () -> Unit,
onCountCardClick: () -> Unit,
) {
BoxWithConstraints(modifier = modifier.fillMaxWidth()) {
val gap = 8.dp
Expand Down Expand Up @@ -152,6 +152,10 @@ fun WeeklySummaryGrid(
@Composable
private fun WeeklySummaryGridPreview() {
AfternoteTheme {
WeeklySummaryGrid(recordedCount = 3)
WeeklySummaryGrid(
recordedCount = 3,
onCountCardClick = {},
onImageClick = {},
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ import com.android.tools.screenshot.PreviewTest
@Composable
internal fun weeklySummaryGridScreenshot() {
AfternoteTheme {
WeeklySummaryGrid(recordedCount = 3, modifier = Modifier.padding(16.dp))
WeeklySummaryGrid(
recordedCount = 3,
modifier = Modifier.padding(16.dp),
onCountCardClick = {},
onImageClick = {},
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,17 @@ private val DateFormatter = DateTimeFormatter.ofPattern("yyyy.MM.dd")
fun DailyQuestionListCard(
answer: DailyQuestion,
modifier: Modifier = Modifier,
/** 카드 전체 탭 — 저장된 기록 본문을 여는 상세 화면으로 간다 (#759). */
onClick: () -> Unit = {},
onEdit: () -> Unit = {},
onDelete: () -> Unit = {},
/**
* 카드 전체 탭 — 저장된 기록 본문을 여는 상세 화면으로 간다 (#759).
*
* **`null` 이면 클릭 자체를 붙이지 않는다** (#1540 리뷰).
*
* no-op 을 넘기면 `Role.Button` 이 그대로 실려 스크린리더가 「버튼」으로 읽는데 눌러도
* 아무 일이 없다 — 읽기 전용으로 쓰는 자리(주간 리포트 HISTORY)가 그랬다.
*/
onClick: (() -> Unit)?,
onEdit: (() -> Unit)?,
onDelete: (() -> Unit)?,
) {
OutlinedCard(
colors =
Expand All @@ -62,7 +69,10 @@ fun DailyQuestionListCard(
),
border = BorderStroke(1.dp, color = AfternoteDesign.colors.gray2),
shape = CardShape,
modifier = modifier.fillMaxWidth().clickable(role = Role.Button, onClick = onClick),
modifier =
modifier
.fillMaxWidth()
.then(if (onClick != null) Modifier.clickable(role = Role.Button, onClick = onClick) else Modifier),
) {
if (answer.imageUrl != null) {
ThumbnailCardContent(answer = answer, onEdit = onEdit, onDelete = onDelete)
Expand All @@ -76,8 +86,8 @@ fun DailyQuestionListCard(
@Composable
private fun TextCardContent(
answer: DailyQuestion,
onEdit: () -> Unit,
onDelete: () -> Unit,
onEdit: (() -> Unit)?,
onDelete: (() -> Unit)?,
) {
Column(
modifier = Modifier.padding(16.dp),
Expand Down Expand Up @@ -106,8 +116,8 @@ private fun TextCardContent(
@Composable
private fun ThumbnailCardContent(
answer: DailyQuestion,
onEdit: () -> Unit,
onDelete: () -> Unit,
onEdit: (() -> Unit)?,
onDelete: (() -> Unit)?,
) {
Row(
modifier = Modifier.padding(12.dp),
Expand Down Expand Up @@ -149,8 +159,8 @@ private fun ThumbnailCardContent(
@Composable
private fun CardHeaderRow(
date: LocalDate,
onEdit: () -> Unit,
onDelete: () -> Unit,
onEdit: (() -> Unit)?,
onDelete: (() -> Unit)?,
) {
var menuExpanded by remember { mutableStateOf(false) }

Expand All @@ -172,28 +182,35 @@ private fun CardHeaderRow(
)
}

Box {
Icon(
painter = painterResource(R.drawable.mindrecord_horizontal),
tint = AfternoteDesign.colors.gray5,
contentDescription = stringResource(R.string.mindrecord_more_menu_cd),
modifier =
Modifier
.size(20.dp)
.clickable(role = Role.Button) { menuExpanded = true },
)
if (menuExpanded) {
RecordActionPopup(
onDismiss = { menuExpanded = false },
onDelete = {
menuExpanded = false
onDelete()
},
onEdit = {
menuExpanded = false
onEdit()
},
// **핸들러가 없으면 «더보기» 자체를 그리지 않는다** (#1540).
//
// 종전에는 `= {}` 디폴트라, 핸들러를 안 넘긴 화면(주간 리포트 HISTORY)에서도 메뉴가
// 뜨고 «수정»·«삭제» 를 눌러도 아무 일이 없었다. 눌러도 아무 일 없는 버튼을 그리는
// 대신 없는 상호작용은 보여 주지 않는다.
if (onEdit != null && onDelete != null) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[nit] onEdit != null && onDelete != null 이라 한쪽만 넘긴 호출부는 넘긴 핸들러까지 조용히 사라집니다. 지금 호출부 2곳(DailyQuestionAnswerListScreen:204, WeeklyReportScreen:158)은 둘 다 같이 넘기거나 같이 null 이라 영향은 없지만, 의도가 «둘 다 있을 때만 메뉴» 라면 KDoc 에 한 줄 적어 두면 다음 호출부가 헷갈리지 않습니다.

Box {
Icon(
painter = painterResource(R.drawable.mindrecord_horizontal),
tint = AfternoteDesign.colors.gray5,
contentDescription = stringResource(R.string.mindrecord_more_menu_cd),
modifier =
Modifier
.size(20.dp)
.clickable(role = Role.Button) { menuExpanded = true },
)
if (menuExpanded) {
RecordActionPopup(
onDismiss = { menuExpanded = false },
onDelete = {
menuExpanded = false
onDelete()
},
onEdit = {
menuExpanded = false
onEdit()
},
)
}
}
}
}
Expand All @@ -210,6 +227,9 @@ private fun DailyQuestionCardPreview() {
content = "아무 말 없이 그저 나의 곁을 지켜주는 아내가 고맙다.",
date = LocalDate.now(),
),
onClick = {},
onDelete = {},
onEdit = {},
)
}
}
Expand All @@ -226,6 +246,9 @@ private fun DailyQuestionCardWithImagePreview() {
date = LocalDate.now(),
imageUrl = "https://example.com/image.jpg",
),
onClick = {},
onDelete = {},
onEdit = {},
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ fun DiaryCard(
diary: DailyDiary,
modifier: Modifier = Modifier,
/** 카드 전체 탭 — 저장된 기록 본문을 여는 상세 화면으로 간다 (#759). */
onClick: () -> Unit = {},
onEdit: () -> Unit = {},
onDelete: () -> Unit = {},
onClick: () -> Unit,
onEdit: () -> Unit,
onDelete: () -> Unit,
) {
var menuExpanded by remember { mutableStateOf(false) }

Expand Down Expand Up @@ -189,6 +189,9 @@ private fun DiaryCardPreview() {
emotion = "😊",
imageUrl = "https://example.com/image.jpg",
),
onClick = {},
onDelete = {},
onEdit = {},
)
}
}
Expand All @@ -205,6 +208,9 @@ private fun DiaryCardNoImagePreview() {
date = LocalDate.now(),
emotion = "😊",
),
onClick = {},
onDelete = {},
onEdit = {},
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ fun DiaryComponent(
diary: DailyDiary,
modifier: Modifier = Modifier,
/** 카드 전체 탭 — 저장된 기록 본문을 여는 상세 화면으로 간다 (#759). */
onClick: () -> Unit = {},
onEdit: () -> Unit = {},
onDelete: () -> Unit = {},
onClick: () -> Unit,
onEdit: () -> Unit,
onDelete: () -> Unit,
) {
var menuExpanded by remember { mutableStateOf(false) }

Expand Down Expand Up @@ -171,6 +171,9 @@ private fun DiaryComponentPreview() {
emotion = "😊",
imageUrl = "https://example.com/image.jpg",
),
onClick = {},
onDelete = {},
onEdit = {},
)
}
}
Expand All @@ -187,6 +190,9 @@ private fun DiaryComponentNoImagePreview() {
date = LocalDate.now(),
emotion = "😊",
),
onClick = {},
onDelete = {},
onEdit = {},
)
}
}
Loading
Loading