/** * * Player * */ import React, { useCallback, useRef, useState, useMemo } from 'react'; import { Map, withLeaflet, ZoomControl, ImageOverlay } from 'react-leaflet'; import useMousetrap from 'react-hook-mousetrap'; import { Button, Icon, Title } from 'quinoa-design-library'; import { useFullScreen } from 'react-browser-hooks'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faShare } from '@fortawesome/free-solid-svg-icons/faShare'; import { faTimes } from '@fortawesome/free-solid-svg-icons/faTimes'; import { faExpand } from '@fortawesome/free-solid-svg-icons/faExpand'; import Tooltip from 'react-tooltip'; import Modal from 'react-modal'; import L from 'leaflet'; import AnnotationLayer from 'components/AnnotationLayer'; import Loader from 'components/Loader'; import { LocalIiifLayer, DistantIiifLayer } from 'components/IiifLayer'; import { useLockEffect, useToggleBoolean, useUrl, coverToBounds } from 'utils/hooks'; import { enhancer } from 'containers/Editor'; import ReactDOM from 'react-dom'; import Sidebar from './Sidebar'; import Slideshow from 'types/Slideshow'; import { List } from 'immutable'; import Annotation from 'types/Annotation'; import { SureContextProps, changeSelection, SupportedShapes } from 'types'; import './style.css'; import { isSvg } from 'utils/index'; const minZoom = 1; const maxZoom = 20; Modal.setAppElement('#app'); interface PlayerContainerProps { readonly slideshow: Slideshow; readonly selectedAnnotations: List; readonly changeSelection: changeSelection; readonly url?: string; readonly viewerMode?: boolean; } interface PlayerProps extends PlayerContainerProps { readonly playing: boolean; } const PlayerMap = withLeaflet((props) => { const selected = props.selectedAnnotations.first(); const isInvisible = selected && selected.properties.type === SupportedShapes.invisible; useLockEffect(props.leaflet.map, (selected && !isInvisible) ? selected : props.slideshow.image); let child; if (props.url) { if (isSvg(props.slideshow.image)) { child = ( coverToBounds(props.slideshow.image), [props.slideshow.image])} /> ); } else { child = ; } } else if (isSvg(props.slideshow.image)) { child = ( coverToBounds(props.slideshow.image), [props.slideshow.image])} /> ); } else { child = ; } return ( {child} ); }); export const selectNext = (selected, annotations) => { if (!selected) { return annotations.first(); } const index = annotations.indexOf(selected); if (index + 1 < annotations.size) { return annotations.get(index + 1); } else { return annotations.first(); } }; const noop = undefined; export const Player: React.SFC = (props) => { const selected = props.selectedAnnotations.first(); const [mountSidebar, setMountSidebar] = useState(false); const [isShareHelpOpen, setShareHelpOpen] = useState(false); const [sidebarVisible, onClose, onOpen] = useToggleBoolean(); const fs = useFullScreen(); const onPlay = useCallback(() => { onOpen(); if (!selected) { onNext(); } }, [onOpen]); const onNext = useCallback( props.slideshow.annotations.size > 1 ? () => props.changeSelection(selectNext(selected, props.slideshow.annotations)) : noop as any, [selected, props.slideshow.annotations], ); const onPrev = useCallback( props.slideshow.annotations.size > 1 ? () => props.changeSelection(selectNext(selected, props.slideshow.annotations.reverse())) : noop as any, [selected, props.slideshow.annotations], ); useMousetrap('k', onNext); useMousetrap('j', onPrev); const onMapClick = useCallback((event) => { if (sidebarVisible) { return props.changeSelection(); } }, [sidebarVisible, props.changeSelection]); const toggleShareHelpOpen = useCallback(() => setShareHelpOpen(!isShareHelpOpen), [isShareHelpOpen]); const sidebarRef = useRef(null); const sidebarReady = (domElement) => { if (!sidebarRef.current) { sidebarRef.current = domElement; setMountSidebar(!!domElement); } }; const {viewerMode} = props; return (
{(sidebarRef.current && mountSidebar) && ReactDOM.createPortal( , sidebarRef.current, )}
{ viewerMode && }
{ viewerMode &&
<span>Share this document</span> <span> <Button onClick={toggleShareHelpOpen} isRounded> <Icon><FontAwesomeIcon icon={faTimes} /></Icon> </Button> </span>
Share the URL address of this document:
{window.location.href}
Embed this document in another page or application:
{``}
}
); }; export default enhancer(props => { if (props.slideshow) { return (); } return ; });