|
1 | 1 | import * as React from "react"; |
2 | 2 | import * as ReactDOM from "react-dom/client"; |
3 | 3 |
|
4 | | -/** @type {React.Context<import("@anywidget/types").AnyModel>} */ |
5 | | -let ModelContext = React.createContext(/** @type {any} */ (null)); |
| 4 | +/** |
| 5 | + * @typedef RenderContext |
| 6 | + * @property {import("@anywidget/types").AnyModel} model |
| 7 | + * @property {import("@anywidget/types").Experimental} experimental |
| 8 | + */ |
| 9 | + |
| 10 | +/** @type {React.Context<RenderContext>} */ |
| 11 | +let RenderContext = React.createContext(/** @type {any} */ (null)); |
| 12 | + |
| 13 | +/** @returns {RenderContext} */ |
| 14 | +function useRenderContext() { |
| 15 | + let ctx = React.useContext(RenderContext); |
| 16 | + if (!ctx) throw new Error("RenderContext not found"); |
| 17 | + return ctx; |
| 18 | +} |
6 | 19 |
|
7 | 20 | /** @returns {import("@anywidget/types").AnyModel} */ |
8 | 21 | export function useModel() { |
9 | | - let model = React.useContext(ModelContext); |
10 | | - if (!model) throw new Error("Model not found"); |
11 | | - return model; |
| 22 | + let ctx = useRenderContext(); |
| 23 | + return ctx.model; |
| 24 | +} |
| 25 | + |
| 26 | +/** @returns {import("@anywidget/types").Experimental} */ |
| 27 | +export function useExperimental() { |
| 28 | + let ctx = useRenderContext(); |
| 29 | + return ctx.experimental; |
12 | 30 | } |
13 | 31 |
|
14 | 32 | /** |
@@ -39,15 +57,15 @@ export function useModelState(key) { |
39 | 57 | * @returns {import("@anywidget/types").Render} |
40 | 58 | */ |
41 | 59 | export function createRender(Widget) { |
42 | | - return ({ model, el }) => { |
| 60 | + return ({ el, model, experimental }) => { |
43 | 61 | let root = ReactDOM.createRoot(el); |
44 | 62 | root.render( |
45 | 63 | React.createElement( |
46 | 64 | React.StrictMode, |
47 | 65 | null, |
48 | 66 | React.createElement( |
49 | | - ModelContext.Provider, |
50 | | - { value: model }, |
| 67 | + RenderContext.Provider, |
| 68 | + { value: { model, experimental } }, |
51 | 69 | React.createElement(Widget), |
52 | 70 | ), |
53 | 71 | ), |
|
0 commit comments