UNPKG

@plone/volto

Version:
112 lines (102 loc) 3.19 kB
import React from 'react'; import PropTypes from 'prop-types'; import loadable from '@loadable/component'; import 'react-image-gallery/styles/css/image-gallery.css'; import { Button } from 'semantic-ui-react'; import Icon from '@plone/volto/components/theme/Icon/Icon'; import { flattenToAppURL } from '@plone/volto/helpers/Url/Url'; import config from '@plone/volto/registry'; import galleryLeftSVG from '@plone/volto/icons/left-key.svg'; import galleryRightSVG from '@plone/volto/icons/right-key.svg'; import galleryPlaySVG from '@plone/volto/icons/play.svg'; import galleryPauseSVG from '@plone/volto/icons/pause.svg'; import galleryFullScreenSVG from '@plone/volto/icons/fullscreen.svg'; import galleryBackDownSVG from '@plone/volto/icons/back-down.svg'; const ImageGallery = loadable(() => import('react-image-gallery')); const renderLeftNav = (onClick, disabled) => { return ( <Button type="button" className="image-gallery-icon image-gallery-left-nav primary basic" disabled={disabled} onClick={onClick} > <Icon name={galleryLeftSVG} size="48px" fill="black" /> </Button> ); }; const renderRightNav = (onClick, disabled) => { return ( <Button type="button" className="image-gallery-icon image-gallery-right-nav primary basic" disabled={disabled} onClick={onClick} > <Icon name={galleryRightSVG} size="48px" /> </Button> ); }; const renderPlayPauseButton = (onClick, isPlaying) => ( <Button type="button" className="image-gallery-icon image-gallery-play-button basic primary" onClick={onClick} aria-label="Play or Pause Slideshow" > {isPlaying ? ( <Icon name={galleryPauseSVG} size="48px" /> ) : ( <Icon name={galleryPlaySVG} size="48px" /> )} </Button> ); const renderFullscreenButton = (onClick, isFullscreen) => { return ( <Button type="button" className="image-gallery-icon image-gallery-fullscreen-button primary basic" onClick={onClick} aria-label="Open Fullscreen" > {isFullscreen ? ( <Icon name={galleryBackDownSVG} size="48px" /> ) : ( <Icon name={galleryFullScreenSVG} size="48px" /> )} </Button> ); }; const ImageGalleryTemplate = ({ items }) => { const { settings } = config; const renderItems = items.filter( (content) => settings.imageObjects.includes(content['@type']) && content.image_field, ); const imagesInfo = renderItems.map((item) => { return { original: `${flattenToAppURL(item['@id'])}/@@images/${ item.image_field }/large`, thumbnail: `${flattenToAppURL(item['@id'])}/@@images/${ item.image_field }/thumb`, }; }); return ( renderItems.length > 0 && ( <ImageGallery items={imagesInfo} renderLeftNav={renderLeftNav} renderRightNav={renderRightNav} renderPlayPauseButton={renderPlayPauseButton} renderFullscreenButton={renderFullscreenButton} lazyLoad={true} /> ) ); }; ImageGalleryTemplate.propTypes = { items: PropTypes.arrayOf(PropTypes.any).isRequired, }; export default ImageGalleryTemplate;