Skip to content

Commit f72781e

Browse files
authored
Merge pull request #1 from reason-react-native/flatten-and-complete
Add complete bindings & flatten API
2 parents 57e6ca3 + b26e655 commit f72781e

File tree

3 files changed

+218
-76
lines changed

3 files changed

+218
-76
lines changed

README.md

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,23 @@ yarn add @reason-react-native/permissions
4646

4747
```reason
4848
open ReactNative;
49-
open ReactNativePermissions;
5049
5150
let requestCamera = () => {
52-
Permissions.request(
53-
switch (Platform.os) {
54-
| os when os === "ios" => Permissions.Constants.IOS.camera
55-
| _ => Permissions.Constants.Android.camera
56-
},
57-
)
58-
|> Js.Promise.then_(permissionStatus =>
59-
switch (permissionStatus) {
60-
| status when status === Results.granted => Js.Promise.resolve()
61-
| _ => Js.Promise.reject(Js.Exn.raiseError("permission error"))
62-
}
63-
);
51+
ReactNativePermissions.(
52+
request(
53+
switch (Platform.os) {
54+
| os when os === "ios" => Ios.camera
55+
| _ => Android.camera
56+
},
57+
)
58+
|> Js.Promise.then_(permissionStatus =>
59+
switch (permissionStatus) {
60+
| status when status === granted => Js.Promise.resolve()
61+
| _ => Js.Promise.reject(Js.Exn.raiseError("permission error"))
62+
}
63+
)
64+
)
65+
);
6466
};
6567
```
6668

src/ReactNativePermissions.bs.js

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,10 @@
11
'use strict';
22

33

4-
var IOS = { };
5-
64
var Android = { };
75

8-
var Constants = {
9-
IOS: IOS,
10-
Android: Android
11-
};
12-
13-
var Results = { };
14-
15-
var $$Permissions = {
16-
Constants: Constants,
17-
Results: Results
18-
};
6+
var Ios = { };
197

20-
exports.$$Permissions = $$Permissions;
8+
exports.Android = Android;
9+
exports.Ios = Ios;
2110
/* No side effect */

src/ReactNativePermissions.re

