import { ReactNode, useEffect, useState } from "react"; import { AiOutlinePicture } from "react-icons/ai"; import { RiErrorWarningLine } from "react-icons/ri"; import { useSelector } from "react-redux"; import { Box, Close, Flex, Heading, Text } from "theme-ui"; import { Kbd } from "@/components/Kbd"; import { FigmaIconSquare } from "@/icons/FigmaIconSquare"; import { Card, useCardRadius } from "@/legacy/components/Card"; import SliceMachineModal from "@/legacy/components/SliceMachineModal"; import { ComponentUI } from "@/legacy/lib/models/common/ComponentUI"; import { isModalOpen } from "@/modules/modal"; import { ModalKeysEnum } from "@/modules/modal/types"; import useSliceMachineActions from "@/modules/useSliceMachineActions"; import { SliceMachineStoreType } from "@/redux/type"; import { getOS, OS } from "@/utils/os"; import VariationDropZone from "./VariationDropZone"; export type SliceVariationSelector = { sliceID: string; variationID: string }; const FigmaTip = () => { const os = getOS(); const keys = (() => { if ([OS.Windows, OS.Linux].includes(os)) { return ( <> ctrl + shift + c > ); } return ( <> cmd + shift + c > ); })(); return ( Use {keys} to copy any frame as .png, then just paste it here ); }; const VariationIcon: React.FC<{ isValid?: boolean }> = ({ isValid }) => ( {/* eslint-disable-next-line @typescript-eslint/strict-boolean-expressions */} {isValid ? ( ) : ( )} ); const VariationsList = ({ slice, onSelectVariation, variationSelector, }: { slice: ComponentUI; variationSelector: SliceVariationSelector; onSelectVariation: (s: SliceVariationSelector) => void; }) => ( <> {slice.model.name} {slice.model.variations.map((variation) => { const { sliceID, variationID } = variationSelector; const isSelectedVariation = sliceID === slice.model.id && variationID === variation.id; return ( onSelectVariation({ sliceID: slice.model.id, variationID: variation.id, }) } > {/* eslint-disable-next-line @typescript-eslint/strict-boolean-expressions */} {variation.name} ); })} > ); const variationSetter = ( defaultVariationSelector: SliceVariationSelector | undefined, slices: ComponentUI[], ) => // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing defaultVariationSelector || (slices.length ? { sliceID: slices[0].model.id, variationID: slices[0].model.variations[0].id, } : undefined); const ScreenshotChangesModal = ({ slices, defaultVariationSelector, onUploadSuccess, }: { slices: ComponentUI[]; defaultVariationSelector?: SliceVariationSelector; onUploadSuccess?: (newSlice: ComponentUI) => void; }) => { const { closeModals } = useSliceMachineActions(); const { isOpen } = useSelector((store: SliceMachineStoreType) => ({ isOpen: isModalOpen(store, ModalKeysEnum.SCREENSHOTS), })); const [variationSelector, setVariationSelector] = useState( variationSetter(defaultVariationSelector, slices), ); useEffect(() => { setVariationSelector(variationSetter(defaultVariationSelector, slices)); // eslint-disable-next-line react-hooks/exhaustive-deps }, [ defaultVariationSelector?.sliceID, defaultVariationSelector?.variationID, isOpen, ]); if (slices.length === 0 || !variationSelector) return null; const supportsClipboardRead = typeof navigator.clipboard.read === "function"; return ( closeModals()} > Slice screenshots closeModals()} /> } Footer={null} > {slices.map((slice, i) => ( ))} {supportsClipboardRead ? : undefined} {(() => { const slice = slices.find( (s) => s.model.id === variationSelector.sliceID, ); return slice ? ( ) : null; })()} ); }; function CardHeader({ children }: { children: ReactNode }) { const radius = useCardRadius(); return ( `1px solid ${String(t.colors?.borders)}`, }} > {children} ); } export default ScreenshotChangesModal;