feat(custom-widgets): add secure v2 authoring

This commit is contained in:
Thomas Camlong committed 2026-07-12 14:35:35 +02:00
1 parent d37545c98e
commit 46add018bf
56 files changed
+12613 -1726

No files matched your search

@@ -3,12 +3,49 @@
import type { ReactNode } from "react";
import { createContext, useContext } from "react";
const WidgetDefinitionContext = createContext<string>("");
export interface CustomJsxRuntimeContextValue {
/** The placed board item used for all authorization decisions. */
itemId?: string;
/** Kept temporarily for display-only v1 templates. Never used for network authorization. */
definitionId?: string;
/** Short-lived, user-bound session used only by the admin authoring preview. */
previewSessionId?: string;
previewLiveActions?: boolean;
isEditMode: boolean;
requestCapabilities?: readonly CustomJsxRequestCapability[];
}
export function WidgetDefinitionProvider({ definitionId, children }: { definitionId: string; children: ReactNode }) {
return <WidgetDefinitionContext.Provider value={definitionId}>{children}</WidgetDefinitionContext.Provider>;
export interface CustomJsxRequestCapability {
id: string;
kind: "query" | "action";
method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
minimumBoardPermission: "view" | "modify" | "full";
}
const CustomJsxRuntimeContext = createContext<CustomJsxRuntimeContextValue>({ isEditMode: false });
export function WidgetDefinitionProvider({
itemId,
definitionId,
previewSessionId,
previewLiveActions = false,
isEditMode = false,
requestCapabilities = [],
children,
}: CustomJsxRuntimeContextValue & { children: ReactNode }) {
return (
<CustomJsxRuntimeContext.Provider
value={{ itemId, definitionId, previewSessionId, previewLiveActions, isEditMode, requestCapabilities }}
>
{children}
</CustomJsxRuntimeContext.Provider>
);
}
export function useWidgetDefinitionId(): string {
return useContext(WidgetDefinitionContext);
return useContext(CustomJsxRuntimeContext).definitionId ?? "";
}
export function useCustomJsxRuntime(): CustomJsxRuntimeContextValue {
return useContext(CustomJsxRuntimeContext);
}