UNPKG

@paroicms/front-media-gallery

Version:

Basic media gallery react component for Paroi CMS.

84 lines (83 loc) 3.69 kB
import filePlaceholder from "../../assets/images/file-placeholder.jpeg"; import pdfPlaceholder from "../../assets/images/pdf-placeholder.png"; import { openModalDialog, syncOpenModalDialog } from "@paroicms/internal-front-lib"; import { Button } from "primereact/button"; import { Menu } from "primereact/menu"; import { classNames } from "primereact/utils"; import { useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { isImage } from "../helpers/isImageGuard"; import makeConfirmDeleteDialog from "./dialogs/ConfirmDeleteDialog"; import makeViewMediaPropertiesDialog from "./dialogs/MediaPropertiesDialog"; export default function GalleryItem({ media, attachedData, onAction, onDelete, onClick, onReplace, isMobile, getMediaProperties, updateCaption, contentLanguage, }) { const { t } = useTranslation(); const [isMenuOpened, setMenuOpened] = useState(false); const menuLeft = useRef(null); const updateMediaCaption = updateCaption ? async (mediaUid, caption) => { await updateCaption(mediaUid, caption); } : undefined; const renderDropdownItems = () => { const dropdownItems = []; if (onDelete) { dropdownItems.push({ label: t("frontMediaGallery.delete"), command: async () => { await openModalDialog(makeConfirmDeleteDialog, { onDelete, }); }, }); } if (onReplace) { dropdownItems.push({ label: t("frontMediaGallery.replace"), command: onReplace, }); } if (getMediaProperties) { dropdownItems.push({ label: t("frontMediaGallery.properties"), command: () => { syncOpenModalDialog(makeViewMediaPropertiesDialog, { getMediaProperties, updateCaption: updateMediaCaption, onDelete, mediaUid: media.uid, contentLanguage, }); }, }); } return dropdownItems; }; let threeDotsButton; if (onReplace) { threeDotsButton = (<> <Button icon="pi pi-ellipsis-h" className={`Media-dropdown${isMenuOpened ? " opened" : ""}`} onClick={(ev) => menuLeft.current?.toggle(ev)} aria-controls="popup_menu_left" aria-haspopup/> <Menu model={renderDropdownItems()} popup ref={menuLeft} id="popup_menu_left" popupAlignment="right" onShow={() => setMenuOpened(true)} onHide={() => setMenuOpened(false)}/> </>); } else if (getMediaProperties) { threeDotsButton = (<Button icon="pi pi-ellipsis-h" className="Media-dropdown" onClick={() => syncOpenModalDialog(makeViewMediaPropertiesDialog, { getMediaProperties, updateCaption: updateMediaCaption, onDelete, mediaUid: media.uid, contentLanguage, })}/>); } return (<div className="Media"> {threeDotsButton && threeDotsButton} {onClick && (<Button className="Media-insertImage" icon="pi pi-arrow-left" size="small" onClick={onClick}/>)} <div className={classNames("Media-image", { mobile: !!isMobile, })}> {renderMedia(media)} </div> </div>); } function renderMedia(media) { return isImage(media) ? (<img src={media.url} height={media.height} width={media.width} alt="media"/>) : (<img src={/pdf/.test(media.mediaType) ? pdfPlaceholder : filePlaceholder} alt="media"/>); }