feat(stats): weekly review snapshot 1차 구현

This commit is contained in:
2026-03-14 19:22:58 +09:00
parent 679601d201
commit dc97a78fdd
8 changed files with 563 additions and 167 deletions

View File

@@ -19,15 +19,62 @@ export const app = {
],
},
stats: {
title: 'Stats',
title: 'Weekly Review',
apiLabel: 'API',
mockLabel: 'Mock',
sourceApi: 'API 통계 사용 중',
sourceMock: 'API 실패로 mock 통계 표시 중',
loading: '통계를 불러오는 중이에요.',
loadFailed: '통계를 불러오지 못했어요.',
synced: '화면 진입 시 최신 요약 동기화합니다.',
synced: '최근 7일 review를 최신 요약으로 동기화합니다.',
refresh: '새로고침',
reviewPeriodLabel: '최근 7일 review',
reviewTitle: '이번 주 집중 리듬',
reviewSnapshotEmpty: '이번 주에는 아직 집중 기록이 많지 않아요. 다음 세션 하나만 다시 만들면 충분해요.',
reviewSnapshotStrong: '이번 주에는 시작한 흐름을 끝까지 가져간 편이에요.',
reviewSnapshotSteady: '이번 주에는 시작은 꾸준했고, 마무리 리듬은 조금 더 다듬을 여지가 있어요.',
reviewSnapshotRecoveryNeeded: '이번 주에는 시작은 있었지만, 닫힘보다 이월이 더 많았어요.',
reviewStarted: '시작한 세션',
reviewStartedHint: '최근 7일 space에 들어간 흐름',
reviewCompleted: '마무리한 세션',
reviewCompletedHint: 'goal 또는 timer를 닫은 세션',
reviewFocusMinutes: '집중 시간',
reviewFocusMinutesHint: '최근 7일 누적 focus 시간',
reviewCarriedOver: '이월된 블록',
reviewCarriedOverHint: '다음 날로 이어진 블록',
reviewStartTitle: '시작 품질',
reviewStartEmpty: '아직 시작 기록이 많지 않아요. 다음 주에는 시작 횟수 하나를 더 만드는 것이 우선이에요.',
reviewStartSummary: (startedSessions: number, bestDayLabel: string, averageDepthLabel: string) =>
`이번 주엔 ${startedSessions}번 시작했고, ${bestDayLabel}에 가장 길게 이어졌어요. 한 번 시작했을 때 평균 ${averageDepthLabel} 정도 머물렀어요.`,
reviewAverageDepth: '평균 세션 깊이',
reviewAverageDepthHint: '한 번 시작했을 때 이어진 평균 시간',
reviewBestDay: '가장 길게 이어진 날',
reviewBestDayHint: (minutes: number) => `${minutes}분 동안 가장 오래 집중했어요.`,
reviewRecoveryTitle: '복귀 품질',
reviewRecoveryMockSummary: '이번 주에는 pause 뒤에도 다시 올라탄 흐름이 있었어요. 복귀는 적었지만 분명히 존재했어요.',
reviewRecoveryLimitedSummary: '복귀 패턴은 아직 이 review에 충분히 합쳐지지 않았어요. 지금은 시작과 마무리 흐름을 먼저 봅니다.',
reviewRecoveryMockNote: 'mock 기준으로 pause 뒤 복귀와 away 뒤 복귀를 함께 보여줍니다.',
reviewRecoveryLimitedNote: 'pause / away 복귀 집계는 다음 연결 단계에서 이 review에 포함됩니다.',
reviewPauseRecovery: 'pause 뒤 복귀',
reviewPauseRecoveryHint: '멈춘 뒤 다시 돌아온 비율',
reviewAwayRecovery: '자리 비움 뒤 복귀',
reviewAwayRecoveryHint: '앱을 떠났다가 다시 돌아온 비율',
reviewCompletionTitle: '마무리 품질',
reviewCompletionEmpty: '이번 주에는 아직 마무리 흐름을 읽을 만큼 세션이 쌓이지 않았어요.',
reviewCompletionStrong: '이번 주에는 시작한 세션을 끝까지 가져가는 힘이 비교적 안정적이었어요.',
reviewCompletionSummary: (completionRate: string, carriedOverCount: number) =>
`완료율은 ${completionRate}였고, 이월된 블록은 ${carriedOverCount}개였어요. 다음 주에는 닫힘 리듬을 더 분명히 만들 여지가 있어요.`,
reviewCompletionRate: '완료율',
reviewCompletionRateHint: '시작한 세션 중 마무리까지 간 비율',
reviewCarryKeep: (bestDayLabel: string) => `${bestDayLabel}처럼 길게 이어졌던 흐름을 다음 주에도 기본 리듬으로 유지해 보세요.`,
reviewCarryKeepGeneric: '이번 주에 가장 오래 이어진 흐름의 길이를 다음 주 기본 리듬으로 유지해 보세요.',
reviewCarryTryDefault: '다음 주 첫 세션은 시간을 늘리기보다, 바로 시작할 한 줄을 더 작게 잡아 보세요.',
reviewCarryTrySmaller: '이월된 블록이 많았어요. 다음 주에는 목표를 더 작게 잡고 첫 microStep을 더 구체적으로 적어보세요.',
reviewCarryTryClosure: '시작은 있었지만 마무리가 약했어요. 다음 주에는 완료 직전에 다른 블록으로 넘어가지 않는 흐름을 한 번 만들어 보세요.',
reviewCarryTryStart: '시작 횟수가 적었어요. 다음 주에는 길이를 늘리기보다 첫 세션을 한 번 더 여는 것에 집중해 보세요.',
reviewCarryCta: '이 흐름으로 다음 세션 시작',
reviewCarryKeepTitle: '다음 주에 유지할 것',
reviewCarryTryTitle: '다음 주에 바꿔볼 것',
today: '오늘',
last7Days: '최근 7일',
chartTitle: '집중 흐름 그래프',