feat(immersion): 몰입 모드 상단 액션을 나가기로 전환
맥락: - 몰입 모드 ON에서 상단 우측 액션이 허브 이동으로 보이는 혼선을 줄이고 즉시 이탈 동선을 제공하기 위해 변경사항: - 몰입 모드 훅에 exitImmersionMode 액션 추가 - 몰입 모드 ON 시 상단 우측 액션을 나가기 버튼으로 전환 - 나가기 클릭 시 토스트(나가기(더미)) 노출 후 몰입 모드 OFF 처리 - docs/90_current_state.md, docs/session_brief.md 최신 상태 반영 검증: - npx tsc --noEmit 세션-상태: 몰입 모드 ON에서 상단 우측 액션은 나가기로 동작함 세션-다음: RoomSheet/도크의 인원수 중심 정보를 분위기형 정보로 교체 세션-리스크: 터치 환경에서 미니 레일 발견성이 낮을 수 있어 UX 보완이 필요
This commit is contained in:
@@ -1,16 +1,24 @@
|
||||
'use client';
|
||||
|
||||
import { useState } from 'react';
|
||||
import { useToast } from '@/shared/ui';
|
||||
|
||||
export const useImmersionMode = () => {
|
||||
const { pushToast } = useToast();
|
||||
const [isImmersionMode, setImmersionMode] = useState(false);
|
||||
|
||||
const toggleImmersionMode = () => {
|
||||
setImmersionMode((current) => !current);
|
||||
};
|
||||
|
||||
const exitImmersionMode = () => {
|
||||
setImmersionMode(false);
|
||||
pushToast({ title: '나가기(더미)' });
|
||||
};
|
||||
|
||||
return {
|
||||
isImmersionMode,
|
||||
toggleImmersionMode,
|
||||
exitImmersionMode,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -4,12 +4,14 @@ interface SpaceChromeWidgetProps {
|
||||
roomName: string;
|
||||
vibeLabel: string;
|
||||
isImmersionMode: boolean;
|
||||
onExitImmersionMode: () => void;
|
||||
}
|
||||
|
||||
export const SpaceChromeWidget = ({
|
||||
roomName,
|
||||
vibeLabel,
|
||||
isImmersionMode,
|
||||
onExitImmersionMode,
|
||||
}: SpaceChromeWidgetProps) => {
|
||||
return (
|
||||
<div className="px-4 pt-2 sm:px-6">
|
||||
@@ -21,23 +23,23 @@ export const SpaceChromeWidget = ({
|
||||
<p className="text-sm font-medium tracking-tight text-white/90">VibeRoom</p>
|
||||
</div>
|
||||
|
||||
<Link
|
||||
href="/app"
|
||||
className={
|
||||
isImmersionMode
|
||||
? 'inline-flex h-7 w-7 items-center justify-center rounded-md bg-white/8 text-[11px] text-white/74 transition hover:bg-white/14 hover:text-white'
|
||||
: 'rounded-lg bg-white/8 px-2.5 py-1.5 text-xs text-white/82 transition hover:bg-white/14 hover:text-white'
|
||||
}
|
||||
>
|
||||
{isImmersionMode ? (
|
||||
<>
|
||||
<span aria-hidden>↩</span>
|
||||
<span className="sr-only">허브로 돌아가기</span>
|
||||
</>
|
||||
) : (
|
||||
'허브로 돌아가기'
|
||||
)}
|
||||
</Link>
|
||||
{isImmersionMode ? (
|
||||
<button
|
||||
type="button"
|
||||
onClick={onExitImmersionMode}
|
||||
className="inline-flex items-center gap-1 rounded-md bg-white/8 px-2 py-1 text-[11px] text-white/74 transition hover:bg-white/14 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-200/80"
|
||||
>
|
||||
<span aria-hidden>⤫</span>
|
||||
<span>나가기</span>
|
||||
</button>
|
||||
) : (
|
||||
<Link
|
||||
href="/app"
|
||||
className="rounded-lg bg-white/8 px-2.5 py-1.5 text-xs text-white/82 transition hover:bg-white/14 hover:text-white"
|
||||
>
|
||||
허브로 돌아가기
|
||||
</Link>
|
||||
)}
|
||||
</header>
|
||||
|
||||
{!isImmersionMode ? (
|
||||
|
||||
@@ -19,7 +19,7 @@ export const SpaceSkeletonWidget = () => {
|
||||
const soundFromQuery = searchParams.get('sound');
|
||||
|
||||
const room = useMemo(() => getRoomById(roomId) ?? ROOM_THEMES[0], [roomId]);
|
||||
const { isImmersionMode, toggleImmersionMode } = useImmersionMode();
|
||||
const { isImmersionMode, toggleImmersionMode, exitImmersionMode } = useImmersionMode();
|
||||
const initialSoundPresetId =
|
||||
SOUND_PRESETS.find((preset) => preset.id === soundFromQuery)?.id ??
|
||||
SOUND_PRESETS[0].id;
|
||||
@@ -66,6 +66,7 @@ export const SpaceSkeletonWidget = () => {
|
||||
roomName={room.name}
|
||||
vibeLabel={room.vibeLabel}
|
||||
isImmersionMode={isImmersionMode}
|
||||
onExitImmersionMode={exitImmersionMode}
|
||||
/>
|
||||
|
||||
<main className="flex-1" />
|
||||
|
||||
Reference in New Issue
Block a user