feat(curation): Scene 추천 자동 적용과 override 존중 규칙 도입

맥락:
- 목표 입력 후 바로 시작할 수 있도록 Scene 기반 추천값을 자동으로 채우되, 사용자가 직접 바꾼 값은 유지해야 했습니다.

변경사항:
- RoomTheme에 recommendedSoundPresetId, recommendedTimerPresetId 필드를 추가하고 각 Scene 더미 데이터에 추천 preset id를 매핑했습니다.
- /space 초기 진입 시 선택된 Scene 추천값으로 타이머/사운드 기본값이 설정되도록 초기화 로직을 정리했습니다.
- /space 상태에 override.sound/override.timer 플래그를 추가하고, Scene 변경 시 override가 false인 항목만 자동 동기화하도록 반영했습니다.
- 추천 복원 액션(추천으로 되돌림)을 위한 핸들러/props 경로를 workspace -> tools-dock -> control-center까지 연결했습니다.

검증:
- npx tsc --noEmit

세션-상태: Scene 추천 자동 적용과 override 기반 자동 동기화가 동작합니다.
세션-다음: Control Center를 Scene/Time 중심 구조로 단순화하고 추천 정보/되돌리기 UI를 적용합니다.
세션-리스크: Control Center UI가 아직 기존 구조(Sound/Pack 포함)라 다음 커밋에서 정리가 필요합니다.
This commit is contained in:
2026-03-05 12:06:21 +09:00
parent 836679753e
commit f24205f324
5 changed files with 169 additions and 11 deletions

View File

@@ -32,6 +32,8 @@ interface SpaceToolsDockWidgetProps {
onSetSoundMuted: (nextMuted: boolean) => void;
thoughts: RecentThought[];
thoughtCount: number;
sceneRecommendedSoundLabel: string;
sceneRecommendedTimerLabel: string;
onRoomSelect: (roomId: string) => void;
onTimerSelect: (timerLabel: string) => void;
onSelectPreset: (presetId: string) => void;
@@ -40,6 +42,7 @@ interface SpaceToolsDockWidgetProps {
onSetThoughtCompleted: (thoughtId: string, isCompleted: boolean) => RecentThought | null;
onRestoreThought: (thought: RecentThought) => void;
onClearInbox: () => RecentThought[];
onResetToSceneRecommended: () => void;
onStatusMessage: (payload: HudStatusLinePayload) => void;
onExitRequested: () => void;
}
@@ -57,6 +60,8 @@ export const SpaceToolsDockWidget = ({
onSetSoundMuted,
thoughts,
thoughtCount,
sceneRecommendedSoundLabel,
sceneRecommendedTimerLabel,
onRoomSelect,
onTimerSelect,
onSelectPreset,
@@ -65,6 +70,7 @@ export const SpaceToolsDockWidget = ({
onSetThoughtCompleted,
onRestoreThought,
onClearInbox,
onResetToSceneRecommended,
onStatusMessage,
onExitRequested,
}: SpaceToolsDockWidgetProps) => {
@@ -414,6 +420,8 @@ export const SpaceToolsDockWidget = ({
selectedRoomId={selectedRoomId}
selectedTimerLabel={selectedTimerLabel}
selectedSoundPresetId={selectedPresetId}
sceneRecommendedSoundLabel={sceneRecommendedSoundLabel}
sceneRecommendedTimerLabel={sceneRecommendedTimerLabel}
timerPresets={timerPresets}
soundPresets={SOUND_PRESETS}
onSelectRoom={(roomId) => {
@@ -427,6 +435,7 @@ export const SpaceToolsDockWidget = ({
}}
onApplyPack={handleApplyPack}
onLockedClick={handleLockedClick}
onResetToRecommended={onResetToSceneRecommended}
/>
) : null}