import 'react-image-crop/dist/ReactCrop.css' import {useCallback, useImperativeHandle, useRef, useState} from 'react' import {View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import ReactCrop, {type PercentCrop} from 'react-image-crop' import { type ImageSource, type ImageTransformation, manipulateImage, } from '#/state/gallery' import {atoms as a, useTheme} from '#/alf' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import {Loader} from '#/components/Loader' import {type EditImageDialogProps} from './EditImageDialog' export function EditImageDialog(props: EditImageDialogProps) { return ( ) } function DialogInner({ control, image, onChange, circularCrop, aspectRatio, }: EditImageDialogProps) { const {_} = useLingui() const [pending, setPending] = useState(false) const ref = useRef<{save: () => Promise}>(null) const cancelButton = useCallback( () => ( ), [control, _, pending], ) const saveButton = useCallback( () => ( ), [_, pending], ) return ( Edit image }> {image && ( )} ) } function EditImageInner({ image, onChange, saveRef, circularCrop = false, aspectRatio, }: Required> & Omit & { saveRef: React.RefObject<{save: () => Promise}> }) { const t = useTheme() const [isDragging, setIsDragging] = useState(false) const {_} = useLingui() const control = Dialog.useDialogContext() const source = image.source const initialCrop = getInitialCrop(source, image.manips) const [crop, setCrop] = useState(initialCrop) const onPressSubmit = useCallback(async () => { const result = await manipulateImage(image, { crop: crop && (crop.width || crop.height) !== 0 ? { originX: (crop.x * source.width) / 100, originY: (crop.y * source.height) / 100, width: (crop.width * source.width) / 100, height: (crop.height * source.height) / 100, } : undefined, }) control.close(() => { onChange(result) }) }, [crop, image, source, control, onChange]) useImperativeHandle( saveRef, () => ({ save: onPressSubmit, }), [onPressSubmit], ) return ( setCrop(percentCrop)} className="ReactCrop--no-animate" onDragStart={() => setIsDragging(true)} onDragEnd={() => setIsDragging(false)}> {/* Eat clicks when dragging, otherwise mousing up over the backdrop causes the dialog to close */} {isDragging && } ) } const getInitialCrop = ( source: ImageSource, manips: ImageTransformation | undefined, ): PercentCrop | undefined => { const initialArea = manips?.crop if (initialArea) { return { unit: '%', x: (initialArea.originX / source.width) * 100, y: (initialArea.originY / source.height) * 100, width: (initialArea.width / source.width) * 100, height: (initialArea.height / source.height) * 100, } } }