Skip to content

Commit 4d835f8

Browse files
authored
Merge pull request #2 from artsy/chore/upgrade–react-native-launch-arguments
chore: add new architecture support
2 parents fbd800c + 7f3fa89 commit 4d835f8

File tree

8 files changed

+4778
-13
lines changed

8 files changed

+4778
-13
lines changed

android/src/main/java/com/reactnativelauncharguments/LaunchArgumentsModule.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import com.facebook.react.bridge.ReactApplicationContext;
1010
import com.facebook.react.bridge.ReactContextBaseJavaModule;
1111
import com.facebook.react.bridge.ReactMethod;
12+
import com.facebook.react.TurboReactPackage;
13+
import com.facebook.react.module.model.ReactModuleInfo;
14+
import com.facebook.react.module.model.ReactModuleInfoProvider;
1215

1316
import java.io.Serializable;
1417
import java.util.HashMap;
@@ -20,6 +23,8 @@
2023

2124
public class LaunchArgumentsModule extends ReactContextBaseJavaModule {
2225

26+
public static final String NAME = "LaunchArguments";
27+
2328
private static final long ACTIVITY_WAIT_INTERVAL = 100L;
2429
private static final int ACTIVITY_WAIT_TRIES = 200;
2530

@@ -32,7 +37,7 @@ public class LaunchArgumentsModule extends ReactContextBaseJavaModule {
3237
@NonNull
3338
@Override
3439
public String getName() {
35-
return "LaunchArguments";
40+
return NAME;
3641
}
3742

3843
@Nullable
Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,47 @@
11
package com.reactnativelauncharguments;
22

3-
import com.facebook.react.ReactPackage;
3+
import com.facebook.react.BaseReactPackage;
44
import com.facebook.react.bridge.NativeModule;
55
import com.facebook.react.bridge.ReactApplicationContext;
6-
import com.facebook.react.uimanager.ViewManager;
6+
import com.facebook.react.module.model.ReactModuleInfo;
7+
import com.facebook.react.module.model.ReactModuleInfoProvider;
8+
import com.facebook.react.TurboReactPackage;
79

8-
import java.util.Collections;
9-
import java.util.List;
10+
import java.util.HashMap;
11+
import java.util.Map;
1012

11-
public class LaunchArgumentsPackage implements ReactPackage {
12-
13+
import javax.annotation.Nonnull;
14+
import javax.annotation.Nullable;
15+
16+
public class LaunchArgumentsPackage extends TurboReactPackage {
17+
18+
@Nullable
1319
@Override
14-
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
15-
return Collections.emptyList();
20+
public NativeModule getModule(String name, @Nonnull ReactApplicationContext reactContext) {
21+
if (name.equals(LaunchArgumentsModule.NAME)) {
22+
return new LaunchArgumentsModule(reactContext);
23+
} else {
24+
return null;
25+
}
1626
}
1727

1828
@Override
19-
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
20-
final NativeModule nativeModule = new LaunchArgumentsModule(reactContext);
21-
return Collections.singletonList(nativeModule);
29+
public ReactModuleInfoProvider getReactModuleInfoProvider() {
30+
return () -> {
31+
final Map<String, ReactModuleInfo> moduleInfos = new HashMap<>();
32+
boolean isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
33+
moduleInfos.put(
34+
LaunchArgumentsModule.NAME,
35+
new ReactModuleInfo(
36+
LaunchArgumentsModule.NAME,
37+
LaunchArgumentsModule.NAME,
38+
false, // canOverrideExistingModule
39+
false, // needsEagerInit
40+
true, // hasConstants
41+
false, // isCxxModule
42+
isTurboModule // isTurboModule
43+
));
44+
return moduleInfos;
45+
};
2246
}
23-
}
47+
}

ios/LaunchArguments.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
#import <React/RCTBridgeModule.h>
22

3+
#ifdef RCT_NEW_ARCH_ENABLED
4+
#import <React/RCTTurboModule.h>
5+
#import "RCTNativeLaunchArgumentsSpec.h"
6+
7+
@interface LaunchArguments : NSObject <NativeLaunchArgumentsSpec>
8+
#else
39
@interface LaunchArguments : NSObject <RCTBridgeModule>
10+
#endif
11+
412
@end

ios/LaunchArguments.m

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ @implementation LaunchArguments
44

55
RCT_EXPORT_MODULE()
66

7+
#ifdef RCT_NEW_ARCH_ENABLED
8+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
9+
(const facebook::react::ObjCTurboModule::InitParams &)params
10+
{
11+
return std::make_shared<facebook::react::NativeLaunchArgumentsSpecJSI>(params);
12+
}
13+
#endif
14+
715
- (dispatch_queue_t)methodQueue
816
{
917
return dispatch_get_main_queue();

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,10 @@
3434
"react": "^16.9.0",
3535
"react-native": "^0.62.2",
3636
"typescript": "^3.8.3"
37+
},
38+
"codegenConfig": {
39+
"name": "RNLaunchArgumentsSpec",
40+
"type": "modules",
41+
"jsSrcsDir": "src"
3742
}
3843
}

react-native.config.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module.exports = {
2+
dependency: {
3+
platforms: {
4+
android: {
5+
sourceDir: '../android/src/main/java/com/reactnativelauncharguments',
6+
packageImportPath: 'import com.reactnativelauncharguments.LaunchArgumentsPackage;',
7+
componentDescriptors: null,
8+
cmakeListsPath: null,
9+
},
10+
ios: {
11+
libraryFolder: '../ios',
12+
sharedLibraries: [],
13+
project: 'LaunchArguments.xcodeproj',
14+
podspecPath: '../react-native-launch-arguments.podspec',
15+
},
16+
},
17+
},
18+
};

src/NativeLaunchArguments.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { NativeModules, Platform } from "react-native";
2+
3+
const LINKING_ERROR =
4+
`The package 'react-native-launch-arguments' doesn't seem to be linked. Make sure: \n\n` +
5+
Platform.select({ ios: "- You have run 'pod install'\n", default: "" }) +
6+
"- You rebuilt the app after installing the package\n" +
7+
"- You are not using Expo managed workflow\n";
8+
9+
// @ts-expect-error
10+
const isTurboModuleEnabled = global.__turboModuleProxy != null;
11+
12+
const LaunchArgumentsModule = isTurboModuleEnabled
13+
? require('./NativeLaunchArguments').default
14+
: NativeModules.LaunchArguments
15+
? NativeModules.LaunchArguments
16+
: new Proxy(
17+
{},
18+
{
19+
get() {
20+
throw new Error(LINKING_ERROR);
21+
},
22+
}
23+
);
24+
25+
type RawMap = Record<string, string>;
26+
27+
type ParsedMap = Record<string, string | boolean>;
28+
29+
type LaunchArgumentsType = {
30+
value<T extends object = ParsedMap>(): T;
31+
};
32+
33+
let parsed: ParsedMap | null = null;
34+
35+
export const LaunchArguments: LaunchArgumentsType = {
36+
value<T>(): T {
37+
if (parsed) {
38+
return parsed as any as T;
39+
}
40+
41+
parsed = {};
42+
43+
const constants = isTurboModuleEnabled
44+
? LaunchArgumentsModule.getConstants()
45+
: LaunchArgumentsModule;
46+
47+
const raw = constants.value as RawMap;
48+
49+
for (const k in raw) {
50+
const rawValue = raw[k];
51+
try {
52+
parsed[k] = JSON.parse(rawValue);
53+
} catch {
54+
parsed[k] = rawValue;
55+
}
56+
}
57+
58+
return parsed as any as T;
59+
},
60+
};

0 commit comments

Comments
 (0)