@@ -58,6 +58,9 @@ export interface WidgetHandlerProps {
5858 /** Widget for this to handle */
5959 widgetDescriptor : WidgetDescriptor ;
6060
61+ /** Widget ID maintained by the DashboardPlugin */
62+ id : string ;
63+
6164 /** Widget data to display */
6265 initialData ?: ReadonlyWidgetData ;
6366
@@ -73,6 +76,7 @@ function WidgetHandler({
7376 onDataChange = EMPTY_FUNCTION ,
7477 widgetDescriptor,
7578 initialData : initialDataProp ,
79+ id,
7680} : WidgetHandlerProps ) : JSX . Element | null {
7781 const { widget, error : widgetError } = useWidget ( widgetDescriptor ) ;
7882 const [ isLoading , setIsLoading ] = useState ( true ) ;
@@ -208,49 +212,53 @@ function WidgetHandler({
208212 // We close those objects that are no longer referenced, as they will never be referenced again.
209213 const deadObjectMap = new Map ( exportedObjectMap . current ) ;
210214 const deadCallableMap = new Map ( renderedCallableMap . current ) ;
211- const hydratedDocument = transformNode ( doc , ( key , value ) => {
212- // Need to re-hydrate any objects that are defined
213- if ( isCallableNode ( value ) ) {
214- const callableId = value [ CALLABLE_KEY ] ;
215- deadCallableMap . delete ( callableId ) ;
216- if ( renderedCallableMap . current . has ( callableId ) ) {
217- log . debug2 ( 'Reusing callableId' , callableId ) ;
218- return renderedCallableMap . current . get ( callableId ) ;
215+ const hydratedDocument = transformNode (
216+ doc ,
217+ ( key , value ) => {
218+ // Need to re-hydrate any objects that are defined
219+ if ( isCallableNode ( value ) ) {
220+ const callableId = value [ CALLABLE_KEY ] ;
221+ deadCallableMap . delete ( callableId ) ;
222+ if ( renderedCallableMap . current . has ( callableId ) ) {
223+ log . debug2 ( 'Reusing callableId' , callableId ) ;
224+ return renderedCallableMap . current . get ( callableId ) ;
225+ }
226+ log . debug2 ( 'Registering callableId' , callableId ) ;
227+ const callable = wrapCallable (
228+ jsonClient ,
229+ callableId ,
230+ callableFinalizationRegistry ,
231+ false
232+ ) ;
233+ renderedCallableMap . current . set ( callableId , callable ) ;
234+ return callable ;
219235 }
220- log . debug2 ( 'Registering callableId' , callableId ) ;
221- const callable = wrapCallable (
222- jsonClient ,
223- callableId ,
224- callableFinalizationRegistry ,
225- false
226- ) ;
227- renderedCallableMap . current . set ( callableId , callable ) ;
228- return callable ;
229- }
230- if ( isObjectNode ( value ) ) {
231- // Replace this node with the exported object
232- const objectKey = value [ OBJECT_KEY ] ;
233- const exportedObject = exportedObjectMap . current . get ( objectKey ) ;
234- if ( exportedObject === undefined ) {
235- // The map should always have the exported object for a key, otherwise the protocol is broken
236- throw new Error ( `Invalid exported object key ${ objectKey } ` ) ;
236+ if ( isObjectNode ( value ) ) {
237+ // Replace this node with the exported object
238+ const objectKey = value [ OBJECT_KEY ] ;
239+ const exportedObject = exportedObjectMap . current . get ( objectKey ) ;
240+ if ( exportedObject === undefined ) {
241+ // The map should always have the exported object for a key, otherwise the protocol is broken
242+ throw new Error ( `Invalid exported object key ${ objectKey } ` ) ;
243+ }
244+ deadObjectMap . delete ( objectKey ) ;
245+ return exportedObject ;
237246 }
238- deadObjectMap . delete ( objectKey ) ;
239- return exportedObject ;
240- }
241247
242- if ( isElementNode ( value ) ) {
243- // Replace the elements node with the Component it maps to
244- try {
245- return getComponentForElement ( value ) ;
246- } catch ( e ) {
247- log . warn ( 'Error getting component for element' , e ) ;
248- return value ;
248+ if ( isElementNode ( value ) ) {
249+ // Replace the elements node with the Component it maps to
250+ try {
251+ return getComponentForElement ( value ) ;
252+ } catch ( e ) {
253+ log . warn ( 'Error getting component for element' , e ) ;
254+ return value ;
255+ }
249256 }
250- }
251257
252- return value ;
253- } ) ;
258+ return value ;
259+ } ,
260+ id
261+ ) ;
254262
255263 // Close any objects that are no longer referenced
256264 deadObjectMap . forEach ( ( deadObject , objectKey ) => {
@@ -275,7 +283,13 @@ function WidgetHandler({
275283 ) ;
276284 return hydratedDocument ;
277285 } ,
278- [ callableFinalizationRegistry , document , jsonClient , renderEmptyDocument ]
286+ [
287+ callableFinalizationRegistry ,
288+ document ,
289+ jsonClient ,
290+ renderEmptyDocument ,
291+ id ,
292+ ]
279293 ) ;
280294
281295 const updateExportedObjects = useCallback (
0 commit comments