UNPKG

@paroicms/front-media-gallery

Version:

Basic media gallery react component for Paroi CMS.

43 lines (42 loc) 1.84 kB
import "../../assets/styles/ReorderMedias.scss"; import { ActionButton, syncOpenModalDialog, } from "@paroicms/internal-front-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"; export default function ReorderMedias(props) { const { t } = useTranslation(); const { isMobile } = props; return (<Button className={classNames("Button ReorderMedias-btn", { mobile: !!isMobile, })} onClick={() => syncOpenModalDialog(makeReorderMediasDialog, props)} size="small" severity="secondary"> {t("frontMediaGallery.orderTheMedia")} </Button>); } 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 onClick={() => closeDialog()}>{t("frontMediaGallery.cancel")}</Button> <ActionButton action={applyOrdering}>{t("frontMediaGallery.save")}</ActionButton> </>); return { header, content, footer }; }