95 lines
2.6 KiB
TypeScript
95 lines
2.6 KiB
TypeScript
"use client";
|
|
|
|
import React, { createContext, useContext, useState, useCallback } from "react";
|
|
|
|
interface WidgetHeight {
|
|
screenId: number;
|
|
componentId: string;
|
|
height: number;
|
|
originalHeight: number; // 디자이너에서 설정한 원래 높이
|
|
}
|
|
|
|
interface TableSearchWidgetHeightContextValue {
|
|
widgetHeights: Map<string, WidgetHeight>;
|
|
setWidgetHeight: (screenId: number, componentId: string, height: number, originalHeight: number) => void;
|
|
getWidgetHeight: (screenId: number, componentId: string) => WidgetHeight | undefined;
|
|
getHeightDiff: (screenId: number, componentId: string) => number; // 실제 높이 - 원래 높이
|
|
}
|
|
|
|
const TableSearchWidgetHeightContext = createContext<TableSearchWidgetHeightContextValue | undefined>(
|
|
undefined
|
|
);
|
|
|
|
export function TableSearchWidgetHeightProvider({ children }: { children: React.ReactNode }) {
|
|
const [widgetHeights, setWidgetHeights] = useState<Map<string, WidgetHeight>>(new Map());
|
|
|
|
const setWidgetHeight = useCallback(
|
|
(screenId: number, componentId: string, height: number, originalHeight: number) => {
|
|
const key = `${screenId}_${componentId}`;
|
|
|
|
setWidgetHeights((prev) => {
|
|
const newMap = new Map(prev);
|
|
newMap.set(key, {
|
|
screenId,
|
|
componentId,
|
|
height,
|
|
originalHeight,
|
|
});
|
|
|
|
console.log("📏 [TableSearchWidgetHeightContext] 높이 저장:", {
|
|
key,
|
|
height,
|
|
originalHeight,
|
|
heightDiff: height - originalHeight,
|
|
});
|
|
|
|
return newMap;
|
|
});
|
|
},
|
|
[]
|
|
);
|
|
|
|
const getWidgetHeight = useCallback(
|
|
(screenId: number, componentId: string): WidgetHeight | undefined => {
|
|
const key = `${screenId}_${componentId}`;
|
|
return widgetHeights.get(key);
|
|
},
|
|
[widgetHeights]
|
|
);
|
|
|
|
const getHeightDiff = useCallback(
|
|
(screenId: number, componentId: string): number => {
|
|
const widgetHeight = getWidgetHeight(screenId, componentId);
|
|
if (!widgetHeight) return 0;
|
|
|
|
const diff = widgetHeight.height - widgetHeight.originalHeight;
|
|
return diff;
|
|
},
|
|
[getWidgetHeight]
|
|
);
|
|
|
|
return (
|
|
<TableSearchWidgetHeightContext.Provider
|
|
value={{
|
|
widgetHeights,
|
|
setWidgetHeight,
|
|
getWidgetHeight,
|
|
getHeightDiff,
|
|
}}
|
|
>
|
|
{children}
|
|
</TableSearchWidgetHeightContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useTableSearchWidgetHeight() {
|
|
const context = useContext(TableSearchWidgetHeightContext);
|
|
if (!context) {
|
|
throw new Error(
|
|
"useTableSearchWidgetHeight must be used within TableSearchWidgetHeightProvider"
|
|
);
|
|
}
|
|
return context;
|
|
}
|
|
|