@woshapp/react-native-background-upload 6.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +1 -0
- package/LICENSE +21 -0
- package/README.md +53 -0
- package/android/build.gradle +82 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +6 -0
- package/android/gradle.properties +6 -0
- package/android/gradlew +185 -0
- package/android/gradlew.bat +89 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/com/appfolio/extensions/ContextExtensions.kt +63 -0
- package/android/src/main/java/com/appfolio/extensions/UploadExtensions.kt +57 -0
- package/android/src/main/java/com/appfolio/uploader/GlobalRequestObserverDelegate.kt +62 -0
- package/android/src/main/java/com/appfolio/uploader/ModifiedBinaryUploadRequest.kt +29 -0
- package/android/src/main/java/com/appfolio/uploader/ModifiedHttpUploadRequest.kt +57 -0
- package/android/src/main/java/com/appfolio/uploader/ModifiedMultipartUploadRequest.kt +60 -0
- package/android/src/main/java/com/appfolio/uploader/UploaderModule.kt +384 -0
- package/android/src/main/java/com/appfolio/uploader/UploaderReactPackage.java +32 -0
- package/android/src/main/java/com/appfolio/work/TaskCompletionNotifier.kt +47 -0
- package/android/src/main/java/com/appfolio/work/UploadManager.kt +109 -0
- package/android/src/main/java/com/appfolio/work/UploadWorker.kt +20 -0
- package/bitbucket-pipelines.yml +14 -0
- package/example/RNBackgroundExample/.buckconfig +6 -0
- package/example/RNBackgroundExample/.eslintrc.js +4 -0
- package/example/RNBackgroundExample/.flowconfig +74 -0
- package/example/RNBackgroundExample/.gitattributes +1 -0
- package/example/RNBackgroundExample/.prettierrc.js +6 -0
- package/example/RNBackgroundExample/.watchmanconfig +1 -0
- package/example/RNBackgroundExample/App.js +325 -0
- package/example/RNBackgroundExample/README.md +50 -0
- package/example/RNBackgroundExample/__tests__/App-test.js +14 -0
- package/example/RNBackgroundExample/android/app/BUCK +55 -0
- package/example/RNBackgroundExample/android/app/build.gradle +225 -0
- package/example/RNBackgroundExample/android/app/build_defs.bzl +19 -0
- package/example/RNBackgroundExample/android/app/debug.keystore +0 -0
- package/example/RNBackgroundExample/android/app/proguard-rules.pro +10 -0
- package/example/RNBackgroundExample/android/app/src/androidTest/java/com/rnbackgroundexample/DetoxTest.java +24 -0
- package/example/RNBackgroundExample/android/app/src/debug/AndroidManifest.xml +8 -0
- package/example/RNBackgroundExample/android/app/src/debug/java/com/rnbackgroundexample/ReactNativeFlipper.java +72 -0
- package/example/RNBackgroundExample/android/app/src/main/AndroidManifest.xml +33 -0
- package/example/RNBackgroundExample/android/app/src/main/java/com/rnbackgroundexample/MainActivity.java +15 -0
- package/example/RNBackgroundExample/android/app/src/main/java/com/rnbackgroundexample/MainApplication.java +76 -0
- package/example/RNBackgroundExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/example/RNBackgroundExample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/example/RNBackgroundExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/example/RNBackgroundExample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/example/RNBackgroundExample/android/app/src/main/res/values/strings.xml +3 -0
- package/example/RNBackgroundExample/android/app/src/main/res/values/styles.xml +9 -0
- package/example/RNBackgroundExample/android/build.gradle +42 -0
- package/example/RNBackgroundExample/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/example/RNBackgroundExample/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/example/RNBackgroundExample/android/gradle.properties +23 -0
- package/example/RNBackgroundExample/android/gradlew +183 -0
- package/example/RNBackgroundExample/android/gradlew.bat +103 -0
- package/example/RNBackgroundExample/android/settings.gradle +3 -0
- package/example/RNBackgroundExample/app.json +4 -0
- package/example/RNBackgroundExample/babel.config.js +3 -0
- package/example/RNBackgroundExample/e2e/config.json +8 -0
- package/example/RNBackgroundExample/e2e/detox.pathbuilder.android.js +4 -0
- package/example/RNBackgroundExample/e2e/detox.pathbuilder.ios.js +4 -0
- package/example/RNBackgroundExample/e2e/detox.pathbuilder.js +21 -0
- package/example/RNBackgroundExample/e2e/environment.js +23 -0
- package/example/RNBackgroundExample/e2e/firstTest.spec.js +56 -0
- package/example/RNBackgroundExample/e2e/server.js +69 -0
- package/example/RNBackgroundExample/e2e/start-server.js +2 -0
- package/example/RNBackgroundExample/index.js +9 -0
- package/example/RNBackgroundExample/ios/App.swift +9 -0
- package/example/RNBackgroundExample/ios/Podfile +24 -0
- package/example/RNBackgroundExample/ios/Podfile.lock +387 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample/AppDelegate.h +15 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample/AppDelegate.m +42 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample/Images.xcassets/AppIcon.appiconset/Contents.json +38 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample/Images.xcassets/Contents.json +6 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample/Info.plist +65 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample/LaunchScreen.storyboard +58 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample/main.m +16 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample-Bridging-Header.h +4 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample-tvOS/Info.plist +53 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample-tvOSTests/Info.plist +24 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample.xcodeproj/project.pbxproj +991 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample.xcodeproj/xcshareddata/xcschemes/RNBackgroundExample-tvOS.xcscheme +88 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample.xcodeproj/xcshareddata/xcschemes/RNBackgroundExample.xcscheme +88 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample.xcworkspace/contents.xcworkspacedata +10 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExampleTests/Info.plist +24 -0
- package/example/RNBackgroundExample/ios/RNBackgroundExampleTests/RNBackgroundExampleTests.m +72 -0
- package/example/RNBackgroundExample/metro.config.js +22 -0
- package/example/RNBackgroundExample/package.json +71 -0
- package/example/RNBackgroundExample/scripts/deploy-android.sh +14 -0
- package/example/RNBackgroundExample/scripts/deploy-ios.sh +11 -0
- package/example/RNBackgroundExample/scripts/postinstall.sh +13 -0
- package/example/RNBackgroundExample/wait-for-emulator.sh +39 -0
- package/example/RNBackgroundExample/yarn.lock +8165 -0
- package/index.d.ts +154 -0
- package/ios/VydiaRNFileUploader.h +10 -0
- package/ios/VydiaRNFileUploader.m +457 -0
- package/ios/VydiaRNFileUploader.xcodeproj/project.pbxproj +254 -0
- package/package.json +37 -0
- package/react-native-upload.podspec +23 -0
- package/src/index.js +151 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.appfolio.work
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import androidx.work.Worker
|
|
5
|
+
import androidx.work.WorkerParameters
|
|
6
|
+
import com.appfolio.extensions.PARAM_KEY_NOTIF_CONFIG
|
|
7
|
+
import com.appfolio.extensions.PARAM_KEY_TASK_PARAMS
|
|
8
|
+
import com.appfolio.extensions.toUploadNotificationConfig
|
|
9
|
+
import com.appfolio.extensions.toUploadTaskParameters
|
|
10
|
+
|
|
11
|
+
class UploadWorker(val context: Context, params: WorkerParameters): Worker(context, params) {
|
|
12
|
+
|
|
13
|
+
override fun doWork(): Result {
|
|
14
|
+
val taskParamsStr = inputData.getString(PARAM_KEY_TASK_PARAMS) ?: return Result.failure()
|
|
15
|
+
val notifConfigStr = inputData.getString(PARAM_KEY_NOTIF_CONFIG) ?: return Result.failure()
|
|
16
|
+
|
|
17
|
+
UploadManager.startUpload(context, taskParamsStr.toUploadTaskParameters(), notifConfigStr.toUploadNotificationConfig())
|
|
18
|
+
return Result.success()
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
[ignore]
|
|
2
|
+
; We fork some components by platform
|
|
3
|
+
.*/*[.]android.js
|
|
4
|
+
|
|
5
|
+
; Ignore "BUCK" generated dirs
|
|
6
|
+
<PROJECT_ROOT>/\.buckd/
|
|
7
|
+
|
|
8
|
+
; Ignore polyfills
|
|
9
|
+
node_modules/react-native/Libraries/polyfills/.*
|
|
10
|
+
|
|
11
|
+
; These should not be required directly
|
|
12
|
+
; require from fbjs/lib instead: require('fbjs/lib/warning')
|
|
13
|
+
node_modules/warning/.*
|
|
14
|
+
|
|
15
|
+
; Flow doesn't support platforms
|
|
16
|
+
.*/Libraries/Utilities/LoadingView.js
|
|
17
|
+
|
|
18
|
+
[untyped]
|
|
19
|
+
.*/node_modules/@react-native-community/cli/.*/.*
|
|
20
|
+
|
|
21
|
+
[include]
|
|
22
|
+
|
|
23
|
+
[libs]
|
|
24
|
+
node_modules/react-native/interface.js
|
|
25
|
+
node_modules/react-native/flow/
|
|
26
|
+
|
|
27
|
+
[options]
|
|
28
|
+
emoji=true
|
|
29
|
+
|
|
30
|
+
esproposal.optional_chaining=enable
|
|
31
|
+
esproposal.nullish_coalescing=enable
|
|
32
|
+
|
|
33
|
+
module.file_ext=.js
|
|
34
|
+
module.file_ext=.json
|
|
35
|
+
module.file_ext=.ios.js
|
|
36
|
+
|
|
37
|
+
munge_underscores=true
|
|
38
|
+
|
|
39
|
+
module.name_mapper='^react-native/\(.*\)$' -> '<PROJECT_ROOT>/node_modules/react-native/\1'
|
|
40
|
+
module.name_mapper='^@?[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> '<PROJECT_ROOT>/node_modules/react-native/Libraries/Image/RelativeImageStub'
|
|
41
|
+
|
|
42
|
+
suppress_type=$FlowIssue
|
|
43
|
+
suppress_type=$FlowFixMe
|
|
44
|
+
suppress_type=$FlowFixMeProps
|
|
45
|
+
suppress_type=$FlowFixMeState
|
|
46
|
+
|
|
47
|
+
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)
|
|
48
|
+
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)?:? #[0-9]+
|
|
49
|
+
suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
|
|
50
|
+
|
|
51
|
+
[lints]
|
|
52
|
+
sketchy-null-number=warn
|
|
53
|
+
sketchy-null-mixed=warn
|
|
54
|
+
sketchy-number=warn
|
|
55
|
+
untyped-type-import=warn
|
|
56
|
+
nonstrict-import=warn
|
|
57
|
+
deprecated-type=warn
|
|
58
|
+
unsafe-getters-setters=warn
|
|
59
|
+
inexact-spread=warn
|
|
60
|
+
unnecessary-invariant=warn
|
|
61
|
+
signature-verification-failure=warn
|
|
62
|
+
deprecated-utility=error
|
|
63
|
+
|
|
64
|
+
[strict]
|
|
65
|
+
deprecated-type
|
|
66
|
+
nonstrict-import
|
|
67
|
+
sketchy-null
|
|
68
|
+
unclear-type
|
|
69
|
+
unsafe-getters-setters
|
|
70
|
+
untyped-import
|
|
71
|
+
untyped-type-import
|
|
72
|
+
|
|
73
|
+
[version]
|
|
74
|
+
^0.122.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*.pbxproj -text
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sample React Native App
|
|
3
|
+
* https://github.com/facebook/react-native
|
|
4
|
+
*
|
|
5
|
+
* @format
|
|
6
|
+
* @flow
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import React, {useState} from 'react';
|
|
10
|
+
import {
|
|
11
|
+
Alert,
|
|
12
|
+
SafeAreaView,
|
|
13
|
+
StyleSheet,
|
|
14
|
+
ScrollView,
|
|
15
|
+
View,
|
|
16
|
+
Text,
|
|
17
|
+
StatusBar,
|
|
18
|
+
Button,
|
|
19
|
+
Platform,
|
|
20
|
+
TouchableOpacity,
|
|
21
|
+
} from 'react-native';
|
|
22
|
+
|
|
23
|
+
import {Header, Colors} from 'react-native/Libraries/NewAppScreen';
|
|
24
|
+
|
|
25
|
+
import Upload from 'react-native-background-upload';
|
|
26
|
+
|
|
27
|
+
import ImagePicker from 'react-native-image-picker';
|
|
28
|
+
|
|
29
|
+
import RNFS from 'react-native-fs';
|
|
30
|
+
|
|
31
|
+
const url10SecDelayPut = 'http://localhost:8080/10secDelay';
|
|
32
|
+
const url5secDelayFail = 'http://localhost:8080/5secDelayFail';
|
|
33
|
+
|
|
34
|
+
const path = RNFS.TemporaryDirectoryPath + '/test.json';
|
|
35
|
+
const prefix = Platform.OS === 'ios' ? 'file://' : '';
|
|
36
|
+
|
|
37
|
+
const commonOptions = {
|
|
38
|
+
url: '',
|
|
39
|
+
path: prefix + path,
|
|
40
|
+
method: 'PUT',
|
|
41
|
+
type: 'raw',
|
|
42
|
+
// only supported on Android
|
|
43
|
+
notification: {
|
|
44
|
+
enabled: true,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
RNFS.writeFile(path, '');
|
|
49
|
+
|
|
50
|
+
const App: () => React$Node = () => {
|
|
51
|
+
const [delay10Completed, set10SecDelayCompleted] = useState(false);
|
|
52
|
+
const [delay5Completed, set5SecDelayCompleted] = useState(false);
|
|
53
|
+
|
|
54
|
+
const [isImagePickerShowing, setIsImagePickerShowing] = useState(false);
|
|
55
|
+
const [uploadId, setUploadId] = useState(null);
|
|
56
|
+
const [progress, setProgress] = useState(null);
|
|
57
|
+
|
|
58
|
+
const onPressUpload = options => {
|
|
59
|
+
if (isImagePickerShowing) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
setIsImagePickerShowing(true);
|
|
64
|
+
|
|
65
|
+
const imagePickerOptions = {
|
|
66
|
+
takePhotoButtonTitle: null,
|
|
67
|
+
title: 'Upload Media',
|
|
68
|
+
chooseFromLibraryButtonTitle: 'Choose From Library',
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
ImagePicker.showImagePicker(imagePickerOptions, response => {
|
|
72
|
+
let didChooseVideo = true;
|
|
73
|
+
|
|
74
|
+
console.log('ImagePicker response: ', response);
|
|
75
|
+
const {customButton, didCancel, error, path, uri} = response;
|
|
76
|
+
|
|
77
|
+
if (didCancel) {
|
|
78
|
+
didChooseVideo = false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (error) {
|
|
82
|
+
console.warn('ImagePicker error:', response);
|
|
83
|
+
didChooseVideo = false;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// TODO: Should this happen higher?
|
|
87
|
+
setIsImagePickerShowing(false);
|
|
88
|
+
|
|
89
|
+
if (!didChooseVideo) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
let finalPath = Platform.OS === 'android' ? path : uri;
|
|
94
|
+
|
|
95
|
+
if (finalPath) {
|
|
96
|
+
// Video is stored locally on the device
|
|
97
|
+
Upload.getFileInfo(finalPath).then(metadata => {
|
|
98
|
+
const uploadOpts = Object.assign(
|
|
99
|
+
{
|
|
100
|
+
path: finalPath,
|
|
101
|
+
method: 'POST',
|
|
102
|
+
headers: {
|
|
103
|
+
'content-type': metadata.mimeType, // server requires a content-type header
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
options,
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
Upload.startUpload(uploadOpts)
|
|
110
|
+
.then(uploadId => {
|
|
111
|
+
console.log(
|
|
112
|
+
`Upload started with options: ${JSON.stringify(uploadOpts)}`,
|
|
113
|
+
);
|
|
114
|
+
setUploadId(uploadId);
|
|
115
|
+
setProgress(0);
|
|
116
|
+
Upload.addListener('progress', uploadId, data => {
|
|
117
|
+
if (data.progress % 5 === 0) {
|
|
118
|
+
setProgress(+data.progress);
|
|
119
|
+
}
|
|
120
|
+
console.log(`Progress: ${data.progress}%`);
|
|
121
|
+
});
|
|
122
|
+
Upload.addListener('error', uploadId, data => {
|
|
123
|
+
console.log(`Error: ${data.error}%`);
|
|
124
|
+
});
|
|
125
|
+
Upload.addListener('completed', uploadId, data => {
|
|
126
|
+
console.log('Completed!');
|
|
127
|
+
});
|
|
128
|
+
})
|
|
129
|
+
.catch(function(err) {
|
|
130
|
+
setUploadId(null);
|
|
131
|
+
setProgress(null);
|
|
132
|
+
console.log('Upload error!', err);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
} else {
|
|
136
|
+
// Video is stored in google cloud
|
|
137
|
+
Alert.alert('Video not found');
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
return (
|
|
143
|
+
<>
|
|
144
|
+
<StatusBar barStyle="dark-content" />
|
|
145
|
+
<SafeAreaView testID="main_screen">
|
|
146
|
+
<ScrollView
|
|
147
|
+
contentInsetAdjustmentBehavior="automatic"
|
|
148
|
+
style={styles.scrollView}>
|
|
149
|
+
<Header />
|
|
150
|
+
{global.HermesInternal == null ? null : (
|
|
151
|
+
<View style={styles.engine}>
|
|
152
|
+
<Text style={styles.footer}>Engine: Hermes</Text>
|
|
153
|
+
</View>
|
|
154
|
+
)}
|
|
155
|
+
<View style={styles.body}>
|
|
156
|
+
<View style={styles.sectionContainer}>
|
|
157
|
+
<TouchableOpacity
|
|
158
|
+
testID="10_sec_delay_button"
|
|
159
|
+
onPress={() => {
|
|
160
|
+
const options = {
|
|
161
|
+
...commonOptions,
|
|
162
|
+
url: url10SecDelayPut,
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
Upload.startUpload(options)
|
|
166
|
+
.then(uploadId => {
|
|
167
|
+
console.warn(uploadId);
|
|
168
|
+
setUploadId(uploadId);
|
|
169
|
+
|
|
170
|
+
Upload.addListener(
|
|
171
|
+
'completed',
|
|
172
|
+
uploadId,
|
|
173
|
+
({responseCode}) => {
|
|
174
|
+
console.warn({responseCode});
|
|
175
|
+
|
|
176
|
+
if (responseCode <= 299) {
|
|
177
|
+
set10SecDelayCompleted(true);
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
);
|
|
181
|
+
})
|
|
182
|
+
.catch(err => {
|
|
183
|
+
console.warn(err.message);
|
|
184
|
+
});
|
|
185
|
+
}}>
|
|
186
|
+
<Text>10 Sec Delay Success</Text>
|
|
187
|
+
</TouchableOpacity>
|
|
188
|
+
|
|
189
|
+
{delay10Completed && (
|
|
190
|
+
<View testID="10_sec_delay_completed">
|
|
191
|
+
<Text>Finished!!!</Text>
|
|
192
|
+
</View>
|
|
193
|
+
)}
|
|
194
|
+
</View>
|
|
195
|
+
<View style={styles.sectionContainer}>
|
|
196
|
+
<TouchableOpacity
|
|
197
|
+
testID="5_sec_delay_button"
|
|
198
|
+
onPress={() => {
|
|
199
|
+
const options = {
|
|
200
|
+
...commonOptions,
|
|
201
|
+
url: url5secDelayFail,
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
Upload.startUpload(options)
|
|
205
|
+
.then(uploadId => {
|
|
206
|
+
console.warn(uploadId);
|
|
207
|
+
setUploadId(uploadId);
|
|
208
|
+
|
|
209
|
+
Upload.addListener(
|
|
210
|
+
'completed',
|
|
211
|
+
uploadId,
|
|
212
|
+
({responseCode}) => {
|
|
213
|
+
console.warn(responseCode);
|
|
214
|
+
if (responseCode === 502) {
|
|
215
|
+
set5SecDelayCompleted(true);
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
Upload.addListener(
|
|
221
|
+
'error',
|
|
222
|
+
uploadId,
|
|
223
|
+
({responseCode}) => {
|
|
224
|
+
set5SecDelayCompleted(true);
|
|
225
|
+
},
|
|
226
|
+
);
|
|
227
|
+
})
|
|
228
|
+
.catch(err => {
|
|
229
|
+
console.warn(err.message);
|
|
230
|
+
});
|
|
231
|
+
}}>
|
|
232
|
+
<Text>5 Sec Delay Error</Text>
|
|
233
|
+
</TouchableOpacity>
|
|
234
|
+
|
|
235
|
+
{delay5Completed && (
|
|
236
|
+
<View testID="5_sec_delay_completed">
|
|
237
|
+
<Text>Finished!!!</Text>
|
|
238
|
+
</View>
|
|
239
|
+
)}
|
|
240
|
+
|
|
241
|
+
<Button
|
|
242
|
+
title="Tap To Upload Multipart"
|
|
243
|
+
onPress={() =>
|
|
244
|
+
onPressUpload({
|
|
245
|
+
url: `http://${
|
|
246
|
+
Platform.OS === 'ios' ? 'localhost' : '10.0.2.2'
|
|
247
|
+
}:8080/upload_multipart`,
|
|
248
|
+
field: 'uploaded_media',
|
|
249
|
+
type: 'multipart',
|
|
250
|
+
})
|
|
251
|
+
}
|
|
252
|
+
/>
|
|
253
|
+
|
|
254
|
+
<View style={{height: 32}} />
|
|
255
|
+
<Text style={{textAlign: 'center'}}>
|
|
256
|
+
{`Current Upload ID: ${uploadId === null ? 'none' : uploadId}`}
|
|
257
|
+
</Text>
|
|
258
|
+
<Text style={{textAlign: 'center'}}>
|
|
259
|
+
{`Progress: ${progress === null ? 'none' : `${progress}%`}`}
|
|
260
|
+
</Text>
|
|
261
|
+
<View />
|
|
262
|
+
<Button
|
|
263
|
+
testID="cancel_button"
|
|
264
|
+
title="Tap to Cancel Upload"
|
|
265
|
+
onPress={() => {
|
|
266
|
+
if (!uploadId) {
|
|
267
|
+
console.log('Nothing to cancel!');
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
Upload.cancelUpload(uploadId).then(() => {
|
|
272
|
+
console.log(`Upload ${uploadId} canceled`);
|
|
273
|
+
setUploadId(null);
|
|
274
|
+
setProgress(null);
|
|
275
|
+
});
|
|
276
|
+
}}
|
|
277
|
+
/>
|
|
278
|
+
</View>
|
|
279
|
+
</View>
|
|
280
|
+
</ScrollView>
|
|
281
|
+
</SafeAreaView>
|
|
282
|
+
</>
|
|
283
|
+
);
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
const styles = StyleSheet.create({
|
|
287
|
+
scrollView: {
|
|
288
|
+
backgroundColor: Colors.lighter,
|
|
289
|
+
},
|
|
290
|
+
engine: {
|
|
291
|
+
position: 'absolute',
|
|
292
|
+
right: 0,
|
|
293
|
+
},
|
|
294
|
+
body: {
|
|
295
|
+
backgroundColor: Colors.white,
|
|
296
|
+
},
|
|
297
|
+
sectionContainer: {
|
|
298
|
+
marginTop: 32,
|
|
299
|
+
paddingHorizontal: 24,
|
|
300
|
+
},
|
|
301
|
+
sectionTitle: {
|
|
302
|
+
fontSize: 24,
|
|
303
|
+
fontWeight: '600',
|
|
304
|
+
color: Colors.black,
|
|
305
|
+
},
|
|
306
|
+
sectionDescription: {
|
|
307
|
+
marginTop: 8,
|
|
308
|
+
fontSize: 18,
|
|
309
|
+
fontWeight: '400',
|
|
310
|
+
color: Colors.dark,
|
|
311
|
+
},
|
|
312
|
+
highlight: {
|
|
313
|
+
fontWeight: '700',
|
|
314
|
+
},
|
|
315
|
+
footer: {
|
|
316
|
+
color: Colors.dark,
|
|
317
|
+
fontSize: 12,
|
|
318
|
+
fontWeight: '600',
|
|
319
|
+
padding: 4,
|
|
320
|
+
paddingRight: 12,
|
|
321
|
+
textAlign: 'right',
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
export default App;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Example App for [react-native-background-upload](https://github.com/Vydia/react-native-background-upload)
|
|
2
|
+
|
|
3
|
+
This is a React Native app and Express server that servers ars a very basic
|
|
4
|
+
implementation of react-native-background-upload. Use this repo to experiment
|
|
5
|
+
with the package, or fork this repo and use it to create a minimal reproduction
|
|
6
|
+
of a bug or other issue when opening up a github issue on
|
|
7
|
+
[react-native-background-upload](https://github.com/Vydia/react-native-background-upload).
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
1. Clone the repo
|
|
12
|
+
1. `yarn install`
|
|
13
|
+
1. `yarn server`
|
|
14
|
+
1. Run the example app `react-native run-ios` or `react-native run-android`
|
|
15
|
+
1. Tap the button in the mobile app to perform an upload.
|
|
16
|
+
|
|
17
|
+
If you are running on an Android enumlator/device and uploads don't 'just work', run `adb reverse tcp:8080 tcp:8080` after `react-native run-android`. This will allow the device to communicate with the server. Otherwise it won't work.
|
|
18
|
+
|
|
19
|
+
## E2E Tests
|
|
20
|
+
|
|
21
|
+
You need to have [Detox setup](https://github.com/wix/Detox/blob/master/docs/Introduction.GettingStarted.md).
|
|
22
|
+
|
|
23
|
+
To run the E2E Tests for Android, do the following:
|
|
24
|
+
|
|
25
|
+
1. Clone the repo
|
|
26
|
+
1. `yarn`
|
|
27
|
+
1. `yarn e2e/deploy/android`
|
|
28
|
+
1. `yarn e2e/test/android`
|
|
29
|
+
|
|
30
|
+
To run the E2E Tests for iOS, do the following:
|
|
31
|
+
|
|
32
|
+
1. Clone the repo
|
|
33
|
+
1. `yarn`
|
|
34
|
+
1. `yarn deploy/release/ios`
|
|
35
|
+
1. `yarn e2e/test/ios`
|
|
36
|
+
|
|
37
|
+
## Important files to look at
|
|
38
|
+
|
|
39
|
+
### [App.js](https://github.com/Vydia/react-native-background-upload/blob/master/example/RNBackgroundExample/App.js)
|
|
40
|
+
|
|
41
|
+
The React Native component that allows the user to choose an image from device
|
|
42
|
+
and upload it to the localhost server.
|
|
43
|
+
|
|
44
|
+
*Note: In the iOS simulator, you can add images and videos to the camera roll by
|
|
45
|
+
dragging and dropping files from finder onto the simulator window. In the Android
|
|
46
|
+
emulator you can usually use the emulator camera app to take test picture.*
|
|
47
|
+
|
|
48
|
+
### [e2e/start-server.js](https://github.com/Vydia/react-native-background-upload/blob/master/example/RNBackgroundExample/e2e/start-server.js)
|
|
49
|
+
|
|
50
|
+
The express server that receives the upload and writes it to file.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @format
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import 'react-native';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import App from '../App';
|
|
8
|
+
|
|
9
|
+
// Note: test renderer must be required after react-native.
|
|
10
|
+
import renderer from 'react-test-renderer';
|
|
11
|
+
|
|
12
|
+
it('renders correctly', () => {
|
|
13
|
+
renderer.create(<App />);
|
|
14
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# To learn about Buck see [Docs](https://buckbuild.com/).
|
|
2
|
+
# To run your application with Buck:
|
|
3
|
+
# - install Buck
|
|
4
|
+
# - `npm start` - to start the packager
|
|
5
|
+
# - `cd android`
|
|
6
|
+
# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
|
|
7
|
+
# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
|
|
8
|
+
# - `buck install -r android/app` - compile, install and run application
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
load(":build_defs.bzl", "create_aar_targets", "create_jar_targets")
|
|
12
|
+
|
|
13
|
+
lib_deps = []
|
|
14
|
+
|
|
15
|
+
create_aar_targets(glob(["libs/*.aar"]))
|
|
16
|
+
|
|
17
|
+
create_jar_targets(glob(["libs/*.jar"]))
|
|
18
|
+
|
|
19
|
+
android_library(
|
|
20
|
+
name = "all-libs",
|
|
21
|
+
exported_deps = lib_deps,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
android_library(
|
|
25
|
+
name = "app-code",
|
|
26
|
+
srcs = glob([
|
|
27
|
+
"src/main/java/**/*.java",
|
|
28
|
+
]),
|
|
29
|
+
deps = [
|
|
30
|
+
":all-libs",
|
|
31
|
+
":build_config",
|
|
32
|
+
":res",
|
|
33
|
+
],
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
android_build_config(
|
|
37
|
+
name = "build_config",
|
|
38
|
+
package = "com.rnbackgroundexample",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
android_resource(
|
|
42
|
+
name = "res",
|
|
43
|
+
package = "com.rnbackgroundexample",
|
|
44
|
+
res = "src/main/res",
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
android_binary(
|
|
48
|
+
name = "app",
|
|
49
|
+
keystore = "//android/keystores:debug",
|
|
50
|
+
manifest = "src/main/AndroidManifest.xml",
|
|
51
|
+
package_type = "debug",
|
|
52
|
+
deps = [
|
|
53
|
+
":app-code",
|
|
54
|
+
],
|
|
55
|
+
)
|