UNPKG

@paroicms/bo-media-gallery

Version:

Basic media gallery react component for Paroi CMS.

41 lines (40 loc) 1.84 kB
import "../../assets/styles/ReorderMedias.scss"; import { ActionButton, syncOpenModalDialog, } from "@paroicms/internal-bo-lib"; import { Button } from "primereact/button"; import { classNames } from "primereact/utils"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { ReactSortable } from "react-sortablejs"; import GalleryItem from "../GalleryItem/GalleryItem.jsx"; export default function ReorderMedias(props) { const { t } = useTranslation(); const { isMobile } = props; return (<Button className={classNames("ReorderMedias-button", { mobile: !!isMobile, })} label={t("frontMediaGallery.orderTheMedia")} onClick={() => syncOpenModalDialog(makeReorderMediasDialog, props)} size="small" severity="secondary"/>); } function makeReorderMediasDialog({ closeDialog, parameter: { medias, setOrdering }, }) { const { t } = useTranslation(); const header = t("frontMediaGallery.dragAndDropMedia"); const [sortableItems, setSortableItems] = useState([]); const applyOrdering = async () => { await setOrdering(sortableItems); closeDialog(); }; useEffect(() => { setSortableItems(medias.map((m) => ({ id: m.uid, // needed by the UI library ...m, }))); }, [medias]); const content = (<> <ReactSortable tag="div" className="Gallery flex-wrap" list={sortableItems} setList={setSortableItems}> {sortableItems.map((item) => (<GalleryItem key={item.uid} media={item}/>))} </ReactSortable> </>); const footer = (<> <Button severity="secondary" onClick={() => closeDialog()} label={t("frontMediaGallery.cancel")}/> <ActionButton action={applyOrdering} label={t("frontMediaGallery.save")}/> </>); return { header, content, footer }; }