UNPKG

mirador

Version:

An open-source, web-based 'multi-up' viewer that supports zoom-pan-rotate functionality, ability to display/compare simple images, and images with annotations.

130 lines (121 loc) 4.04 kB
import { lazy, Suspense } from 'react'; import PropTypes from 'prop-types'; import { styled } from '@mui/material/styles'; import classNames from 'classnames'; import WindowSideBar from '../containers/WindowSideBar'; import CompanionArea from '../containers/CompanionArea'; import CollectionDialog from '../containers/CollectionDialog'; import ns from '../config/css-ns'; const AudioViewer = lazy(() => import('../containers/AudioViewer')); const GalleryView = lazy(() => import('../containers/GalleryView')); const SelectCollection = lazy(() => import('../containers/SelectCollection')); const WindowViewer = lazy(() => import('../containers/WindowViewer')); const VideoViewer = lazy(() => import('../containers/VideoViewer')); const TextViewer = lazy(() => import('../containers/TextViewer')); GalleryView.displayName = 'GalleryView'; SelectCollection.displayName = 'SelectCollection'; WindowViewer.displayName = 'WindowViewer'; const Root = styled('div', { name: 'PrimaryWindow', slot: 'root' })(() => ({ display: 'flex', flex: 1, position: 'relative', })); /** */ const TypeSpecificViewer = ({ audioResources = [], isCollection = false, isFetching = false, textResources = [], videoResources = [], view = undefined, windowId, }) => { if (isCollection) { return ( <SelectCollection windowId={windowId} /> ); } if (isFetching === false) { if (view === 'gallery') { return ( <GalleryView windowId={windowId} /> ); } if (videoResources.length > 0) { return ( <VideoViewer windowId={windowId} /> ); } if (audioResources.length > 0) { return ( <AudioViewer windowId={windowId} /> ); } if (textResources.length > 0) { return ( <TextViewer windowId={windowId} /> ); } return ( <WindowViewer windowId={windowId} /> ); } return null; }; TypeSpecificViewer.propTypes = { audioResources: PropTypes.arrayOf(PropTypes.object), // eslint-disable-line react/forbid-prop-types isCollection: PropTypes.bool, isFetching: PropTypes.bool, textResources: PropTypes.arrayOf(PropTypes.object), // eslint-disable-line react/forbid-prop-types videoResources: PropTypes.arrayOf(PropTypes.object), // eslint-disable-line react/forbid-prop-types view: PropTypes.string, windowId: PropTypes.string.isRequired, }; /** * PrimaryWindow - component that renders the primary content of a Mirador * window. Right now this differentiates between a Image, Video, or Audio viewer. */ export function PrimaryWindow({ audioResources = undefined, children = null, className = undefined, isCollection = false, isCollectionDialogVisible = false, isFetching = false, textResources = undefined, videoResources = undefined, view = undefined, windowId, }) { const viewerProps = { audioResources, isCollection, isFetching, textResources, videoResources, view, windowId, }; return ( <Root data-testid="test-window" className={classNames(ns('primary-window'), className)}> <WindowSideBar windowId={windowId} /> <CompanionArea windowId={windowId} position="left" /> { isCollectionDialogVisible && <CollectionDialog windowId={windowId} /> } <Suspense fallback={<div />}> {children || <TypeSpecificViewer {...viewerProps} />} </Suspense> </Root> ); } PrimaryWindow.propTypes = { audioResources: PropTypes.arrayOf(PropTypes.object), // eslint-disable-line react/forbid-prop-types children: PropTypes.node, className: PropTypes.string, isCollection: PropTypes.bool, isCollectionDialogVisible: PropTypes.bool, isFetching: PropTypes.bool, textResources: PropTypes.arrayOf(PropTypes.object), // eslint-disable-line react/forbid-prop-types videoResources: PropTypes.arrayOf(PropTypes.object), // eslint-disable-line react/forbid-prop-types view: PropTypes.string, windowId: PropTypes.string.isRequired, };