Skip to content

Commit d0c9916

Browse files
committed
fix: make both platforms work on both archs
1 parent 6105499 commit d0c9916

File tree

11 files changed

+90
-64
lines changed

11 files changed

+90
-64
lines changed

FabricExample/.watchmanconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{}
1+
{}

FabricExample/app.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
22
"name": "FabricExample",
33
"displayName": "FabricExample"
4-
}
4+
}

FabricExample/metro.config.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ const pack = require('../package.json');
77

88
const root = path.resolve(__dirname, '..');
99

10-
const modules = [
11-
...Object.keys(pack.peerDependencies),
12-
];
10+
const modules = [...Object.keys(pack.peerDependencies)];
1311

1412
module.exports = {
1513
projectRoot: __dirname,
@@ -20,8 +18,7 @@ module.exports = {
2018
resolver: {
2119
blacklistRE: exclusionList(
2220
modules.map(
23-
(m) =>
24-
new RegExp(`^${escape(path.join(root, 'node_modules', m))}\\/.*$`),
21+
m => new RegExp(`^${escape(path.join(root, 'node_modules', m))}\\/.*$`),
2522
),
2623
),
2724

@@ -39,4 +36,4 @@ module.exports = {
3936
},
4037
}),
4138
},
42-
};
39+
};

android/src/main/java/com/zoontek/rnpermissions/RNPermissionsModule.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import com.facebook.react.bridge.Callback;
1919
import com.facebook.react.bridge.Promise;
2020
import com.facebook.react.bridge.ReactApplicationContext;
21-
import com.facebook.react.bridge.ReactContextBaseJavaModule;
2221
import com.facebook.react.bridge.ReactMethod;
2322
import com.facebook.react.bridge.ReadableArray;
2423
import com.facebook.react.bridge.WritableMap;
@@ -28,6 +27,7 @@
2827
import com.facebook.react.modules.core.PermissionListener;
2928

3029
import java.util.ArrayList;
30+
import java.util.HashMap;
3131
import java.util.Map;
3232

