diff --git a/react/lib/grid-stack-context.ts b/react/lib/grid-stack-context.ts index e06a17420..d2c313a1a 100644 --- a/react/lib/grid-stack-context.ts +++ b/react/lib/grid-stack-context.ts @@ -4,13 +4,15 @@ import { createContext, useContext } from "react"; export const GridStackContext = createContext<{ initialOptions: GridStackOptions; gridStack: GridStack | null; - addWidget: (fn: (id: string) => Omit) => void; + addWidget: (widget: GridStackWidget & { id: Required["id"] }) => void; removeWidget: (id: string) => void; addSubGrid: ( - fn: ( - id: string, - withWidget: (w: Omit) => GridStackWidget - ) => Omit + subGrid: GridStackWidget & { + id: Required["id"]; + subGridOpts: Required["subGridOpts"] & { + children: Array["id"] }> + } + } ) => void; saveOptions: () => GridStackOptions | GridStackWidget[] | undefined; removeAll: () => void; diff --git a/react/lib/grid-stack-provider.tsx b/react/lib/grid-stack-provider.tsx index 215dc538f..ff262b555 100644 --- a/react/lib/grid-stack-provider.tsx +++ b/react/lib/grid-stack-provider.tsx @@ -26,13 +26,11 @@ export function GridStackProvider({ }); const addWidget = useCallback( - (fn: (id: string) => Omit) => { - const newId = `widget-${Math.random().toString(36).substring(2, 15)}`; - const widget = fn(newId); - gridStack?.addWidget({ ...widget, id: newId }); + (widget: GridStackWidget & { id: Required["id"] }) => { + gridStack?.addWidget(widget); setRawWidgetMetaMap((prev) => { const newMap = new Map(prev); - newMap.set(newId, widget); + newMap.set(widget.id, widget); return newMap; }); }, @@ -40,29 +38,18 @@ export function GridStackProvider({ ); const addSubGrid = useCallback( - ( - fn: ( - id: string, - withWidget: (w: Omit) => GridStackWidget - ) => Omit - ) => { - const newId = `sub-grid-${Math.random().toString(36).substring(2, 15)}`; - const subWidgetIdMap = new Map(); - - const widget = fn(newId, (w) => { - const subWidgetId = `widget-${Math.random() - .toString(36) - .substring(2, 15)}`; - subWidgetIdMap.set(subWidgetId, w); - return { ...w, id: subWidgetId }; - }); - - gridStack?.addWidget({ ...widget, id: newId }); + (subGrid: GridStackWidget & { + id: Required["id"]; + subGridOpts: Required["subGridOpts"] & { + children: Array["id"] }> + } + }) => { + gridStack?.addWidget(subGrid); setRawWidgetMetaMap((prev) => { const newMap = new Map(prev); - subWidgetIdMap.forEach((meta, id) => { - newMap.set(id, meta); + subGrid.subGridOpts?.children?.forEach((meta: GridStackWidget & { id: Required["id"] }) => { + newMap.set(meta.id, meta); }); return newMap; }); diff --git a/react/src/demo/demo.tsx b/react/src/demo/demo.tsx index b0b4b6b53..d7ef7f861 100644 --- a/react/src/demo/demo.tsx +++ b/react/src/demo/demo.tsx @@ -141,7 +141,7 @@ export function GridStackDemo() { <> - + @@ -149,7 +149,7 @@ export function GridStackDemo() { - + @@ -175,7 +175,10 @@ function Toolbar() { >