import { Box, Button, Gradient, Text, theme } from "@prismicio/editor-ui"; import { useRouter } from "next/router"; import { type Dispatch, type FC, type SetStateAction, useState } from "react"; import { toast } from "react-toastify"; import { updateSlice } from "@/apiClient"; import { Divider } from "@/components/Divider"; import { copySliceVariation } from "@/domain/slice"; import { useSliceState } from "@/features/slices/sliceBuilder/SliceBuilderProvider"; import { SharedSliceCard } from "@/features/slices/sliceCards/SharedSliceCard"; import { SLICES_CONFIG } from "@/features/slices/slicesConfig"; import { type Payload, useScreenshotChangesModal, } from "@/hooks/useScreenshotChangesModal"; import { DeleteVariationModal } from "@/legacy/components/DeleteVariationModal"; import { RenameVariationModal } from "@/legacy/components/Forms/RenameVariationModal"; import ScreenshotChangesModal from "@/legacy/components/ScreenshotChangesModal"; import AddVariationModal from "@/legacy/lib/builders/SliceBuilder/VariationsList/AddVariationModal"; import type { VariationSM } from "@/legacy/lib/models/common/Slice"; import useSliceMachineActions from "@/modules/useSliceMachineActions"; import styles from "./VariationsList.module.css"; type DialogState = | { type: "ADD_VARIATION"; variation?: undefined; loading?: boolean } | { type: "RENAME_VARIATION"; variation: VariationSM; loading?: boolean } | { type: "DELETE_VARIATION"; variation: VariationSM; loading?: boolean } | undefined; type VariationsListProps = { horizontalScroll: boolean; }; export const VariationsList: FC = (props) => { const { horizontalScroll = false } = props; const { slice, variation, setSlice } = useSliceState(); const [dialog, setDialog] = useState(); const screenshotChangesModal = useScreenshotChangesModal(); const { sliceFilterFn, defaultVariationSelector, onUploadSuccess } = screenshotChangesModal.modalPayload; const router = useRouter(); const { saveSliceSuccess } = useSliceMachineActions(); const variationCount = slice.model.variations.length; return ( <> {horizontalScroll ? ( <> {variationCount} variation{variationCount !== 1 && "s"}
) : ( <> {/* * As `PageLayoutContent` has a `16px` bottom padding, we need to apply * an equal negative margin to the `div` if we want it to sit flush with * the bottom of the page. * TODO(PBD-1080): write the new `ScrollAreaEndGradient` component * instead of using a `div`. */}
)}
{ setDialog(undefined); }} slice={slice} variation={dialog?.variation} /> { setDialog(undefined); }} slice={slice} variation={dialog?.variation} /> { setDialog(undefined); }} onSubmit={async (id, name, copiedVariation) => { try { const { slice: newSlice, variation: newVariation } = copySliceVariation({ slice, id, name, copiedVariation }); await updateSlice(newSlice); saveSliceSuccess(newSlice); setSlice(newSlice); const url = SLICES_CONFIG.getBuilderPagePathname({ libraryName: newSlice.href, sliceName: newSlice.model.name, variationId: newVariation.id, }); void router.replace(url); } catch (error) { const message = `Could not add variation \`${name}\``; console.error(message, error); toast.error(message); } }} variations={slice.model.variations} /> ); }; type SharedSliceCardsProps = { screenshotChangesModal: Payload; setDialog: Dispatch>; width?: 320; }; export const SharedSliceCards = (props: SharedSliceCardsProps) => { const { screenshotChangesModal, setDialog, width } = props; const { slice, variation, setSlice } = useSliceState(); const defaultCardStyle = { scrollSnapAlign: "start" }; return ( <> {slice.model.variations.map((v) => (
{ setDialog({ type: "RENAME_VARIATION", variation: v, }); }, onRemove: () => { setDialog({ type: "DELETE_VARIATION", variation: v, }); }, removeDisabled: slice.model.variations.length <= 1, }} key={v.id} mode="navigation" onUpdateScreenshot={() => { screenshotChangesModal.onOpenModal({ sliceFilterFn: (s) => s, defaultVariationSelector: { sliceID: slice.model.id, variationID: v.id, }, onUploadSuccess: (newSlice) => { setSlice(newSlice); }, }); }} replace selected={v.id === variation.id} slice={slice} variant="outlined" variationId={v.id} />
))} ); };