Skip to content

Commit 0c62995

Browse files
authored
feat(react): Add useExperimental hook (#524)
1 parent 8753d21 commit 0c62995

4 files changed

Lines changed: 37 additions & 9 deletions

File tree

.changeset/sweet-needles-shop.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@anywidget/react": patch
3+
---
4+
5+
Add `useExperimental` hook

.changeset/thirty-pans-hope.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@anywidget/types": patch
3+
---
4+
5+
Export `Experimental` type

packages/react/index.js

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,32 @@
11
import * as React from "react";
22
import * as ReactDOM from "react-dom/client";
33

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+
}
619

720
/** @returns {import("@anywidget/types").AnyModel} */
821
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;
1230
}
1331

1432
/**
@@ -39,15 +57,15 @@ export function useModelState(key) {
3957
* @returns {import("@anywidget/types").Render}
4058
*/
4159
export function createRender(Widget) {
42-
return ({ model, el }) => {
60+
return ({ el, model, experimental }) => {
4361
let root = ReactDOM.createRoot(el);
4462
root.render(
4563
React.createElement(
4664
React.StrictMode,
4765
null,
4866
React.createElement(
49-
ModelContext.Provider,
50-
{ value: model },
67+
RenderContext.Provider,
68+
{ value: { model, experimental } },
5169
React.createElement(Widget),
5270
),
5371
),

packages/types/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export interface AnyModel<T extends ObjectHash = ObjectHash> {
4343
widget_manager: IWidgetManager;
4444
}
4545

46-
type Experimental = {
46+
export type Experimental = {
4747
invoke: <T>(
4848
name: string,
4949
msg?: any,

0 commit comments

Comments
 (0)