Skip to content

Commit

Permalink
example: revive React Native example (#4164)
Browse files Browse the repository at this point in the history
  • Loading branch information
giacomocerquone authored Jan 5, 2023
1 parent d9580d9 commit 38dfb70
Show file tree
Hide file tree
Showing 23 changed files with 1,840 additions and 1,469 deletions.
8 changes: 8 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,14 @@ module.exports = {
'examples/vue/**/*.js',
'examples/vue3/**/*.js',
],
rules: {
'no-unused-vars': [
'error',
{
'varsIgnorePattern': 'React',
},
],
},
parserOptions: {
sourceType: 'module',
},
Expand Down
3 changes: 2 additions & 1 deletion examples/react-native-expo/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"rules": {
"react/react-in-jsx-scope": "off"
"react/react-in-jsx-scope": "off",
"no-use-before-define": "off"
}
}
4 changes: 4 additions & 0 deletions examples/react-native-expo/.expo-shared/assets.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb": true,
"40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd": true
}
11 changes: 9 additions & 2 deletions examples/react-native-expo/.gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
node_modules/**/*
.expo/*
node_modules/
.expo/
dist/
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/

# macOS
.DS_Store
1 change: 0 additions & 1 deletion examples/react-native-expo/.watchmanconfig

This file was deleted.

235 changes: 116 additions & 119 deletions examples/react-native-expo/App.js
Original file line number Diff line number Diff line change
@@ -1,175 +1,172 @@
// import * as Expo from 'expo'
import React from 'react'
import {
Text,
View,
AsyncStorage,
Image,
} from 'react-native'
import React, { useEffect, useState, useCallback } from 'react'
import { Text, View, Image, StyleSheet } from 'react-native'
import AsyncStorage from '@react-native-async-storage/async-storage'
import Uppy from '@uppy/core'
import Tus from '@uppy/tus'
import UppyFilePicker from '@uppy/react-native'
import FilePicker from '@uppy/react-native'
import useUppy from '@uppy/react/lib/useUppy'
import FileList from './FileList'
import PauseResumeButton from './PauseResumeButton'
import ProgressBar from './ProgressBar'
import SelectFiles from './SelectFilesButton'
import getTusFileReader from './tusFileReader'

export default class App extends React.Component {
constructor () {
super()

this.state = {
progress: 0,
total: 0,
file: null,
uploadURL: null,
isFilePickerVisible: false,
isPaused: false,
uploadStarted: false,
uploadComplete: false,
info: null,
totalProgress: 0,
}

this.isReactNative = (typeof navigator !== 'undefined'
&& typeof navigator.product === 'string'
&& navigator.product.toLowerCase() === 'reactnative')

this.showFilePicker = this.showFilePicker.bind(this)
this.hideFilePicker = this.hideFilePicker.bind(this)
this.togglePauseResume = this.togglePauseResume.bind(this)
export default function App () {
const [state, _setState] = useState({
progress: 0,
total: 0,
file: null,
uploadURL: null,
isFilePickerVisible: false,
isPaused: false,
uploadStarted: false,
uploadComplete: false,
info: null,
totalProgress: 0,
})

const setState = useCallback((newState) => _setState((oldState) => ({ ...oldState, ...newState })), [])

const uppy = useUppy(() => {
return new Uppy({ autoProceed: true, debug: true })
.use(Tus, {
endpoint: 'https://tusd.tusdemo.net/files/',
urlStorage: AsyncStorage,
fileReader: getTusFileReader,
chunkSize: 10 * 1024 * 1024, // keep the chunk size small to avoid memory exhaustion
})
})

console.log('Is this React Native?', this.isReactNative)
this.uppy = new Uppy({ autoProceed: true, debug: true })
this.uppy.use(Tus, {
endpoint: 'https://tusd.tusdemo.net/files/',
urlStorage: AsyncStorage,
fileReader: getTusFileReader,
chunkSize: 10 * 1024 * 1024, // keep the chunk size small to avoid memory exhaustion
})
this.uppy.on('upload-progress', (file, progress) => {
this.setState({
useEffect(() => {
uppy.on('upload-progress', (file, progress) => {
setState({
progress: progress.bytesUploaded,
total: progress.bytesTotal,
totalProgress: this.uppy.state.totalProgress,
totalProgress: uppy.state.totalProgress,
uploadStarted: true,
})
})
this.uppy.on('upload-success', () => {
uppy.on('upload-success', () => {
// console.log(file.name, response)
})
this.uppy.on('complete', (result) => {
this.setState({
status: 'Upload complete ✅',
uppy.on('complete', (result) => {
setState({
status: result.successful[0] ? 'Upload complete ✅' : 'Upload errored ❌',
uploadURL: result.successful[0] ? result.successful[0].uploadURL : null,
uploadComplete: true,
uploadStarted: false,
})
console.log('Upload complete:', result)
})

this.uppy.on('info-visible', () => {
const { info } = this.uppy.getState()
this.setState({
uppy.on('info-visible', () => {
const { info } = uppy.getState()
setState({
info,
})
console.log('uppy-info:', info)
})

this.uppy.on('info-hidden', () => {
this.setState({
uppy.on('info-hidden', () => {
setState({
info: null,
})
})
}
}, [setState, uppy])

showFilePicker () {
this.setState({
const showFilePicker = () => {
setState({
isFilePickerVisible: true,
uploadStarted: false,
uploadComplete: false,
})
}

hideFilePicker () {
this.setState({
const hideFilePicker = () => {
setState({
isFilePickerVisible: false,
})
}

togglePauseResume () {
if (this.state.isPaused) {
this.uppy.resumeAll()
this.setState({
const togglePauseResume = () => {
if (state.isPaused) {
uppy.resumeAll()
setState({
isPaused: false,
})
} else {
this.uppy.pauseAll()
this.setState({
uppy.pauseAll()
setState({
isPaused: true,
})
}
}

render () {
return (
<View style={{
paddingTop: 100,
paddingLeft: 50,
paddingRight: 50,
flex: 1,
}}
return (
<View
style={styles.root}
>
<Text
style={styles.title}
>
<Text style={{
fontSize: 25,
marginBottom: 20,
textAlign: 'center',
}}
Uppy in React Native
</Text>
<View style={{ alignItems: 'center' }}>
<Image
style={styles.logo}
source={require('./assets/uppy-logo.png')}
/>
</View>
<SelectFiles showFilePicker={showFilePicker} />

{state.info ? (
<Text
style={{
marginBottom: 10,
marginTop: 10,
color: '#b8006b',
}}
>
Uppy in React Native
{state.info.message}
</Text>
<View style={{ alignItems: 'center' }}>
<Image
style={{ width: 80, height: 78, marginBottom: 50 }}
source={require('./assets/uppy-logo.png')}
/>
</View>
<SelectFiles showFilePicker={this.showFilePicker} />

{this.state.info ? (
<Text
style={{
marginBottom: 10,
marginTop: 10,
color: '#b8006b',
}}
>
{this.state.info.message}
</Text>
) : null}

<ProgressBar progress={this.state.totalProgress} />

<PauseResumeButton
isPaused={this.state.isPaused}
onPress={this.togglePauseResume}
uploadStarted={this.state.uploadStarted}
uploadComplete={this.state.uploadComplete}
/>

<UppyFilePicker
uppy={this.uppy}
show={this.state.isFilePickerVisible}
onRequestClose={this.hideFilePicker}
) : null}

<ProgressBar progress={state.totalProgress} />

<PauseResumeButton
isPaused={state.isPaused}
onPress={togglePauseResume}
uploadStarted={state.uploadStarted}
uploadComplete={state.uploadComplete}
/>

{uppy && (
<FilePicker
uppy={uppy}
show={state.isFilePickerVisible}
onRequestClose={hideFilePicker}
companionUrl="http://localhost:3020"
/>
)}

<FileList uppy={this.uppy} />
{uppy && <FileList uppy={uppy} />}

{/* <Text>{this.state.status ? 'Status: ' + this.state.status : null}</Text>
<Text>{this.state.progress} of {this.state.total}</Text> */}
</View>
)
}
{state.status && <Text>Status: {state.status}</Text>}
<Text>{state.progress} of {state.total}</Text>
</View>
)
}

const styles = StyleSheet.create({
root: {
paddingTop: 100,
paddingBottom: 20,
paddingLeft: 50,
paddingRight: 50,
flex: 1,
},
title: {
fontSize: 25,
marginBottom: 20,
textAlign: 'center',
},
logo: { width: 80, height: 78, marginBottom: 50 },
})
Loading

0 comments on commit 38dfb70

Please sign in to comment.