import React from 'react' import {StyleSheet, TouchableOpacity, View} from 'react-native' import ImageEditor from 'react-avatar-editor' import {Slider} from '@miblanchard/react-native-slider' import LinearGradient from 'react-native-linear-gradient' import {Text} from 'view/com/util/text/Text' import {Dimensions} from 'lib/media/types' import {getDataUriSize} from 'lib/media/util' import {s, gradients} from 'lib/styles' import {useStores} from 'state/index' import {usePalette} from 'lib/hooks/usePalette' import {SquareIcon, RectWideIcon, RectTallIcon} from 'lib/icons' import {Image as RNImage} from 'react-native-image-crop-picker' enum AspectRatio { Square = 'square', Wide = 'wide', Tall = 'tall', } const DIMS: Record = { [AspectRatio.Square]: {width: 1000, height: 1000}, [AspectRatio.Wide]: {width: 1000, height: 750}, [AspectRatio.Tall]: {width: 750, height: 1000}, } export const snapPoints = ['0%'] export function Component({ uri, onSelect, }: { uri: string onSelect: (img?: RNImage) => void }) { const store = useStores() const pal = usePalette('default') const [as, setAs] = React.useState(AspectRatio.Square) const [scale, setScale] = React.useState(1) const editorRef = React.useRef(null) const doSetAs = (v: AspectRatio) => () => setAs(v) const onPressCancel = () => { onSelect(undefined) store.shell.closeModal() } const onPressDone = () => { const canvas = editorRef.current?.getImageScaledToCanvas() if (canvas) { const dataUri = canvas.toDataURL('image/jpeg') onSelect({ path: dataUri, mime: 'image/jpeg', size: getDataUriSize(dataUri), width: DIMS[as].width, height: DIMS[as].height, }) } else { onSelect(undefined) } store.shell.closeModal() } let cropperStyle if (as === AspectRatio.Square) { cropperStyle = styles.cropperSquare } else if (as === AspectRatio.Wide) { cropperStyle = styles.cropperWide } else if (as === AspectRatio.Tall) { cropperStyle = styles.cropperTall } return ( setScale(Array.isArray(v) ? v[0] : v) } minimumValue={1} maximumValue={3} containerStyle={styles.slider} /> Cancel Done ) } const styles = StyleSheet.create({ cropper: { marginLeft: 'auto', marginRight: 'auto', borderWidth: 1, borderRadius: 4, overflow: 'hidden', }, cropperSquare: { width: 400, height: 400, }, cropperWide: { width: 400, height: 300, }, cropperTall: { width: 300, height: 400, }, imageEditor: { maxWidth: '100%', }, ctrls: { flexDirection: 'row', alignItems: 'center', marginTop: 10, }, slider: { flex: 1, marginRight: 10, }, btns: { flexDirection: 'row', alignItems: 'center', marginTop: 10, }, btn: { borderRadius: 4, paddingVertical: 8, paddingHorizontal: 24, }, })