"use client"; import React, { Suspense, useRef, useState } from "react"; import { Loader2, Inbox } from "lucide-react"; import { useTab, TabItem } from "@/contexts/TabContext"; import { DialogPortalContainerContext } from "@/contexts/DialogPortalContext"; import { ScreenViewPageEmbeddable } from "@/app/(main)/screens/[screenId]/page"; function TabLoadingFallback() { return (

화면을 불러오는 중...

); } function EmptyTabState() { return (

열린 탭이 없습니다

왼쪽 메뉴에서 화면을 선택하면 탭으로 열립니다.

); } /** * 개별 탭 패널 - 탭별 Dialog 포탈 컨테이너를 제공 * 탭이 display:none이면 포탈 컨테이너도 숨겨져 모달이 자동으로 가려짐 */ function TabPanel({ isActive, isMounted, children, }: { isActive: boolean; isMounted: boolean; children: React.ReactNode; }) { const [portalContainer, setPortalContainer] = useState(null); return (
{isMounted ? children : null}
); } export function TabContent() { const { tabs, activeTabId, refreshKeys } = useTab(); const stableOrderRef = useRef([]); const mountedTabIdsRef = useRef>( new Set(activeTabId ? [activeTabId] : []) ); if (activeTabId && !mountedTabIdsRef.current.has(activeTabId)) { mountedTabIdsRef.current.add(activeTabId); } const currentIds = new Set(tabs.map(t => t.id)); const stableIds = new Set(stableOrderRef.current.map(t => t.id)); stableOrderRef.current = stableOrderRef.current.filter(t => currentIds.has(t.id)); for (const id of mountedTabIdsRef.current) { if (!currentIds.has(id)) mountedTabIdsRef.current.delete(id); } for (const tab of tabs) { if (!stableIds.has(tab.id)) { stableOrderRef.current.push(tab); } } const stableTabs = stableOrderRef.current; if (stableTabs.length === 0) { return ; } return ( <> {stableTabs.map((tab) => ( }> ))} ); }