getTurboModule(
27 | const std::string &name,
28 | const JavaTurboModule::InitParams ¶ms) override;
29 |
30 | /**
31 | * Test-only method. Allows user to verify whether a TurboModule can be
32 | * created by instances of this class.
33 | */
34 | bool canCreateTurboModule(const std::string &name);
35 | };
36 |
37 | } // namespace react
38 | } // namespace facebook
39 |
--------------------------------------------------------------------------------
/example/android/app/src/main/java/com/usefileuploadexample/newarchitecture/components/MainComponentsRegistry.java:
--------------------------------------------------------------------------------
1 | package com.usefileuploadexample.newarchitecture.components;
2 |
3 | import com.facebook.jni.HybridData;
4 | import com.facebook.proguard.annotations.DoNotStrip;
5 | import com.facebook.react.fabric.ComponentFactory;
6 | import com.facebook.soloader.SoLoader;
7 |
8 | /**
9 | * Class responsible to load the custom Fabric Components. This class has native methods and needs a
10 | * corresponding C++ implementation/header file to work correctly (already placed inside the jni/
11 | * folder for you).
12 | *
13 | * Please note that this class is used ONLY if you opt-in for the New Architecture (see the
14 | * `newArchEnabled` property). Is ignored otherwise.
15 | */
16 | @DoNotStrip
17 | public class MainComponentsRegistry {
18 | static {
19 | SoLoader.loadLibrary("fabricjni");
20 | }
21 |
22 | @DoNotStrip private final HybridData mHybridData;
23 |
24 | @DoNotStrip
25 | private native HybridData initHybrid(ComponentFactory componentFactory);
26 |
27 | @DoNotStrip
28 | private MainComponentsRegistry(ComponentFactory componentFactory) {
29 | mHybridData = initHybrid(componentFactory);
30 | }
31 |
32 | @DoNotStrip
33 | public static MainComponentsRegistry register(ComponentFactory componentFactory) {
34 | return new MainComponentsRegistry(componentFactory);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/example/android/app/_BUCK:
--------------------------------------------------------------------------------
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.usefileuploadexample",
39 | )
40 |
41 | android_resource(
42 | name = "res",
43 | package = "com.usefileuploadexample",
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 | )
56 |
--------------------------------------------------------------------------------
/example/src/components/ProgressBar.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { StyleProp, StyleSheet, View, ViewStyle } from 'react-native';
3 | import Animated, {
4 | useAnimatedStyle,
5 | withSpring,
6 | } from 'react-native-reanimated';
7 |
8 | type Props = {
9 | value: number;
10 | progressColor?: ViewStyle['backgroundColor'];
11 | style?: StyleProp;
12 | };
13 |
14 | export default function ProgressBar({
15 | value,
16 | style,
17 | progressColor = '#3880ff',
18 | }: Props) {
19 | const [layoutWidth, setLayoutWidth] = useState();
20 | const animatedStyle = useAnimatedStyle(() => {
21 | if (!layoutWidth) {
22 | return { width: 0 };
23 | }
24 |
25 | // subtract 2 to account for border
26 | const widthValue = (value / 100) * layoutWidth - 2;
27 | return {
28 | width: withSpring(widthValue, {
29 | overshootClamping: true,
30 | stiffness: 75,
31 | }),
32 | };
33 | }, [layoutWidth, value]);
34 |
35 | return (
36 | setLayoutWidth(event.nativeEvent.layout.width)}
39 | >
40 |
47 |
48 | );
49 | }
50 |
51 | const styles = StyleSheet.create({
52 | container: {
53 | height: 10,
54 | backgroundColor: '#fff',
55 | borderColor: '#708090',
56 | borderWidth: 1,
57 | borderRadius: 4,
58 | },
59 | });
60 |
--------------------------------------------------------------------------------
/example/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp:
--------------------------------------------------------------------------------
1 | #include "MainApplicationTurboModuleManagerDelegate.h"
2 | #include "MainApplicationModuleProvider.h"
3 |
4 | namespace facebook {
5 | namespace react {
6 |
7 | jni::local_ref
8 | MainApplicationTurboModuleManagerDelegate::initHybrid(
9 | jni::alias_ref) {
10 | return makeCxxInstance();
11 | }
12 |
13 | void MainApplicationTurboModuleManagerDelegate::registerNatives() {
14 | registerHybrid({
15 | makeNativeMethod(
16 | "initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid),
17 | makeNativeMethod(
18 | "canCreateTurboModule",
19 | MainApplicationTurboModuleManagerDelegate::canCreateTurboModule),
20 | });
21 | }
22 |
23 | std::shared_ptr
24 | MainApplicationTurboModuleManagerDelegate::getTurboModule(
25 | const std::string &name,
26 | const std::shared_ptr &jsInvoker) {
27 | // Not implemented yet: provide pure-C++ NativeModules here.
28 | return nullptr;
29 | }
30 |
31 | std::shared_ptr
32 | MainApplicationTurboModuleManagerDelegate::getTurboModule(
33 | const std::string &name,
34 | const JavaTurboModule::InitParams ¶ms) {
35 | return MainApplicationModuleProvider(name, params);
36 | }
37 |
38 | bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule(
39 | const std::string &name) {
40 | return getTurboModule(name, nullptr) != nullptr ||
41 | getTurboModule(name, {.moduleName = name}) != nullptr;
42 | }
43 |
44 | } // namespace react
45 | } // namespace facebook
46 |
--------------------------------------------------------------------------------
/example/ios/Podfile:
--------------------------------------------------------------------------------
1 | require_relative '../node_modules/react-native/scripts/react_native_pods'
2 | require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
3 |
4 | platform :ios, '12.4'
5 | install! 'cocoapods', :deterministic_uuids => false
6 |
7 | target 'UseFileUploadExample' do
8 | config = use_native_modules!
9 |
10 | # Flags change depending on the env values.
11 | flags = get_default_flags()
12 |
13 | use_react_native!(
14 | :path => config[:reactNativePath],
15 | # Hermes is now enabled by default. Disable by setting this flag to false.
16 | # Upcoming versions of React Native may rely on get_default_flags(), but
17 | # we make it explicit here to aid in the React Native upgrade process.
18 | :hermes_enabled => true,
19 | :fabric_enabled => flags[:fabric_enabled],
20 | # Enables Flipper.
21 | #
22 | # Note that if you have use_frameworks! enabled, Flipper will not work and
23 | # you should disable the next line.
24 | :flipper_configuration => FlipperConfiguration.enabled,
25 | # An absolute path to your application root.
26 | :app_path => "#{Pod::Config.instance.installation_root}/.."
27 | )
28 |
29 | target 'UseFileUploadExampleTests' do
30 | inherit! :complete
31 | # Pods for testing
32 | end
33 |
34 | post_install do |installer|
35 | react_native_post_install(
36 | installer,
37 | # Set `mac_catalyst_enabled` to `true` in order to apply patches
38 | # necessary for Mac Catalyst builds
39 | :mac_catalyst_enabled => false
40 | )
41 | __apply_Xcode_12_5_M1_post_install_workaround(installer)
42 | end
43 | end
44 |
--------------------------------------------------------------------------------
/example/android/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | ext {
5 | buildToolsVersion = "31.0.0"
6 | minSdkVersion = 21
7 | compileSdkVersion = 31
8 | targetSdkVersion = 31
9 |
10 | if (System.properties['os.arch'] == "aarch64") {
11 | // For M1 Users we need to use the NDK 24 which added support for aarch64
12 | ndkVersion = "24.0.8215888"
13 | } else {
14 | // Otherwise we default to the side-by-side NDK version from AGP.
15 | ndkVersion = "21.4.7075529"
16 | }
17 | }
18 | repositories {
19 | google()
20 | mavenCentral()
21 | }
22 | dependencies {
23 | classpath("com.android.tools.build:gradle:7.2.1")
24 | classpath("com.facebook.react:react-native-gradle-plugin")
25 | classpath("de.undercouch:gradle-download-task:5.0.1")
26 | // NOTE: Do not place your application dependencies here; they belong
27 | // in the individual module build.gradle files
28 | }
29 | }
30 |
31 | allprojects {
32 | repositories {
33 | maven {
34 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
35 | url("$rootDir/../node_modules/react-native/android")
36 | }
37 | maven {
38 | // Android JSC is installed from npm
39 | url("$rootDir/../node_modules/jsc-android/dist")
40 | }
41 | mavenCentral {
42 | // We don't want to fetch react-native from Maven Central as there are
43 | // older versions over there.
44 | content {
45 | excludeGroup "com.facebook.react"
46 | }
47 | }
48 | google()
49 | maven { url 'https://www.jitpack.io' }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/example/android/app/src/main/java/com/usefileuploadexample/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.usefileuploadexample;
2 |
3 | import com.facebook.react.ReactActivity;
4 | import com.facebook.react.ReactActivityDelegate;
5 | import com.facebook.react.ReactRootView;
6 |
7 | public class MainActivity extends ReactActivity {
8 |
9 | /**
10 | * Returns the name of the main component registered from JavaScript. This is used to schedule
11 | * rendering of the component.
12 | */
13 | @Override
14 | protected String getMainComponentName() {
15 | return "UseFileUploadExample";
16 | }
17 |
18 | /**
19 | * Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and
20 | * you can specify the renderer you wish to use - the new renderer (Fabric) or the old renderer
21 | * (Paper).
22 | */
23 | @Override
24 | protected ReactActivityDelegate createReactActivityDelegate() {
25 | return new MainActivityDelegate(this, getMainComponentName());
26 | }
27 |
28 | public static class MainActivityDelegate extends ReactActivityDelegate {
29 | public MainActivityDelegate(ReactActivity activity, String mainComponentName) {
30 | super(activity, mainComponentName);
31 | }
32 |
33 | @Override
34 | protected ReactRootView createRootView() {
35 | ReactRootView reactRootView = new ReactRootView(getContext());
36 | // If you opted-in for the New Architecture, we enable the Fabric Renderer.
37 | reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED);
38 | return reactRootView;
39 | }
40 |
41 | @Override
42 | protected boolean isConcurrentRootEnabled() {
43 | // If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18).
44 | // More on this on https://reactjs.org/blog/2022/03/29/react-v18.html
45 | return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/example/ios/UseFileUploadExample/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | UseFileUploadExample
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1
25 | LSRequiresIPhoneOS
26 |
27 | NSAppTransportSecurity
28 |
29 | NSExceptionDomains
30 |
31 | localhost
32 |
33 | NSExceptionAllowsInsecureHTTPLoads
34 |
35 |
36 |
37 |
38 | NSLocationWhenInUseUsageDescription
39 |
40 | NSPhotoLibraryUsageDescription
41 | Used to select media for file uploads
42 | UILaunchStoryboardName
43 | LaunchScreen
44 | UIRequiredDeviceCapabilities
45 |
46 | armv7
47 |
48 | UISupportedInterfaceOrientations
49 |
50 | UIInterfaceOrientationPortrait
51 | UIInterfaceOrientationLandscapeLeft
52 | UIInterfaceOrientationLandscapeRight
53 |
54 | UIViewControllerBasedStatusBarAppearance
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/example/android/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
13 | org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
19 |
20 | # AndroidX package structure to make it clearer which packages are bundled with the
21 | # Android operating system, and which are packaged with your app's APK
22 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
23 | android.useAndroidX=true
24 | # Automatically convert third-party libraries to use AndroidX
25 | android.enableJetifier=true
26 |
27 | # Version of flipper SDK to use with React Native
28 | FLIPPER_VERSION=0.125.0
29 |
30 | # Use this property to specify which architecture you want to build.
31 | # You can also override it from the CLI using
32 | # ./gradlew -PreactNativeArchitectures=x86_64
33 | reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
34 |
35 | # Use this property to enable support to the new architecture.
36 | # This will allow you to use TurboModules and the Fabric render in
37 | # your application. You should enable this flag either if you want
38 | # to write custom TurboModules/Fabric components OR use libraries that
39 | # are providing them.
40 | newArchEnabled=false
41 |
--------------------------------------------------------------------------------
/example/android/app/src/main/res/drawable/rn_edit_text_material.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
21 |
22 |
23 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/example/android/app/src/main/java/com/usefileuploadexample/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java:
--------------------------------------------------------------------------------
1 | package com.usefileuploadexample.newarchitecture.modules;
2 |
3 | import com.facebook.jni.HybridData;
4 | import com.facebook.react.ReactPackage;
5 | import com.facebook.react.ReactPackageTurboModuleManagerDelegate;
6 | import com.facebook.react.bridge.ReactApplicationContext;
7 | import com.facebook.soloader.SoLoader;
8 | import java.util.List;
9 |
10 | /**
11 | * Class responsible to load the TurboModules. This class has native methods and needs a
12 | * corresponding C++ implementation/header file to work correctly (already placed inside the jni/
13 | * folder for you).
14 | *
15 | * Please note that this class is used ONLY if you opt-in for the New Architecture (see the
16 | * `newArchEnabled` property). Is ignored otherwise.
17 | */
18 | public class MainApplicationTurboModuleManagerDelegate
19 | extends ReactPackageTurboModuleManagerDelegate {
20 |
21 | private static volatile boolean sIsSoLibraryLoaded;
22 |
23 | protected MainApplicationTurboModuleManagerDelegate(
24 | ReactApplicationContext reactApplicationContext, List packages) {
25 | super(reactApplicationContext, packages);
26 | }
27 |
28 | protected native HybridData initHybrid();
29 |
30 | native boolean canCreateTurboModule(String moduleName);
31 |
32 | public static class Builder extends ReactPackageTurboModuleManagerDelegate.Builder {
33 | protected MainApplicationTurboModuleManagerDelegate build(
34 | ReactApplicationContext context, List packages) {
35 | return new MainApplicationTurboModuleManagerDelegate(context, packages);
36 | }
37 | }
38 |
39 | @Override
40 | protected synchronized void maybeLoadOtherSoLibraries() {
41 | if (!sIsSoLibraryLoaded) {
42 | // If you change the name of your application .so file in the Android.mk file,
43 | // make sure you update the name here as well.
44 | SoLoader.loadLibrary("usefileuploadexample_appmodules");
45 | sIsSoLibraryLoaded = true;
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/example/ios/UseFileUploadExampleTests/UseFileUploadExampleTests.m:
--------------------------------------------------------------------------------
1 | #import
2 | #import
3 |
4 | #import
5 | #import
6 |
7 | #define TIMEOUT_SECONDS 600
8 | #define TEXT_TO_LOOK_FOR @"Welcome to React"
9 |
10 | @interface UseFileUploadExampleTests : XCTestCase
11 |
12 | @end
13 |
14 | @implementation UseFileUploadExampleTests
15 |
16 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test
17 | {
18 | if (test(view)) {
19 | return YES;
20 | }
21 | for (UIView *subview in [view subviews]) {
22 | if ([self findSubviewInView:subview matching:test]) {
23 | return YES;
24 | }
25 | }
26 | return NO;
27 | }
28 |
29 | - (void)testRendersWelcomeScreen
30 | {
31 | UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];
32 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
33 | BOOL foundElement = NO;
34 |
35 | __block NSString *redboxError = nil;
36 | #ifdef DEBUG
37 | RCTSetLogFunction(
38 | ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {
39 | if (level >= RCTLogLevelError) {
40 | redboxError = message;
41 | }
42 | });
43 | #endif
44 |
45 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
46 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
47 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
48 |
49 | foundElement = [self findSubviewInView:vc.view
50 | matching:^BOOL(UIView *view) {
51 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
52 | return YES;
53 | }
54 | return NO;
55 | }];
56 | }
57 |
58 | #ifdef DEBUG
59 | RCTSetLogFunction(RCTDefaultLogFunction);
60 | #endif
61 |
62 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
63 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
64 | }
65 |
66 | @end
67 |
--------------------------------------------------------------------------------
/example/android/app/src/main/jni/MainComponentsRegistry.cpp:
--------------------------------------------------------------------------------
1 | #include "MainComponentsRegistry.h"
2 |
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 |
9 | namespace facebook {
10 | namespace react {
11 |
12 | MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {}
13 |
14 | std::shared_ptr
15 | MainComponentsRegistry::sharedProviderRegistry() {
16 | auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry();
17 |
18 | // Autolinked providers registered by RN CLI
19 | rncli_registerProviders(providerRegistry);
20 |
21 | // Custom Fabric Components go here. You can register custom
22 | // components coming from your App or from 3rd party libraries here.
23 | //
24 | // providerRegistry->add(concreteComponentDescriptorProvider<
25 | // AocViewerComponentDescriptor>());
26 | return providerRegistry;
27 | }
28 |
29 | jni::local_ref
30 | MainComponentsRegistry::initHybrid(
31 | jni::alias_ref,
32 | ComponentFactory *delegate) {
33 | auto instance = makeCxxInstance(delegate);
34 |
35 | auto buildRegistryFunction =
36 | [](EventDispatcher::Weak const &eventDispatcher,
37 | ContextContainer::Shared const &contextContainer)
38 | -> ComponentDescriptorRegistry::Shared {
39 | auto registry = MainComponentsRegistry::sharedProviderRegistry()
40 | ->createComponentDescriptorRegistry(
41 | {eventDispatcher, contextContainer});
42 |
43 | auto mutableRegistry =
44 | std::const_pointer_cast(registry);
45 |
46 | mutableRegistry->setFallbackComponentDescriptor(
47 | std::make_shared(
48 | ComponentDescriptorParameters{
49 | eventDispatcher, contextContainer, nullptr}));
50 |
51 | return registry;
52 | };
53 |
54 | delegate->buildRegistryFunction = buildRegistryFunction;
55 | return instance;
56 | }
57 |
58 | void MainComponentsRegistry::registerNatives() {
59 | registerHybrid({
60 | makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid),
61 | });
62 | }
63 |
64 | } // namespace react
65 | } // namespace facebook
66 |
--------------------------------------------------------------------------------
/src/hooks/useFileUpload.ts:
--------------------------------------------------------------------------------
1 | import { useRef } from 'react';
2 | import type {
3 | FileUploadOptions,
4 | OnDoneData,
5 | OnErrorData,
6 | UploadItem,
7 | } from '../types';
8 |
9 | export default function useFileUpload({
10 | url,
11 | field,
12 | method = 'POST',
13 | headers,
14 | timeout,
15 | data,
16 | onProgress,
17 | onDone,
18 | onError,
19 | onTimeout,
20 | }: FileUploadOptions) {
21 | const requests = useRef<{
22 | [key: string]: XMLHttpRequest;
23 | }>({});
24 |
25 | const startUpload = (item: T): Promise> => {
26 | return new Promise((resolve, reject) => {
27 | const formData = new FormData();
28 | formData.append(field, item);
29 |
30 | if (data) {
31 | for (const key in data) {
32 | formData.append(key, data[key]);
33 | }
34 | }
35 |
36 | const xhr = new XMLHttpRequest();
37 |
38 | xhr.open(method, url);
39 |
40 | requests.current[item.uri] = xhr;
41 |
42 | if (xhr.upload) {
43 | xhr.upload.onprogress = (event: ProgressEvent) => {
44 | onProgress?.({ item, event });
45 | };
46 | }
47 |
48 | if (timeout) {
49 | xhr.timeout = timeout;
50 | xhr.ontimeout = () => {
51 | const result: OnErrorData = {
52 | item,
53 | error: xhr.responseText,
54 | timeout: true,
55 | };
56 | onTimeout?.(result);
57 | reject(result);
58 | };
59 | }
60 |
61 | xhr.onload = () => {
62 | const result: OnDoneData = {
63 | item,
64 | responseBody: xhr.response || xhr.responseText,
65 | responseHeaders: xhr.getAllResponseHeaders(),
66 | };
67 | onDone?.(result);
68 | resolve(result);
69 | };
70 |
71 | xhr.onerror = () => {
72 | const result: OnErrorData = {
73 | item,
74 | error: xhr.responseText,
75 | };
76 | onError?.(result);
77 | reject(result);
78 | };
79 |
80 | xhr.onabort = () => {
81 | const result: OnErrorData = {
82 | item,
83 | error: 'Request aborted',
84 | };
85 | onError?.(result);
86 | reject(result);
87 | };
88 |
89 | headers?.forEach((value: string, key: string) => {
90 | xhr.setRequestHeader(key, value);
91 | });
92 |
93 | xhr.send(formData);
94 | });
95 | };
96 |
97 | const abortUpload = (uri: string) => {
98 | requests.current[uri]?.abort();
99 | };
100 |
101 | return { startUpload, abortUpload };
102 | }
103 |
--------------------------------------------------------------------------------
/example/android/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/example/android/app/src/main/java/com/usefileuploadexample/MainApplication.java:
--------------------------------------------------------------------------------
1 | package com.usefileuploadexample;
2 |
3 | import android.app.Application;
4 | import android.content.Context;
5 | import com.facebook.react.PackageList;
6 | import com.facebook.react.ReactApplication;
7 | import com.facebook.react.ReactInstanceManager;
8 | import com.facebook.react.ReactNativeHost;
9 | import com.facebook.react.ReactPackage;
10 | import com.facebook.react.config.ReactFeatureFlags;
11 | import com.facebook.soloader.SoLoader;
12 | import com.usefileuploadexample.newarchitecture.MainApplicationReactNativeHost;
13 | import java.lang.reflect.InvocationTargetException;
14 | import java.util.List;
15 |
16 | public class MainApplication extends Application implements ReactApplication {
17 |
18 | private final ReactNativeHost mReactNativeHost =
19 | new ReactNativeHost(this) {
20 | @Override
21 | public boolean getUseDeveloperSupport() {
22 | return BuildConfig.DEBUG;
23 | }
24 |
25 | @Override
26 | protected List getPackages() {
27 | @SuppressWarnings("UnnecessaryLocalVariable")
28 | List packages = new PackageList(this).getPackages();
29 | // Packages that cannot be autolinked yet can be added manually here, for example:
30 | // packages.add(new MyReactNativePackage());
31 | return packages;
32 | }
33 |
34 | @Override
35 | protected String getJSMainModuleName() {
36 | return "index";
37 | }
38 | };
39 |
40 | private final ReactNativeHost mNewArchitectureNativeHost =
41 | new MainApplicationReactNativeHost(this);
42 |
43 | @Override
44 | public ReactNativeHost getReactNativeHost() {
45 | if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
46 | return mNewArchitectureNativeHost;
47 | } else {
48 | return mReactNativeHost;
49 | }
50 | }
51 |
52 | @Override
53 | public void onCreate() {
54 | super.onCreate();
55 | // If you opted-in for the New Architecture, we enable the TurboModule system
56 | ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
57 | SoLoader.init(this, /* native exopackage */ false);
58 | initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
59 | }
60 |
61 | /**
62 | * Loads Flipper in React Native templates. Call this in the onCreate method with something like
63 | * initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
64 | *
65 | * @param context
66 | * @param reactInstanceManager
67 | */
68 | private static void initializeFlipper(
69 | Context context, ReactInstanceManager reactInstanceManager) {
70 | if (BuildConfig.DEBUG) {
71 | try {
72 | /*
73 | We use reflection here to pick up the class that initializes Flipper,
74 | since Flipper library is not available in release mode
75 | */
76 | Class> aClass = Class.forName("com.usefileuploadexample.ReactNativeFlipper");
77 | aClass
78 | .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
79 | .invoke(null, context, reactInstanceManager);
80 | } catch (ClassNotFoundException e) {
81 | e.printStackTrace();
82 | } catch (NoSuchMethodException e) {
83 | e.printStackTrace();
84 | } catch (IllegalAccessException e) {
85 | e.printStackTrace();
86 | } catch (InvocationTargetException e) {
87 | e.printStackTrace();
88 | }
89 | }
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/example/android/app/src/debug/java/com/usefileuploadexample/ReactNativeFlipper.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) Meta Platforms, Inc. and affiliates.
3 | *
4 | * This source code is licensed under the MIT license found in the LICENSE file in the root
5 | * directory of this source tree.
6 | */
7 | package com.usefileuploadexample;
8 |
9 | import android.content.Context;
10 | import com.facebook.flipper.android.AndroidFlipperClient;
11 | import com.facebook.flipper.android.utils.FlipperUtils;
12 | import com.facebook.flipper.core.FlipperClient;
13 | import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
14 | import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
15 | import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
16 | import com.facebook.flipper.plugins.inspector.DescriptorMapping;
17 | import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
18 | import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
19 | import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
20 | import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
21 | import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
22 | import com.facebook.react.ReactInstanceEventListener;
23 | import com.facebook.react.ReactInstanceManager;
24 | import com.facebook.react.bridge.ReactContext;
25 | import com.facebook.react.modules.network.NetworkingModule;
26 | import okhttp3.OkHttpClient;
27 |
28 | public class ReactNativeFlipper {
29 | public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
30 | if (FlipperUtils.shouldEnableFlipper(context)) {
31 | final FlipperClient client = AndroidFlipperClient.getInstance(context);
32 |
33 | client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
34 | client.addPlugin(new ReactFlipperPlugin());
35 | client.addPlugin(new DatabasesFlipperPlugin(context));
36 | client.addPlugin(new SharedPreferencesFlipperPlugin(context));
37 | client.addPlugin(CrashReporterPlugin.getInstance());
38 |
39 | NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
40 | NetworkingModule.setCustomClientBuilder(
41 | new NetworkingModule.CustomClientBuilder() {
42 | @Override
43 | public void apply(OkHttpClient.Builder builder) {
44 | builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
45 | }
46 | });
47 | client.addPlugin(networkFlipperPlugin);
48 | client.start();
49 |
50 | // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
51 | // Hence we run if after all native modules have been initialized
52 | ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
53 | if (reactContext == null) {
54 | reactInstanceManager.addReactInstanceEventListener(
55 | new ReactInstanceEventListener() {
56 | @Override
57 | public void onReactContextInitialized(ReactContext reactContext) {
58 | reactInstanceManager.removeReactInstanceEventListener(this);
59 | reactContext.runOnNativeModulesQueueThread(
60 | new Runnable() {
61 | @Override
62 | public void run() {
63 | client.addPlugin(new FrescoFlipperPlugin());
64 | }
65 | });
66 | }
67 | });
68 | } else {
69 | client.addPlugin(new FrescoFlipperPlugin());
70 | }
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/example/ios/UseFileUploadExample.xcodeproj/xcshareddata/xcschemes/UseFileUploadExample.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
53 |
55 |
61 |
62 |
63 |
64 |
70 |
72 |
78 |
79 |
80 |
81 |
83 |
84 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/example/ios/UseFileUploadExample/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-native-use-file-upload",
3 | "version": "0.2.0",
4 | "description": "A hook for uploading files using multipart form data with React Native. Provides a simple way to track upload progress, abort an upload, and handle timeouts. Written in TypeScript and no dependencies required.",
5 | "main": "lib/commonjs/index",
6 | "module": "lib/module/index",
7 | "types": "lib/typescript/index.d.ts",
8 | "react-native": "src/index",
9 | "source": "src/index",
10 | "files": [
11 | "src",
12 | "lib",
13 | "android",
14 | "ios",
15 | "cpp",
16 | "*.podspec",
17 | "!lib/typescript/example",
18 | "!ios/build",
19 | "!android/build",
20 | "!android/gradle",
21 | "!android/gradlew",
22 | "!android/gradlew.bat",
23 | "!android/local.properties",
24 | "!**/__tests__",
25 | "!**/__fixtures__",
26 | "!**/__mocks__",
27 | "!**/.*"
28 | ],
29 | "scripts": {
30 | "test": "jest",
31 | "typescript": "tsc --noEmit",
32 | "lint": "eslint \"**/*.{js,ts,tsx}\"",
33 | "prepare": "bob build",
34 | "release": "release-it",
35 | "example": "yarn --cwd example",
36 | "bootstrap": "yarn example && yarn install && yarn example pods"
37 | },
38 | "keywords": [
39 | "react-native",
40 | "ios",
41 | "android",
42 | "file",
43 | "upload",
44 | "uploader",
45 | "photo"
46 | ],
47 | "repository": "https://github.com/rossmartin/react-native-use-file-upload",
48 | "author": "Ross Martin <2498502+rossmartin@users.noreply.github.com> (https://github.com/rossmartin)",
49 | "license": "MIT",
50 | "bugs": {
51 | "url": "https://github.com/rossmartin/react-native-use-file-upload/issues"
52 | },
53 | "homepage": "https://github.com/rossmartin/react-native-use-file-upload#readme",
54 | "publishConfig": {
55 | "registry": "https://registry.npmjs.org/"
56 | },
57 | "devDependencies": {
58 | "@commitlint/config-conventional": "^17.0.2",
59 | "@react-native-community/eslint-config": "^3.0.2",
60 | "@release-it/conventional-changelog": "^5.0.0",
61 | "@types/jest": "^28.1.2",
62 | "@types/react": "~17.0.21",
63 | "@types/react-native": "0.68.0",
64 | "commitlint": "^17.0.2",
65 | "eslint": "^8.4.1",
66 | "eslint-config-prettier": "^8.5.0",
67 | "eslint-plugin-prettier": "^4.2.1",
68 | "jest": "^28.1.1",
69 | "pod-install": "^0.1.0",
70 | "prettier": "2.7.1",
71 | "react": "18.1.0",
72 | "react-native": "0.70.3",
73 | "react-native-builder-bob": "^0.20.0",
74 | "release-it": "^15.0.0",
75 | "typescript": "^4.5.2"
76 | },
77 | "resolutions": {
78 | "@types/react": "17.0.21"
79 | },
80 | "peerDependencies": {
81 | "react": "*",
82 | "react-native": "*"
83 | },
84 | "jest": {
85 | "preset": "react-native",
86 | "modulePathIgnorePatterns": [
87 | "/example/node_modules",
88 | "/lib/"
89 | ]
90 | },
91 | "commitlint": {
92 | "extends": [
93 | "@commitlint/config-conventional"
94 | ]
95 | },
96 | "release-it": {
97 | "git": {
98 | "commitMessage": "chore: release ${version}",
99 | "tagName": "v${version}"
100 | },
101 | "npm": {
102 | "publish": true
103 | },
104 | "github": {
105 | "release": true
106 | },
107 | "plugins": {
108 | "@release-it/conventional-changelog": {
109 | "preset": "angular"
110 | }
111 | }
112 | },
113 | "eslintConfig": {
114 | "root": true,
115 | "extends": [
116 | "@react-native-community",
117 | "prettier"
118 | ],
119 | "rules": {
120 | "prettier/prettier": [
121 | "error",
122 | {
123 | "quoteProps": "consistent",
124 | "singleQuote": true,
125 | "tabWidth": 2,
126 | "trailingComma": "es5",
127 | "useTabs": false,
128 | "arrowParens": "always"
129 | }
130 | ]
131 | }
132 | },
133 | "eslintIgnore": [
134 | "node_modules/",
135 | "lib/"
136 | ],
137 | "prettier": {
138 | "quoteProps": "consistent",
139 | "singleQuote": true,
140 | "tabWidth": 2,
141 | "trailingComma": "es5",
142 | "useTabs": false,
143 | "arrowParens": "always"
144 | },
145 | "react-native-builder-bob": {
146 | "source": "src",
147 | "output": "lib",
148 | "targets": [
149 | "commonjs",
150 | "module",
151 | [
152 | "typescript",
153 | {
154 | "project": "tsconfig.build.json"
155 | }
156 | ]
157 | ]
158 | }
159 | }
160 |
--------------------------------------------------------------------------------
/example/ios/UseFileUploadExample/AppDelegate.mm:
--------------------------------------------------------------------------------
1 | #import "AppDelegate.h"
2 |
3 | #import
4 | #import
5 | #import
6 |
7 | #import
8 |
9 | #if RCT_NEW_ARCH_ENABLED
10 | #import
11 | #import
12 | #import
13 | #import
14 | #import
15 | #import
16 |
17 | #import
18 |
19 | static NSString *const kRNConcurrentRoot = @"concurrentRoot";
20 |
21 | @interface AppDelegate () {
22 | RCTTurboModuleManager *_turboModuleManager;
23 | RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
24 | std::shared_ptr _reactNativeConfig;
25 | facebook::react::ContextContainer::Shared _contextContainer;
26 | }
27 | @end
28 | #endif
29 |
30 | @implementation AppDelegate
31 |
32 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
33 | {
34 | RCTAppSetupPrepareApp(application);
35 |
36 | RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
37 |
38 | #if RCT_NEW_ARCH_ENABLED
39 | _contextContainer = std::make_shared();
40 | _reactNativeConfig = std::make_shared();
41 | _contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
42 | _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer];
43 | bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
44 | #endif
45 |
46 | NSDictionary *initProps = [self prepareInitialProps];
47 | UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"UseFileUploadExample", initProps);
48 |
49 | if (@available(iOS 13.0, *)) {
50 | rootView.backgroundColor = [UIColor systemBackgroundColor];
51 | } else {
52 | rootView.backgroundColor = [UIColor whiteColor];
53 | }
54 |
55 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
56 | UIViewController *rootViewController = [UIViewController new];
57 | rootViewController.view = rootView;
58 | self.window.rootViewController = rootViewController;
59 | [self.window makeKeyAndVisible];
60 | return YES;
61 | }
62 |
63 | /// This method controls whether the `concurrentRoot`feature of React18 is turned on or off.
64 | ///
65 | /// @see: https://reactjs.org/blog/2022/03/29/react-v18.html
66 | /// @note: This requires to be rendering on Fabric (i.e. on the New Architecture).
67 | /// @return: `true` if the `concurrentRoot` feture is enabled. Otherwise, it returns `false`.
68 | - (BOOL)concurrentRootEnabled
69 | {
70 | // Switch this bool to turn on and off the concurrent root
71 | return true;
72 | }
73 |
74 | - (NSDictionary *)prepareInitialProps
75 | {
76 | NSMutableDictionary *initProps = [NSMutableDictionary new];
77 |
78 | #ifdef RCT_NEW_ARCH_ENABLED
79 | initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]);
80 | #endif
81 |
82 | return initProps;
83 | }
84 |
85 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
86 | {
87 | #if DEBUG
88 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
89 | #else
90 | return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
91 | #endif
92 | }
93 |
94 | #if RCT_NEW_ARCH_ENABLED
95 |
96 | #pragma mark - RCTCxxBridgeDelegate
97 |
98 | - (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge
99 | {
100 | _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
101 | delegate:self
102 | jsInvoker:bridge.jsCallInvoker];
103 | return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
104 | }
105 |
106 | #pragma mark RCTTurboModuleManagerDelegate
107 |
108 | - (Class)getModuleClassFromName:(const char *)name
109 | {
110 | return RCTCoreModulesClassProvider(name);
111 | }
112 |
113 | - (std::shared_ptr)getTurboModule:(const std::string &)name
114 | jsInvoker:(std::shared_ptr)jsInvoker
115 | {
116 | return nullptr;
117 | }
118 |
119 | - (std::shared_ptr)getTurboModule:(const std::string &)name
120 | initParams:
121 | (const facebook::react::ObjCTurboModule::InitParams &)params
122 | {
123 | return nullptr;
124 | }
125 |
126 | - (id)getModuleInstanceFromClass:(Class)moduleClass
127 | {
128 | return RCTAppSetupDefaultModuleFromClass(moduleClass);
129 | }
130 |
131 | #endif
132 |
133 | @end
134 |
--------------------------------------------------------------------------------
/example/android/app/src/main/java/com/usefileuploadexample/newarchitecture/MainApplicationReactNativeHost.java:
--------------------------------------------------------------------------------
1 | package com.usefileuploadexample.newarchitecture;
2 |
3 | import android.app.Application;
4 | import androidx.annotation.NonNull;
5 | import com.facebook.react.PackageList;
6 | import com.facebook.react.ReactInstanceManager;
7 | import com.facebook.react.ReactNativeHost;
8 | import com.facebook.react.ReactPackage;
9 | import com.facebook.react.ReactPackageTurboModuleManagerDelegate;
10 | import com.facebook.react.bridge.JSIModulePackage;
11 | import com.facebook.react.bridge.JSIModuleProvider;
12 | import com.facebook.react.bridge.JSIModuleSpec;
13 | import com.facebook.react.bridge.JSIModuleType;
14 | import com.facebook.react.bridge.JavaScriptContextHolder;
15 | import com.facebook.react.bridge.ReactApplicationContext;
16 | import com.facebook.react.bridge.UIManager;
17 | import com.facebook.react.fabric.ComponentFactory;
18 | import com.facebook.react.fabric.CoreComponentsRegistry;
19 | import com.facebook.react.fabric.FabricJSIModuleProvider;
20 | import com.facebook.react.fabric.ReactNativeConfig;
21 | import com.facebook.react.uimanager.ViewManagerRegistry;
22 | import com.usefileuploadexample.BuildConfig;
23 | import com.usefileuploadexample.newarchitecture.components.MainComponentsRegistry;
24 | import com.usefileuploadexample.newarchitecture.modules.MainApplicationTurboModuleManagerDelegate;
25 | import java.util.ArrayList;
26 | import java.util.List;
27 |
28 | /**
29 | * A {@link ReactNativeHost} that helps you load everything needed for the New Architecture, both
30 | * TurboModule delegates and the Fabric Renderer.
31 | *
32 | * Please note that this class is used ONLY if you opt-in for the New Architecture (see the
33 | * `newArchEnabled` property). Is ignored otherwise.
34 | */
35 | public class MainApplicationReactNativeHost extends ReactNativeHost {
36 | public MainApplicationReactNativeHost(Application application) {
37 | super(application);
38 | }
39 |
40 | @Override
41 | public boolean getUseDeveloperSupport() {
42 | return BuildConfig.DEBUG;
43 | }
44 |
45 | @Override
46 | protected List getPackages() {
47 | List packages = new PackageList(this).getPackages();
48 | // Packages that cannot be autolinked yet can be added manually here, for example:
49 | // packages.add(new MyReactNativePackage());
50 | // TurboModules must also be loaded here providing a valid TurboReactPackage implementation:
51 | // packages.add(new TurboReactPackage() { ... });
52 | // If you have custom Fabric Components, their ViewManagers should also be loaded here
53 | // inside a ReactPackage.
54 | return packages;
55 | }
56 |
57 | @Override
58 | protected String getJSMainModuleName() {
59 | return "index";
60 | }
61 |
62 | @NonNull
63 | @Override
64 | protected ReactPackageTurboModuleManagerDelegate.Builder
65 | getReactPackageTurboModuleManagerDelegateBuilder() {
66 | // Here we provide the ReactPackageTurboModuleManagerDelegate Builder. This is necessary
67 | // for the new architecture and to use TurboModules correctly.
68 | return new MainApplicationTurboModuleManagerDelegate.Builder();
69 | }
70 |
71 | @Override
72 | protected JSIModulePackage getJSIModulePackage() {
73 | return new JSIModulePackage() {
74 | @Override
75 | public List getJSIModules(
76 | final ReactApplicationContext reactApplicationContext,
77 | final JavaScriptContextHolder jsContext) {
78 | final List specs = new ArrayList<>();
79 |
80 | // Here we provide a new JSIModuleSpec that will be responsible of providing the
81 | // custom Fabric Components.
82 | specs.add(
83 | new JSIModuleSpec() {
84 | @Override
85 | public JSIModuleType getJSIModuleType() {
86 | return JSIModuleType.UIManager;
87 | }
88 |
89 | @Override
90 | public JSIModuleProvider getJSIModuleProvider() {
91 | final ComponentFactory componentFactory = new ComponentFactory();
92 | CoreComponentsRegistry.register(componentFactory);
93 |
94 | // Here we register a Components Registry.
95 | // The one that is generated with the template contains no components
96 | // and just provides you the one from React Native core.
97 | MainComponentsRegistry.register(componentFactory);
98 |
99 | final ReactInstanceManager reactInstanceManager = getReactInstanceManager();
100 |
101 | ViewManagerRegistry viewManagerRegistry =
102 | new ViewManagerRegistry(
103 | reactInstanceManager.getOrCreateViewManagers(reactApplicationContext));
104 |
105 | return new FabricJSIModuleProvider(
106 | reactApplicationContext,
107 | componentFactory,
108 | ReactNativeConfig.DEFAULT_CONFIG,
109 | viewManagerRegistry);
110 | }
111 | });
112 | return specs;
113 | }
114 | };
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # react-native-use-file-upload
2 |
3 | A hook for uploading files using multipart form data with React Native. Provides a simple way to track upload progress, abort an upload, and handle timeouts. Written in TypeScript and no dependencies required.
4 |
5 | [](https://www.npmjs.org/package/react-native-use-file-upload)
6 |
7 | 
8 |
9 | ## Installation
10 |
11 | ```sh
12 | yarn add react-native-use-file-upload
13 | ```
14 |
15 | ## Example App
16 |
17 | There is an example app in this repo as shown in the above gif. It is located within `example` and there is a small node server script within `example/server` [here](example/server/server.ts). You can start the node server within `example` using `yarn server`.
18 |
19 | ## Usage
20 |
21 | ```tsx
22 | import useFileUpload, { UploadItem } from 'react-native-use-file-upload';
23 |
24 | // Used in optional type parameter for useFileUpload
25 | interface Item extends UploadItem {
26 | progress?: number;
27 | }
28 |
29 | // ...
30 | const [data, setData] = useState- ([]);
31 | // The generic type param below for useFileUpload is optional
32 | // and defaults to UploadItem. It should inherit UploadItem.
33 | const { startUpload, abortUpload } = useFileUpload
- ({
34 | url: 'https://example.com/upload',
35 | field: 'file',
36 | // Below options are optional
37 | method: 'POST',
38 | data,
39 | headers,
40 | timeout: 60 * 1000, // 60 seconds
41 | onProgress,
42 | onDone,
43 | onError,
44 | onTimeout,
45 | });
46 |
47 | const onPressUpload = async () => {
48 | const promises = data.map((item) => startUpload(item));
49 | // Use Promise.all instead if you want to throw an error from a timeout or error.
50 | // As of October 2022 you have to polyfill allSettled in React Native.
51 | const result = await Promise.allSettled(promises);
52 | };
53 | ```
54 |
55 | ## Methods
56 |
57 | ### `startUpload`
58 |
59 | Start a file upload for a given file. Returns a promise that resolves with `OnDoneData` or rejects with `OnErrorData`.
60 |
61 | ```ts
62 | // Objects passed to startUpload should have the below shape at least (UploadItem type)
63 | startUpload({
64 | name: 'file.jpg',
65 | type: 'image/jpg',
66 | uri: 'file://some-local-file.jpg',
67 | });
68 | ```
69 |
70 | ### `abortUpload`
71 |
72 | Abort a file upload for a given file. The promise from `startUpload` gets rejected and `onError` runs if present.
73 |
74 | ```ts
75 | // Pass the uri of a file that started uploading
76 | abortUpload('file://some-local-file.jpg');
77 | ```
78 |
79 | ## Options
80 |
81 |
82 |
83 |
84 | Name
85 | Type
86 | Required
87 | Description
88 |
89 |
90 |
91 |
92 | url
93 | string
94 | Required
95 | The URL to send the request to.
96 |
97 |
98 | field
99 | string
100 | Required
101 | The field name that will be used for the file in FormData.
102 |
103 |
104 | method
105 | string
106 | Optional
107 | The HTTP method for the request. Defaults to "POST".
108 |
109 |
110 | data
111 | object
112 | Optional
113 | An object of additional FormData fields to be set with the request.
114 |
115 |
116 | headers
117 | Headers
118 | Optional
119 | Option for passsing in requst headers.
120 |
121 | ```ts
122 | const headers = new Headers();
123 | headers.append('Authorization', 'foo');
124 | useFileUpload({ headers });
125 | ```
126 |
127 |
128 |
129 |
130 |
131 | timeout
132 | number
133 | Optional
134 | The timeout value for the request in milliseconds.
135 |
136 |
137 | onProgress
138 | function
139 | Optional
140 | Callback when a request times out for a given file. It receives 1 argument of this shape -
141 |
142 | ```ts
143 | // OnProgressData type
144 | {
145 | item: UploadItem; // or a type that inherits UploadItem
146 | event: ProgressEvent;
147 | };
148 | // event is the XMLHttpRequest progress event object and it's shape is -
149 | {
150 | loaded: number,
151 | total: number
152 | }
153 | ```
154 |
155 |
156 |
157 |
158 | onDone
159 | function
160 | Optional
161 | Callback on request completion for a given file. It receives 1 argument of this shape -
162 |
163 | ```ts
164 | // OnDoneData type
165 | {
166 | item: UploadItem; // or a type that inherits UploadItem
167 | responseBody: string; // eg "{\"foo\":\"baz\"}" (JSON) or "foo"
168 | responseHeaders: string;
169 | }
170 | ```
171 |
172 |
173 |
174 |
175 | onError
176 | function
177 | Optional
178 | Callback when a request error happens for a given file. It receives 1 argument of this shape -
179 |
180 | ```ts
181 | // onErrorData type
182 | {
183 | item: UploadItem; // or a type that inherits UploadItem
184 | error: string;
185 | }
186 | ```
187 |
188 |
189 |
190 |
191 | onTimeout
192 | function
193 | Optional
194 | Callback when a request error happens for a given file. It receives 1 argument of this shape -
195 |
196 | ```ts
197 | // OnErrorData type
198 | {
199 | item: UploadItem; // or a type that inherits UploadItem
200 | error: string;
201 | timeout: boolean; // true here
202 | }
203 | ```
204 |
205 |
206 |
207 |
208 |
209 |
210 | ## FAQs
211 |
212 | ### Do requests continue when the app is backgrounded?
213 |
214 | Requests continue when the app is backgrounded on android but they do not on iOS. This can be addressed by using [react-native-background-upload](https://github.com/Vydia/react-native-background-upload).
215 |
216 | The React Native team did a heavy lift to polyfill and bridge `XMLHttpRequest` to the native side for us. [There is an open PR in React Native to allow network requests to run in the background for iOS](https://github.com/facebook/react-native/pull/31838). `react-native-background-upload` is great but if backgrounding can be supported without any external native dependencies it is a win for everyone.
217 |
218 | ### How can I throttle the file uploads so that I can simulate a real world scenario where upload progress takes time?
219 |
220 | You can throttle the file uploads by using [ngrok](https://ngrok.com/) and [Network Link Conditioner](https://developer.apple.com/download/more/?q=Additional%20Tools). Once you have ngrok installed you can start a HTTP tunnel forwarding to the local node server on port 8080 via:
221 |
222 | ```sh
223 | ngrok http 8080
224 | ```
225 |
226 | ngrok will generate a forwarding URL to the local node server and you should set this as the `url` for `useFileUpload`. This will make your device/simulator make the requests against the ngrok forwarding URL.
227 |
228 | You can throttle your connection using Network Link Conditioner if needed. The existing Wifi profile with a 33 Mbps upload works well and you can add a custom profile also. If your upload speed is faster than 100 Mbps you'll see a difference by throttling with Network Link Conditioner. You might not need to throttle with Network Link Conditioner depending on your connection upload speed.
229 |
230 | ### Why send 1 file at a time instead of multiple in a single request?
231 |
232 | It is possible to to send multiple files in 1 request. There are downsides to this approach though and the main one is that it is slower. A client has the ability to handle multiple server connections simultaneously, allowing the files to stream in parallel. This folds the upload time over on itself.
233 |
234 | Another downside is fault tolerance. By splitting the files into separate requests, this strategy allows for a file upload to fail in isolation. If the connection fails for the request, or the file is invalidated by the server, or any other reason, that file upload will fail by itself and won't affect any of the other uploads.
235 |
236 | ### Why is `type` and `name` required in the `UploadItem` type?
237 |
238 | This is because of how React Native abstracts away setting the `content-disposition` request header for us in their polyfill for `FormData`. You can see [here](https://github.com/facebook/react-native/blob/d05a5d15512ab794ef80b31ef91090d5d88b3fcd/Libraries/Network/FormData.js) how that is being done in the `getParts` function.
239 |
240 | ## License
241 |
242 | [MIT](LICENSE.md)
243 |
244 | ---
245 |
246 | Made with [create-react-native-library](https://github.com/callstack/react-native-builder-bob)
247 |
--------------------------------------------------------------------------------
/example/android/gradlew:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | #
4 | # Copyright © 2015-2021 the original authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | #
21 | # Gradle start up script for POSIX generated by Gradle.
22 | #
23 | # Important for running:
24 | #
25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
26 | # noncompliant, but you have some other compliant shell such as ksh or
27 | # bash, then to run this script, type that shell name before the whole
28 | # command line, like:
29 | #
30 | # ksh Gradle
31 | #
32 | # Busybox and similar reduced shells will NOT work, because this script
33 | # requires all of these POSIX shell features:
34 | # * functions;
35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»;
37 | # * compound commands having a testable exit status, especially «case»;
38 | # * various built-in commands including «command», «set», and «ulimit».
39 | #
40 | # Important for patching:
41 | #
42 | # (2) This script targets any POSIX shell, so it avoids extensions provided
43 | # by Bash, Ksh, etc; in particular arrays are avoided.
44 | #
45 | # The "traditional" practice of packing multiple parameters into a
46 | # space-separated string is a well documented source of bugs and security
47 | # problems, so this is (mostly) avoided, by progressively accumulating
48 | # options in "$@", and eventually passing that to Java.
49 | #
50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
52 | # see the in-line comments for details.
53 | #
54 | # There are tweaks for specific operating systems such as AIX, CygWin,
55 | # Darwin, MinGW, and NonStop.
56 | #
57 | # (3) This script is generated from the Groovy template
58 | # https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
59 | # within the Gradle project.
60 | #
61 | # You can find Gradle at https://github.com/gradle/gradle/.
62 | #
63 | ##############################################################################
64 |
65 | # Attempt to set APP_HOME
66 |
67 | # Resolve links: $0 may be a link
68 | app_path=$0
69 |
70 | # Need this for daisy-chained symlinks.
71 | while
72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
73 | [ -h "$app_path" ]
74 | do
75 | ls=$( ls -ld "$app_path" )
76 | link=${ls#*' -> '}
77 | case $link in #(
78 | /*) app_path=$link ;; #(
79 | *) app_path=$APP_HOME$link ;;
80 | esac
81 | done
82 |
83 | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
84 |
85 | APP_NAME="Gradle"
86 | APP_BASE_NAME=${0##*/}
87 |
88 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
89 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
90 |
91 | # Use the maximum available, or set MAX_FD != -1 to use that value.
92 | MAX_FD=maximum
93 |
94 | warn () {
95 | echo "$*"
96 | } >&2
97 |
98 | die () {
99 | echo
100 | echo "$*"
101 | echo
102 | exit 1
103 | } >&2
104 |
105 | # OS specific support (must be 'true' or 'false').
106 | cygwin=false
107 | msys=false
108 | darwin=false
109 | nonstop=false
110 | case "$( uname )" in #(
111 | CYGWIN* ) cygwin=true ;; #(
112 | Darwin* ) darwin=true ;; #(
113 | MSYS* | MINGW* ) msys=true ;; #(
114 | NONSTOP* ) nonstop=true ;;
115 | esac
116 |
117 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
118 |
119 |
120 | # Determine the Java command to use to start the JVM.
121 | if [ -n "$JAVA_HOME" ] ; then
122 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
123 | # IBM's JDK on AIX uses strange locations for the executables
124 | JAVACMD=$JAVA_HOME/jre/sh/java
125 | else
126 | JAVACMD=$JAVA_HOME/bin/java
127 | fi
128 | if [ ! -x "$JAVACMD" ] ; then
129 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
130 |
131 | Please set the JAVA_HOME variable in your environment to match the
132 | location of your Java installation."
133 | fi
134 | else
135 | JAVACMD=java
136 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
137 |
138 | Please set the JAVA_HOME variable in your environment to match the
139 | location of your Java installation."
140 | fi
141 |
142 | # Increase the maximum file descriptors if we can.
143 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
144 | case $MAX_FD in #(
145 | max*)
146 | MAX_FD=$( ulimit -H -n ) ||
147 | warn "Could not query maximum file descriptor limit"
148 | esac
149 | case $MAX_FD in #(
150 | '' | soft) :;; #(
151 | *)
152 | ulimit -n "$MAX_FD" ||
153 | warn "Could not set maximum file descriptor limit to $MAX_FD"
154 | esac
155 | fi
156 |
157 | # Collect all arguments for the java command, stacking in reverse order:
158 | # * args from the command line
159 | # * the main class name
160 | # * -classpath
161 | # * -D...appname settings
162 | # * --module-path (only if needed)
163 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
164 |
165 | # For Cygwin or MSYS, switch paths to Windows format before running java
166 | if "$cygwin" || "$msys" ; then
167 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
168 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
169 |
170 | JAVACMD=$( cygpath --unix "$JAVACMD" )
171 |
172 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
173 | for arg do
174 | if
175 | case $arg in #(
176 | -*) false ;; # don't mess with options #(
177 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
178 | [ -e "$t" ] ;; #(
179 | *) false ;;
180 | esac
181 | then
182 | arg=$( cygpath --path --ignore --mixed "$arg" )
183 | fi
184 | # Roll the args list around exactly as many times as the number of
185 | # args, so each arg winds up back in the position where it started, but
186 | # possibly modified.
187 | #
188 | # NB: a `for` loop captures its iteration list before it begins, so
189 | # changing the positional parameters here affects neither the number of
190 | # iterations, nor the values presented in `arg`.
191 | shift # remove old arg
192 | set -- "$@" "$arg" # push replacement arg
193 | done
194 | fi
195 |
196 | # Collect all arguments for the java command;
197 | # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
198 | # shell script including quotes and variable substitutions, so put them in
199 | # double quotes to make sure that they get re-expanded; and
200 | # * put everything else in single quotes, so that it's not re-expanded.
201 |
202 | set -- \
203 | "-Dorg.gradle.appname=$APP_BASE_NAME" \
204 | -classpath "$CLASSPATH" \
205 | org.gradle.wrapper.GradleWrapperMain \
206 | "$@"
207 |
208 | # Use "xargs" to parse quoted args.
209 | #
210 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed.
211 | #
212 | # In Bash we could simply go:
213 | #
214 | # readarray ARGS < <( xargs -n1 <<<"$var" ) &&
215 | # set -- "${ARGS[@]}" "$@"
216 | #
217 | # but POSIX shell has neither arrays nor command substitution, so instead we
218 | # post-process each arg (as a line of input to sed) to backslash-escape any
219 | # character that might be a shell metacharacter, then use eval to reverse
220 | # that process (while maintaining the separation between arguments), and wrap
221 | # the whole thing up as a single "set" statement.
222 | #
223 | # This will of course break if any of these variables contains a newline or
224 | # an unmatched quote.
225 | #
226 |
227 | eval "set -- $(
228 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
229 | xargs -n1 |
230 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
231 | tr '\n' ' '
232 | )" '"$@"'
233 |
234 | exec "$JAVACMD" "$@"
235 |
--------------------------------------------------------------------------------
/example/src/App.tsx:
--------------------------------------------------------------------------------
1 | import React, { useRef, useState } from 'react';
2 | import {
3 | ActivityIndicator,
4 | Animated,
5 | Button,
6 | Pressable,
7 | SafeAreaView,
8 | StyleSheet,
9 | Text,
10 | View,
11 | } from 'react-native';
12 | import { launchImageLibrary } from 'react-native-image-picker';
13 | import SortableGrid, { ItemOrder } from 'react-native-sortable-grid';
14 | import ReactNativeHapticFeedback, {
15 | HapticOptions,
16 | } from 'react-native-haptic-feedback';
17 | import FastImage from 'react-native-fast-image';
18 |
19 | import ProgressBar from './components/ProgressBar';
20 | import useFileUpload, { UploadItem, OnProgressData } from '../../src/index';
21 | import { allSettled } from './util/general';
22 | import placeholderImage from './img/placeholder.png';
23 |
24 | const hapticFeedbackOptions: HapticOptions = {
25 | enableVibrateFallback: false,
26 | ignoreAndroidSystemSettings: false,
27 | };
28 |
29 | interface Item extends UploadItem {
30 | progress?: number;
31 | failed?: boolean; // true on timeout or error
32 | completed?: boolean;
33 | }
34 |
35 | export default function App() {
36 | const [data, setData] = useState- ([]);
37 | const dragStartAnimatedValue = useRef(new Animated.Value(1));
38 |
39 | const { startUpload, abortUpload } = useFileUpload
- ({
40 | url: 'http://localhost:8080/upload',
41 | field: 'file',
42 | // optional below
43 | method: 'POST',
44 | timeout: 60 * 1000, // you can set this lower to cause timeouts to happen
45 | onProgress,
46 | onDone: ({ item }) => {
47 | updateItem({
48 | item,
49 | keysAndValues: [
50 | {
51 | key: 'completed',
52 | value: true,
53 | },
54 | ],
55 | });
56 | },
57 | onError: ({ item }) => {
58 | updateItem({
59 | item,
60 | keysAndValues: [
61 | { key: 'progress', value: undefined },
62 | { key: 'failed', value: true },
63 | ],
64 | });
65 | },
66 | onTimeout: ({ item }) => {
67 | updateItem({
68 | item,
69 | keysAndValues: [
70 | { key: 'progress', value: undefined },
71 | { key: 'failed', value: true },
72 | ],
73 | });
74 | },
75 | });
76 |
77 | const isUploading = data.some(
78 | (item) =>
79 | typeof item.progress === 'number' &&
80 | item.progress > 0 &&
81 | item.progress < 100
82 | );
83 |
84 | const updateItem =
({
85 | item,
86 | keysAndValues,
87 | }: {
88 | item: Item;
89 | keysAndValues: { key: K; value: Item[K] }[];
90 | }) => {
91 | setData((prevState) => {
92 | const newState = [...prevState];
93 | const itemToUpdate = newState.find((s) => s.uri === item.uri);
94 |
95 | if (itemToUpdate) {
96 | keysAndValues.forEach(({ key, value }) => {
97 | itemToUpdate[key] = value;
98 | });
99 | }
100 |
101 | return newState;
102 | });
103 | };
104 |
105 | function onProgress({ item, event }: OnProgressData- ) {
106 | const progress = event?.loaded
107 | ? Math.round((event.loaded / event.total) * 100)
108 | : 0;
109 |
110 | updateItem({
111 | item,
112 | keysAndValues: [{ key: 'progress', value: progress }],
113 | });
114 | }
115 |
116 | const onPressSelectMedia = async () => {
117 | const response = await launchImageLibrary({
118 | mediaType: 'photo',
119 | selectionLimit: 0,
120 | });
121 |
122 | const items: Item[] =
123 | response?.assets?.map((a) => ({
124 | name: a.fileName!,
125 | type: a.type!,
126 | uri: a.uri!,
127 | })) ?? [];
128 |
129 | setData((prevState) => [...prevState, ...items]);
130 | };
131 |
132 | const putItOnTheLine = async (_data: Item[]) => {
133 | const promises = _data
134 | .filter((item) => typeof item.progress !== 'number') // leave out any in progress or completed
135 | .map((item) => startUpload(item));
136 | // use Promise.all here if you want an error from a timeout or error
137 | const result = await allSettled(promises);
138 | console.log('result: ', result);
139 | };
140 |
141 | const onPressUpload = () => {
142 | // allow uploading any that previously failed
143 | setData((prevState) => {
144 | const newState = [...prevState].map((item) => ({
145 | ...item,
146 | failed: false,
147 | }));
148 |
149 | putItOnTheLine(newState);
150 |
151 | return newState;
152 | });
153 | };
154 |
155 | const onPressDeleteItem = (item: Item) => () => {
156 | setData((prevState) => {
157 | const newState = [...prevState];
158 | const deleteIndex = prevState.findIndex((s) => s.uri === item.uri);
159 |
160 | if (deleteIndex > -1) {
161 | newState.splice(deleteIndex, 1);
162 | }
163 |
164 | return newState;
165 | });
166 | abortUpload(item.uri);
167 | };
168 |
169 | const onPressRetry = (item: Item) => () => {
170 | updateItem({
171 | item,
172 | keysAndValues: [
173 | {
174 | key: 'failed',
175 | value: false,
176 | },
177 | ],
178 | });
179 | startUpload({ ...item, failed: false }).catch(() => {});
180 | };
181 |
182 | const onDragStart = () => {
183 | ReactNativeHapticFeedback.trigger('impactMedium', hapticFeedbackOptions);
184 | dragStartAnimatedValue.current.setValue(1);
185 | // unable to set useNativeDriver true because of a limitation in react-native-sortable-grid
186 | Animated.loop(
187 | Animated.sequence([
188 | Animated.timing(dragStartAnimatedValue.current, {
189 | toValue: 1.1,
190 | useNativeDriver: false,
191 | duration: 300,
192 | }),
193 | Animated.timing(dragStartAnimatedValue.current, {
194 | toValue: 1,
195 | useNativeDriver: false,
196 | duration: 300,
197 | }),
198 | ])
199 | ).start();
200 | };
201 |
202 | const onDragRelease = (_itemOrder: ItemOrder) => {
203 | //console.log('onDragRelease, itemOrder: ', _itemOrder);
204 | // you can see where this can go :~)
205 | };
206 |
207 | const getDragStartAnimation = () => {
208 | return {
209 | transform: [
210 | {
211 | scale: dragStartAnimatedValue.current.interpolate({
212 | inputRange: [1, 1.1],
213 | outputRange: [1, 1.1],
214 | }),
215 | },
216 | ],
217 | };
218 | };
219 |
220 | const renderItem = (item: Item) => {
221 | const itemProgress = item.progress || 0;
222 | const showProgress = !item.failed && itemProgress > 0 && itemProgress < 100;
223 |
224 | return (
225 |
226 |
232 | {showProgress ? (
233 |
234 | ) : null}
235 | {item.failed ? (
236 |
237 | ↻
238 |
239 | ) : null}
240 | {item.completed ? ✓ : null}
241 |
242 | ✗
243 |
244 |
245 | );
246 | };
247 |
248 | return (
249 |
250 |
251 |
252 |
253 |
259 | {data.map((d) => renderItem(d))}
260 |
261 |
262 |
263 |
264 |
265 | {isUploading ? : null}
266 |
267 |
268 |
269 | );
270 | }
271 |
272 | const styles = StyleSheet.create({
273 | container: {
274 | flex: 1,
275 | paddingHorizontal: 8,
276 | },
277 | flexContainer: {
278 | flex: 1,
279 | },
280 | imageBackground: {
281 | flex: 1,
282 | margin: 8,
283 | justifyContent: 'center',
284 | alignItems: 'center',
285 | },
286 | image: {
287 | ...StyleSheet.absoluteFillObject,
288 | borderRadius: 12,
289 | },
290 | deleteIcon: {
291 | position: 'absolute',
292 | top: -8,
293 | right: -8,
294 | backgroundColor: '#fff',
295 | width: 24,
296 | height: 24,
297 | borderRadius: 12,
298 | justifyContent: 'center',
299 | alignItems: 'center',
300 | shadowColor: '#000',
301 | shadowOffset: {
302 | width: 0,
303 | height: 2,
304 | },
305 | shadowOpacity: 0.25,
306 | shadowRadius: 3.84,
307 | elevation: 5,
308 | },
309 | deleteIconText: {
310 | fontWeight: '800',
311 | },
312 | iconText: {
313 | fontSize: 64,
314 | color: '#fff',
315 | fontWeight: '800',
316 | },
317 | progressBar: {
318 | position: 'absolute',
319 | bottom: 12,
320 | width: '80%',
321 | },
322 | row: {
323 | flexDirection: 'row',
324 | justifyContent: 'center',
325 | },
326 | });
327 |
--------------------------------------------------------------------------------
/example/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: "com.android.application"
2 |
3 | import com.android.build.OutputFile
4 | import org.apache.tools.ant.taskdefs.condition.Os
5 |
6 | /**
7 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
8 | * and bundleReleaseJsAndAssets).
9 | * These basically call `react-native bundle` with the correct arguments during the Android build
10 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
11 | * bundle directly from the development server. Below you can see all the possible configurations
12 | * and their defaults. If you decide to add a configuration block, make sure to add it before the
13 | * `apply from: "../../node_modules/react-native/react.gradle"` line.
14 | *
15 | * project.ext.react = [
16 | * // the name of the generated asset file containing your JS bundle
17 | * bundleAssetName: "index.android.bundle",
18 | *
19 | * // the entry file for bundle generation. If none specified and
20 | * // "index.android.js" exists, it will be used. Otherwise "index.js" is
21 | * // default. Can be overridden with ENTRY_FILE environment variable.
22 | * entryFile: "index.android.js",
23 | *
24 | * // https://reactnative.dev/docs/performance#enable-the-ram-format
25 | * bundleCommand: "ram-bundle",
26 | *
27 | * // whether to bundle JS and assets in debug mode
28 | * bundleInDebug: false,
29 | *
30 | * // whether to bundle JS and assets in release mode
31 | * bundleInRelease: true,
32 | *
33 | * // whether to bundle JS and assets in another build variant (if configured).
34 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
35 | * // The configuration property can be in the following formats
36 | * // 'bundleIn${productFlavor}${buildType}'
37 | * // 'bundleIn${buildType}'
38 | * // bundleInFreeDebug: true,
39 | * // bundleInPaidRelease: true,
40 | * // bundleInBeta: true,
41 | *
42 | * // whether to disable dev mode in custom build variants (by default only disabled in release)
43 | * // for example: to disable dev mode in the staging build type (if configured)
44 | * devDisabledInStaging: true,
45 | * // The configuration property can be in the following formats
46 | * // 'devDisabledIn${productFlavor}${buildType}'
47 | * // 'devDisabledIn${buildType}'
48 | *
49 | * // the root of your project, i.e. where "package.json" lives
50 | * root: "../../",
51 | *
52 | * // where to put the JS bundle asset in debug mode
53 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
54 | *
55 | * // where to put the JS bundle asset in release mode
56 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release",
57 | *
58 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
59 | * // require('./image.png')), in debug mode
60 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
61 | *
62 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
63 | * // require('./image.png')), in release mode
64 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
65 | *
66 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means
67 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
68 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle
69 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
70 | * // for example, you might want to remove it from here.
71 | * inputExcludes: ["android/**", "ios/**"],
72 | *
73 | * // override which node gets called and with what additional arguments
74 | * nodeExecutableAndArgs: ["node"],
75 | *
76 | * // supply additional arguments to the packager
77 | * extraPackagerArgs: []
78 | * ]
79 | */
80 |
81 | project.ext.react = [
82 | enableHermes: true, // clean and rebuild if changing
83 | ]
84 |
85 | apply from: "../../node_modules/react-native/react.gradle"
86 |
87 | /**
88 | * Set this to true to create two separate APKs instead of one:
89 | * - An APK that only works on ARM devices
90 | * - An APK that only works on x86 devices
91 | * The advantage is the size of the APK is reduced by about 4MB.
92 | * Upload all the APKs to the Play Store and people will download
93 | * the correct one based on the CPU architecture of their device.
94 | */
95 | def enableSeparateBuildPerCPUArchitecture = false
96 |
97 | /**
98 | * Run Proguard to shrink the Java bytecode in release builds.
99 | */
100 | def enableProguardInReleaseBuilds = false
101 |
102 | /**
103 | * The preferred build flavor of JavaScriptCore.
104 | *
105 | * For example, to use the international variant, you can use:
106 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
107 | *
108 | * The international variant includes ICU i18n library and necessary data
109 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
110 | * give correct results when using with locales other than en-US. Note that
111 | * this variant is about 6MiB larger per architecture than default.
112 | */
113 | def jscFlavor = 'org.webkit:android-jsc:+'
114 |
115 | /**
116 | * Whether to enable the Hermes VM.
117 | *
118 | * This should be set on project.ext.react and that value will be read here. If it is not set
119 | * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
120 | * and the benefits of using Hermes will therefore be sharply reduced.
121 | */
122 | def enableHermes = project.ext.react.get("enableHermes", false);
123 |
124 | /**
125 | * Architectures to build native code for.
126 | */
127 | def reactNativeArchitectures() {
128 | def value = project.getProperties().get("reactNativeArchitectures")
129 | return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
130 | }
131 |
132 | android {
133 | ndkVersion rootProject.ext.ndkVersion
134 |
135 | compileSdkVersion rootProject.ext.compileSdkVersion
136 |
137 | defaultConfig {
138 | applicationId "com.usefileuploadexample"
139 | minSdkVersion rootProject.ext.minSdkVersion
140 | targetSdkVersion rootProject.ext.targetSdkVersion
141 | versionCode 1
142 | versionName "1.0"
143 | buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
144 |
145 | if (isNewArchitectureEnabled()) {
146 | // We configure the CMake build only if you decide to opt-in for the New Architecture.
147 | externalNativeBuild {
148 | cmake {
149 | arguments "-DPROJECT_BUILD_DIR=$buildDir",
150 | "-DREACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
151 | "-DREACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build",
152 | "-DNODE_MODULES_DIR=$rootDir/../node_modules",
153 | "-DANDROID_STL=c++_shared"
154 | }
155 | }
156 | if (!enableSeparateBuildPerCPUArchitecture) {
157 | ndk {
158 | abiFilters (*reactNativeArchitectures())
159 | }
160 | }
161 | }
162 | }
163 |
164 | if (isNewArchitectureEnabled()) {
165 | // We configure the NDK build only if you decide to opt-in for the New Architecture.
166 | externalNativeBuild {
167 | cmake {
168 | path "$projectDir/src/main/jni/CMakeLists.txt"
169 | }
170 | }
171 | def reactAndroidProjectDir = project(':ReactAndroid').projectDir
172 | def packageReactNdkDebugLibs = tasks.register("packageReactNdkDebugLibs", Copy) {
173 | dependsOn(":ReactAndroid:packageReactNdkDebugLibsForBuck")
174 | from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
175 | into("$buildDir/react-ndk/exported")
176 | }
177 | def packageReactNdkReleaseLibs = tasks.register("packageReactNdkReleaseLibs", Copy) {
178 | dependsOn(":ReactAndroid:packageReactNdkReleaseLibsForBuck")
179 | from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
180 | into("$buildDir/react-ndk/exported")
181 | }
182 | afterEvaluate {
183 | // If you wish to add a custom TurboModule or component locally,
184 | // you should uncomment this line.
185 | // preBuild.dependsOn("generateCodegenArtifactsFromSchema")
186 | preDebugBuild.dependsOn(packageReactNdkDebugLibs)
187 | preReleaseBuild.dependsOn(packageReactNdkReleaseLibs)
188 |
189 | // Due to a bug inside AGP, we have to explicitly set a dependency
190 | // between configureCMakeDebug* tasks and the preBuild tasks.
191 | // This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
192 | configureCMakeRelWithDebInfo.dependsOn(preReleaseBuild)
193 | configureCMakeDebug.dependsOn(preDebugBuild)
194 | reactNativeArchitectures().each { architecture ->
195 | tasks.findByName("configureCMakeDebug[${architecture}]")?.configure {
196 | dependsOn("preDebugBuild")
197 | }
198 | tasks.findByName("configureCMakeRelWithDebInfo[${architecture}]")?.configure {
199 | dependsOn("preReleaseBuild")
200 | }
201 | }
202 | }
203 | }
204 |
205 | splits {
206 | abi {
207 | reset()
208 | enable enableSeparateBuildPerCPUArchitecture
209 | universalApk false // If true, also generate a universal APK
210 | include (*reactNativeArchitectures())
211 | }
212 | }
213 | signingConfigs {
214 | debug {
215 | storeFile file('debug.keystore')
216 | storePassword 'android'
217 | keyAlias 'androiddebugkey'
218 | keyPassword 'android'
219 | }
220 | }
221 | buildTypes {
222 | debug {
223 | signingConfig signingConfigs.debug
224 | }
225 | release {
226 | // Caution! In production, you need to generate your own keystore file.
227 | // see https://reactnative.dev/docs/signed-apk-android.
228 | signingConfig signingConfigs.debug
229 | minifyEnabled enableProguardInReleaseBuilds
230 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
231 | }
232 | }
233 |
234 | // applicationVariants are e.g. debug, release
235 | applicationVariants.all { variant ->
236 | variant.outputs.each { output ->
237 | // For each separate APK per architecture, set a unique version code as described here:
238 | // https://developer.android.com/studio/build/configure-apk-splits.html
239 | // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
240 | def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
241 | def abi = output.getFilter(OutputFile.ABI)
242 | if (abi != null) { // null for the universal-debug, universal-release variants
243 | output.versionCodeOverride =
244 | defaultConfig.versionCode * 1000 + versionCodes.get(abi)
245 | }
246 |
247 | }
248 | }
249 | }
250 |
251 | dependencies {
252 | implementation fileTree(dir: "libs", include: ["*.jar"])
253 |
254 | //noinspection GradleDynamicVersion
255 | implementation "com.facebook.react:react-native:+" // From node_modules
256 |
257 | implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
258 |
259 | debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
260 | exclude group:'com.facebook.fbjni'
261 | }
262 |
263 | debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
264 | exclude group:'com.facebook.flipper'
265 | exclude group:'com.squareup.okhttp3', module:'okhttp'
266 | }
267 |
268 | debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
269 | exclude group:'com.facebook.flipper'
270 | }
271 |
272 | if (enableHermes) {
273 | //noinspection GradleDynamicVersion
274 | implementation("com.facebook.react:hermes-engine:+") { // From node_modules
275 | exclude group:'com.facebook.fbjni'
276 | }
277 | } else {
278 | implementation jscFlavor
279 | }
280 | }
281 |
282 | if (isNewArchitectureEnabled()) {
283 | // If new architecture is enabled, we let you build RN from source
284 | // Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
285 | // This will be applied to all the imported transtitive dependency.
286 | configurations.all {
287 | resolutionStrategy.dependencySubstitution {
288 | substitute(module("com.facebook.react:react-native"))
289 | .using(project(":ReactAndroid"))
290 | .because("On New Architecture we're building React Native from source")
291 | substitute(module("com.facebook.react:hermes-engine"))
292 | .using(project(":ReactAndroid:hermes-engine"))
293 | .because("On New Architecture we're building Hermes from source")
294 | }
295 | }
296 | }
297 |
298 | // Run this once to be able to run the application with BUCK
299 | // puts all compile dependencies into folder libs for BUCK to use
300 | task copyDownloadableDepsToLibs(type: Copy) {
301 | from configurations.implementation
302 | into 'libs'
303 | }
304 |
305 | apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
306 |
307 | def isNewArchitectureEnabled() {
308 | // To opt-in for the New Architecture, you can either:
309 | // - Set `newArchEnabled` to true inside the `gradle.properties` file
310 | // - Invoke gradle with `-newArchEnabled=true`
311 | // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
312 | return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
313 | }
314 |
--------------------------------------------------------------------------------
/example/ios/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - boost (1.76.0)
3 | - CocoaAsyncSocket (7.6.5)
4 | - DoubleConversion (1.1.6)
5 | - FBLazyVector (0.70.3)
6 | - FBReactNativeSpec (0.70.3):
7 | - RCT-Folly (= 2021.07.22.00)
8 | - RCTRequired (= 0.70.3)
9 | - RCTTypeSafety (= 0.70.3)
10 | - React-Core (= 0.70.3)
11 | - React-jsi (= 0.70.3)
12 | - ReactCommon/turbomodule/core (= 0.70.3)
13 | - Flipper (0.125.0):
14 | - Flipper-Folly (~> 2.6)
15 | - Flipper-RSocket (~> 1.4)
16 | - Flipper-Boost-iOSX (1.76.0.1.11)
17 | - Flipper-DoubleConversion (3.2.0.1)
18 | - Flipper-Fmt (7.1.7)
19 | - Flipper-Folly (2.6.10):
20 | - Flipper-Boost-iOSX
21 | - Flipper-DoubleConversion
22 | - Flipper-Fmt (= 7.1.7)
23 | - Flipper-Glog
24 | - libevent (~> 2.1.12)
25 | - OpenSSL-Universal (= 1.1.1100)
26 | - Flipper-Glog (0.5.0.5)
27 | - Flipper-PeerTalk (0.0.4)
28 | - Flipper-RSocket (1.4.3):
29 | - Flipper-Folly (~> 2.6)
30 | - FlipperKit (0.125.0):
31 | - FlipperKit/Core (= 0.125.0)
32 | - FlipperKit/Core (0.125.0):
33 | - Flipper (~> 0.125.0)
34 | - FlipperKit/CppBridge
35 | - FlipperKit/FBCxxFollyDynamicConvert
36 | - FlipperKit/FBDefines
37 | - FlipperKit/FKPortForwarding
38 | - SocketRocket (~> 0.6.0)
39 | - FlipperKit/CppBridge (0.125.0):
40 | - Flipper (~> 0.125.0)
41 | - FlipperKit/FBCxxFollyDynamicConvert (0.125.0):
42 | - Flipper-Folly (~> 2.6)
43 | - FlipperKit/FBDefines (0.125.0)
44 | - FlipperKit/FKPortForwarding (0.125.0):
45 | - CocoaAsyncSocket (~> 7.6)
46 | - Flipper-PeerTalk (~> 0.0.4)
47 | - FlipperKit/FlipperKitHighlightOverlay (0.125.0)
48 | - FlipperKit/FlipperKitLayoutHelpers (0.125.0):
49 | - FlipperKit/Core
50 | - FlipperKit/FlipperKitHighlightOverlay
51 | - FlipperKit/FlipperKitLayoutTextSearchable
52 | - FlipperKit/FlipperKitLayoutIOSDescriptors (0.125.0):
53 | - FlipperKit/Core
54 | - FlipperKit/FlipperKitHighlightOverlay
55 | - FlipperKit/FlipperKitLayoutHelpers
56 | - YogaKit (~> 1.18)
57 | - FlipperKit/FlipperKitLayoutPlugin (0.125.0):
58 | - FlipperKit/Core
59 | - FlipperKit/FlipperKitHighlightOverlay
60 | - FlipperKit/FlipperKitLayoutHelpers
61 | - FlipperKit/FlipperKitLayoutIOSDescriptors
62 | - FlipperKit/FlipperKitLayoutTextSearchable
63 | - YogaKit (~> 1.18)
64 | - FlipperKit/FlipperKitLayoutTextSearchable (0.125.0)
65 | - FlipperKit/FlipperKitNetworkPlugin (0.125.0):
66 | - FlipperKit/Core
67 | - FlipperKit/FlipperKitReactPlugin (0.125.0):
68 | - FlipperKit/Core
69 | - FlipperKit/FlipperKitUserDefaultsPlugin (0.125.0):
70 | - FlipperKit/Core
71 | - FlipperKit/SKIOSNetworkPlugin (0.125.0):
72 | - FlipperKit/Core
73 | - FlipperKit/FlipperKitNetworkPlugin
74 | - fmt (6.2.1)
75 | - glog (0.3.5)
76 | - hermes-engine (0.70.3)
77 | - libevent (2.1.12)
78 | - libwebp (1.2.3):
79 | - libwebp/demux (= 1.2.3)
80 | - libwebp/mux (= 1.2.3)
81 | - libwebp/webp (= 1.2.3)
82 | - libwebp/demux (1.2.3):
83 | - libwebp/webp
84 | - libwebp/mux (1.2.3):
85 | - libwebp/demux
86 | - libwebp/webp (1.2.3)
87 | - OpenSSL-Universal (1.1.1100)
88 | - RCT-Folly (2021.07.22.00):
89 | - boost
90 | - DoubleConversion
91 | - fmt (~> 6.2.1)
92 | - glog
93 | - RCT-Folly/Default (= 2021.07.22.00)
94 | - RCT-Folly/Default (2021.07.22.00):
95 | - boost
96 | - DoubleConversion
97 | - fmt (~> 6.2.1)
98 | - glog
99 | - RCT-Folly/Futures (2021.07.22.00):
100 | - boost
101 | - DoubleConversion
102 | - fmt (~> 6.2.1)
103 | - glog
104 | - libevent
105 | - RCTRequired (0.70.3)
106 | - RCTTypeSafety (0.70.3):
107 | - FBLazyVector (= 0.70.3)
108 | - RCTRequired (= 0.70.3)
109 | - React-Core (= 0.70.3)
110 | - React (0.70.3):
111 | - React-Core (= 0.70.3)
112 | - React-Core/DevSupport (= 0.70.3)
113 | - React-Core/RCTWebSocket (= 0.70.3)
114 | - React-RCTActionSheet (= 0.70.3)
115 | - React-RCTAnimation (= 0.70.3)
116 | - React-RCTBlob (= 0.70.3)
117 | - React-RCTImage (= 0.70.3)
118 | - React-RCTLinking (= 0.70.3)
119 | - React-RCTNetwork (= 0.70.3)
120 | - React-RCTSettings (= 0.70.3)
121 | - React-RCTText (= 0.70.3)
122 | - React-RCTVibration (= 0.70.3)
123 | - React-bridging (0.70.3):
124 | - RCT-Folly (= 2021.07.22.00)
125 | - React-jsi (= 0.70.3)
126 | - React-callinvoker (0.70.3)
127 | - React-Codegen (0.70.3):
128 | - FBReactNativeSpec (= 0.70.3)
129 | - RCT-Folly (= 2021.07.22.00)
130 | - RCTRequired (= 0.70.3)
131 | - RCTTypeSafety (= 0.70.3)
132 | - React-Core (= 0.70.3)
133 | - React-jsi (= 0.70.3)
134 | - React-jsiexecutor (= 0.70.3)
135 | - ReactCommon/turbomodule/core (= 0.70.3)
136 | - React-Core (0.70.3):
137 | - glog
138 | - RCT-Folly (= 2021.07.22.00)
139 | - React-Core/Default (= 0.70.3)
140 | - React-cxxreact (= 0.70.3)
141 | - React-jsi (= 0.70.3)
142 | - React-jsiexecutor (= 0.70.3)
143 | - React-perflogger (= 0.70.3)
144 | - Yoga
145 | - React-Core/CoreModulesHeaders (0.70.3):
146 | - glog
147 | - RCT-Folly (= 2021.07.22.00)
148 | - React-Core/Default
149 | - React-cxxreact (= 0.70.3)
150 | - React-jsi (= 0.70.3)
151 | - React-jsiexecutor (= 0.70.3)
152 | - React-perflogger (= 0.70.3)
153 | - Yoga
154 | - React-Core/Default (0.70.3):
155 | - glog
156 | - RCT-Folly (= 2021.07.22.00)
157 | - React-cxxreact (= 0.70.3)
158 | - React-jsi (= 0.70.3)
159 | - React-jsiexecutor (= 0.70.3)
160 | - React-perflogger (= 0.70.3)
161 | - Yoga
162 | - React-Core/DevSupport (0.70.3):
163 | - glog
164 | - RCT-Folly (= 2021.07.22.00)
165 | - React-Core/Default (= 0.70.3)
166 | - React-Core/RCTWebSocket (= 0.70.3)
167 | - React-cxxreact (= 0.70.3)
168 | - React-jsi (= 0.70.3)
169 | - React-jsiexecutor (= 0.70.3)
170 | - React-jsinspector (= 0.70.3)
171 | - React-perflogger (= 0.70.3)
172 | - Yoga
173 | - React-Core/RCTActionSheetHeaders (0.70.3):
174 | - glog
175 | - RCT-Folly (= 2021.07.22.00)
176 | - React-Core/Default
177 | - React-cxxreact (= 0.70.3)
178 | - React-jsi (= 0.70.3)
179 | - React-jsiexecutor (= 0.70.3)
180 | - React-perflogger (= 0.70.3)
181 | - Yoga
182 | - React-Core/RCTAnimationHeaders (0.70.3):
183 | - glog
184 | - RCT-Folly (= 2021.07.22.00)
185 | - React-Core/Default
186 | - React-cxxreact (= 0.70.3)
187 | - React-jsi (= 0.70.3)
188 | - React-jsiexecutor (= 0.70.3)
189 | - React-perflogger (= 0.70.3)
190 | - Yoga
191 | - React-Core/RCTBlobHeaders (0.70.3):
192 | - glog
193 | - RCT-Folly (= 2021.07.22.00)
194 | - React-Core/Default
195 | - React-cxxreact (= 0.70.3)
196 | - React-jsi (= 0.70.3)
197 | - React-jsiexecutor (= 0.70.3)
198 | - React-perflogger (= 0.70.3)
199 | - Yoga
200 | - React-Core/RCTImageHeaders (0.70.3):
201 | - glog
202 | - RCT-Folly (= 2021.07.22.00)
203 | - React-Core/Default
204 | - React-cxxreact (= 0.70.3)
205 | - React-jsi (= 0.70.3)
206 | - React-jsiexecutor (= 0.70.3)
207 | - React-perflogger (= 0.70.3)
208 | - Yoga
209 | - React-Core/RCTLinkingHeaders (0.70.3):
210 | - glog
211 | - RCT-Folly (= 2021.07.22.00)
212 | - React-Core/Default
213 | - React-cxxreact (= 0.70.3)
214 | - React-jsi (= 0.70.3)
215 | - React-jsiexecutor (= 0.70.3)
216 | - React-perflogger (= 0.70.3)
217 | - Yoga
218 | - React-Core/RCTNetworkHeaders (0.70.3):
219 | - glog
220 | - RCT-Folly (= 2021.07.22.00)
221 | - React-Core/Default
222 | - React-cxxreact (= 0.70.3)
223 | - React-jsi (= 0.70.3)
224 | - React-jsiexecutor (= 0.70.3)
225 | - React-perflogger (= 0.70.3)
226 | - Yoga
227 | - React-Core/RCTSettingsHeaders (0.70.3):
228 | - glog
229 | - RCT-Folly (= 2021.07.22.00)
230 | - React-Core/Default
231 | - React-cxxreact (= 0.70.3)
232 | - React-jsi (= 0.70.3)
233 | - React-jsiexecutor (= 0.70.3)
234 | - React-perflogger (= 0.70.3)
235 | - Yoga
236 | - React-Core/RCTTextHeaders (0.70.3):
237 | - glog
238 | - RCT-Folly (= 2021.07.22.00)
239 | - React-Core/Default
240 | - React-cxxreact (= 0.70.3)
241 | - React-jsi (= 0.70.3)
242 | - React-jsiexecutor (= 0.70.3)
243 | - React-perflogger (= 0.70.3)
244 | - Yoga
245 | - React-Core/RCTVibrationHeaders (0.70.3):
246 | - glog
247 | - RCT-Folly (= 2021.07.22.00)
248 | - React-Core/Default
249 | - React-cxxreact (= 0.70.3)
250 | - React-jsi (= 0.70.3)
251 | - React-jsiexecutor (= 0.70.3)
252 | - React-perflogger (= 0.70.3)
253 | - Yoga
254 | - React-Core/RCTWebSocket (0.70.3):
255 | - glog
256 | - RCT-Folly (= 2021.07.22.00)
257 | - React-Core/Default (= 0.70.3)
258 | - React-cxxreact (= 0.70.3)
259 | - React-jsi (= 0.70.3)
260 | - React-jsiexecutor (= 0.70.3)
261 | - React-perflogger (= 0.70.3)
262 | - Yoga
263 | - React-CoreModules (0.70.3):
264 | - RCT-Folly (= 2021.07.22.00)
265 | - RCTTypeSafety (= 0.70.3)
266 | - React-Codegen (= 0.70.3)
267 | - React-Core/CoreModulesHeaders (= 0.70.3)
268 | - React-jsi (= 0.70.3)
269 | - React-RCTImage (= 0.70.3)
270 | - ReactCommon/turbomodule/core (= 0.70.3)
271 | - React-cxxreact (0.70.3):
272 | - boost (= 1.76.0)
273 | - DoubleConversion
274 | - glog
275 | - RCT-Folly (= 2021.07.22.00)
276 | - React-callinvoker (= 0.70.3)
277 | - React-jsi (= 0.70.3)
278 | - React-jsinspector (= 0.70.3)
279 | - React-logger (= 0.70.3)
280 | - React-perflogger (= 0.70.3)
281 | - React-runtimeexecutor (= 0.70.3)
282 | - React-hermes (0.70.3):
283 | - DoubleConversion
284 | - glog
285 | - hermes-engine
286 | - RCT-Folly (= 2021.07.22.00)
287 | - RCT-Folly/Futures (= 2021.07.22.00)
288 | - React-cxxreact (= 0.70.3)
289 | - React-jsi (= 0.70.3)
290 | - React-jsiexecutor (= 0.70.3)
291 | - React-jsinspector (= 0.70.3)
292 | - React-perflogger (= 0.70.3)
293 | - React-jsi (0.70.3):
294 | - boost (= 1.76.0)
295 | - DoubleConversion
296 | - glog
297 | - RCT-Folly (= 2021.07.22.00)
298 | - React-jsi/Default (= 0.70.3)
299 | - React-jsi/Default (0.70.3):
300 | - boost (= 1.76.0)
301 | - DoubleConversion
302 | - glog
303 | - RCT-Folly (= 2021.07.22.00)
304 | - React-jsiexecutor (0.70.3):
305 | - DoubleConversion
306 | - glog
307 | - RCT-Folly (= 2021.07.22.00)
308 | - React-cxxreact (= 0.70.3)
309 | - React-jsi (= 0.70.3)
310 | - React-perflogger (= 0.70.3)
311 | - React-jsinspector (0.70.3)
312 | - React-logger (0.70.3):
313 | - glog
314 | - react-native-image-picker (4.10.0):
315 | - React-Core
316 | - React-perflogger (0.70.3)
317 | - React-RCTActionSheet (0.70.3):
318 | - React-Core/RCTActionSheetHeaders (= 0.70.3)
319 | - React-RCTAnimation (0.70.3):
320 | - RCT-Folly (= 2021.07.22.00)
321 | - RCTTypeSafety (= 0.70.3)
322 | - React-Codegen (= 0.70.3)
323 | - React-Core/RCTAnimationHeaders (= 0.70.3)
324 | - React-jsi (= 0.70.3)
325 | - ReactCommon/turbomodule/core (= 0.70.3)
326 | - React-RCTBlob (0.70.3):
327 | - RCT-Folly (= 2021.07.22.00)
328 | - React-Codegen (= 0.70.3)
329 | - React-Core/RCTBlobHeaders (= 0.70.3)
330 | - React-Core/RCTWebSocket (= 0.70.3)
331 | - React-jsi (= 0.70.3)
332 | - React-RCTNetwork (= 0.70.3)
333 | - ReactCommon/turbomodule/core (= 0.70.3)
334 | - React-RCTImage (0.70.3):
335 | - RCT-Folly (= 2021.07.22.00)
336 | - RCTTypeSafety (= 0.70.3)
337 | - React-Codegen (= 0.70.3)
338 | - React-Core/RCTImageHeaders (= 0.70.3)
339 | - React-jsi (= 0.70.3)
340 | - React-RCTNetwork (= 0.70.3)
341 | - ReactCommon/turbomodule/core (= 0.70.3)
342 | - React-RCTLinking (0.70.3):
343 | - React-Codegen (= 0.70.3)
344 | - React-Core/RCTLinkingHeaders (= 0.70.3)
345 | - React-jsi (= 0.70.3)
346 | - ReactCommon/turbomodule/core (= 0.70.3)
347 | - React-RCTNetwork (0.70.3):
348 | - RCT-Folly (= 2021.07.22.00)
349 | - RCTTypeSafety (= 0.70.3)
350 | - React-Codegen (= 0.70.3)
351 | - React-Core/RCTNetworkHeaders (= 0.70.3)
352 | - React-jsi (= 0.70.3)
353 | - ReactCommon/turbomodule/core (= 0.70.3)
354 | - React-RCTSettings (0.70.3):
355 | - RCT-Folly (= 2021.07.22.00)
356 | - RCTTypeSafety (= 0.70.3)
357 | - React-Codegen (= 0.70.3)
358 | - React-Core/RCTSettingsHeaders (= 0.70.3)
359 | - React-jsi (= 0.70.3)
360 | - ReactCommon/turbomodule/core (= 0.70.3)
361 | - React-RCTText (0.70.3):
362 | - React-Core/RCTTextHeaders (= 0.70.3)
363 | - React-RCTVibration (0.70.3):
364 | - RCT-Folly (= 2021.07.22.00)
365 | - React-Codegen (= 0.70.3)
366 | - React-Core/RCTVibrationHeaders (= 0.70.3)
367 | - React-jsi (= 0.70.3)
368 | - ReactCommon/turbomodule/core (= 0.70.3)
369 | - React-runtimeexecutor (0.70.3):
370 | - React-jsi (= 0.70.3)
371 | - ReactCommon/turbomodule/core (0.70.3):
372 | - DoubleConversion
373 | - glog
374 | - RCT-Folly (= 2021.07.22.00)
375 | - React-bridging (= 0.70.3)
376 | - React-callinvoker (= 0.70.3)
377 | - React-Core (= 0.70.3)
378 | - React-cxxreact (= 0.70.3)
379 | - React-jsi (= 0.70.3)
380 | - React-logger (= 0.70.3)
381 | - React-perflogger (= 0.70.3)
382 | - RNFastImage (8.6.3):
383 | - React-Core
384 | - SDWebImage (~> 5.11.1)
385 | - SDWebImageWebPCoder (~> 0.8.4)
386 | - RNReactNativeHapticFeedback (1.14.0):
387 | - React-Core
388 | - RNReanimated (2.13.0):
389 | - DoubleConversion
390 | - FBLazyVector
391 | - FBReactNativeSpec
392 | - glog
393 | - RCT-Folly
394 | - RCTRequired
395 | - RCTTypeSafety
396 | - React-callinvoker
397 | - React-Core
398 | - React-Core/DevSupport
399 | - React-Core/RCTWebSocket
400 | - React-CoreModules
401 | - React-cxxreact
402 | - React-jsi
403 | - React-jsiexecutor
404 | - React-jsinspector
405 | - React-RCTActionSheet
406 | - React-RCTAnimation
407 | - React-RCTBlob
408 | - React-RCTImage
409 | - React-RCTLinking
410 | - React-RCTNetwork
411 | - React-RCTSettings
412 | - React-RCTText
413 | - ReactCommon/turbomodule/core
414 | - Yoga
415 | - SDWebImage (5.11.1):
416 | - SDWebImage/Core (= 5.11.1)
417 | - SDWebImage/Core (5.11.1)
418 | - SDWebImageWebPCoder (0.8.5):
419 | - libwebp (~> 1.0)
420 | - SDWebImage/Core (~> 5.10)
421 | - SocketRocket (0.6.0)
422 | - Yoga (1.14.0)
423 | - YogaKit (1.18.1):
424 | - Yoga (~> 1.14)
425 |
426 | DEPENDENCIES:
427 | - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
428 | - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
429 | - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
430 | - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`)
431 | - Flipper (= 0.125.0)
432 | - Flipper-Boost-iOSX (= 1.76.0.1.11)
433 | - Flipper-DoubleConversion (= 3.2.0.1)
434 | - Flipper-Fmt (= 7.1.7)
435 | - Flipper-Folly (= 2.6.10)
436 | - Flipper-Glog (= 0.5.0.5)
437 | - Flipper-PeerTalk (= 0.0.4)
438 | - Flipper-RSocket (= 1.4.3)
439 | - FlipperKit (= 0.125.0)
440 | - FlipperKit/Core (= 0.125.0)
441 | - FlipperKit/CppBridge (= 0.125.0)
442 | - FlipperKit/FBCxxFollyDynamicConvert (= 0.125.0)
443 | - FlipperKit/FBDefines (= 0.125.0)
444 | - FlipperKit/FKPortForwarding (= 0.125.0)
445 | - FlipperKit/FlipperKitHighlightOverlay (= 0.125.0)
446 | - FlipperKit/FlipperKitLayoutPlugin (= 0.125.0)
447 | - FlipperKit/FlipperKitLayoutTextSearchable (= 0.125.0)
448 | - FlipperKit/FlipperKitNetworkPlugin (= 0.125.0)
449 | - FlipperKit/FlipperKitReactPlugin (= 0.125.0)
450 | - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.125.0)
451 | - FlipperKit/SKIOSNetworkPlugin (= 0.125.0)
452 | - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
453 | - hermes-engine (from `../node_modules/react-native/sdks/hermes/hermes-engine.podspec`)
454 | - libevent (~> 2.1.12)
455 | - OpenSSL-Universal (= 1.1.1100)
456 | - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
457 | - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
458 | - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
459 | - React (from `../node_modules/react-native/`)
460 | - React-bridging (from `../node_modules/react-native/ReactCommon`)
461 | - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
462 | - React-Codegen (from `build/generated/ios`)
463 | - React-Core (from `../node_modules/react-native/`)
464 | - React-Core/DevSupport (from `../node_modules/react-native/`)
465 | - React-Core/RCTWebSocket (from `../node_modules/react-native/`)
466 | - React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
467 | - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
468 | - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`)
469 | - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
470 | - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
471 | - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
472 | - React-logger (from `../node_modules/react-native/ReactCommon/logger`)
473 | - react-native-image-picker (from `../node_modules/react-native-image-picker`)
474 | - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`)
475 | - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
476 | - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
477 | - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
478 | - React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
479 | - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
480 | - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
481 | - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
482 | - React-RCTText (from `../node_modules/react-native/Libraries/Text`)
483 | - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
484 | - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
485 | - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
486 | - RNFastImage (from `../node_modules/react-native-fast-image`)
487 | - RNReactNativeHapticFeedback (from `../node_modules/react-native-haptic-feedback`)
488 | - RNReanimated (from `../node_modules/react-native-reanimated`)
489 | - Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
490 |
491 | SPEC REPOS:
492 | trunk:
493 | - CocoaAsyncSocket
494 | - Flipper
495 | - Flipper-Boost-iOSX
496 | - Flipper-DoubleConversion
497 | - Flipper-Fmt
498 | - Flipper-Folly
499 | - Flipper-Glog
500 | - Flipper-PeerTalk
501 | - Flipper-RSocket
502 | - FlipperKit
503 | - fmt
504 | - libevent
505 | - libwebp
506 | - OpenSSL-Universal
507 | - SDWebImage
508 | - SDWebImageWebPCoder
509 | - SocketRocket
510 | - YogaKit
511 |
512 | EXTERNAL SOURCES:
513 | boost:
514 | :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
515 | DoubleConversion:
516 | :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
517 | FBLazyVector:
518 | :path: "../node_modules/react-native/Libraries/FBLazyVector"
519 | FBReactNativeSpec:
520 | :path: "../node_modules/react-native/React/FBReactNativeSpec"
521 | glog:
522 | :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
523 | hermes-engine:
524 | :podspec: "../node_modules/react-native/sdks/hermes/hermes-engine.podspec"
525 | RCT-Folly:
526 | :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
527 | RCTRequired:
528 | :path: "../node_modules/react-native/Libraries/RCTRequired"
529 | RCTTypeSafety:
530 | :path: "../node_modules/react-native/Libraries/TypeSafety"
531 | React:
532 | :path: "../node_modules/react-native/"
533 | React-bridging:
534 | :path: "../node_modules/react-native/ReactCommon"
535 | React-callinvoker:
536 | :path: "../node_modules/react-native/ReactCommon/callinvoker"
537 | React-Codegen:
538 | :path: build/generated/ios
539 | React-Core:
540 | :path: "../node_modules/react-native/"
541 | React-CoreModules:
542 | :path: "../node_modules/react-native/React/CoreModules"
543 | React-cxxreact:
544 | :path: "../node_modules/react-native/ReactCommon/cxxreact"
545 | React-hermes:
546 | :path: "../node_modules/react-native/ReactCommon/hermes"
547 | React-jsi:
548 | :path: "../node_modules/react-native/ReactCommon/jsi"
549 | React-jsiexecutor:
550 | :path: "../node_modules/react-native/ReactCommon/jsiexecutor"
551 | React-jsinspector:
552 | :path: "../node_modules/react-native/ReactCommon/jsinspector"
553 | React-logger:
554 | :path: "../node_modules/react-native/ReactCommon/logger"
555 | react-native-image-picker:
556 | :path: "../node_modules/react-native-image-picker"
557 | React-perflogger:
558 | :path: "../node_modules/react-native/ReactCommon/reactperflogger"
559 | React-RCTActionSheet:
560 | :path: "../node_modules/react-native/Libraries/ActionSheetIOS"
561 | React-RCTAnimation:
562 | :path: "../node_modules/react-native/Libraries/NativeAnimation"
563 | React-RCTBlob:
564 | :path: "../node_modules/react-native/Libraries/Blob"
565 | React-RCTImage:
566 | :path: "../node_modules/react-native/Libraries/Image"
567 | React-RCTLinking:
568 | :path: "../node_modules/react-native/Libraries/LinkingIOS"
569 | React-RCTNetwork:
570 | :path: "../node_modules/react-native/Libraries/Network"
571 | React-RCTSettings:
572 | :path: "../node_modules/react-native/Libraries/Settings"
573 | React-RCTText:
574 | :path: "../node_modules/react-native/Libraries/Text"
575 | React-RCTVibration:
576 | :path: "../node_modules/react-native/Libraries/Vibration"
577 | React-runtimeexecutor:
578 | :path: "../node_modules/react-native/ReactCommon/runtimeexecutor"
579 | ReactCommon:
580 | :path: "../node_modules/react-native/ReactCommon"
581 | RNFastImage:
582 | :path: "../node_modules/react-native-fast-image"
583 | RNReactNativeHapticFeedback:
584 | :path: "../node_modules/react-native-haptic-feedback"
585 | RNReanimated:
586 | :path: "../node_modules/react-native-reanimated"
587 | Yoga:
588 | :path: "../node_modules/react-native/ReactCommon/yoga"
589 |
590 | SPEC CHECKSUMS:
591 | boost: a7c83b31436843459a1961bfd74b96033dc77234
592 | CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
593 | DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
594 | FBLazyVector: 3b313c3fb52b597f7a9b430798e6367d2b9f07e5
595 | FBReactNativeSpec: 99a7ecb7e9665d96f2fea706b0844e2f3117f381
596 | Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0
597 | Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c
598 | Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30
599 | Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b
600 | Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3
601 | Flipper-Glog: 70c50ce58ddaf67dc35180db05f191692570f446
602 | Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
603 | Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541
604 | FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86
605 | fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
606 | glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
607 | hermes-engine: bb344d89a0d14c2c91ad357480a79698bb80e186
608 | libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
609 | libwebp: 60305b2e989864154bd9be3d772730f08fc6a59c
610 | OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c
611 | RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda
612 | RCTRequired: 5cf7e7d2f12699724b59f90350257a422eaa9492
613 | RCTTypeSafety: 3f3ead9673d1ab8bb1aea85b0894ab3220f8f06e
614 | React: 30a333798d1fcf595e8a4108bbaa0f125a655f4a
615 | React-bridging: 92396c03ab446756ddfb7a8e2baff3bcf19eec7d
616 | React-callinvoker: bb66a41b41fa0b7c5f3cc626693a63c9ea0d6252
617 | React-Codegen: a2a944a9688fae870be0a2ecdca37284034b25c2
618 | React-Core: a689b4d1bd13e15915a05c9918c2b01df96cd811
619 | React-CoreModules: d262214db6b704b042bc5c0735b06c346a371d7f
620 | React-cxxreact: 81d5bf256313bf96cb925eb0e654103291161a17
621 | React-hermes: 1c35cbfbdc7a888c3a1aa05e6d0ca004d92c923c
622 | React-jsi: 7f99dc3055bec9a0eeb4230f8b6ac873514c8421
623 | React-jsiexecutor: 7e2e1772ef7b97168c880eeaf3749d8c145ffd6e
624 | React-jsinspector: 0553c9fe7218e1f127be070bd5a4d2fc19fb8190
625 | React-logger: cffcc09e8aba8a3014be8d18da7f922802e9f19e
626 | react-native-image-picker: 4bc9ed38c8be255b515d8c88babbaf74973f91a8
627 | React-perflogger: 082b4293f0b3914ff41da35a6c06ac4490fcbcc8
628 | React-RCTActionSheet: 83da3030deb5dea54b398129f56540a44e64d3ae
629 | React-RCTAnimation: bac3a4f4c0436554d9f7fbb1352a0cdcb1fb0f1c
630 | React-RCTBlob: d2c8830ac6b4d55d5624469829fe6d0ef1d534d1
631 | React-RCTImage: 26ad032b09f90ae5d2283ec19f0c455c444c8189
632 | React-RCTLinking: 4a8d16586df11fff515a6c52ff51a02c47a20499
633 | React-RCTNetwork: 843fc75a70f0b5760de0bf59468585f41209bcf0
634 | React-RCTSettings: 54e59255f94462951b45f84c3f81aedc27cf8615
635 | React-RCTText: c32e2a60827bd232b2bc95941b9926ccf1c2be4c
636 | React-RCTVibration: b9a58ffdd18446f43d493a4b0ecd603ee86be847
637 | React-runtimeexecutor: e9b1f9310158a1e265bcdfdfd8c62d6174b947a2
638 | ReactCommon: 01064177e66d652192c661de899b1076da962fd9
639 | RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8
640 | RNReactNativeHapticFeedback: 1e3efeca9628ff9876ee7cdd9edec1b336913f8c
641 | RNReanimated: ce445c233a6ff5600223484a88ad5704945d972a
642 | SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
643 | SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d
644 | SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608
645 | Yoga: 2ed968a4f060a92834227c036279f2736de0fce3
646 | YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
647 |
648 | PODFILE CHECKSUM: 87d9808a5beda7076f49294026460a134d07240b
649 |
650 | COCOAPODS: 1.11.3
651 |
--------------------------------------------------------------------------------
/example/ios/UseFileUploadExample.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 54;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 00E356F31AD99517003FC87E /* UseFileUploadExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* UseFileUploadExampleTests.m */; };
11 | 0C80B921A6F3F58F76C31292 /* libPods-UseFileUploadExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-UseFileUploadExample.a */; };
12 | 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
13 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
14 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
15 | 7699B88040F8A987B510C191 /* libPods-UseFileUploadExample-UseFileUploadExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-UseFileUploadExample-UseFileUploadExampleTests.a */; };
16 | 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXContainerItemProxy section */
20 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
21 | isa = PBXContainerItemProxy;
22 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
23 | proxyType = 1;
24 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
25 | remoteInfo = UseFileUploadExample;
26 | };
27 | /* End PBXContainerItemProxy section */
28 |
29 | /* Begin PBXFileReference section */
30 | 00E356EE1AD99517003FC87E /* UseFileUploadExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UseFileUploadExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
31 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
32 | 00E356F21AD99517003FC87E /* UseFileUploadExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UseFileUploadExampleTests.m; sourceTree = ""; };
33 | 13B07F961A680F5B00A75B9A /* UseFileUploadExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = UseFileUploadExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
34 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = UseFileUploadExample/AppDelegate.h; sourceTree = ""; };
35 | 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = UseFileUploadExample/AppDelegate.mm; sourceTree = ""; };
36 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = UseFileUploadExample/Images.xcassets; sourceTree = ""; };
37 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = UseFileUploadExample/Info.plist; sourceTree = ""; };
38 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = UseFileUploadExample/main.m; sourceTree = ""; };
39 | 19F6CBCC0A4E27FBF8BF4A61 /* libPods-UseFileUploadExample-UseFileUploadExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-UseFileUploadExample-UseFileUploadExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
40 | 244AD18D2908A8B20093BC55 /* hermes.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = hermes.xcframework; path = "Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework"; sourceTree = ""; };
41 | 3B4392A12AC88292D35C810B /* Pods-UseFileUploadExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-UseFileUploadExample.debug.xcconfig"; path = "Target Support Files/Pods-UseFileUploadExample/Pods-UseFileUploadExample.debug.xcconfig"; sourceTree = ""; };
42 | 5709B34CF0A7D63546082F79 /* Pods-UseFileUploadExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-UseFileUploadExample.release.xcconfig"; path = "Target Support Files/Pods-UseFileUploadExample/Pods-UseFileUploadExample.release.xcconfig"; sourceTree = ""; };
43 | 5B7EB9410499542E8C5724F5 /* Pods-UseFileUploadExample-UseFileUploadExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-UseFileUploadExample-UseFileUploadExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-UseFileUploadExample-UseFileUploadExampleTests/Pods-UseFileUploadExample-UseFileUploadExampleTests.debug.xcconfig"; sourceTree = ""; };
44 | 5DCACB8F33CDC322A6C60F78 /* libPods-UseFileUploadExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-UseFileUploadExample.a"; sourceTree = BUILT_PRODUCTS_DIR; };
45 | 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = UseFileUploadExample/LaunchScreen.storyboard; sourceTree = ""; };
46 | 89C6BE57DB24E9ADA2F236DE /* Pods-UseFileUploadExample-UseFileUploadExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-UseFileUploadExample-UseFileUploadExampleTests.release.xcconfig"; path = "Target Support Files/Pods-UseFileUploadExample-UseFileUploadExampleTests/Pods-UseFileUploadExample-UseFileUploadExampleTests.release.xcconfig"; sourceTree = ""; };
47 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
48 | /* End PBXFileReference section */
49 |
50 | /* Begin PBXFrameworksBuildPhase section */
51 | 00E356EB1AD99517003FC87E /* Frameworks */ = {
52 | isa = PBXFrameworksBuildPhase;
53 | buildActionMask = 2147483647;
54 | files = (
55 | 7699B88040F8A987B510C191 /* libPods-UseFileUploadExample-UseFileUploadExampleTests.a in Frameworks */,
56 | );
57 | runOnlyForDeploymentPostprocessing = 0;
58 | };
59 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
60 | isa = PBXFrameworksBuildPhase;
61 | buildActionMask = 2147483647;
62 | files = (
63 | 0C80B921A6F3F58F76C31292 /* libPods-UseFileUploadExample.a in Frameworks */,
64 | );
65 | runOnlyForDeploymentPostprocessing = 0;
66 | };
67 | /* End PBXFrameworksBuildPhase section */
68 |
69 | /* Begin PBXGroup section */
70 | 00E356EF1AD99517003FC87E /* UseFileUploadExampleTests */ = {
71 | isa = PBXGroup;
72 | children = (
73 | 00E356F21AD99517003FC87E /* UseFileUploadExampleTests.m */,
74 | 00E356F01AD99517003FC87E /* Supporting Files */,
75 | );
76 | path = UseFileUploadExampleTests;
77 | sourceTree = "";
78 | };
79 | 00E356F01AD99517003FC87E /* Supporting Files */ = {
80 | isa = PBXGroup;
81 | children = (
82 | 00E356F11AD99517003FC87E /* Info.plist */,
83 | );
84 | name = "Supporting Files";
85 | sourceTree = "";
86 | };
87 | 13B07FAE1A68108700A75B9A /* UseFileUploadExample */ = {
88 | isa = PBXGroup;
89 | children = (
90 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
91 | 13B07FB01A68108700A75B9A /* AppDelegate.mm */,
92 | 13B07FB51A68108700A75B9A /* Images.xcassets */,
93 | 13B07FB61A68108700A75B9A /* Info.plist */,
94 | 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
95 | 13B07FB71A68108700A75B9A /* main.m */,
96 | );
97 | name = UseFileUploadExample;
98 | sourceTree = "";
99 | };
100 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
101 | isa = PBXGroup;
102 | children = (
103 | 244AD18D2908A8B20093BC55 /* hermes.xcframework */,
104 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
105 | 5DCACB8F33CDC322A6C60F78 /* libPods-UseFileUploadExample.a */,
106 | 19F6CBCC0A4E27FBF8BF4A61 /* libPods-UseFileUploadExample-UseFileUploadExampleTests.a */,
107 | );
108 | name = Frameworks;
109 | sourceTree = "";
110 | };
111 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
112 | isa = PBXGroup;
113 | children = (
114 | );
115 | name = Libraries;
116 | sourceTree = "";
117 | };
118 | 83CBB9F61A601CBA00E9B192 = {
119 | isa = PBXGroup;
120 | children = (
121 | 13B07FAE1A68108700A75B9A /* UseFileUploadExample */,
122 | 832341AE1AAA6A7D00B99B32 /* Libraries */,
123 | 00E356EF1AD99517003FC87E /* UseFileUploadExampleTests */,
124 | 83CBBA001A601CBA00E9B192 /* Products */,
125 | 2D16E6871FA4F8E400B85C8A /* Frameworks */,
126 | BBD78D7AC51CEA395F1C20DB /* Pods */,
127 | );
128 | indentWidth = 2;
129 | sourceTree = "";
130 | tabWidth = 2;
131 | usesTabs = 0;
132 | };
133 | 83CBBA001A601CBA00E9B192 /* Products */ = {
134 | isa = PBXGroup;
135 | children = (
136 | 13B07F961A680F5B00A75B9A /* UseFileUploadExample.app */,
137 | 00E356EE1AD99517003FC87E /* UseFileUploadExampleTests.xctest */,
138 | );
139 | name = Products;
140 | sourceTree = "";
141 | };
142 | BBD78D7AC51CEA395F1C20DB /* Pods */ = {
143 | isa = PBXGroup;
144 | children = (
145 | 3B4392A12AC88292D35C810B /* Pods-UseFileUploadExample.debug.xcconfig */,
146 | 5709B34CF0A7D63546082F79 /* Pods-UseFileUploadExample.release.xcconfig */,
147 | 5B7EB9410499542E8C5724F5 /* Pods-UseFileUploadExample-UseFileUploadExampleTests.debug.xcconfig */,
148 | 89C6BE57DB24E9ADA2F236DE /* Pods-UseFileUploadExample-UseFileUploadExampleTests.release.xcconfig */,
149 | );
150 | path = Pods;
151 | sourceTree = "";
152 | };
153 | /* End PBXGroup section */
154 |
155 | /* Begin PBXNativeTarget section */
156 | 00E356ED1AD99517003FC87E /* UseFileUploadExampleTests */ = {
157 | isa = PBXNativeTarget;
158 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "UseFileUploadExampleTests" */;
159 | buildPhases = (
160 | A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */,
161 | 00E356EA1AD99517003FC87E /* Sources */,
162 | 00E356EB1AD99517003FC87E /* Frameworks */,
163 | 00E356EC1AD99517003FC87E /* Resources */,
164 | C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */,
165 | F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */,
166 | );
167 | buildRules = (
168 | );
169 | dependencies = (
170 | 00E356F51AD99517003FC87E /* PBXTargetDependency */,
171 | );
172 | name = UseFileUploadExampleTests;
173 | productName = UseFileUploadExampleTests;
174 | productReference = 00E356EE1AD99517003FC87E /* UseFileUploadExampleTests.xctest */;
175 | productType = "com.apple.product-type.bundle.unit-test";
176 | };
177 | 13B07F861A680F5B00A75B9A /* UseFileUploadExample */ = {
178 | isa = PBXNativeTarget;
179 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "UseFileUploadExample" */;
180 | buildPhases = (
181 | C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */,
182 | FD10A7F022414F080027D42C /* Start Packager */,
183 | 13B07F871A680F5B00A75B9A /* Sources */,
184 | 13B07F8C1A680F5B00A75B9A /* Frameworks */,
185 | 13B07F8E1A680F5B00A75B9A /* Resources */,
186 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
187 | 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */,
188 | E235C05ADACE081382539298 /* [CP] Copy Pods Resources */,
189 | );
190 | buildRules = (
191 | );
192 | dependencies = (
193 | );
194 | name = UseFileUploadExample;
195 | productName = UseFileUploadExample;
196 | productReference = 13B07F961A680F5B00A75B9A /* UseFileUploadExample.app */;
197 | productType = "com.apple.product-type.application";
198 | };
199 | /* End PBXNativeTarget section */
200 |
201 | /* Begin PBXProject section */
202 | 83CBB9F71A601CBA00E9B192 /* Project object */ = {
203 | isa = PBXProject;
204 | attributes = {
205 | LastUpgradeCheck = 1210;
206 | TargetAttributes = {
207 | 00E356ED1AD99517003FC87E = {
208 | CreatedOnToolsVersion = 6.2;
209 | TestTargetID = 13B07F861A680F5B00A75B9A;
210 | };
211 | 13B07F861A680F5B00A75B9A = {
212 | LastSwiftMigration = 1120;
213 | };
214 | };
215 | };
216 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "UseFileUploadExample" */;
217 | compatibilityVersion = "Xcode 12.0";
218 | developmentRegion = en;
219 | hasScannedForEncodings = 0;
220 | knownRegions = (
221 | en,
222 | Base,
223 | );
224 | mainGroup = 83CBB9F61A601CBA00E9B192;
225 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
226 | projectDirPath = "";
227 | projectRoot = "";
228 | targets = (
229 | 13B07F861A680F5B00A75B9A /* UseFileUploadExample */,
230 | 00E356ED1AD99517003FC87E /* UseFileUploadExampleTests */,
231 | );
232 | };
233 | /* End PBXProject section */
234 |
235 | /* Begin PBXResourcesBuildPhase section */
236 | 00E356EC1AD99517003FC87E /* Resources */ = {
237 | isa = PBXResourcesBuildPhase;
238 | buildActionMask = 2147483647;
239 | files = (
240 | );
241 | runOnlyForDeploymentPostprocessing = 0;
242 | };
243 | 13B07F8E1A680F5B00A75B9A /* Resources */ = {
244 | isa = PBXResourcesBuildPhase;
245 | buildActionMask = 2147483647;
246 | files = (
247 | 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
248 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
249 | );
250 | runOnlyForDeploymentPostprocessing = 0;
251 | };
252 | /* End PBXResourcesBuildPhase section */
253 |
254 | /* Begin PBXShellScriptBuildPhase section */
255 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
256 | isa = PBXShellScriptBuildPhase;
257 | buildActionMask = 2147483647;
258 | files = (
259 | );
260 | inputPaths = (
261 | "$(SRCROOT)/.xcode.env.local",
262 | "$(SRCROOT)/.xcode.env",
263 | );
264 | name = "Bundle React Native code and images";
265 | outputPaths = (
266 | );
267 | runOnlyForDeploymentPostprocessing = 0;
268 | shellPath = /bin/sh;
269 | shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
270 | };
271 | 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = {
272 | isa = PBXShellScriptBuildPhase;
273 | buildActionMask = 2147483647;
274 | files = (
275 | );
276 | inputFileListPaths = (
277 | "${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample/Pods-UseFileUploadExample-frameworks-${CONFIGURATION}-input-files.xcfilelist",
278 | );
279 | name = "[CP] Embed Pods Frameworks";
280 | outputFileListPaths = (
281 | "${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample/Pods-UseFileUploadExample-frameworks-${CONFIGURATION}-output-files.xcfilelist",
282 | );
283 | runOnlyForDeploymentPostprocessing = 0;
284 | shellPath = /bin/sh;
285 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample/Pods-UseFileUploadExample-frameworks.sh\"\n";
286 | showEnvVarsInLog = 0;
287 | };
288 | A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = {
289 | isa = PBXShellScriptBuildPhase;
290 | buildActionMask = 2147483647;
291 | files = (
292 | );
293 | inputFileListPaths = (
294 | );
295 | inputPaths = (
296 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
297 | "${PODS_ROOT}/Manifest.lock",
298 | );
299 | name = "[CP] Check Pods Manifest.lock";
300 | outputFileListPaths = (
301 | );
302 | outputPaths = (
303 | "$(DERIVED_FILE_DIR)/Pods-UseFileUploadExample-UseFileUploadExampleTests-checkManifestLockResult.txt",
304 | );
305 | runOnlyForDeploymentPostprocessing = 0;
306 | shellPath = /bin/sh;
307 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
308 | showEnvVarsInLog = 0;
309 | };
310 | C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = {
311 | isa = PBXShellScriptBuildPhase;
312 | buildActionMask = 2147483647;
313 | files = (
314 | );
315 | inputFileListPaths = (
316 | );
317 | inputPaths = (
318 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
319 | "${PODS_ROOT}/Manifest.lock",
320 | );
321 | name = "[CP] Check Pods Manifest.lock";
322 | outputFileListPaths = (
323 | );
324 | outputPaths = (
325 | "$(DERIVED_FILE_DIR)/Pods-UseFileUploadExample-checkManifestLockResult.txt",
326 | );
327 | runOnlyForDeploymentPostprocessing = 0;
328 | shellPath = /bin/sh;
329 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
330 | showEnvVarsInLog = 0;
331 | };
332 | C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = {
333 | isa = PBXShellScriptBuildPhase;
334 | buildActionMask = 2147483647;
335 | files = (
336 | );
337 | inputFileListPaths = (
338 | "${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample-UseFileUploadExampleTests/Pods-UseFileUploadExample-UseFileUploadExampleTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
339 | );
340 | name = "[CP] Embed Pods Frameworks";
341 | outputFileListPaths = (
342 | "${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample-UseFileUploadExampleTests/Pods-UseFileUploadExample-UseFileUploadExampleTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
343 | );
344 | runOnlyForDeploymentPostprocessing = 0;
345 | shellPath = /bin/sh;
346 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample-UseFileUploadExampleTests/Pods-UseFileUploadExample-UseFileUploadExampleTests-frameworks.sh\"\n";
347 | showEnvVarsInLog = 0;
348 | };
349 | E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = {
350 | isa = PBXShellScriptBuildPhase;
351 | buildActionMask = 2147483647;
352 | files = (
353 | );
354 | inputFileListPaths = (
355 | "${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample/Pods-UseFileUploadExample-resources-${CONFIGURATION}-input-files.xcfilelist",
356 | );
357 | name = "[CP] Copy Pods Resources";
358 | outputFileListPaths = (
359 | "${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample/Pods-UseFileUploadExample-resources-${CONFIGURATION}-output-files.xcfilelist",
360 | );
361 | runOnlyForDeploymentPostprocessing = 0;
362 | shellPath = /bin/sh;
363 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample/Pods-UseFileUploadExample-resources.sh\"\n";
364 | showEnvVarsInLog = 0;
365 | };
366 | F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = {
367 | isa = PBXShellScriptBuildPhase;
368 | buildActionMask = 2147483647;
369 | files = (
370 | );
371 | inputFileListPaths = (
372 | "${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample-UseFileUploadExampleTests/Pods-UseFileUploadExample-UseFileUploadExampleTests-resources-${CONFIGURATION}-input-files.xcfilelist",
373 | );
374 | name = "[CP] Copy Pods Resources";
375 | outputFileListPaths = (
376 | "${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample-UseFileUploadExampleTests/Pods-UseFileUploadExample-UseFileUploadExampleTests-resources-${CONFIGURATION}-output-files.xcfilelist",
377 | );
378 | runOnlyForDeploymentPostprocessing = 0;
379 | shellPath = /bin/sh;
380 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-UseFileUploadExample-UseFileUploadExampleTests/Pods-UseFileUploadExample-UseFileUploadExampleTests-resources.sh\"\n";
381 | showEnvVarsInLog = 0;
382 | };
383 | FD10A7F022414F080027D42C /* Start Packager */ = {
384 | isa = PBXShellScriptBuildPhase;
385 | buildActionMask = 2147483647;
386 | files = (
387 | );
388 | inputFileListPaths = (
389 | );
390 | inputPaths = (
391 | );
392 | name = "Start Packager";
393 | outputFileListPaths = (
394 | );
395 | outputPaths = (
396 | );
397 | runOnlyForDeploymentPostprocessing = 0;
398 | shellPath = /bin/sh;
399 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
400 | showEnvVarsInLog = 0;
401 | };
402 | /* End PBXShellScriptBuildPhase section */
403 |
404 | /* Begin PBXSourcesBuildPhase section */
405 | 00E356EA1AD99517003FC87E /* Sources */ = {
406 | isa = PBXSourcesBuildPhase;
407 | buildActionMask = 2147483647;
408 | files = (
409 | 00E356F31AD99517003FC87E /* UseFileUploadExampleTests.m in Sources */,
410 | );
411 | runOnlyForDeploymentPostprocessing = 0;
412 | };
413 | 13B07F871A680F5B00A75B9A /* Sources */ = {
414 | isa = PBXSourcesBuildPhase;
415 | buildActionMask = 2147483647;
416 | files = (
417 | 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
418 | 13B07FC11A68108700A75B9A /* main.m in Sources */,
419 | );
420 | runOnlyForDeploymentPostprocessing = 0;
421 | };
422 | /* End PBXSourcesBuildPhase section */
423 |
424 | /* Begin PBXTargetDependency section */
425 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
426 | isa = PBXTargetDependency;
427 | target = 13B07F861A680F5B00A75B9A /* UseFileUploadExample */;
428 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
429 | };
430 | /* End PBXTargetDependency section */
431 |
432 | /* Begin XCBuildConfiguration section */
433 | 00E356F61AD99517003FC87E /* Debug */ = {
434 | isa = XCBuildConfiguration;
435 | baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-UseFileUploadExample-UseFileUploadExampleTests.debug.xcconfig */;
436 | buildSettings = {
437 | BUNDLE_LOADER = "$(TEST_HOST)";
438 | GCC_PREPROCESSOR_DEFINITIONS = (
439 | "DEBUG=1",
440 | "$(inherited)",
441 | );
442 | INFOPLIST_FILE = UseFileUploadExampleTests/Info.plist;
443 | IPHONEOS_DEPLOYMENT_TARGET = 12.4;
444 | LD_RUNPATH_SEARCH_PATHS = (
445 | "$(inherited)",
446 | "@executable_path/Frameworks",
447 | "@loader_path/Frameworks",
448 | );
449 | OTHER_LDFLAGS = (
450 | "-ObjC",
451 | "-lc++",
452 | "$(inherited)",
453 | );
454 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
455 | PRODUCT_NAME = "$(TARGET_NAME)";
456 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/UseFileUploadExample.app/UseFileUploadExample";
457 | };
458 | name = Debug;
459 | };
460 | 00E356F71AD99517003FC87E /* Release */ = {
461 | isa = XCBuildConfiguration;
462 | baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-UseFileUploadExample-UseFileUploadExampleTests.release.xcconfig */;
463 | buildSettings = {
464 | BUNDLE_LOADER = "$(TEST_HOST)";
465 | COPY_PHASE_STRIP = NO;
466 | INFOPLIST_FILE = UseFileUploadExampleTests/Info.plist;
467 | IPHONEOS_DEPLOYMENT_TARGET = 12.4;
468 | LD_RUNPATH_SEARCH_PATHS = (
469 | "$(inherited)",
470 | "@executable_path/Frameworks",
471 | "@loader_path/Frameworks",
472 | );
473 | OTHER_LDFLAGS = (
474 | "-ObjC",
475 | "-lc++",
476 | "$(inherited)",
477 | );
478 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
479 | PRODUCT_NAME = "$(TARGET_NAME)";
480 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/UseFileUploadExample.app/UseFileUploadExample";
481 | };
482 | name = Release;
483 | };
484 | 13B07F941A680F5B00A75B9A /* Debug */ = {
485 | isa = XCBuildConfiguration;
486 | baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-UseFileUploadExample.debug.xcconfig */;
487 | buildSettings = {
488 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
489 | CLANG_ENABLE_MODULES = YES;
490 | CURRENT_PROJECT_VERSION = 1;
491 | DEVELOPMENT_TEAM = 9Q6GU6BHTV;
492 | ENABLE_BITCODE = NO;
493 | INFOPLIST_FILE = UseFileUploadExample/Info.plist;
494 | LD_RUNPATH_SEARCH_PATHS = (
495 | "$(inherited)",
496 | "@executable_path/Frameworks",
497 | );
498 | OTHER_LDFLAGS = (
499 | "$(inherited)",
500 | "-ObjC",
501 | "-lc++",
502 | );
503 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
504 | PRODUCT_NAME = UseFileUploadExample;
505 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
506 | SWIFT_VERSION = 5.0;
507 | VERSIONING_SYSTEM = "apple-generic";
508 | };
509 | name = Debug;
510 | };
511 | 13B07F951A680F5B00A75B9A /* Release */ = {
512 | isa = XCBuildConfiguration;
513 | baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-UseFileUploadExample.release.xcconfig */;
514 | buildSettings = {
515 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
516 | CLANG_ENABLE_MODULES = YES;
517 | CURRENT_PROJECT_VERSION = 1;
518 | DEVELOPMENT_TEAM = 9Q6GU6BHTV;
519 | INFOPLIST_FILE = UseFileUploadExample/Info.plist;
520 | LD_RUNPATH_SEARCH_PATHS = (
521 | "$(inherited)",
522 | "@executable_path/Frameworks",
523 | );
524 | OTHER_LDFLAGS = (
525 | "$(inherited)",
526 | "-ObjC",
527 | "-lc++",
528 | );
529 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
530 | PRODUCT_NAME = UseFileUploadExample;
531 | SWIFT_VERSION = 5.0;
532 | VERSIONING_SYSTEM = "apple-generic";
533 | };
534 | name = Release;
535 | };
536 | 83CBBA201A601CBA00E9B192 /* Debug */ = {
537 | isa = XCBuildConfiguration;
538 | buildSettings = {
539 | ALWAYS_SEARCH_USER_PATHS = NO;
540 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
541 | CLANG_CXX_LANGUAGE_STANDARD = "c++17";
542 | CLANG_CXX_LIBRARY = "libc++";
543 | CLANG_ENABLE_MODULES = YES;
544 | CLANG_ENABLE_OBJC_ARC = YES;
545 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
546 | CLANG_WARN_BOOL_CONVERSION = YES;
547 | CLANG_WARN_COMMA = YES;
548 | CLANG_WARN_CONSTANT_CONVERSION = YES;
549 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
550 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
551 | CLANG_WARN_EMPTY_BODY = YES;
552 | CLANG_WARN_ENUM_CONVERSION = YES;
553 | CLANG_WARN_INFINITE_RECURSION = YES;
554 | CLANG_WARN_INT_CONVERSION = YES;
555 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
556 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
557 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
558 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
559 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
560 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
561 | CLANG_WARN_STRICT_PROTOTYPES = YES;
562 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
563 | CLANG_WARN_UNREACHABLE_CODE = YES;
564 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
565 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
566 | COPY_PHASE_STRIP = NO;
567 | ENABLE_STRICT_OBJC_MSGSEND = YES;
568 | ENABLE_TESTABILITY = YES;
569 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
570 | GCC_C_LANGUAGE_STANDARD = gnu99;
571 | GCC_DYNAMIC_NO_PIC = NO;
572 | GCC_NO_COMMON_BLOCKS = YES;
573 | GCC_OPTIMIZATION_LEVEL = 0;
574 | GCC_PREPROCESSOR_DEFINITIONS = (
575 | "DEBUG=1",
576 | "$(inherited)",
577 | );
578 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
579 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
580 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
581 | GCC_WARN_UNDECLARED_SELECTOR = YES;
582 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
583 | GCC_WARN_UNUSED_FUNCTION = YES;
584 | GCC_WARN_UNUSED_VARIABLE = YES;
585 | IPHONEOS_DEPLOYMENT_TARGET = 12.4;
586 | LD_RUNPATH_SEARCH_PATHS = (
587 | /usr/lib/swift,
588 | "$(inherited)",
589 | );
590 | LIBRARY_SEARCH_PATHS = (
591 | "\"$(SDKROOT)/usr/lib/swift\"",
592 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
593 | "\"$(inherited)\"",
594 | );
595 | MTL_ENABLE_DEBUG_INFO = YES;
596 | ONLY_ACTIVE_ARCH = YES;
597 | OTHER_CPLUSPLUSFLAGS = (
598 | "$(OTHER_CFLAGS)",
599 | "-DFOLLY_NO_CONFIG",
600 | "-DFOLLY_MOBILE=1",
601 | "-DFOLLY_USE_LIBCPP=1",
602 | );
603 | REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
604 | SDKROOT = iphoneos;
605 | };
606 | name = Debug;
607 | };
608 | 83CBBA211A601CBA00E9B192 /* Release */ = {
609 | isa = XCBuildConfiguration;
610 | buildSettings = {
611 | ALWAYS_SEARCH_USER_PATHS = NO;
612 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
613 | CLANG_CXX_LANGUAGE_STANDARD = "c++17";
614 | CLANG_CXX_LIBRARY = "libc++";
615 | CLANG_ENABLE_MODULES = YES;
616 | CLANG_ENABLE_OBJC_ARC = YES;
617 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
618 | CLANG_WARN_BOOL_CONVERSION = YES;
619 | CLANG_WARN_COMMA = YES;
620 | CLANG_WARN_CONSTANT_CONVERSION = YES;
621 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
622 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
623 | CLANG_WARN_EMPTY_BODY = YES;
624 | CLANG_WARN_ENUM_CONVERSION = YES;
625 | CLANG_WARN_INFINITE_RECURSION = YES;
626 | CLANG_WARN_INT_CONVERSION = YES;
627 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
628 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
629 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
630 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
631 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
632 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
633 | CLANG_WARN_STRICT_PROTOTYPES = YES;
634 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
635 | CLANG_WARN_UNREACHABLE_CODE = YES;
636 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
637 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
638 | COPY_PHASE_STRIP = YES;
639 | ENABLE_NS_ASSERTIONS = NO;
640 | ENABLE_STRICT_OBJC_MSGSEND = YES;
641 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386;
642 | GCC_C_LANGUAGE_STANDARD = gnu99;
643 | GCC_NO_COMMON_BLOCKS = YES;
644 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
645 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
646 | GCC_WARN_UNDECLARED_SELECTOR = YES;
647 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
648 | GCC_WARN_UNUSED_FUNCTION = YES;
649 | GCC_WARN_UNUSED_VARIABLE = YES;
650 | IPHONEOS_DEPLOYMENT_TARGET = 12.4;
651 | LD_RUNPATH_SEARCH_PATHS = (
652 | /usr/lib/swift,
653 | "$(inherited)",
654 | );
655 | LIBRARY_SEARCH_PATHS = (
656 | "\"$(SDKROOT)/usr/lib/swift\"",
657 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
658 | "\"$(inherited)\"",
659 | );
660 | MTL_ENABLE_DEBUG_INFO = NO;
661 | OTHER_CPLUSPLUSFLAGS = (
662 | "$(OTHER_CFLAGS)",
663 | "-DFOLLY_NO_CONFIG",
664 | "-DFOLLY_MOBILE=1",
665 | "-DFOLLY_USE_LIBCPP=1",
666 | );
667 | REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
668 | SDKROOT = iphoneos;
669 | VALIDATE_PRODUCT = YES;
670 | };
671 | name = Release;
672 | };
673 | /* End XCBuildConfiguration section */
674 |
675 | /* Begin XCConfigurationList section */
676 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "UseFileUploadExampleTests" */ = {
677 | isa = XCConfigurationList;
678 | buildConfigurations = (
679 | 00E356F61AD99517003FC87E /* Debug */,
680 | 00E356F71AD99517003FC87E /* Release */,
681 | );
682 | defaultConfigurationIsVisible = 0;
683 | defaultConfigurationName = Release;
684 | };
685 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "UseFileUploadExample" */ = {
686 | isa = XCConfigurationList;
687 | buildConfigurations = (
688 | 13B07F941A680F5B00A75B9A /* Debug */,
689 | 13B07F951A680F5B00A75B9A /* Release */,
690 | );
691 | defaultConfigurationIsVisible = 0;
692 | defaultConfigurationName = Release;
693 | };
694 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "UseFileUploadExample" */ = {
695 | isa = XCConfigurationList;
696 | buildConfigurations = (
697 | 83CBBA201A601CBA00E9B192 /* Debug */,
698 | 83CBBA211A601CBA00E9B192 /* Release */,
699 | );
700 | defaultConfigurationIsVisible = 0;
701 | defaultConfigurationName = Release;
702 | };
703 | /* End XCConfigurationList section */
704 | };
705 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
706 | }
707 |
--------------------------------------------------------------------------------