Implement image uploading in the web composer
This commit is contained in:
parent
0f293ecf95
commit
4182edfd7e
19 changed files with 338 additions and 281 deletions
|
@ -8,7 +8,7 @@ import {
|
|||
} from 'react-native'
|
||||
import LinearGradient from 'react-native-linear-gradient'
|
||||
import {ScrollView, TextInput} from './util'
|
||||
import {PickedMedia} from '../util/images/image-crop-picker/ImageCropPicker'
|
||||
import {PickedMedia} from '../../../lib/media/picker'
|
||||
import {Text} from '../util/text/Text'
|
||||
import {ErrorMessage} from '../util/error/ErrorMessage'
|
||||
import {useStores} from 'state/index'
|
||||
|
@ -16,7 +16,7 @@ import {ProfileViewModel} from 'state/models/profile-view'
|
|||
import {s, colors, gradients} from 'lib/styles'
|
||||
import {enforceLen} from 'lib/strings/helpers'
|
||||
import {MAX_DISPLAY_NAME, MAX_DESCRIPTION} from 'lib/constants'
|
||||
import {compressIfNeeded} from 'lib/images'
|
||||
import {compressIfNeeded} from 'lib/media/manip'
|
||||
import {UserBanner} from '../util/UserBanner'
|
||||
import {UserAvatar} from '../util/UserAvatar'
|
||||
import {usePalette} from 'lib/hooks/usePalette'
|
||||
|
|
|
@ -21,7 +21,10 @@ export const Modal = observer(function Modal() {
|
|||
return null
|
||||
}
|
||||
|
||||
const onClose = () => {
|
||||
const onPressMask = () => {
|
||||
if (store.shell.activeModal?.name === 'crop-image') {
|
||||
return // dont close on mask presses during crop
|
||||
}
|
||||
store.shell.closeModal()
|
||||
}
|
||||
const onInnerPress = () => {
|
||||
|
@ -70,7 +73,7 @@ export const Modal = observer(function Modal() {
|
|||
}
|
||||
|
||||
return (
|
||||
<TouchableWithoutFeedback onPress={onClose}>
|
||||
<TouchableWithoutFeedback onPress={onPressMask}>
|
||||
<View style={styles.mask}>
|
||||
<TouchableWithoutFeedback onPress={onInnerPress}>
|
||||
<View style={[styles.container, pal.view]}>{element}</View>
|
||||
|
|
|
@ -38,6 +38,7 @@ export function Component({
|
|||
const pal = usePalette('default')
|
||||
const [as, setAs] = React.useState<AspectRatio>(AspectRatio.Square)
|
||||
const [scale, setScale] = React.useState<number>(1)
|
||||
const editorRef = React.useRef<ImageEditor>(null)
|
||||
|
||||
const doSetAs = (v: AspectRatio) => () => setAs(v)
|
||||
|
||||
|
@ -46,8 +47,20 @@ export function Component({
|
|||
store.shell.closeModal()
|
||||
}
|
||||
const onPressDone = () => {
|
||||
console.log('TODO')
|
||||
onSelect(undefined) // TODO
|
||||
const canvas = editorRef.current?.getImageScaledToCanvas()
|
||||
if (canvas) {
|
||||
const dataUri = canvas.toDataURL('image/jpeg')
|
||||
onSelect({
|
||||
mediaType: 'photo',
|
||||
path: dataUri,
|
||||
mime: 'image/jpeg',
|
||||
size: Math.round((dataUri.length * 3) / 4), // very rough estimate
|
||||
width: DIMS[as].width,
|
||||
height: DIMS[as].height,
|
||||
})
|
||||
} else {
|
||||
onSelect(undefined)
|
||||
}
|
||||
store.shell.closeModal()
|
||||
}
|
||||
|
||||
|
@ -61,13 +74,15 @@ export function Component({
|
|||
}
|
||||
return (
|
||||
<View>
|
||||
<View style={[styles.cropper, cropperStyle]}>
|
||||
<View style={[styles.cropper, pal.borderDark, cropperStyle]}>
|
||||
<ImageEditor
|
||||
ref={editorRef}
|
||||
style={styles.imageEditor}
|
||||
image={uri}
|
||||
width={DIMS[as].width}
|
||||
height={DIMS[as].height}
|
||||
scale={scale}
|
||||
border={0}
|
||||
/>
|
||||
</View>
|
||||
<View style={styles.ctrls}>
|
||||
|
@ -126,6 +141,9 @@ const styles = StyleSheet.create({
|
|||
cropper: {
|
||||
marginLeft: 'auto',
|
||||
marginRight: 'auto',
|
||||
borderWidth: 1,
|
||||
borderRadius: 4,
|
||||
overflow: 'hidden',
|
||||
},
|
||||
cropperSquare: {
|
||||
width: 400,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue