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

@@ -18,6 +18,8 @@ interface ControlCenterSheetWidgetProps {
selectedRoomId: string;
selectedTimerLabel: string;
selectedSoundPresetId: string;
sceneRecommendedSoundLabel: string;
sceneRecommendedTimerLabel: string;
timerPresets: TimerPreset[];
soundPresets: SoundPreset[];
onSelectRoom: (roomId: string) => void;
@@ -25,6 +27,7 @@ interface ControlCenterSheetWidgetProps {
onSelectSound: (soundPresetId: string) => void;
onApplyPack: (packId: QuickPackId) => void;
onLockedClick: (source: string) => void;
onResetToRecommended: () => void;
}
type QuickPackId = 'balanced' | 'deep-work' | 'gentle';
@@ -80,6 +83,8 @@ export const ControlCenterSheetWidget = ({
selectedRoomId,
selectedTimerLabel,
selectedSoundPresetId,
sceneRecommendedSoundLabel: _sceneRecommendedSoundLabel,
sceneRecommendedTimerLabel: _sceneRecommendedTimerLabel,
timerPresets,
soundPresets,
onSelectRoom,
@@ -87,6 +92,7 @@ export const ControlCenterSheetWidget = ({
onSelectSound,
onApplyPack,
onLockedClick,
onResetToRecommended: _onResetToRecommended,
}: ControlCenterSheetWidgetProps) => {
const reducedMotion = useReducedMotion();
const isPro = plan === 'pro';