refactor(space): scene 도메인과 current session 계약을 정리

This commit is contained in:
2026-03-09 13:05:44 +09:00
parent 8184915cb1
commit 675014166a
19 changed files with 243 additions and 208 deletions

View File

@@ -1,9 +1,9 @@
'use client';
import { useEffect, useMemo, useRef, useState, type FormEvent } from 'react';
import type { RoomTheme } from '@/entities/room';
import type { SceneTheme } from '@/entities/scene';
import type { GoalChip, SoundPreset, TimerPreset } from '@/entities/session';
import { SpaceSelectCarousel } from '@/features/space-select';
import { SceneSelectCarousel } from '@/features/scene-select';
import { SessionGoalField } from '@/features/session-goal';
import { Button } from '@/shared/ui';
import { cn } from '@/shared/lib/cn';
@@ -12,8 +12,8 @@ type RitualPopover = 'space' | 'timer' | 'sound';
interface SpaceSetupDrawerWidgetProps {
open: boolean;
rooms: RoomTheme[];
selectedRoomId: string;
scenes: SceneTheme[];
selectedSceneId: string;
selectedTimerLabel: string;
selectedSoundPresetId: string;
goalInput: string;
@@ -22,7 +22,7 @@ interface SpaceSetupDrawerWidgetProps {
soundPresets: SoundPreset[];
timerPresets: TimerPreset[];
canStart: boolean;
onRoomSelect: (roomId: string) => void;
onSceneSelect: (sceneId: string) => void;
onTimerSelect: (timerLabel: string) => void;
onSoundSelect: (soundPresetId: string) => void;
onGoalChange: (value: string) => void;
@@ -63,8 +63,8 @@ const SummaryChip = ({ label, value, open, onClick }: SummaryChipProps) => {
export const SpaceSetupDrawerWidget = ({
open,
rooms,
selectedRoomId,
scenes,
selectedSceneId,
selectedTimerLabel,
selectedSoundPresetId,
goalInput,
@@ -73,7 +73,7 @@ export const SpaceSetupDrawerWidget = ({
soundPresets,
timerPresets,
canStart,
onRoomSelect,
onSceneSelect,
onTimerSelect,
onSoundSelect,
onGoalChange,
@@ -84,9 +84,9 @@ export const SpaceSetupDrawerWidget = ({
const [openPopover, setOpenPopover] = useState<RitualPopover | null>(null);
const panelRef = useRef<HTMLDivElement | null>(null);
const selectedRoom = useMemo(() => {
return rooms.find((room) => room.id === selectedRoomId) ?? rooms[0];
}, [rooms, selectedRoomId]);
const selectedScene = useMemo(() => {
return scenes.find((scene) => scene.id === selectedSceneId) ?? scenes[0];
}, [scenes, selectedSceneId]);
const selectedSoundLabel = useMemo(() => {
return (
@@ -183,8 +183,8 @@ export const SpaceSetupDrawerWidget = ({
<div className="relative mb-3">
<div className="flex flex-wrap gap-1.5">
<SummaryChip
label="공간"
value={selectedRoom?.name ?? '기본 공간'}
label="배경"
value={selectedScene?.name ?? '기본 배경'}
open={openPopover === 'space'}
onClick={() => togglePopover('space')}
/>
@@ -204,11 +204,11 @@ export const SpaceSetupDrawerWidget = ({
{openPopover === 'space' ? (
<div className="absolute left-0 right-0 top-[calc(100%+0.5rem)] z-20 rounded-2xl border border-white/14 bg-slate-950/80 p-2.5 shadow-[0_18px_44px_rgba(2,6,23,0.4)] backdrop-blur-xl animate-[popover-rise_220ms_ease-out] motion-reduce:animate-none">
<SpaceSelectCarousel
rooms={rooms.slice(0, 4)}
selectedRoomId={selectedRoomId}
onSelect={(roomId) => {
onRoomSelect(roomId);
<SceneSelectCarousel
scenes={scenes.slice(0, 4)}
selectedSceneId={selectedSceneId}
onSelect={(sceneId) => {
onSceneSelect(sceneId);
setOpenPopover(null);
}}
/>