{"version":3,"file":"useImagePickerCrop.hook.cjs","sources":["../../../../../src/components/forms/image-picker/hooks/useImagePickerCrop.hook.ts"],"sourcesContent":["import type { Area, Point } from 'react-easy-crop'\r\nimport { useCallback, useEffect, useState } from 'react'\r\n\r\nimport type {\r\n    UseImagePickerCropOptions,\r\n    UseImagePickerCropReturn,\r\n} from '@components/forms/image-picker/hooks/types'\r\nimport { createImagePickerCroppedFile } from '@components/forms/image-picker/utils/imagePicker.utils.ts'\r\n\r\n/**\r\n * Manages cropper state and turns a selected crop area into a local file.\r\n *\r\n * The hook does not update picker state itself. Its caller decides when the\r\n * generated file becomes the committed ImagePicker value.\r\n */\r\nexport const useImagePickerCrop = ({\r\n    file,\r\n    cropErrorLabel,\r\n    onConfirm,\r\n}: UseImagePickerCropOptions): UseImagePickerCropReturn => {\r\n    const [imageUrl, setImageUrl] = useState<string>()\r\n    const [crop, setCrop] = useState<Point>({ x: 0, y: 0 })\r\n    const [zoom, setZoom] = useState(1)\r\n    const [croppedAreaPixels, setCroppedAreaPixels] = useState<Area>()\r\n    const [isProcessing, setIsProcessing] = useState(false)\r\n    const [cropError, setCropError] = useState<string>()\r\n\r\n    useEffect(() => {\r\n        setCrop({ x: 0, y: 0 })\r\n        setZoom(1)\r\n        setCroppedAreaPixels(undefined)\r\n        setCropError(undefined)\r\n\r\n        if (\r\n            typeof URL === 'undefined'\r\n            || typeof URL.createObjectURL !== 'function'\r\n        ) {\r\n            setImageUrl(undefined)\r\n            setCropError(cropErrorLabel)\r\n            return\r\n        }\r\n\r\n        const objectUrl = URL.createObjectURL(file)\r\n        setImageUrl(objectUrl)\r\n\r\n        return () => {\r\n            if (typeof URL.revokeObjectURL === 'function') {\r\n                URL.revokeObjectURL(objectUrl)\r\n            }\r\n        }\r\n    }, [cropErrorLabel, file])\r\n\r\n    const handleCropComplete = useCallback(\r\n        (_croppedArea: Area, nextCroppedAreaPixels: Area) => {\r\n            setCroppedAreaPixels(nextCroppedAreaPixels)\r\n        },\r\n        [],\r\n    )\r\n\r\n    const handleMediaLoaded = useCallback(() => {\r\n        setCropError(undefined)\r\n    }, [])\r\n\r\n    const handleMediaError = useCallback(() => {\r\n        setCropError(cropErrorLabel)\r\n    }, [cropErrorLabel])\r\n\r\n    const handleConfirm = useCallback(async () => {\r\n        if (!imageUrl || !croppedAreaPixels || isProcessing) {\r\n            return\r\n        }\r\n\r\n        setIsProcessing(true)\r\n        setCropError(undefined)\r\n\r\n        let croppedFile: File\r\n        try {\r\n            croppedFile = await createImagePickerCroppedFile(\r\n                file,\r\n                croppedAreaPixels,\r\n            )\r\n        } catch {\r\n            setCropError(cropErrorLabel)\r\n            setIsProcessing(false)\r\n            return\r\n        }\r\n\r\n        setIsProcessing(false)\r\n        onConfirm(croppedFile)\r\n    }, [\r\n        cropErrorLabel,\r\n        croppedAreaPixels,\r\n        file,\r\n        imageUrl,\r\n        isProcessing,\r\n        onConfirm,\r\n    ])\r\n\r\n    return {\r\n        imageUrl,\r\n        crop,\r\n        setCrop,\r\n        zoom,\r\n        setZoom,\r\n        croppedAreaPixels,\r\n        handleCropComplete,\r\n        handleMediaLoaded,\r\n        handleMediaError,\r\n        isProcessing,\r\n        cropError,\r\n        handleConfirm,\r\n    }\r\n}\r\n"],"names":["useImagePickerCrop","file","cropErrorLabel","onConfirm","imageUrl","setImageUrl","useState","crop","setCrop","zoom","setZoom","croppedAreaPixels","setCroppedAreaPixels","isProcessing","setIsProcessing","cropError","setCropError","useEffect","objectUrl","handleCropComplete","useCallback","_croppedArea","nextCroppedAreaPixels","handleMediaLoaded","handleMediaError","handleConfirm","croppedFile","createImagePickerCroppedFile"],"mappings":"qJAeaA,EAAqB,CAAC,CAC/B,KAAAC,EACA,eAAAC,EACA,UAAAC,CACJ,IAA2D,CACvD,KAAM,CAACC,EAAUC,CAAW,EAAIC,WAAA,EAC1B,CAACC,EAAMC,CAAO,EAAIF,EAAAA,SAAgB,CAAE,EAAG,EAAG,EAAG,EAAG,EAChD,CAACG,EAAMC,CAAO,EAAIJ,EAAAA,SAAS,CAAC,EAC5B,CAACK,EAAmBC,CAAoB,EAAIN,WAAA,EAC5C,CAACO,EAAcC,CAAe,EAAIR,EAAAA,SAAS,EAAK,EAChD,CAACS,EAAWC,CAAY,EAAIV,WAAA,EAElCW,EAAAA,UAAU,IAAM,CAMZ,GALAT,EAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EACtBE,EAAQ,CAAC,EACTE,EAAqB,MAAS,EAC9BI,EAAa,MAAS,EAGlB,OAAO,IAAQ,KACZ,OAAO,IAAI,iBAAoB,WACpC,CACEX,EAAY,MAAS,EACrBW,EAAad,CAAc,EAC3B,MACJ,CAEA,MAAMgB,EAAY,IAAI,gBAAgBjB,CAAI,EAC1C,OAAAI,EAAYa,CAAS,EAEd,IAAM,CACL,OAAO,IAAI,iBAAoB,YAC/B,IAAI,gBAAgBA,CAAS,CAErC,CACJ,EAAG,CAAChB,EAAgBD,CAAI,CAAC,EAEzB,MAAMkB,EAAqBC,EAAAA,YACvB,CAACC,EAAoBC,IAAgC,CACjDV,EAAqBU,CAAqB,CAC9C,EACA,CAAA,CAAC,EAGCC,EAAoBH,EAAAA,YAAY,IAAM,CACxCJ,EAAa,MAAS,CAC1B,EAAG,CAAA,CAAE,EAECQ,EAAmBJ,EAAAA,YAAY,IAAM,CACvCJ,EAAad,CAAc,CAC/B,EAAG,CAACA,CAAc,CAAC,EAEbuB,EAAgBL,EAAAA,YAAY,SAAY,CAC1C,GAAI,CAAChB,GAAY,CAACO,GAAqBE,EACnC,OAGJC,EAAgB,EAAI,EACpBE,EAAa,MAAS,EAEtB,IAAIU,EACJ,GAAI,CACAA,EAAc,MAAMC,EAAAA,6BAChB1B,EACAU,CAAA,CAER,MAAQ,CACJK,EAAad,CAAc,EAC3BY,EAAgB,EAAK,EACrB,MACJ,CAEAA,EAAgB,EAAK,EACrBX,EAAUuB,CAAW,CACzB,EAAG,CACCxB,EACAS,EACAV,EACAG,EACAS,EACAV,CAAA,CACH,EAED,MAAO,CACH,SAAAC,EACA,KAAAG,EACA,QAAAC,EACA,KAAAC,EACA,QAAAC,EACA,kBAAAC,EACA,mBAAAQ,EACA,kBAAAI,EACA,iBAAAC,EACA,aAAAX,EACA,UAAAE,EACA,cAAAU,CAAA,CAER"}