3333
@ReactModule(name = RNPermissionsModule.NAME)
@@ -376,11 +376,11 @@ public void invoke(Object... args) {
376376

377377
@Override
378378
protected Map<String, Object> getTypedExportedConstants() {
379-
return null;
379+
return new HashMap<>();
380380
}
381381

382382
@Override
383-
public void check(double permission, Promise promise) {
383+
public void check(String permission, Promise promise) {
384384
promise.reject("Permissions:check", "check is not supported on Android");
385385
}
386386

@@ -390,7 +390,7 @@ public void checkLocationAccuracy(Promise promise) {
390390
}
391391

392392
@Override
393-
public void request(double permission, Promise promise) {
393+
public void request(String permission, Promise promise) {
394394
promise.reject("Permissions:request", "request is not supported on Android");
395395
}
396396

android/src/paper/java/com/zoontek/rnpermissions/NativePermissionsModuleSpec.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,15 @@ public NativePermissionsModuleSpec(ReactApplicationContext reactContext) {
6262

6363
@ReactMethod
6464
@DoNotStrip
65-
public abstract void check(double permission, Promise promise);
65+
public abstract void check(String permission, Promise promise);
6666

6767
@ReactMethod
6868
@DoNotStrip
6969
public abstract void checkLocationAccuracy(Promise promise);
7070

7171
@ReactMethod
7272
@DoNotStrip
73-
public abstract void request(double permission, Promise promise);
73+
public abstract void request(String permission, Promise promise);
7474

7575
@ReactMethod
7676
@DoNotStrip
@@ -91,10 +91,10 @@ public NativePermissionsModuleSpec(ReactApplicationContext reactContext) {
9191
public final @Nullable Map<String, Object> getConstants() {
9292
Map<String, Object> constants = getTypedExportedConstants();
9393
if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) {
94-
Set<String> obligatoryFlowConstants = new HashSet<>(Arrays.asList(
94+
Set<String> obligatoryFlowConstants = new HashSet<>();
95+
Set<String> optionalFlowConstants = new HashSet<>(Arrays.asList(
9596
"available"
9697
));
97-
Set<String> optionalFlowConstants = new HashSet<>();
9898
Set<String> undeclaredConstants = new HashSet<>(constants.keySet());
9999
undeclaredConstants.removeAll(obligatoryFlowConstants);
100100
undeclaredConstants.removeAll(optionalFlowConstants);

ios/RNPermissionsModule.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#ifdef RCT_NEW_ARCH_ENABLED
2-
#import <rnpermissions/rnpermissions.h>
2+
#import <rnpermission/rnpermission.h>
33
#else
44
#import <React/RCTBridge.h>
55
#endif

ios/RNPermissionsModule.mm

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -367,10 +367,22 @@ - (void)unlockHandler:(NSString * _Nonnull)lockId {
367367
}];
368368
}
369369

370-
RCT_EXPORT_METHOD(check:(NSString *)permission
370+
RCT_EXPORT_METHOD(check:
371+
#ifdef RCT_NEW_ARCH_ENABLED
372+
(NSString *)
373+
#else
374+
(RNPermission)
375+
#endif
376+
permission
371377
resolve:(RCTPromiseResolveBlock)resolve
372378
reject:(RCTPromiseRejectBlock)reject) {
373-
id<RNPermissionHandler> handler = [self handlerForPermission:permission];
379+
id<RNPermissionHandler> handler = [self handlerForPermission:
380+
#ifdef RCT_NEW_ARCH_ENABLED
381+
[RCTConvert RNPermission:permission]
382+
#else
383+
permission
384+
#endif
385+
];
374386
NSString *lockId = [self lockHandler:handler];
375387

376388
[handler checkWithResolver:^(RNPermissionStatus status) {
@@ -382,10 +394,22 @@ - (void)unlockHandler:(NSString * _Nonnull)lockId {
382394
}];
383395
}
384396

385-
RCT_EXPORT_METHOD(request:(NSString *)permission
397+
RCT_EXPORT_METHOD(request:
398+
#ifdef RCT_NEW_ARCH_ENABLED
399+
(NSString *)
400+
#else
401+
(RNPermission)
402+
#endif
403+
permission
386404
resolve:(RCTPromiseResolveBlock)resolve
387405
reject:(RCTPromiseRejectBlock)reject) {
388-
id<RNPermissionHandler> handler = [self handlerForPermission:permission];
406+
id<RNPermissionHandler> handler = [self handlerForPermission:
407+
#ifdef RCT_NEW_ARCH_ENABLED
408+
[RCTConvert RNPermission:permission]
409+
#else
410+
permission
411+
#endif
412+
];
389413
NSString *lockId = [self lockHandler:handler];
390414

391415
[handler requestWithResolver:^(RNPermissionStatus status) {
@@ -489,12 +513,13 @@ - (void)shouldShowRequestPermissionRationale:(NSString *)permission resolve:(RCT
489513
reject(@"RNPermissions:shouldShowRequestPermissionRationale", @"shouldShowRequestPermissionRationale is not supported on iOS", nil);
490514
}
491515

492-
- (facebook::react::ModuleConstants<JS::NativePermissionsModule::Constants::Builder>)getConstants {
516+
517+
#if RCT_NEW_ARCH_ENABLED
518+
519+
- (facebook::react::ModuleConstants<JS::NativePermissionsModule::Constants::Builder>)getConstants {
493520
return [self constantsToExport];
494521
}
495522

496-
497-
#if RCT_NEW_ARCH_ENABLED
498523
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
499524
(const facebook::react::ObjCTurboModule::InitParams &)params
500525
{

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
"typescript": "^4.7.4"
7777
},
7878
"codegenConfig": {
79-
"name": "rnpermissions",
79+
"name": "rnpermission",
8080
"type": "modules",
8181
"jsSrcsDir": "./src",
8282
"android": {

src/NativePermissionsModule.ts

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,32 @@
11
/* eslint-disable @typescript-eslint/ban-types */
22
// we use Object type because methods on the native side use NSDictionary and ReadableMap
33
// and we want to stay compatible with those
4-
import {TurboModuleRegistry, TurboModule} from 'react-native';
4+
import {TurboModule, TurboModuleRegistry} from 'react-native';
55

66
type NotificationsResponse = {
7-
status: Object;
8-
settings: Object;
9-
};
7+
status: Object;
8+
settings: Object;
9+
};
1010

1111
export interface Spec extends TurboModule {
12-
openSettings(): Promise<void>;
13-
checkNotifications(): Promise<NotificationsResponse>;
12+
openSettings(): Promise<void>;
13+
checkNotifications(): Promise<NotificationsResponse>;
1414

15-
// Android only part
16-
checkPermission(permission: string): Promise<string>;
17-
shouldShowRequestPermissionRationale(permission: string): Promise<boolean>;
18-
requestPermission(permission: string): Promise<string>;
19-
checkMultiplePermissions(permissions: string[]): Promise<Object>;
20-
requestMultiplePermissions(permissions: string[]): Promise<Object>;
15+
// Android only part
16+
checkPermission(permission: string): Promise<string>;
17+
shouldShowRequestPermissionRationale(permission: string): Promise<boolean>;
18+
requestPermission(permission: string): Promise<string>;
19+
checkMultiplePermissions(permissions: string[]): Promise<Object>;
20+
requestMultiplePermissions(permissions: string[]): Promise<Object>;
2121

22-
// iOS only part
23-
check(permission: string): Promise<string>; // TODO: should be number prolly
24-
checkLocationAccuracy(): Promise<string>;
25-
request(permission: string): Promise<string>; // TODO: should be number prolly
26-
requestLocationAccuracy(purposeKey: string): Promise<string>;
27-
requestNotifications(options: string[]): Promise<NotificationsResponse>;
28-
openLimitedPhotoLibraryPicker(): Promise<boolean>;
29-
getConstants(): {
30-
available: string[];
31-
};
22+
// iOS only part
23+
check(permission: string): Promise<string>; // TODO: should be number prolly
24+
checkLocationAccuracy(): Promise<string>;
25+
request(permission: string): Promise<string>; // TODO: should be number prolly
26+
requestLocationAccuracy(purposeKey: string): Promise<string>;
27+
requestNotifications(options: string[]): Promise<NotificationsResponse>;
28+
openLimitedPhotoLibraryPicker(): Promise<boolean>;
29+
getConstants(): {available?: string[]};
3230
}
3331

34-
export default TurboModuleRegistry.getEnforcing<Spec>('RNPermissionsModule');
32+
export default TurboModuleRegistry.getEnforcing<Spec>('RNPermissionsModule');

src/methods.android.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
import {Alert, AlertButton} from 'react-native';
22
import type {Contract} from './contract';
3+
import NativeModule from './NativePermissionsModule';
34
import type {NotificationsResponse, Permission, PermissionStatus, Rationale} from './types';
45
import {
56
checkLocationAccuracy,
67
openLimitedPhotoLibraryPicker,
78
requestLocationAccuracy,
89
} from './unsupportedPlatformMethods';
910
import {platformVersion, uniq} from './utils';
10-
import NativeModule from './NativePermissionsModule';
1111
const TIRAMISU_VERSION_CODE = 33;
1212

1313
async function openSettings(): Promise<void> {
1414
await NativeModule.openSettings();
1515
}
1616

1717
function check(permission: Permission): Promise<PermissionStatus> {
18-
return NativeModule.checkPermission(permission);
18+
return NativeModule.checkPermission(permission) as Promise<PermissionStatus>;
1919
}
2020

2121
async function request(permission: Permission, rationale?: Rationale): Promise<PermissionStatus> {
@@ -29,27 +29,29 @@ async function request(permission: Permission, rationale?: Rationale): Promise<P
2929
const buttons: AlertButton[] = [];
3030

3131
if (buttonNegative) {
32-
const onPress = () => resolve(NativeModule.checkPermission(permission));
32+
const onPress = () =>
33+
resolve(NativeModule.checkPermission(permission) as Promise<PermissionStatus>);
3334
buttonNeutral && buttons.push({text: buttonNeutral, onPress});
3435
buttons.push({text: buttonNegative, onPress});
3536
}
3637

3738
buttons.push({
3839
text: buttonPositive,
39-
onPress: () => resolve(NativeModule.requestPermission(permission)),
40+
onPress: () =>
41+
resolve(NativeModule.requestPermission(permission) as Promise<PermissionStatus>),
4042
});
4143

4244
Alert.alert(title, message, buttons, {cancelable: false});
4345
});
4446
}
4547
}
4648

47-
return NativeModule.requestPermission(permission);
49+
return NativeModule.requestPermission(permission) as Promise<PermissionStatus>;
4850
}
4951

5052
async function checkNotifications(): Promise<NotificationsResponse> {
5153
if (platformVersion < TIRAMISU_VERSION_CODE) {
52-
return NativeModule.checkNotifications();
54+
return NativeModule.checkNotifications() as Promise<NotificationsResponse>;
5355
}
5456

5557
const status = await check('android.permission.POST_NOTIFICATIONS');
@@ -58,7 +60,7 @@ async function checkNotifications(): Promise<NotificationsResponse> {
5860

5961
async function requestNotifications(): Promise<NotificationsResponse> {
6062
if (platformVersion < TIRAMISU_VERSION_CODE) {
61-
return NativeModule.checkNotifications();
63+
return NativeModule.checkNotifications() as Promise<NotificationsResponse>;
6264
}
6365

6466
const status = await request('android.permission.POST_NOTIFICATIONS');
@@ -69,14 +71,18 @@ function checkMultiple<P extends Permission[]>(
6971
permissions: P,
7072
): Promise<Record<P[number], PermissionStatus>> {
7173
const dedup = uniq(permissions);
72-
return NativeModule.checkMultiplePermissions(dedup);
74+
return NativeModule.checkMultiplePermissions(dedup) as Promise<
75+
Record<P[number], PermissionStatus>
76+
>;
7377
}
7478

7579
function requestMultiple<P extends Permission[]>(
7680
permissions: P,
7781
): Promise<Record<P[number], PermissionStatus>> {
7882
const dedup = uniq(permissions);
79-
return NativeModule.requestMultiplePermissions(dedup);
83+
return NativeModule.requestMultiplePermissions(dedup) as Promise<
84+
Record<P[number], PermissionStatus>
85+
>;
8086
}
8187

8288
export const methods: Contract = {

0 commit comments

Comments
 (0)