Allow images as well as videos

This commit is contained in:
Brandon Presley 2022-12-18 23:15:36 +13:00
parent f9ea32573e
commit 237cd64887
2 changed files with 63 additions and 53 deletions

42
App.tsx
View File

@ -4,8 +4,8 @@ import DocumentPicker, {
DocumentPickerResponse, DocumentPickerResponse,
types, types,
} from 'react-native-document-picker' } from 'react-native-document-picker'
import Video from 'react-native-video'
import {backgroundColor} from './constants' import {backgroundColor} from './constants'
import Item from './Item'
const buttonWidth = '45%' const buttonWidth = '45%'
@ -13,12 +13,11 @@ export default function App() {
const [files, setFiles] = useState<DocumentPickerResponse[]>([]) const [files, setFiles] = useState<DocumentPickerResponse[]>([])
const [selected, setSelected] = useState(0) const [selected, setSelected] = useState(0)
const [paused, setPaused] = useState(false) const [paused, setPaused] = useState(false)
const [width, setWidth] = useState(0)
const height = Dimensions.get('screen').height
const pick = async () => { const pick = async () => {
const picked = await DocumentPicker.pickMultiple({type: types.video}) const picked = await DocumentPicker.pickMultiple({
type: [types.video, types.images],
})
setSelected(0) setSelected(0)
console.log(`Picked ${picked.length} files.`) console.log(`Picked ${picked.length} files.`)
setFiles(picked) setFiles(picked)
@ -47,29 +46,14 @@ export default function App() {
padding: 10, padding: 10,
}}> }}>
{files.length > 0 ? ( {files.length > 0 ? (
<View style={{alignItems: 'center'}}> <>
<Pressable onLongPress={pick} onPress={() => setPaused(!paused)}> <Item
<Video
paused={paused} paused={paused}
style={{ setPaused={setPaused}
height: height - height * 0.25, onLongPress={pick}
width, selected={selected}
alignItems: 'center', files={files}
}}
source={{uri: files[selected].uri}}
resizeMode="contain"
onLoad={response => {
setWidth(response.naturalSize.width)
}}
/> />
</Pressable>
<Text
style={{
color: 'white',
margin: 10,
}}>
{files[selected].name} ({selected + 1}/ {files.length})
</Text>
<View style={{flexDirection: 'row', justifyContent: 'space-around'}}> <View style={{flexDirection: 'row', justifyContent: 'space-around'}}>
<View style={{width: buttonWidth, marginRight: 10}}> <View style={{width: buttonWidth, marginRight: 10}}>
<Button title="Prev" disabled={selected <= 0} onPress={prev} /> <Button title="Prev" disabled={selected <= 0} onPress={prev} />
@ -82,9 +66,11 @@ export default function App() {
/> />
</View> </View>
</View> </View>
</View> </>
) : ( ) : (
<Pressable onPress={pick}> <Pressable
onPress={pick}
style={{height: '100%', justifyContent: 'center'}}>
<Text style={{color: 'white', fontSize: 24}}>Select video(s)...</Text> <Text style={{color: 'white', fontSize: 24}}>Select video(s)...</Text>
</Pressable> </Pressable>
)} )}

View File

@ -1,42 +1,66 @@
import {useState} from 'react' import {useMemo, useState} from 'react'
import {Dimensions, Pressable, Text, View} from 'react-native' import {Dimensions, Image, Pressable, Text, View} from 'react-native'
import {DocumentPickerResponse} from 'react-native-document-picker' import {DocumentPickerResponse, types} from 'react-native-document-picker'
import Video from 'react-native-video' import Video from 'react-native-video'
export default function Item({ export default function Item({
value, files,
onLongPress, onLongPress,
selected,
paused,
setPaused,
}: { }: {
value: DocumentPickerResponse files: DocumentPickerResponse[]
onLongPress: () => void onLongPress: () => void
selected: number
paused: boolean
setPaused: (value: boolean) => void
}) { }) {
const [paused, setPaused] = useState(false)
const [width, setWidth] = useState(0) const [width, setWidth] = useState(0)
const screenHeight = Dimensions.get('screen').height
const file = useMemo(() => files[selected], [files, selected])
const height = Dimensions.get('screen').height const video = (
return (
<View style={{alignItems: 'center'}}>
<Pressable onLongPress={onLongPress} onPress={() => setPaused(!paused)}> <Pressable onLongPress={onLongPress} onPress={() => setPaused(!paused)}>
<Video <Video
paused={paused} paused={paused}
style={{ style={{
height: height - height * 0.25, height: screenHeight - screenHeight * 0.25,
width, width,
alignItems: 'center', alignItems: 'center',
}} }}
source={{uri: value.uri}} source={{uri: file.uri}}
resizeMode="contain" resizeMode="contain"
onLoad={response => { onLoad={response => {
setWidth(response.naturalSize.width) setWidth(response.naturalSize.width)
}} }}
/> />
</Pressable> </Pressable>
)
const image = (
<Pressable onLongPress={onLongPress}>
<Image
source={{
uri: file.uri,
width: 300,
height: screenHeight - screenHeight * 0.25,
}}
resizeMode="contain"
onLoad={({nativeEvent}) => setWidth(nativeEvent.source.width)}
/>
</Pressable>
)
return (
<View style={{alignItems: 'center'}}>
{file.type?.includes('video') ? video : image}
<Text <Text
style={{ style={{
color: 'white', color: 'white',
margin: 10,
}}> }}>
{value.name} {file.name} ({selected + 1}/ {files.length})
</Text> </Text>
</View> </View>
) )