{"version":3,"file":"PreviewBox.mjs","sources":["../../../../../admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Flex, IconButton } from '@strapi/design-system';\nimport { Crop as Resize, Download as DownloadIcon, Trash, PinMap } from '@strapi/icons';\nimport cropperjscss from 'cropperjs/dist/cropper.css?raw';\nimport { useIntl } from 'react-intl';\nimport { createGlobalStyle } from 'styled-components';\n\nimport { AssetType } from '../../../enums';\nimport { useCropImg } from '../../../hooks/useCropImg';\nimport { useEditAsset } from '../../../hooks/useEditAsset';\nimport { useTracking } from '../../../hooks/useTracking';\nimport { useUpload } from '../../../hooks/useUpload';\nimport { appendSearchParamsToUrl, createAssetUrl, getTrad, downloadFile } from '../../../utils';\nimport { CopyLinkButton } from '../../CopyLinkButton/CopyLinkButton';\nimport { UploadProgress } from '../../UploadProgress/UploadProgress';\nimport { RemoveAssetDialog } from '../RemoveAssetDialog';\n\nimport { AssetPreview } from './AssetPreview';\nimport { CroppingActions } from './CroppingActions';\nimport { FocalPointActions } from './FocalPointActions';\nimport {\n  ActionRow,\n  BadgeOverride,\n  RelativeBox,\n  UploadProgressWrapper,\n  Wrapper,\n  FocalPointImageWrapper,\n  FocalPointAim,\n  FocalPointHalo,\n} from './PreviewComponents';\n\nimport type {\n  File as FileDefinition,\n  RawFile,\n  FocalPoint,\n} from '../../../../../shared/contracts/files';\n\ninterface Asset extends Omit<FileDefinition, 'folder'> {\n  isLocal?: boolean;\n  rawFile?: RawFile;\n  folder?: FileDefinition['folder'] & { id: number };\n}\n\ninterface PreviewBoxProps {\n  asset: Asset;\n  canUpdate: boolean;\n  canCopyLink: boolean;\n  canDownload: boolean;\n  replacementFile?: File;\n  onDelete: (asset?: Asset | null) => void;\n  onCropFinish: () => void;\n  onCropStart: () => void;\n  onCropCancel: () => void;\n  trackedLocation?: string;\n  formFocalPoint?: FocalPoint | null;\n  onFocalPointStart: () => void;\n  onFocalPointFinish: (focalPoint: FocalPoint) => void;\n  onFocalPointCancel: () => void;\n}\n\nexport const PreviewBox = ({\n  asset,\n  canUpdate,\n  canCopyLink,\n  canDownload,\n  onDelete,\n  onCropFinish,\n  onCropStart,\n  onCropCancel,\n  replacementFile,\n  trackedLocation,\n  formFocalPoint,\n  onFocalPointStart,\n  onFocalPointFinish,\n  onFocalPointCancel,\n}: PreviewBoxProps) => {\n  const CropperjsStyle = createGlobalStyle`${cropperjscss}`;\n  const { trackUsage } = useTracking();\n  const previewRef = React.useRef(null);\n  const [isCropImageReady, setIsCropImageReady] = React.useState(false);\n  const [hasCropIntent, setHasCropIntent] = React.useState<boolean | null>(null);\n  const [assetUrl, setAssetUrl] = React.useState(createAssetUrl(asset, false));\n  const [thumbnailUrl, setThumbnailUrl] = React.useState(createAssetUrl(asset, true));\n\n  // When loading a cross-origin image for cropping, append a cache-busting parameter\n  // so the browser makes a fresh request with CORS headers instead of serving a\n  // previously cached non-CORS response (which would taint the canvas and break\n  // cropping). Signed URLs are excluded because modifying them invalidates the signature.\n  const cropUrl = React.useMemo(() => {\n    if (!asset.isLocal && !asset.isUrlSigned && assetUrl) {\n      return appendSearchParamsToUrl({ url: assetUrl, params: { updatedAt: asset.updatedAt } });\n    }\n\n    return assetUrl;\n  }, [assetUrl, asset.isLocal, asset.isUrlSigned, asset.updatedAt]);\n\n  const { formatMessage } = useIntl();\n  const [showConfirmDialog, setShowConfirmDialog] = React.useState(false);\n  const { crop, produceFile, stopCropping, isCropping, isCropperReady, width, height } =\n    useCropImg();\n  const { editAsset, error, isLoading, progress, cancel } = useEditAsset();\n  const [isInFocalPointMode, setIsInFocalPointMode] = React.useState<boolean>(false);\n  const [focalPoint, setFocalPoint] = React.useState<FocalPoint>(\n    formFocalPoint ?? { x: 50, y: 50 }\n  );\n\n  const {\n    upload,\n    isLoading: isLoadingUpload,\n    cancel: cancelUpload,\n    error: uploadError,\n    progress: progressUpload,\n  } = useUpload();\n\n  React.useEffect(() => {\n    // Whenever a replacementUrl is set, make sure to permutate the real asset.url by\n    // the locally generated one\n    if (replacementFile) {\n      const fileLocalUrl = URL.createObjectURL(replacementFile);\n\n      if (asset.isLocal) {\n        asset.url = fileLocalUrl;\n      }\n\n      setAssetUrl(fileLocalUrl);\n      setThumbnailUrl(fileLocalUrl);\n    }\n  }, [replacementFile, asset]);\n\n  React.useEffect(() => {\n    if (hasCropIntent === false) {\n      stopCropping();\n      onCropCancel();\n    }\n  }, [hasCropIntent, stopCropping, onCropCancel, onCropFinish]);\n\n  React.useEffect(() => {\n    if (hasCropIntent && isCropImageReady) {\n      crop(previewRef.current!);\n      onCropStart();\n    }\n  }, [isCropImageReady, hasCropIntent, onCropStart, crop]);\n\n  const handleCropping = async () => {\n    const nextAsset = { ...asset, width, height, folder: asset.folder?.id };\n    const file = (await produceFile(nextAsset.name, nextAsset.mime!, nextAsset.updatedAt!)) as File;\n\n    // Making sure that when persisting the new asset, the URL changes with width and height\n    // So that the browser makes a request and handle the image caching correctly at the good size\n    let optimizedCachingImage;\n    let optimizedCachingThumbnailImage;\n\n    if (asset.isLocal) {\n      optimizedCachingImage = URL.createObjectURL(file);\n      optimizedCachingThumbnailImage = optimizedCachingImage;\n      asset.url = optimizedCachingImage;\n      asset.rawFile = file;\n\n      trackUsage('didCropFile', { duplicatedFile: null, location: trackedLocation! });\n    } else {\n      const updatedAsset = await editAsset(nextAsset, file);\n      optimizedCachingImage = createAssetUrl(updatedAsset, false);\n      optimizedCachingThumbnailImage = createAssetUrl(updatedAsset, true);\n\n      trackUsage('didCropFile', { duplicatedFile: false, location: trackedLocation! });\n    }\n\n    setAssetUrl(optimizedCachingImage);\n    setThumbnailUrl(optimizedCachingThumbnailImage);\n    setHasCropIntent(false);\n  };\n\n  const isInCroppingMode = isCropping && !isLoading;\n\n  const handleDuplication = async () => {\n    const nextAsset = { ...asset, width, height };\n    const file = (await produceFile(\n      nextAsset.name,\n      nextAsset.mime!,\n      nextAsset.updatedAt!\n    )) as RawFile;\n\n    await upload({ name: file.name, rawFile: file }, asset.folder?.id ? asset.folder.id : null);\n\n    trackUsage('didCropFile', { duplicatedFile: true, location: trackedLocation! });\n\n    setHasCropIntent(false);\n    onCropFinish();\n  };\n\n  const handleCropCancel = () => {\n    setHasCropIntent(false);\n  };\n\n  const handleCropStart = () => {\n    setHasCropIntent(true);\n  };\n\n  const calculateFocalPointFromEvent = (e: React.MouseEvent<HTMLElement>): FocalPoint => {\n    const { clientX, clientY } = e;\n    const rect = e.currentTarget.getBoundingClientRect();\n    const posX = clientX - rect.left;\n    const posY = clientY - rect.top;\n\n    return {\n      x: Number(((posX / rect.width) * 100).toFixed(2)),\n      y: Number(((posY / rect.height) * 100).toFixed(2)),\n    };\n  };\n\n  const handleFocalPointClick = (e: React.MouseEvent<HTMLElement>) => {\n    if (!isInFocalPointMode) return;\n    setFocalPoint(calculateFocalPointFromEvent(e));\n  };\n\n  const handleFocalPointCancel = () => {\n    setIsInFocalPointMode(false);\n    setFocalPoint(formFocalPoint ?? { x: 50, y: 50 });\n    onFocalPointCancel();\n  };\n\n  const handleFocalPointStart = () => {\n    onFocalPointStart();\n    setIsInFocalPointMode(true);\n  };\n\n  const handleFocalPointValidate = () => {\n    setIsInFocalPointMode(false);\n    onFocalPointFinish(focalPoint);\n  };\n\n  const handleFocalPointReset = () => {\n    setFocalPoint({ x: 50, y: 50 });\n  };\n\n  return (\n    <>\n      <CropperjsStyle />\n      <RelativeBox hasRadius background=\"neutral150\" borderColor=\"neutral200\">\n        {isCropperReady && isInCroppingMode && (\n          <CroppingActions\n            onValidate={handleCropping}\n            onDuplicate={asset.isLocal ? undefined : handleDuplication}\n            onCancel={handleCropCancel}\n          />\n        )}\n\n        {isInFocalPointMode && (\n          <FocalPointActions\n            onValidate={handleFocalPointValidate}\n            onCancel={handleFocalPointCancel}\n            onReset={handleFocalPointReset}\n          />\n        )}\n\n        <ActionRow paddingLeft={3} paddingRight={3} justifyContent=\"flex-end\">\n          <Flex gap={1}>\n            {canUpdate && !asset.isLocal && (\n              <IconButton\n                label={formatMessage({\n                  id: 'global.delete',\n                  defaultMessage: 'Delete',\n                })}\n                onClick={() => setShowConfirmDialog(true)}\n              >\n                <Trash />\n              </IconButton>\n            )}\n\n            {canDownload && (\n              <IconButton\n                label={formatMessage({\n                  id: getTrad('control-card.download'),\n                  defaultMessage: 'Download',\n                })}\n                onClick={() => downloadFile(assetUrl!, asset.name)}\n              >\n                <DownloadIcon />\n              </IconButton>\n            )}\n\n            {canCopyLink && <CopyLinkButton url={assetUrl!} />}\n\n            {canUpdate && asset.mime?.includes(AssetType.Image) && (\n              <IconButton\n                label={formatMessage({ id: getTrad('control-card.crop'), defaultMessage: 'Crop' })}\n                onClick={handleCropStart}\n              >\n                <Resize />\n              </IconButton>\n            )}\n\n            {canUpdate && asset.mime?.includes(AssetType.Image) && (\n              <IconButton\n                label={formatMessage({\n                  id: getTrad('control-card.set-focal-point'),\n                  defaultMessage: 'Set focal point',\n                })}\n                onClick={handleFocalPointStart}\n              >\n                <PinMap />\n              </IconButton>\n            )}\n          </Flex>\n        </ActionRow>\n\n        <Wrapper>\n          {/* This one is for editting an asset */}\n          {isLoading && (\n            <UploadProgressWrapper>\n              <UploadProgress error={error} onCancel={cancel} progress={progress} />\n            </UploadProgressWrapper>\n          )}\n\n          {/* This one is for duplicating an asset after cropping */}\n          {isLoadingUpload && (\n            <UploadProgressWrapper>\n              <UploadProgress\n                error={uploadError}\n                onCancel={cancelUpload}\n                progress={progressUpload}\n              />\n            </UploadProgressWrapper>\n          )}\n\n          <FocalPointImageWrapper>\n            <AssetPreview\n              ref={previewRef}\n              mime={asset.mime!}\n              name={asset.name}\n              url={hasCropIntent ? cropUrl! : thumbnailUrl!}\n              onLoad={() => {\n                if (asset.isLocal || hasCropIntent) {\n                  setIsCropImageReady(true);\n                }\n              }}\n              onClick={handleFocalPointClick}\n              style={{ cursor: isInFocalPointMode ? 'crosshair' : undefined }}\n            />\n\n            {/* Show the set focal point marker */}\n            {isInFocalPointMode && (\n              <FocalPointAim $focalPoint={focalPoint}>\n                <FocalPointHalo />\n              </FocalPointAim>\n            )}\n          </FocalPointImageWrapper>\n        </Wrapper>\n\n        <ActionRow\n          paddingLeft={2}\n          paddingRight={2}\n          justifyContent=\"flex-end\"\n          $blurry={isInCroppingMode || isInFocalPointMode}\n        >\n          {isInCroppingMode && width && height && (\n            <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n              {width && height ? `${height}✕${width}` : 'N/A'}\n            </BadgeOverride>\n          )}\n          {isInFocalPointMode && (\n            <BadgeOverride background=\"neutral900\" color=\"neutral0\">\n              {`x: ${focalPoint.x}% | y: ${focalPoint.y}%`}\n            </BadgeOverride>\n          )}\n        </ActionRow>\n      </RelativeBox>\n\n      <RemoveAssetDialog\n        open={showConfirmDialog}\n        onClose={(value) => {\n          setShowConfirmDialog(false);\n          if (value === null) {\n            onDelete(null);\n          }\n        }}\n        asset={asset}\n      />\n    </>\n  );\n};\n"],"names":["PreviewBox","asset","canUpdate","canCopyLink","canDownload","onDelete","onCropFinish","onCropStart","onCropCancel","replacementFile","trackedLocation","formFocalPoint","onFocalPointStart","onFocalPointFinish","onFocalPointCancel","CropperjsStyle","createGlobalStyle","cropperjscss","trackUsage","useTracking","previewRef","React","useRef","isCropImageReady","setIsCropImageReady","useState","hasCropIntent","setHasCropIntent","assetUrl","setAssetUrl","createAssetUrl","thumbnailUrl","setThumbnailUrl","cropUrl","useMemo","isLocal","isUrlSigned","appendSearchParamsToUrl","url","params","updatedAt","formatMessage","useIntl","showConfirmDialog","setShowConfirmDialog","crop","produceFile","stopCropping","isCropping","isCropperReady","width","height","useCropImg","editAsset","error","isLoading","progress","cancel","useEditAsset","isInFocalPointMode","setIsInFocalPointMode","focalPoint","setFocalPoint","x","y","upload","isLoadingUpload","cancelUpload","uploadError","progressUpload","useUpload","useEffect","fileLocalUrl","URL","createObjectURL","current","handleCropping","nextAsset","folder","id","file","name","mime","optimizedCachingImage","optimizedCachingThumbnailImage","rawFile","duplicatedFile","location","updatedAsset","isInCroppingMode","handleDuplication","handleCropCancel","handleCropStart","calculateFocalPointFromEvent","e","clientX","clientY","rect","currentTarget","getBoundingClientRect","posX","left","posY","top","Number","toFixed","handleFocalPointClick","handleFocalPointCancel","handleFocalPointStart","handleFocalPointValidate","handleFocalPointReset","_jsxs","_Fragment","_jsx","RelativeBox","hasRadius","background","borderColor","CroppingActions","onValidate","onDuplicate","undefined","onCancel","FocalPointActions","onReset","ActionRow","paddingLeft","paddingRight","justifyContent","Flex","gap","IconButton","label","defaultMessage","onClick","Trash","getTrad","downloadFile","DownloadIcon","CopyLinkButton","includes","AssetType","Image","Resize","PinMap","Wrapper","UploadProgressWrapper","UploadProgress","FocalPointImageWrapper","AssetPreview","ref","onLoad","style","cursor","FocalPointAim","$focalPoint","FocalPointHalo","$blurry","BadgeOverride","color","RemoveAssetDialog","open","onClose","value"],"mappings":"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"}