From 4ef3afb6040a1f52881b455b190315193af05946 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Fri, 16 Dec 2022 14:48:37 -0600 Subject: Fixes to the composer UX around images and scrolling --- src/view/com/composer/ComposePost.tsx | 111 ++++++++++++++++---------- src/view/com/composer/PhotoCarouselPicker.tsx | 11 +-- src/view/com/posts/FeedItem.tsx | 5 +- src/view/com/util/images/AutoSizedImage.tsx | 59 +++++++------- src/view/index.ts | 10 ++- 5 files changed, 116 insertions(+), 80 deletions(-) (limited to 'src') diff --git a/src/view/com/composer/ComposePost.tsx b/src/view/com/composer/ComposePost.tsx index c6d371bc6..65120b663 100644 --- a/src/view/com/composer/ComposePost.tsx +++ b/src/view/com/composer/ComposePost.tsx @@ -4,6 +4,7 @@ import { ActivityIndicator, KeyboardAvoidingView, SafeAreaView, + ScrollView, StyleSheet, Text, TextInput, @@ -32,6 +33,7 @@ import {SelectedPhoto} from './SelectedPhoto' const MAX_TEXT_LENGTH = 256 const DANGER_TEXT_LENGTH = MAX_TEXT_LENGTH +const HITSLOP = {left: 10, top: 10, right: 10, bottom: 10} export const ComposePost = observer(function ComposePost({ replyTo, @@ -48,6 +50,7 @@ export const ComposePost = observer(function ComposePost({ const [processingState, setProcessingState] = useState('') const [error, setError] = useState('') const [text, setText] = useState('') + const [isSelectingPhotos, setIsSelectingPhotos] = useState(false) const [selectedPhotos, setSelectedPhotos] = useState([]) const autocompleteView = useMemo( @@ -81,10 +84,17 @@ export const ComposePost = observer(function ComposePost({ } }, []) + const onPressSelectPhotos = () => { + if (isSelectingPhotos) { + setIsSelectingPhotos(false) + } else if (selectedPhotos.length < 4) { + setIsSelectingPhotos(true) + } + } const onSelectPhotos = (photos: string[]) => { setSelectedPhotos(photos) + setIsSelectingPhotos(false) } - const onChangeText = (newText: string) => { setText(newText) @@ -211,55 +221,71 @@ export const ComposePost = observer(function ComposePost({ {error} )} - {replyTo ? ( - + + {replyTo ? ( + + + + + + {replyTo.text} + + + + ) : undefined} + - - - - {replyTo.text} - - + onChangeText(text)} + placeholder={selectTextInputPlaceholder} + style={styles.textInput}> + {textDecorated} + - ) : undefined} - - - onChangeText(text)} - placeholder={selectTextInputPlaceholder} - style={styles.textInput}> - {textDecorated} - - - - {localPhotos.photos != null && selectedPhotos.length < 4 && ( - - )} + + {isSelectingPhotos && + localPhotos.photos != null && + selectedPhotos.length < 4 && ( + + )} + + + {MAX_TEXT_LENGTH - text.length} @@ -392,5 +418,6 @@ const styles = StyleSheet.create({ alignItems: 'center', borderTopWidth: 1, borderTopColor: colors.gray2, + backgroundColor: colors.white, }, }) diff --git a/src/view/com/composer/PhotoCarouselPicker.tsx b/src/view/com/composer/PhotoCarouselPicker.tsx index 7095e9dd1..86d23313d 100644 --- a/src/view/com/composer/PhotoCarouselPicker.tsx +++ b/src/view/com/composer/PhotoCarouselPicker.tsx @@ -86,6 +86,11 @@ export const PhotoCarouselPicker = ({ style={{color: colors.blue3}} /> + + + {localPhotos.photos.map((item: any, index: number) => ( ))} - - - ) } @@ -109,6 +109,7 @@ const styles = StyleSheet.create({ maxHeight: 96, padding: 8, overflow: 'hidden', + backgroundColor: colors.white, }, galleryButton: { borderWidth: 1, diff --git a/src/view/com/posts/FeedItem.tsx b/src/view/com/posts/FeedItem.tsx index e66858ff6..984fde289 100644 --- a/src/view/com/posts/FeedItem.tsx +++ b/src/view/com/posts/FeedItem.tsx @@ -193,7 +193,7 @@ export const FeedItem = observer(function FeedItem({ style={styles.postText} /> - + () const [imgInfo, setImgInfo] = useState() const [containerInfo, setContainerInfo] = useState() - const calculatedStyle = useMemo(() => { - if (imgInfo && containerInfo) { - // imgInfo.height / imgInfo.width = x / containerInfo.width - // x = imgInfo.height / imgInfo.width * containerInfo.width - return { - height: Math.min( - MAX_HEIGHT, - (imgInfo.height / imgInfo.width) * containerInfo.width, - ), - } - } - return undefined - }, [imgInfo, containerInfo]) useEffect(() => { let aborted = false - Image.getSize( - uri, - (width: number, height: number) => { - if (!aborted) { - setImgInfo({width, height}) - } - }, - (error: any) => { - if (!aborted) { - setError(String(error)) - } - }, - ) + if (!imgInfo) { + Image.getSize( + uri, + (width: number, height: number) => { + console.log('gotSize') + if (!aborted) { + setImgInfo({width, height}) + } + }, + (error: any) => { + if (!aborted) { + setError(String(error)) + } + }, + ) + } return () => { aborted = true } - }, [uri]) + }, [uri, imgInfo]) const onLayout = (evt: LayoutChangeEvent) => { setContainerInfo({ @@ -71,6 +62,18 @@ export function AutoSizedImage({ }) } + let calculatedStyle: StyleProp | undefined + if (imgInfo && containerInfo) { + // imgInfo.height / imgInfo.width = x / containerInfo.width + // x = imgInfo.height / imgInfo.width * containerInfo.width + calculatedStyle = { + height: Math.min( + MAX_HEIGHT, + (imgInfo.height / imgInfo.width) * containerInfo.width, + ), + } + } + return ( diff --git a/src/view/index.ts b/src/view/index.ts index 71769471b..8f119cd16 100644 --- a/src/view/index.ts +++ b/src/view/index.ts @@ -18,6 +18,7 @@ import {faBell} from '@fortawesome/free-solid-svg-icons/faBell' import {faBell as farBell} from '@fortawesome/free-regular-svg-icons/faBell' import {faBookmark} from '@fortawesome/free-solid-svg-icons/faBookmark' import {faBookmark as farBookmark} from '@fortawesome/free-regular-svg-icons/faBookmark' +import {faCamera} from '@fortawesome/free-solid-svg-icons/faCamera' import {faCheck} from '@fortawesome/free-solid-svg-icons/faCheck' import {faCircleCheck} from '@fortawesome/free-regular-svg-icons/faCircleCheck' import {faCircleUser} from '@fortawesome/free-regular-svg-icons/faCircleUser' @@ -33,6 +34,8 @@ import {faGlobe} from '@fortawesome/free-solid-svg-icons/faGlobe' import {faHeart} from '@fortawesome/free-regular-svg-icons/faHeart' import {faHeart as fasHeart} from '@fortawesome/free-solid-svg-icons/faHeart' import {faHouse} from '@fortawesome/free-solid-svg-icons/faHouse' +import {faImage as farImage} from '@fortawesome/free-regular-svg-icons/faImage' +import {faImage} from '@fortawesome/free-solid-svg-icons/faImage' import {faLink} from '@fortawesome/free-solid-svg-icons/faLink' import {faLock} from '@fortawesome/free-solid-svg-icons/faLock' import {faMagnifyingGlass} from '@fortawesome/free-solid-svg-icons/faMagnifyingGlass' @@ -58,8 +61,6 @@ import {faUserXmark} from '@fortawesome/free-solid-svg-icons/faUserXmark' import {faTicket} from '@fortawesome/free-solid-svg-icons/faTicket' import {faTrashCan} from '@fortawesome/free-regular-svg-icons/faTrashCan' import {faX} from '@fortawesome/free-solid-svg-icons/faX' -import {faCamera} from '@fortawesome/free-solid-svg-icons/faCamera' -import {faImage} from '@fortawesome/free-solid-svg-icons/faImage' import {faXmark} from '@fortawesome/free-solid-svg-icons/faXmark' export function setup() { @@ -82,6 +83,7 @@ export function setup() { farBell, faBookmark, farBookmark, + faCamera, faCheck, faCircleCheck, faCircleUser, @@ -97,6 +99,8 @@ export function setup() { faHeart, fasHeart, faHouse, + faImage, + farImage, faLink, faLock, faMagnifyingGlass, @@ -122,8 +126,6 @@ export function setup() { faTicket, faTrashCan, faX, - faCamera, - faImage, faXmark, ) } -- cgit 1.4.1