import { useOnChange } from "@prismicio/editor-support/React"; import { Box, Dialog, DialogActionButton, DialogActions, DialogCancelButton, DialogContent, DialogHeader, Form, FormInput, ScrollArea, Select, SelectItem, Text, } from "@prismicio/editor-ui"; import { camelCase } from "lodash"; import { type FC, useState } from "react"; import { LibraryUI } from "@/legacy/lib/models/common/LibraryUI"; import styles from "./ConvertLegacySliceButton.module.css"; import { DialogProps } from "./types"; type FormValues = { libraryID: string; sliceID: string; variationID: string; variationName: string; }; export const ConvertLegacySliceAsNewVariationDialog: FC = ({ isOpen, close, onSubmit, isLoading, slice, sliceName, libraries, localSharedSlices, }) => { const defaultValues = { libraryID: localSharedSlices[0]?.from, sliceID: localSharedSlices[0]?.model.id, variationID: camelCase(slice.key), variationName: sliceName, }; const [inferIDFromName, setInferIDFromName] = useState(true); const [values, setValues] = useState(defaultValues); const [errors, setErrors] = useState< Partial> >({}); useOnChange(isOpen, () => { if (!isOpen) { setValues(defaultValues); setErrors({}); } }); function handleValueChange(values: FormValues) { setValues(values); setErrors(validateAsNewVariationValues(values, libraries)); } function handleSubmit() { if (Object.keys(errors).length > 0) { return; } onSubmit(values); } return ( !open && close()} size={{ width: 448, height: "auto" }} >
If you have multiple slices that are similar, you can combine them as variations of the same slice. Choose the slice to which you would like to add this variation. { const newValues = { ...values, variationName: value.slice(0, 30), }; if (inferIDFromName) { newValues.variationID = camelCase( newValues.variationName, ); } handleValueChange(newValues); }} data-testid="variation-name-input" /> { setInferIDFromName(false); handleValueChange({ ...values, variationID: value.slice(0, 30), }); }} data-testid="variation-id-input" /> 0} > Convert
); }; const validateAsNewVariationValues = ( values: FormValues, libraries: readonly LibraryUI[], ): Partial> => { const errors: Partial> = {}; if (!values.libraryID) { errors.libraryID = "Cannot be empty."; } const library = libraries.find( (library) => library.path === values.libraryID, ); // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (!errors.libraryID && !library) { errors.libraryID = "Does not exist."; } if (!values.sliceID) { errors.sliceID = "Cannot be empty."; } const slice = library?.components.find( (component) => component.model.id === values.sliceID, ); // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (!errors.sliceID && !slice) { errors.sliceID = "Does not exist."; } if (!values.variationName) { errors.variationName = "Cannot be empty."; } if (!values.variationID) { errors.variationID = "Cannot be empty."; } else { const variationIDs = slice?.model.variations.map((variation) => variation.id) ?? []; if (variationIDs.includes(values.variationID)) { errors.variationID = "Slice variation ID is already taken."; } } return errors; };