| 359 | * @returns Complete WidgetContext for the render pass |
| 360 | */ |
| 361 | export function createWidgetContext<State>( |
| 362 | widgetKey: string, |
| 363 | instanceIndex: number, |
| 364 | hookContext: Pick< |
| 365 | WidgetContext<State>, |
| 366 | "useState" | "useReducer" | "useRef" | "useEffect" | "useMemo" | "useCallback" |
| 367 | >, |
| 368 | appState: State, |
| 369 | viewport: ResponsiveViewportSnapshot, |
| 370 | onInvalidate: () => void, |
| 371 | colorTokens: ColorTokens = defaultTheme.definition.colors, |
| 372 | ): WidgetContext<State> { |
| 373 | return Object.freeze({ |
| 374 | id: (suffix: string) => scopedId(widgetKey, instanceIndex, suffix), |
| 375 | useState: hookContext.useState, |
| 376 | useReducer: hookContext.useReducer, |
| 377 | useRef: hookContext.useRef, |
| 378 | useEffect: hookContext.useEffect, |
| 379 | useMemo: hookContext.useMemo, |
| 380 | useCallback: hookContext.useCallback, |
| 381 | useAppState: <T>(selector: (s: State) => T): T => selector(appState), |
| 382 | useTheme: () => colorTokens, |
| 383 | useViewport: () => viewport, |
| 384 | invalidate: onInvalidate, |
| 385 | }); |
| 386 | } |
| 387 | |
| 388 | /* ========== Render Result Type ========== */ |
| 389 | |