Skip to content

Commit 77ba892

Browse files
committed
Use a top-level context to track OSD viewers in the workspace instead of the OSDReferences global.
1 parent acccdda commit 77ba892

3 files changed

Lines changed: 28 additions & 14 deletions

File tree

src/components/AppProviders.js

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState, useEffect } from 'react';
1+
import { useState, useEffect, useRef } from 'react';
22
import PropTypes from 'prop-types';
33
import { FullScreen, useFullScreenHandle } from 'react-full-screen';
44
import { I18nextProvider } from 'react-i18next';
@@ -14,6 +14,7 @@ import { CacheProvider } from '@emotion/react';
1414
import createCache from '@emotion/cache';
1515
import createI18nInstance from '../i18n';
1616
import FullScreenContext from '../contexts/FullScreenContext';
17+
import OpenSeadragonWorkspaceReferencesContext from '../contexts/OpenSeadragonWorkspaceReferencesContext';
1718

1819
/**
1920
* Allow applications to opt-out of (or provide their own) drag and drop context
@@ -117,19 +118,23 @@ export function AppProviders({
117118
theme, translations,
118119
dndManager = undefined,
119120
}) {
121+
const osdReferences = useRef({});
122+
120123
return (
121124
<FullScreenShim>
122-
<StoreAwareI18nextProvider language={language} translations={translations}>
123-
<StyledEngineProvider injectFirst>
124-
<CacheProvider value={theme.direction === 'rtl' ? cacheRtl : cacheDefault}>
125-
<ThemeProvider theme={createTheme((theme))}>
126-
<MaybeDndProvider dndManager={dndManager}>
127-
{children}
128-
</MaybeDndProvider>
129-
</ThemeProvider>
130-
</CacheProvider>
131-
</StyledEngineProvider>
132-
</StoreAwareI18nextProvider>
125+
<OpenSeadragonWorkspaceReferencesContext.Provider value={osdReferences}>
126+
<StoreAwareI18nextProvider language={language} translations={translations}>
127+
<StyledEngineProvider injectFirst>
128+
<CacheProvider value={theme.direction === 'rtl' ? cacheRtl : cacheDefault}>
129+
<ThemeProvider theme={createTheme((theme))}>
130+
<MaybeDndProvider dndManager={dndManager}>
131+
{children}
132+
</MaybeDndProvider>
133+
</ThemeProvider>
134+
</CacheProvider>
135+
</StyledEngineProvider>
136+
</StoreAwareI18nextProvider>
137+
</OpenSeadragonWorkspaceReferencesContext.Provider>
133138
</FullScreenShim>
134139
);
135140
}

src/components/OpenSeadragonViewer.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {
2-
useRef, Children, cloneElement, useCallback, useState, useEffect,
2+
useRef, Children, cloneElement, useCallback, useState, useEffect, useContext,
33
} from 'react';
44
import PropTypes from 'prop-types';
55
import { styled } from '@mui/material/styles';
@@ -12,6 +12,7 @@ import { PluginHook } from './PluginHook';
1212
import { OSDReferences } from '../plugins/OSDReferences';
1313
import OpenSeadragonComponent from './OpenSeadragonComponent';
1414
import TileSource from './OpenSeadragonTileSource';
15+
import OpenSeadragonWorkspaceReferencesContext from '../contexts/OpenSeadragonWorkspaceReferencesContext';
1516

1617
const StyledSection = styled('section')({
1718
cursor: 'grab',
@@ -28,6 +29,7 @@ export function OpenSeadragonViewer({
2829
drawAnnotations = false, infoResponses = [], canvasWorld, nonTiledImages = [], updateViewport,
2930
}) {
3031
const apiRef = useRef();
32+
const workspaceReferencesContext = useContext(OpenSeadragonWorkspaceReferencesContext);
3133
const [viewer, setViewer] = useState(null);
3234
const onViewportChange = useCallback(({
3335
flip, rotation, x, y, zoom,
@@ -56,7 +58,9 @@ export function OpenSeadragonViewer({
5658

5759
useEffect(() => {
5860
apiRef.current = viewer;
59-
}, [apiRef, viewer]);
61+
62+
workspaceReferencesContext.current[windowId] = apiRef;
63+
}, [apiRef, windowId, viewer, workspaceReferencesContext]);
6064

6165
const enhancedChildren = Children.map(children, child => (
6266
cloneElement(
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { createContext } from 'react';
2+
3+
const OpenSeadragonWorkspaceReferencesContext = createContext({ current: {} });
4+
5+
export default OpenSeadragonWorkspaceReferencesContext;

0 commit comments

Comments
 (0)