Skip to content

Commit 57d48fe

Browse files
committed
Extract usePlugins for additive plugins.
1 parent f22e042 commit 57d48fe

20 files changed

+52
-33
lines changed

src/components/AttributionPanel.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export function AttributionPanel({
7373
</CompanionWindowSection>
7474
)}
7575

76-
<PluginHook {...pluginProps} />
76+
<PluginHook targetName="AttributionPanel" {...pluginProps} />
7777
</CompanionWindow>
7878
);
7979
}

src/components/BackgroundPluginArea.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { PluginHook } from './PluginHook';
55
/** invisible area where background plugins can add to */
66
export const BackgroundPluginArea = ({ PluginComponents = [], ...props }) => (
77
<div className={ns('background-plugin-area')} style={{ display: 'none' }}>
8-
<PluginHook PluginComponents={PluginComponents} {...props} />
8+
<PluginHook targetName="BackgroundPluginArea" PluginComponents={PluginComponents} {...props} />
99
</div>
1010
);
1111

src/components/CanvasInfo.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export function CanvasInfo({
4949
{canvasMetadata && canvasMetadata.length > 0 && (
5050
<LabelValueMetadata labelValuePairs={canvasMetadata} />
5151
)}
52-
<PluginHook {...pluginProps} />
52+
<PluginHook targetName="CanvasInfo" {...pluginProps} />
5353
</CollapsibleSection>
5454
);
5555
}

src/components/ErrorContent.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export function ErrorContent({
5151
</AccordionDetails>
5252
</InlineAccordion>
5353
)}
54-
<PluginHook {...pluginProps} />
54+
<PluginHook targetName="ErrorContent" {...pluginProps} />
5555
</Alert>
5656
);
5757
}

src/components/ManifestInfo.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export function ManifestInfo({
5252
<LabelValueMetadata labelValuePairs={manifestMetadata} />
5353
)}
5454

55-
<PluginHook {...pluginProps} />
55+
<PluginHook targetName="ManifestInfo" {...pluginProps} />
5656
</CollapsibleSection>
5757
);
5858
}

src/components/ManifestRelatedLinks.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export function ManifestRelatedLinks({
123123
</>
124124
)}
125125
</StyledDl>
126-
<PluginHook {...pluginProps} />
126+
<PluginHook targetName="ManifestRelatedLinks" {...pluginProps} />
127127
</CollapsibleSection>
128128
);
129129
}

src/components/OpenSeadragonViewer.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ export function OpenSeadragonViewer({
137137
{ drawAnnotations
138138
&& <AnnotationsOverlay viewer={viewer} windowId={windowId} /> }
139139
{ enhancedChildren }
140-
<PluginHook viewer={viewer} {...pluginProps} />
140+
<PluginHook targetName="OpenSeadragonViewer" viewer={viewer} {...pluginProps} />
141141
</OpenSeadragonComponent>
142142
);
143143
}

src/components/PluginHook.jsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { forwardRef, isValidElement, cloneElement } from 'react';
2+
import PropTypes from 'prop-types';
3+
import { usePlugins } from '../extend/usePlugins';
24

