import React, { createContext, useContext, useState, useCallback, ReactNode, } from "react"; import { TableRegistration, TableOptionsContextValue, } from "@/types/table-options"; const TableOptionsContext = createContext( undefined ); export const TableOptionsProvider: React.FC<{ children: ReactNode }> = ({ children, }) => { const [registeredTables, setRegisteredTables] = useState< Map >(new Map()); const [selectedTableId, setSelectedTableId] = useState(null); /** * 테이블 등록 */ const registerTable = useCallback((registration: TableRegistration) => { setRegisteredTables((prev) => { const newMap = new Map(prev); newMap.set(registration.tableId, registration); // 첫 번째 테이블이면 자동 선택 if (newMap.size === 1) { setSelectedTableId(registration.tableId); } return newMap; }); }, []); /** * 테이블 등록 해제 */ const unregisterTable = useCallback( (tableId: string) => { setRegisteredTables((prev) => { const newMap = new Map(prev); const removed = newMap.delete(tableId); if (removed) { // 선택된 테이블이 제거되면 첫 번째 테이블 선택 if (selectedTableId === tableId) { const firstTableId = newMap.keys().next().value; setSelectedTableId(firstTableId || null); } } return newMap; }); }, [selectedTableId] ); /** * 특정 테이블 조회 */ const getTable = useCallback( (tableId: string) => { return registeredTables.get(tableId); }, [registeredTables] ); /** * 테이블 데이터 건수 업데이트 */ const updateTableDataCount = useCallback((tableId: string, count: number) => { setRegisteredTables((prev) => { const table = prev.get(tableId); if (table) { // 기존 테이블 정보에 dataCount만 업데이트 const updatedTable = { ...table, dataCount: count }; const newMap = new Map(prev); newMap.set(tableId, updatedTable); console.log("🔄 [TableOptionsContext] 데이터 건수 업데이트:", { tableId, count, updated: true, }); return newMap; } console.warn("⚠️ [TableOptionsContext] 테이블을 찾을 수 없음:", tableId); return prev; }); }, []); return ( {children} ); }; /** * Context Hook */ export const useTableOptions = () => { const context = useContext(TableOptionsContext); if (!context) { throw new Error("useTableOptions must be used within TableOptionsProvider"); } return context; };