Lines changed: 200 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,201 @@
1-
module Permissions = {
2-
module Constants = {
3-
type t;
4-
5-
module IOS = {
6-
[@bs.module "react-native-permissions"]
7-
[@bs.scope ("default", "PERMISSIONS", "IOS")]
8-
external camera: t = "CAMERA";
9-
10-
[@bs.module "react-native-permissions"]
11-
[@bs.scope ("default", "PERMISSIONS", "IOS")]
12-
external locationAlways: t = "LOCATION_ALWAYS";
13-
};
14-
15-
module Android = {
16-
[@bs.module "react-native-permissions"]
17-
[@bs.scope ("default", "PERMISSIONS", "ANDROID")]
18-
external camera: t = "CAMERA";
19-
20-
[@bs.module "react-native-permissions"]
21-
[@bs.scope ("default", "PERMISSIONS", "ANDROID")]
22-
external accessCoarseLocation: t = "ACCESS_COARSE_LOCATION";
23-
24-
[@bs.module "react-native-permissions"]
25-
[@bs.scope ("default", "PERMISSIONS", "ANDROID")]
26-
external accessFineLocation: t = "ACCESS_FINE_LOCATION";
27-
};
28-
};
29-
30-
module Results = {
31-
type t;
32-
[@bs.module "react-native-permissions"] [@bs.scope ("default", "RESULTS")]
33-
external unavailable: t = "UNAVAILABLE";
34-
[@bs.module "react-native-permissions"] [@bs.scope ("default", "RESULTS")]
35-
external denied: t = "DENIED";
36-
[@bs.module "react-native-permissions"] [@bs.scope ("default", "RESULTS")]
37-
external granted: t = "GRANTED";
38-
[@bs.module "react-native-permissions"] [@bs.scope ("default", "RESULTS")]
39-
external blocked: t = "BLOCKED";
40-
};
41-
42-
[@bs.module "react-native-permissions"] [@bs.scope "default"]
43-
external openSettings: unit => Js.Promise.t(unit) = "openSettings";
44-
45-
[@bs.module "react-native-permissions"] [@bs.scope "default"]
46-
external request: Constants.t => Js.Promise.t(Results.t) = "request";
47-
48-
[@bs.module "react-native-permissions"] [@bs.scope "default"]
49-
external check: Constants.t => Js.Promise.t(Results.t) = "check";
1+
type permission;
2+
3+
module Android = {
4+
[@bs.module "react-native-permissions"]
5+
[@bs.scope ("PERMISSIONS", "ANDROID")]
6+
external accept_handover: permission = "ACCEPT_HANDOVER";
7+
[@bs.module "react-native-permissions"]
8+
[@bs.scope ("PERMISSIONS", "ANDROID")]
9+
external access_background_location: permission =
10+
"ACCESS_BACKGROUND_LOCATION";
11+
[@bs.module "react-native-permissions"]
12+
[@bs.scope ("PERMISSIONS", "ANDROID")]
13+
external access_coarse_location: permission = "ACCESS_COARSE_LOCATION";
14+
[@bs.module "react-native-permissions"]
15+
[@bs.scope ("PERMISSIONS", "ANDROID")]
16+
external access_fine_location: permission = "ACCESS_FINE_LOCATION";
17+
[@bs.module "react-native-permissions"]
18+
[@bs.scope ("PERMISSIONS", "ANDROID")]
19+
external activity_recognition: permission = "ACTIVITY_RECOGNITION";
20+
[@bs.module "react-native-permissions"]
21+
[@bs.scope ("PERMISSIONS", "ANDROID")]
22+
external add_voicemail: permission = "ADD_VOICEMAIL";
23+
[@bs.module "react-native-permissions"]
24+
[@bs.scope ("PERMISSIONS", "ANDROID")]
25+
external answer_phone_calls: permission = "ANSWER_PHONE_CALLS";
26+
[@bs.module "react-native-permissions"]
27+
[@bs.scope ("PERMISSIONS", "ANDROID")]
28+
external body_sensors: permission = "BODY_SENSORS";
29+
[@bs.module "react-native-permissions"]
30+
[@bs.scope ("PERMISSIONS", "ANDROID")]
31+
external call_phone: permission = "CALL_PHONE";
32+
[@bs.module "react-native-permissions"]
33+
[@bs.scope ("PERMISSIONS", "ANDROID")]
34+
external camera: permission = "CAMERA";
35+
[@bs.module "react-native-permissions"]
36+
[@bs.scope ("PERMISSIONS", "ANDROID")]
37+
external get_accounts: permission = "GET_ACCOUNTS";
38+
[@bs.module "react-native-permissions"]
39+
[@bs.scope ("PERMISSIONS", "ANDROID")]
40+
external process_outgoing_calls: permission = "PROCESS_OUTGOING_CALLS";
41+
[@bs.module "react-native-permissions"]
42+
[@bs.scope ("PERMISSIONS", "ANDROID")]
43+
external read_calendar: permission = "READ_CALENDAR";
44+
[@bs.module "react-native-permissions"]
45+
[@bs.scope ("PERMISSIONS", "ANDROID")]
46+
external read_call_log: permission = "READ_CALL_LOG";
47+
[@bs.module "react-native-permissions"]
48+
[@bs.scope ("PERMISSIONS", "ANDROID")]
49+
external read_contacts: permission = "READ_CONTACTS";
50+
[@bs.module "react-native-permissions"]
51+
[@bs.scope ("PERMISSIONS", "ANDROID")]
52+
external read_external_storage: permission = "READ_EXTERNAL_STORAGE";
53+
[@bs.module "react-native-permissions"]
54+
[@bs.scope ("PERMISSIONS", "ANDROID")]
55+
external read_phone_numbers: permission = "READ_PHONE_NUMBERS";
56+
[@bs.module "react-native-permissions"]
57+
[@bs.scope ("PERMISSIONS", "ANDROID")]
58+
external read_phone_state: permission = "READ_PHONE_STATE";
59+
[@bs.module "react-native-permissions"]
60+
[@bs.scope ("PERMISSIONS", "ANDROID")]
61+
external read_sms: permission = "READ_SMS";
62+
[@bs.module "react-native-permissions"]
63+
[@bs.scope ("PERMISSIONS", "ANDROID")]
64+
external receive_mms: permission = "RECEIVE_MMS";
65+
[@bs.module "react-native-permissions"]
66+
[@bs.scope ("PERMISSIONS", "ANDROID")]
67+
external receive_sms: permission = "RECEIVE_SMS";
68+
[@bs.module "react-native-permissions"]
69+
[@bs.scope ("PERMISSIONS", "ANDROID")]
70+
external receive_wap_push: permission = "RECEIVE_WAP_PUSH";
71+
[@bs.module "react-native-permissions"]
72+
[@bs.scope ("PERMISSIONS", "ANDROID")]
73+
external record_audio: permission = "RECORD_AUDIO";
74+
[@bs.module "react-native-permissions"]
75+
[@bs.scope ("PERMISSIONS", "ANDROID")]
76+
external send_sms: permission = "SEND_SMS";
77+
[@bs.module "react-native-permissions"]
78+
[@bs.scope ("PERMISSIONS", "ANDROID")]
79+
external use_sip: permission = "USE_SIP";
80+
[@bs.module "react-native-permissions"]
81+
[@bs.scope ("PERMISSIONS", "ANDROID")]
82+
external write_calendar: permission = "WRITE_CALENDAR";
83+
[@bs.module "react-native-permissions"]
84+
[@bs.scope ("PERMISSIONS", "ANDROID")]
85+
external write_call_log: permission = "WRITE_CALL_LOG";
86+
[@bs.module "react-native-permissions"]
87+
[@bs.scope ("PERMISSIONS", "ANDROID")]
88+
external write_contacts: permission = "WRITE_CONTACTS";
89+
[@bs.module "react-native-permissions"]
90+
[@bs.scope ("PERMISSIONS", "ANDROID")]
91+
external write_external_storage: permission = "WRITE_EXTERNAL_STORAGE";
92+
};
93+
94+
module Ios = {
95+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
96+
external bluetooth_peripheral: permission = "BLUETOOTH_PERIPHERAL";
97+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
98+
external calendars: permission = "CALENDARS";
99+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
100+
external camera: permission = "CAMERA";
101+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
102+
external contacts: permission = "CONTACTS";
103+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
104+
external face_id: permission = "FACE_ID";
105+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
106+
external location_always: permission = "LOCATION_ALWAYS";
107+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
108+
external location_when_in_use: permission = "LOCATION_WHEN_IN_USE";
109+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
110+
external media_library: permission = "MEDIA_LIBRARY";
111+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
112+
external microphone: permission = "MICROPHONE";
113+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
114+
external motion: permission = "MOTION";
115+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
116+
external photo_library: permission = "PHOTO_LIBRARY";
117+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
118+
external reminders: permission = "REMINDERS";
119+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
120+
external siri: permission = "SIRI";
121+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
122+
external speech_recognition: permission = "SPEECH_RECOGNITION";
123+
[@bs.module "react-native-permissions"] [@bs.scope ("PERMISSIONS", "IOS")]
124+
external storekit: permission = "STOREKIT";
50125
};
126+
127+
type permissionStatus;
128+
129+
/* This feature is not available (on this device / in this context) */
130+
[@bs.module "react-native-permissions"] [@bs.scope "RESULTS"]
131+
external unavailable: permissionStatus = "UNAVAILABLE";
132+
133+
/* The permission has not been requested / is denied but requestable */
134+
[@bs.module "react-native-permissions"] [@bs.scope "RESULTS"]
135+
external denied: permissionStatus = "DENIED";
136+
137+
/* The permission is granted */
138+
[@bs.module "react-native-permissions"] [@bs.scope "RESULTS"]
139+
external granted: permissionStatus = "GRANTED";
140+
141+
/* The permission is denied and not requestable anymore */
142+
[@bs.module "react-native-permissions"] [@bs.scope "RESULTS"]
143+
external blocked: permissionStatus = "BLOCKED";
144+
145+
// methods
146+
147+
[@bs.module "react-native-permissions"]
148+
external check: permission => Js.Promise.t(permissionStatus) = "check";
149+
150+
type requestRationale = {
151+
title: string,
152+
message: string,
153+
buttonPositive: option(string),
154+
buttonNegative: option(string),
155+
buttonNeutral: option(string),
156+
};
157+
158+
[@bs.module "react-native-permissions"]
159+
external request: permission => Js.Promise.t(permissionStatus) = "request";
160+
161+
[@bs.module "react-native-permissions"]
162+
external requestWithRational:
163+
(permission, requestRationale) => Js.Promise.t(permissionStatus) =
164+
"request";
165+
166+
type notificationSettings = {
167+
// properties only availables on iOS
168+
// unavailable settings will not be included in the response object
169+
alert: option(bool),
170+
badge: option(bool),
171+
sound: option(bool),
172+
lockScreen: option(bool),
173+
carPlay: option(bool),
174+
notificationCenter: option(bool),
175+
criticalAlert: option(bool),
176+
};
177+
178+
type requestNotificationsResult = {
179+
status: permissionStatus,
180+
settings: notificationSettings,
181+
};
182+
183+
[@bs.module "react-native-permissions"]
184+
external checkNotifications: unit => Js.Promise.t(requestNotificationsResult) =
185+
"checkNotifications";
186+
187+
// only used on iOS
188+
// string can be
189+
// "alert"
190+
// "badge"
191+
// "sound"
192+
// "criticalAlert"
193+
// "carPlay"
194+
// "provisional"
195+
[@bs.module "react-native-permissions"]
196+
external requestNotifications:
197+
array(string) => Js.Promise.t(requestNotificationsResult) =
198+
"requestNotifications";
199+
200+
[@bs.module "react-native-permissions"]
201+
external openSettings: unit => Js.Promise.t(unit) = "openSettings";

0 commit comments

Comments
 (0)