@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.
Files changed (106) hide show
  1. package/.gitattributes +1 -0
  2. package/LICENSE +21 -0
  3. package/README.md +53 -0
  4. package/android/build.gradle +82 -0
  5. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  6. package/android/gradle/wrapper/gradle-wrapper.properties +6 -0
  7. package/android/gradle.properties +6 -0
  8. package/android/gradlew +185 -0
  9. package/android/gradlew.bat +89 -0
  10. package/android/src/main/AndroidManifest.xml +1 -0
  11. package/android/src/main/java/com/appfolio/extensions/ContextExtensions.kt +63 -0
  12. package/android/src/main/java/com/appfolio/extensions/UploadExtensions.kt +57 -0
  13. package/android/src/main/java/com/appfolio/uploader/GlobalRequestObserverDelegate.kt +62 -0
  14. package/android/src/main/java/com/appfolio/uploader/ModifiedBinaryUploadRequest.kt +29 -0
  15. package/android/src/main/java/com/appfolio/uploader/ModifiedHttpUploadRequest.kt +57 -0
  16. package/android/src/main/java/com/appfolio/uploader/ModifiedMultipartUploadRequest.kt +60 -0
  17. package/android/src/main/java/com/appfolio/uploader/UploaderModule.kt +384 -0
  18. package/android/src/main/java/com/appfolio/uploader/UploaderReactPackage.java +32 -0
  19. package/android/src/main/java/com/appfolio/work/TaskCompletionNotifier.kt +47 -0
  20. package/android/src/main/java/com/appfolio/work/UploadManager.kt +109 -0
  21. package/android/src/main/java/com/appfolio/work/UploadWorker.kt +20 -0
  22. package/bitbucket-pipelines.yml +14 -0
  23. package/example/RNBackgroundExample/.buckconfig +6 -0
  24. package/example/RNBackgroundExample/.eslintrc.js +4 -0
  25. package/example/RNBackgroundExample/.flowconfig +74 -0
  26. package/example/RNBackgroundExample/.gitattributes +1 -0
  27. package/example/RNBackgroundExample/.prettierrc.js +6 -0
  28. package/example/RNBackgroundExample/.watchmanconfig +1 -0
  29. package/example/RNBackgroundExample/App.js +325 -0
  30. package/example/RNBackgroundExample/README.md +50 -0
  31. package/example/RNBackgroundExample/__tests__/App-test.js +14 -0
  32. package/example/RNBackgroundExample/android/app/BUCK +55 -0
  33. package/example/RNBackgroundExample/android/app/build.gradle +225 -0
  34. package/example/RNBackgroundExample/android/app/build_defs.bzl +19 -0
  35. package/example/RNBackgroundExample/android/app/debug.keystore +0 -0
  36. package/example/RNBackgroundExample/android/app/proguard-rules.pro +10 -0
  37. package/example/RNBackgroundExample/android/app/src/androidTest/java/com/rnbackgroundexample/DetoxTest.java +24 -0
  38. package/example/RNBackgroundExample/android/app/src/debug/AndroidManifest.xml +8 -0
  39. package/example/RNBackgroundExample/android/app/src/debug/java/com/rnbackgroundexample/ReactNativeFlipper.java +72 -0
  40. package/example/RNBackgroundExample/android/app/src/main/AndroidManifest.xml +33 -0
  41. package/example/RNBackgroundExample/android/app/src/main/java/com/rnbackgroundexample/MainActivity.java +15 -0
  42. package/example/RNBackgroundExample/android/app/src/main/java/com/rnbackgroundexample/MainApplication.java +76 -0
  43. package/example/RNBackgroundExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  44. package/example/RNBackgroundExample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  45. package/example/RNBackgroundExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  46. package/example/RNBackgroundExample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  47. package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  48. package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  49. package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  50. package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  51. package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  52. package/example/RNBackgroundExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  53. package/example/RNBackgroundExample/android/app/src/main/res/values/strings.xml +3 -0
  54. package/example/RNBackgroundExample/android/app/src/main/res/values/styles.xml +9 -0
  55. package/example/RNBackgroundExample/android/build.gradle +42 -0
  56. package/example/RNBackgroundExample/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  57. package/example/RNBackgroundExample/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  58. package/example/RNBackgroundExample/android/gradle.properties +23 -0
  59. package/example/RNBackgroundExample/android/gradlew +183 -0
  60. package/example/RNBackgroundExample/android/gradlew.bat +103 -0
  61. package/example/RNBackgroundExample/android/settings.gradle +3 -0
  62. package/example/RNBackgroundExample/app.json +4 -0
  63. package/example/RNBackgroundExample/babel.config.js +3 -0
  64. package/example/RNBackgroundExample/e2e/config.json +8 -0
  65. package/example/RNBackgroundExample/e2e/detox.pathbuilder.android.js +4 -0
  66. package/example/RNBackgroundExample/e2e/detox.pathbuilder.ios.js +4 -0
  67. package/example/RNBackgroundExample/e2e/detox.pathbuilder.js +21 -0
  68. package/example/RNBackgroundExample/e2e/environment.js +23 -0
  69. package/example/RNBackgroundExample/e2e/firstTest.spec.js +56 -0
  70. package/example/RNBackgroundExample/e2e/server.js +69 -0
  71. package/example/RNBackgroundExample/e2e/start-server.js +2 -0
  72. package/example/RNBackgroundExample/index.js +9 -0
  73. package/example/RNBackgroundExample/ios/App.swift +9 -0
  74. package/example/RNBackgroundExample/ios/Podfile +24 -0
  75. package/example/RNBackgroundExample/ios/Podfile.lock +387 -0
  76. package/example/RNBackgroundExample/ios/RNBackgroundExample/AppDelegate.h +15 -0
  77. package/example/RNBackgroundExample/ios/RNBackgroundExample/AppDelegate.m +42 -0
  78. package/example/RNBackgroundExample/ios/RNBackgroundExample/Images.xcassets/AppIcon.appiconset/Contents.json +38 -0
  79. package/example/RNBackgroundExample/ios/RNBackgroundExample/Images.xcassets/Contents.json +6 -0
  80. package/example/RNBackgroundExample/ios/RNBackgroundExample/Info.plist +65 -0
  81. package/example/RNBackgroundExample/ios/RNBackgroundExample/LaunchScreen.storyboard +58 -0
  82. package/example/RNBackgroundExample/ios/RNBackgroundExample/main.m +16 -0
  83. package/example/RNBackgroundExample/ios/RNBackgroundExample-Bridging-Header.h +4 -0
  84. package/example/RNBackgroundExample/ios/RNBackgroundExample-tvOS/Info.plist +53 -0
  85. package/example/RNBackgroundExample/ios/RNBackgroundExample-tvOSTests/Info.plist +24 -0
  86. package/example/RNBackgroundExample/ios/RNBackgroundExample.xcodeproj/project.pbxproj +991 -0
  87. package/example/RNBackgroundExample/ios/RNBackgroundExample.xcodeproj/xcshareddata/xcschemes/RNBackgroundExample-tvOS.xcscheme +88 -0
  88. package/example/RNBackgroundExample/ios/RNBackgroundExample.xcodeproj/xcshareddata/xcschemes/RNBackgroundExample.xcscheme +88 -0
  89. package/example/RNBackgroundExample/ios/RNBackgroundExample.xcworkspace/contents.xcworkspacedata +10 -0
  90. package/example/RNBackgroundExample/ios/RNBackgroundExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  91. package/example/RNBackgroundExample/ios/RNBackgroundExampleTests/Info.plist +24 -0
  92. package/example/RNBackgroundExample/ios/RNBackgroundExampleTests/RNBackgroundExampleTests.m +72 -0
  93. package/example/RNBackgroundExample/metro.config.js +22 -0
  94. package/example/RNBackgroundExample/package.json +71 -0
  95. package/example/RNBackgroundExample/scripts/deploy-android.sh +14 -0
  96. package/example/RNBackgroundExample/scripts/deploy-ios.sh +11 -0
  97. package/example/RNBackgroundExample/scripts/postinstall.sh +13 -0
  98. package/example/RNBackgroundExample/wait-for-emulator.sh +39 -0
  99. package/example/RNBackgroundExample/yarn.lock +8165 -0
  100. package/index.d.ts +154 -0
  101. package/ios/VydiaRNFileUploader.h +10 -0
  102. package/ios/VydiaRNFileUploader.m +457 -0
  103. package/ios/VydiaRNFileUploader.xcodeproj/project.pbxproj +254 -0
  104. package/package.json +37 -0
  105. package/react-native-upload.podspec +23 -0
  106. 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,14 @@
1
+ image: node:22
2
+
3
+ pipelines:
4
+ branches:
5
+ master:
6
+ - step:
7
+ name: Deploy to NPM
8
+ deployment: production
9
+ caches:
10
+ - node
11
+ script:
12
+ - pipe: atlassian/npm-publish:1.1.1
13
+ variables:
14
+ NPM_TOKEN: $NPM_TOKEN
@@ -0,0 +1,6 @@
1
+
2
+ [android]
3
+ target = Google Inc.:Google APIs:23
4
+
5
+ [maven_repositories]
6
+ central = https://repo1.maven.org/maven2
@@ -0,0 +1,4 @@
1
+ module.exports = {
2
+ root: true,
3
+ extends: '@react-native-community',
4
+ };
@@ -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,6 @@
1
+ module.exports = {
2
+ bracketSpacing: false,
3
+ jsxBracketSameLine: true,
4
+ singleQuote: true,
5
+ trailingComma: 'all',
6
+ };
@@ -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
+ )