forked from rescript-react-native/rescript-react-native
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtimePickerAndroid.re
More file actions
73 lines (63 loc) · 1.79 KB
/
timePickerAndroid.re
File metadata and controls
73 lines (63 loc) · 1.79 KB
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
[@bs.scope "TimePickerAndroid"] [@bs.module "react-native"]
external timeSet: string = "timeSetAction";
[@bs.scope "TimePickerAndroid"] [@bs.module "react-native"]
external dismissed: string = "dismissedAction";
type response = {
hour: int,
minute: int,
};
[@bs.deriving jsConverter]
type mode = [ | `clock | `spinner | `default];
type action =
| Dismissed
| Set(response);
[@bs.deriving abstract]
type optsJs = {
hour: Js.Nullable.t(int),
minute: Js.Nullable.t(int),
is24Hour: Js.Nullable.t(bool),
mode: string,
};
[@bs.deriving abstract]
type responseJs = {
action: string,
hour: int,
minute: int,
};
let actionHandler = resp =>
if (actionGet(resp) == timeSet) {
Set({hour: hourGet(resp), minute: minuteGet(resp)});
} else if (actionGet(resp) == dismissed) {
Dismissed;
} else {
failwith(
"Unknown action received from TimePickerAndroid. Please report this in the bs-react-native repository",
);
};
let rangeHandler = (valueName, valueFrom, valueTo, value) =>
switch (value) {
| None => None
| Some(v) =>
switch (v) {
| _good when v <= valueTo && v >= valueFrom => Some(v)
| _ =>
failwith(
{j|$valueName must be a value between $valueFrom and $valueTo|j},
)
}
};
[@bs.scope "TimePickerAndroid"] [@bs.module "react-native"]
external _open: optsJs => Js.Promise.t(responseJs) = "open";
let open_ = (~hour=?, ~minute=?, ~is24Hour=?, ~mode=`default, ()) =>
_open(
optsJs(
~hour=hour |> rangeHandler("Hour", 0, 23) |> Js.Nullable.fromOption,
~minute=
minute |> rangeHandler("Minute", 0, 59) |> Js.Nullable.fromOption,
~is24Hour=Js.Nullable.fromOption(is24Hour),
~mode=modeToJs(mode),
),
)
|> Js.Promise.then_((resp: responseJs) =>
resp |> actionHandler |> Js.Promise.resolve
);