35
/** Renders plugins */
4-
export const PluginHook = forwardRef((props, ref) => {
5-
const { PluginComponents } = props; // eslint-disable-line react/prop-types
6-
const { classes, ...otherProps } = props; // eslint-disable-line react/prop-types
6+
export const PluginHook = forwardRef(({ classes = {}, targetName, ...otherProps }, ref) => {
7+
const { PluginComponents } = usePlugins(targetName);
8+
79
return PluginComponents ? (
810
PluginComponents.map((PluginComponent, index) => ( // eslint-disable-line react/prop-types
911
isValidElement(PluginComponent)
@@ -20,3 +22,8 @@ export const PluginHook = forwardRef((props, ref) => {
2022
});
2123

2224
PluginHook.displayName = 'PluginHook';
25+
26+
PluginHook.propTypes = {
27+
classes: PropTypes.object, // eslint-disable-line react/forbid-prop-types, react/require-default-props
28+
targetName: PropTypes.string.isRequired,
29+
};

src/components/Window.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export function Window({
127127
</StyledCompanionAreaRight>
128128
</ContentRow>
129129
<CompanionArea windowId={windowId} position="far-bottom" />
130-
<PluginHook {...ownerState} />
130+
<PluginHook targetName="Window" {...ownerState} />
131131
</Root>
132132
</ErrorBoundary>
133133
);

src/components/WindowAuthenticationBar.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export function WindowAuthenticationBar({
7171
<Typography component="h3" variant="body1" color="inherit">
7272
{ ruleSet ? <SanitizedHtml htmlString={label} ruleSet={ruleSet} /> : label }
7373
</Typography>
74-
<PluginHook {...pluginProps} />
74+
<PluginHook targetName="WindowAuthenticationBar" {...pluginProps} />
7575
{ button }
7676
</StyledTopBar>
7777
</Paper>
@@ -106,7 +106,7 @@ export function WindowAuthenticationBar({
106106
<Typography sx={{ paddingBlockEnd: 1, paddingBlockStart: 1 }} component="h3" variant="body1" color="inherit">
107107
{ ruleSet ? <SanitizedHtml htmlString={label} ruleSet={ruleSet} /> : label }
108108
</Typography>
109-
<PluginHook {...pluginProps} />
109+
<PluginHook targetName="WindowAuthenticationBar" {...pluginProps} />
110110
<StyledFauxButton>
111111
{ !open && (
112112
<Typography variant="button" color="inherit">

src/components/WindowCanvasNavigationControls.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export const WindowCanvasNavigationControls = forwardRef(({
7070
</Stack>
7171
<ViewerInfo windowId={windowId} />
7272

73-
<PluginHook {...pluginProps} />
73+
<PluginHook targetName="WindowCanvasNavigationControls" {...pluginProps} />
7474
</Root>
7575
);
7676
});

src/components/WindowTopBarPluginArea.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ import { PluginHook } from './PluginHook';
55
*/
66
export function WindowTopBarPluginArea(props) {
77
return (
8-
<PluginHook {...props} />
8+
<PluginHook targetName="WindowTopBarPluginArea" {...props} />
99
);
1010
}

src/components/WindowTopBarPluginMenu.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export function WindowTopBarPluginMenu({
6161
open={open}
6262
onClose={handleMenuClose}
6363
>
64-
<PluginHook handleClose={handleMenuClose} {...pluginProps} />
64+
<PluginHook targetName="WindowTopBarPluginMenu" handleClose={handleMenuClose} {...pluginProps} />
6565
</Menu>
6666
</>
6767
);

src/components/WindowTopMenu.jsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,29 @@ import { useContext } from 'react';
22
import ListSubheader from '@mui/material/ListSubheader';
33
import Popover from '@mui/material/Popover';
44
import PropTypes from 'prop-types';
5+
import { useTranslation } from 'react-i18next';
56
import WindowThumbnailSettings from '../containers/WindowThumbnailSettings';
67
import WindowViewSettings from '../containers/WindowViewSettings';
78
import { PluginHook } from './PluginHook';
89
import WorkspaceContext from '../contexts/WorkspaceContext';
10+
import { usePlugins } from '../extend/usePlugins';
911

1012
/** Renders plugins */
11-
function PluginHookWithHeader(props) {
12-
const { PluginComponents, t } = props; // eslint-disable-line react/prop-types
13+
function PluginHookWithHeader({ targetName, ...props }) {
14+
const PluginComponents = usePlugins(targetName);
15+
const { t } = useTranslation();
1316
return PluginComponents ? (
1417
<>
1518
<ListSubheader role="presentation" disableSticky tabIndex={-1}>{t('windowPluginButtons')}</ListSubheader>
16-
<PluginHook {...props} />
19+
<PluginHook targetName={targetName} {...props} />
1720
</>
1821
) : null;
1922
}
2023

24+
PluginHookWithHeader.propTypes = {
25+
targetName: PropTypes.string.isRequired,
26+
};
27+
2128
/**
2229
*/
2330
export function WindowTopMenu({
@@ -51,7 +58,7 @@ export function WindowTopMenu({
5158
<WindowViewSettings windowId={windowId} handleClose={handleClose} />
5259
{showThumbnailNavigationSettings
5360
&& <WindowThumbnailSettings windowId={windowId} handleClose={handleClose} />}
54-
<PluginHookWithHeader {...pluginProps} />
61+
<PluginHookWithHeader targetName="WindowTopMenu" {...pluginProps} />
5562
</Popover>
5663
);
5764
}

src/components/WorkspaceAdd.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ export function WorkspaceAdd({
129129
) : (
130130
<Paper sx={{ margin: 2 }}>
131131
<Typography style={visuallyHidden} component="h1">{t('miradorResources')}</Typography>
132-
<PluginHook {...pluginProps} />
132+
<PluginHook targetName="WorkspaceAdd" {...pluginProps} />
133133
<List disablePadding>
134134
{manifestList}
135135
</List>

src/components/WorkspaceControlPanelButtons.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export function WorkspaceControlPanelButtons({ ...rest }) {
1414
<WorkspaceMenuButton />
1515
<WorkspaceOptionsButton />
1616
<FullScreenButton />
17-
<PluginHook {...rest} />
17+
<PluginHook targetName="WorkspaceControlPanelButtons" {...rest} />
1818
</>
1919
);
2020
}

src/components/WorkspaceMenu.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export function WorkspaceMenu({
8585
<Typography variant="body1">{t('changeTheme')}</Typography>
8686
</MenuItem>
8787
)}
88-
<PluginHook {...pluginProps} />
88+
<PluginHook targetName="WorkspaceMenu" {...pluginProps} />
8989
</Menu>
9090
{selectedOption === 'changeTheme' && (
9191
<ChangeThemeDialog

src/components/WorkspaceOptionsMenu.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export function WorkspaceOptionsMenu({
7676
</ListItemIcon>
7777
<Typography variant="body1">{t('importWorkspace')}</Typography>
7878
</MenuItem>
79-
<PluginHook {...pluginProps} />
79+
<PluginHook targetName="WorkspaceOptionsMenu" {...pluginProps} />
8080
</Menu>
8181
{selectedOption === 'exportWorkspace' && (
8282
<WorkspaceExport

src/extend/usePlugins.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { useContext } from 'react';
2+
import PluginContext from './PluginContext';
3+
4+
/** withPlugins should be the innermost HOC */
5+
export function usePlugins(targetName) {
6+
const pluginMap = useContext(PluginContext);
7+
8+
const plugins = (pluginMap || {})[targetName];
9+
10+
const PluginComponents = (plugins?.add || []).map(plugin => plugin.component);
11+
12+
return { PluginComponents };
13+
}

src/extend/withPlugins.jsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,10 @@ function _withPlugins(targetName, TargetComponent) { // eslint-disable-line no-u
1616

1717
const plugins = (pluginMap || {})[targetName];
1818

19-
if (isEmpty(plugins) || (isEmpty(plugins.wrap) && isEmpty(plugins.add))) {
19+
if (isEmpty(plugins) || isEmpty(plugins.wrap)) {
2020
return <TargetComponent {...passDownProps} />;
2121
}
2222

23-
const PluginComponents = (plugins.add || []).map(plugin => plugin.component);
24-
const targetComponent = (
25-
<TargetComponent {...passDownProps} PluginComponents={PluginComponents} />
26-
);
27-
28-
if (isEmpty(plugins.wrap)) return targetComponent;
29-
3023
/** */
3124
const pluginWrapper = (children, plugin) => {
3225
const WrapPluginComponent = plugin.component;
@@ -35,7 +28,6 @@ function _withPlugins(targetName, TargetComponent) { // eslint-disable-line no-u
3528
<WrapPluginComponent
3629
targetProps={passDownProps}
3730
{...passDownProps}
38-
PluginComponents={PluginComponents}
3931
TargetComponent={TargetComponent}
4032
>
4133
{children}

0 commit comments

Comments
 (0)