@colisweb/rescript-toolkit 4.29.3 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +25 -23
- package/{bsconfig.json → rescript.json} +10 -5
- package/src/decoders/Decoders__UnitMeasure.res +251 -0
- package/src/decoders/Toolkit__Decoders.res +118 -412
- package/src/decoders/index.md +5 -5
- package/src/form/Reform.res +18 -18
- package/src/form/Toolkit__Form.res +53 -50
- package/src/hooks/Toolkit__Hooks.res +41 -60
- package/src/hooks/index.md +2 -2
- package/src/identifier/Toolkit__Identifier.res +27 -70
- package/src/identifier/index.md +3 -3
- package/src/intl/Toolkit__Intl.res +1 -1
- package/src/mock/MockOverlay.res +1 -1
- package/src/request/index.md +11 -11
- package/src/router/Toolkit__Router.res +11 -11
- package/src/ui/Toolkit__Ui_Autocomplete.res +2 -2
- package/src/ui/Toolkit__Ui_Button.res +1 -1
- package/src/ui/Toolkit__Ui_ButtonGroup2.res +1 -1
- package/src/ui/Toolkit__Ui_Checkbox.res +1 -1
- package/src/ui/Toolkit__Ui_Coordinates.res +4 -4
- package/src/ui/Toolkit__Ui_DatetimeInput.res +3 -4
- package/src/ui/Toolkit__Ui_Dropdown.res +1 -1
- package/src/ui/Toolkit__Ui_DropdownList.res +1 -1
- package/src/ui/Toolkit__Ui_IconButton.res +5 -5
- package/src/ui/Toolkit__Ui_Layout.res +6 -6
- package/src/ui/Toolkit__Ui_Listbox.res +17 -21
- package/src/ui/Toolkit__Ui_MultiSelect.res +1 -1
- package/src/ui/Toolkit__Ui_MultiSelectWithValidation.res +1 -1
- package/src/ui/Toolkit__Ui_Notice.res +37 -26
- package/src/ui/Toolkit__Ui_Portal.res +1 -1
- package/src/ui/Toolkit__Ui_PortalDropdown.res +8 -6
- package/src/ui/Toolkit__Ui_RadioGroup.res +1 -1
- package/src/ui/Toolkit__Ui_SearchListbox.res +4 -5
- package/src/ui/Toolkit__Ui_SelectWithValidation.res +1 -1
- package/src/ui/Toolkit__Ui_Snackbar.res +2 -2
- package/src/ui/Toolkit__Ui_Switch.res +1 -1
- package/src/ui/Toolkit__Ui_TextInput.res +3 -4
- package/src/ui/Toolkit__Ui_TextareaInput.res +2 -23
- package/src/ui/Toolkit__Ui_Tooltip.res +1 -1
- package/src/ui/Toolkit__Ui_WeekDateFilter.res +1 -1
- package/src/unleash/Toolkit__Unleash.res +6 -6
- package/src/unleash/index.md +1 -1
- package/src/utils/Toolkit__Utils.res +20 -0
- package/src/utils/Toolkit__Utils_UnitMeasure.res +72 -110
- package/src/vendors/Axios.res +2 -2
- package/src/vendors/DatadogRum.res +3 -3
- package/src/vendors/ReactDayPicker.res +4 -4
- package/src/vendors/ReactUse.res +1 -1
- package/src/vendors/Zendesk.res +1 -1
package/src/form/Reform.res
CHANGED
|
@@ -127,7 +127,7 @@ module Make = (Config: Config) => {
|
|
|
127
127
|
let {handleChange, getFieldError, getFieldState, validateField, state} = useFormContext()
|
|
128
128
|
|
|
129
129
|
{
|
|
130
|
-
handleChange: handleChange(field),
|
|
130
|
+
handleChange: handleChange(field, ...),
|
|
131
131
|
error: getFieldError(Field(field)),
|
|
132
132
|
state: getFieldState(Field(field)),
|
|
133
133
|
validate: () => validateField(Field(field)),
|
|
@@ -369,32 +369,32 @@ module Make = (Config: Config) => {
|
|
|
369
369
|
},
|
|
370
370
|
)
|
|
371
371
|
|
|
372
|
-
let getFieldState = field =>
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|> (
|
|
382
|
-
field =>
|
|
383
|
-
switch field {
|
|
384
|
-
| Some((_nameField, nameFieldState)) => nameFieldState
|
|
385
|
-
| None => Pristine
|
|
386
|
-
}
|
|
372
|
+
let getFieldState = field => {
|
|
373
|
+
let tmp =
|
|
374
|
+
state.fieldsState
|
|
375
|
+
->Belt.List.fromArray
|
|
376
|
+
->Belt.List.getBy(((nameField, _nameFieldState)) =>
|
|
377
|
+
switch nameField == field {
|
|
378
|
+
| true => true
|
|
379
|
+
| _ => false
|
|
380
|
+
}
|
|
387
381
|
)
|
|
388
382
|
|
|
383
|
+
switch tmp {
|
|
384
|
+
| Some((_nameField, nameFieldState)) => nameFieldState
|
|
385
|
+
| None => Pristine
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
389
|
let getFieldError = field =>
|
|
390
|
-
|
|
390
|
+
(
|
|
391
391
|
x =>
|
|
392
392
|
switch x {
|
|
393
393
|
| Error(error) => Some(error)
|
|
394
394
|
| NestedErrors(_errors) => None
|
|
395
395
|
| _ => None
|
|
396
396
|
}
|
|
397
|
-
)
|
|
397
|
+
)(getFieldState(field))
|
|
398
398
|
|
|
399
399
|
let getNestedFieldError = (field, subfield, index) =>
|
|
400
400
|
switch getFieldState(field) {
|
|
@@ -26,12 +26,13 @@ module Make = (StateLenses: Config) => {
|
|
|
26
26
|
let make = (~field, ~elements, ~inline=?) =>
|
|
27
27
|
<Field
|
|
28
28
|
field
|
|
29
|
-
render={({handleChange, error, value}) =>
|
|
30
|
-
<
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
render={({handleChange, error, value}) =>
|
|
30
|
+
<React.Fragment>
|
|
31
|
+
<Toolkit__Ui_RadioGroup
|
|
32
|
+
defaultValue=value onChange={v => handleChange(v)} elements ?inline
|
|
33
|
+
/>
|
|
34
|
+
<ErrorMessage ?error />
|
|
35
|
+
</React.Fragment>}
|
|
35
36
|
/>
|
|
36
37
|
}
|
|
37
38
|
module Input = {
|
|
@@ -75,7 +76,7 @@ module Make = (StateLenses: Config) => {
|
|
|
75
76
|
| _ => validate()
|
|
76
77
|
}
|
|
77
78
|
|
|
78
|
-
|
|
79
|
+
<React.Fragment>
|
|
79
80
|
<div
|
|
80
81
|
className={cx([
|
|
81
82
|
"flex",
|
|
@@ -142,7 +143,7 @@ module Make = (StateLenses: Config) => {
|
|
|
142
143
|
</div>
|
|
143
144
|
</div>
|
|
144
145
|
<ErrorMessage ?error className=?errorClassName />
|
|
145
|
-
|
|
146
|
+
</React.Fragment>
|
|
146
147
|
}}
|
|
147
148
|
/>
|
|
148
149
|
}
|
|
@@ -185,7 +186,7 @@ module Make = (StateLenses: Config) => {
|
|
|
185
186
|
| _ => validate()
|
|
186
187
|
}
|
|
187
188
|
|
|
188
|
-
|
|
189
|
+
<React.Fragment>
|
|
189
190
|
{switch label {
|
|
190
191
|
| None => React.null
|
|
191
192
|
| Some(label) =>
|
|
@@ -214,7 +215,7 @@ module Make = (StateLenses: Config) => {
|
|
|
214
215
|
onBlur
|
|
215
216
|
/>
|
|
216
217
|
<ErrorMessage ?error />
|
|
217
|
-
|
|
218
|
+
</React.Fragment>
|
|
218
219
|
}}
|
|
219
220
|
/>
|
|
220
221
|
}
|
|
@@ -258,7 +259,7 @@ module Make = (StateLenses: Config) => {
|
|
|
258
259
|
| _ => validate()
|
|
259
260
|
}
|
|
260
261
|
|
|
261
|
-
|
|
262
|
+
<React.Fragment>
|
|
262
263
|
{switch label {
|
|
263
264
|
| None => React.null
|
|
264
265
|
| Some(label) =>
|
|
@@ -295,7 +296,7 @@ module Make = (StateLenses: Config) => {
|
|
|
295
296
|
isInvalid
|
|
296
297
|
/>
|
|
297
298
|
<ErrorMessage ?error />
|
|
298
|
-
|
|
299
|
+
</React.Fragment>
|
|
299
300
|
}}
|
|
300
301
|
/>
|
|
301
302
|
}
|
|
@@ -327,7 +328,7 @@ module Make = (StateLenses: Config) => {
|
|
|
327
328
|
| _ => validate()
|
|
328
329
|
}
|
|
329
330
|
|
|
330
|
-
|
|
331
|
+
<React.Fragment>
|
|
331
332
|
{switch label {
|
|
332
333
|
| None => React.null
|
|
333
334
|
| Some(label) =>
|
|
@@ -353,7 +354,7 @@ module Make = (StateLenses: Config) => {
|
|
|
353
354
|
onBlur
|
|
354
355
|
/>
|
|
355
356
|
<ErrorMessage ?error />
|
|
356
|
-
|
|
357
|
+
</React.Fragment>
|
|
357
358
|
}}
|
|
358
359
|
/>
|
|
359
360
|
}
|
|
@@ -363,18 +364,19 @@ module Make = (StateLenses: Config) => {
|
|
|
363
364
|
let make = (~field, ~label, ~name=?, ~disabled=?, ~className=?) =>
|
|
364
365
|
<Field
|
|
365
366
|
field
|
|
366
|
-
render={({handleChange, error, value}) =>
|
|
367
|
-
<
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
367
|
+
render={({handleChange, error, value}) =>
|
|
368
|
+
<React.Fragment>
|
|
369
|
+
<Toolkit__Ui_Checkbox
|
|
370
|
+
?className
|
|
371
|
+
checked={value->Obj.magic}
|
|
372
|
+
value={value->Obj.magic}
|
|
373
|
+
?name
|
|
374
|
+
?disabled
|
|
375
|
+
onChange={(checked, _value) => handleChange(checked)}>
|
|
376
|
+
label
|
|
377
|
+
</Toolkit__Ui_Checkbox>
|
|
378
|
+
<ErrorMessage ?error />
|
|
379
|
+
</React.Fragment>}
|
|
378
380
|
/>
|
|
379
381
|
}
|
|
380
382
|
|
|
@@ -404,7 +406,7 @@ module Make = (StateLenses: Config) => {
|
|
|
404
406
|
}
|
|
405
407
|
}
|
|
406
408
|
|
|
407
|
-
|
|
409
|
+
<React.Fragment>
|
|
408
410
|
{switch label {
|
|
409
411
|
| None => React.null
|
|
410
412
|
| Some(label) =>
|
|
@@ -432,7 +434,7 @@ module Make = (StateLenses: Config) => {
|
|
|
432
434
|
}}
|
|
433
435
|
/>
|
|
434
436
|
<ErrorMessage ?error />
|
|
435
|
-
|
|
437
|
+
</React.Fragment>
|
|
436
438
|
}}
|
|
437
439
|
/>
|
|
438
440
|
}
|
|
@@ -466,7 +468,7 @@ module Make = (StateLenses: Config) => {
|
|
|
466
468
|
}
|
|
467
469
|
}
|
|
468
470
|
|
|
469
|
-
|
|
471
|
+
<React.Fragment>
|
|
470
472
|
{switch label {
|
|
471
473
|
| None => React.null
|
|
472
474
|
| Some(label) =>
|
|
@@ -496,7 +498,7 @@ module Make = (StateLenses: Config) => {
|
|
|
496
498
|
}}
|
|
497
499
|
/>
|
|
498
500
|
<ErrorMessage ?error />
|
|
499
|
-
|
|
501
|
+
</React.Fragment>
|
|
500
502
|
}}
|
|
501
503
|
/>
|
|
502
504
|
}
|
|
@@ -524,7 +526,7 @@ module Make = (StateLenses: Config) => {
|
|
|
524
526
|
render={({handleChange, error, value}) => {
|
|
525
527
|
let isInvalid = error->Option.isSome
|
|
526
528
|
|
|
527
|
-
|
|
529
|
+
<React.Fragment>
|
|
528
530
|
{switch label {
|
|
529
531
|
| None => React.null
|
|
530
532
|
| Some(label) =>
|
|
@@ -549,7 +551,7 @@ module Make = (StateLenses: Config) => {
|
|
|
549
551
|
options
|
|
550
552
|
/>
|
|
551
553
|
<ErrorMessage ?error />
|
|
552
|
-
|
|
554
|
+
</React.Fragment>
|
|
553
555
|
}}
|
|
554
556
|
/>
|
|
555
557
|
}
|
|
@@ -579,7 +581,7 @@ module Make = (StateLenses: Config) => {
|
|
|
579
581
|
}
|
|
580
582
|
}
|
|
581
583
|
|
|
582
|
-
|
|
584
|
+
<React.Fragment>
|
|
583
585
|
{switch label {
|
|
584
586
|
| None => React.null
|
|
585
587
|
| Some(label) =>
|
|
@@ -603,7 +605,7 @@ module Make = (StateLenses: Config) => {
|
|
|
603
605
|
placeholder
|
|
604
606
|
/>
|
|
605
607
|
<ErrorMessage ?error />
|
|
606
|
-
|
|
608
|
+
</React.Fragment>
|
|
607
609
|
}}
|
|
608
610
|
/>
|
|
609
611
|
}
|
|
@@ -622,18 +624,19 @@ module Make = (StateLenses: Config) => {
|
|
|
622
624
|
) =>
|
|
623
625
|
<Field
|
|
624
626
|
field
|
|
625
|
-
render={({handleChange, value}) =>
|
|
626
|
-
<
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
627
|
+
render={({handleChange, value}) =>
|
|
628
|
+
<React.Fragment>
|
|
629
|
+
<Toolkit__Ui_Switch
|
|
630
|
+
?label
|
|
631
|
+
onChange={value => handleChange(value)}
|
|
632
|
+
name=id
|
|
633
|
+
checked=value
|
|
634
|
+
?size
|
|
635
|
+
?displayTitle
|
|
636
|
+
?switchClassName
|
|
637
|
+
className=?{labelClassName}
|
|
638
|
+
/>
|
|
639
|
+
</React.Fragment>}
|
|
637
640
|
/>
|
|
638
641
|
}
|
|
639
642
|
|
|
@@ -652,7 +655,7 @@ module Make = (StateLenses: Config) => {
|
|
|
652
655
|
<Field
|
|
653
656
|
field
|
|
654
657
|
render={({handleChange, value, error}) => {
|
|
655
|
-
|
|
658
|
+
<React.Fragment>
|
|
656
659
|
{switch label {
|
|
657
660
|
| None => React.null
|
|
658
661
|
| Some(label) =>
|
|
@@ -684,7 +687,7 @@ module Make = (StateLenses: Config) => {
|
|
|
684
687
|
<FormattedMessage defaultMessage="Choisissez une date" />,
|
|
685
688
|
)}
|
|
686
689
|
labelFormatter={date => {
|
|
687
|
-
|
|
690
|
+
<React.Fragment>
|
|
688
691
|
<span>
|
|
689
692
|
<FormattedDate
|
|
690
693
|
value={date} weekday=#long day=#numeric month=#long year=#numeric
|
|
@@ -694,11 +697,11 @@ module Make = (StateLenses: Config) => {
|
|
|
694
697
|
className="border inline-flex items-center justify-center w-8 h-8 rounded border-primary-700 text-primary-700">
|
|
695
698
|
<ReactIcons.FaPencilAlt size={18} />
|
|
696
699
|
</div>
|
|
697
|
-
|
|
700
|
+
</React.Fragment>
|
|
698
701
|
}}
|
|
699
702
|
/>
|
|
700
703
|
<ErrorMessage ?error />
|
|
701
|
-
|
|
704
|
+
</React.Fragment>
|
|
702
705
|
}}
|
|
703
706
|
/>
|
|
704
707
|
}
|
|
@@ -15,7 +15,7 @@ let useIsFirstMount = ReactUse.useFirstMountState
|
|
|
15
15
|
let useUpdateEffect = (fn, deps) => {
|
|
16
16
|
let isFirstMount = useIsFirstMount()
|
|
17
17
|
|
|
18
|
-
React.
|
|
18
|
+
React.useEffect(() =>
|
|
19
19
|
if !isFirstMount {
|
|
20
20
|
fn()
|
|
21
21
|
} else {
|
|
@@ -24,7 +24,6 @@ let useUpdateEffect = (fn, deps) => {
|
|
|
24
24
|
, deps)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
let useIsMounted = ReactUse.useMountedState
|
|
28
27
|
let useTimeoutFn = ReactUse.useTimeoutFn
|
|
29
28
|
let useDebounce = ReactUse.useDebounce
|
|
30
29
|
let useDebounce2 = ReactUse.useDebounce2
|
|
@@ -34,7 +33,7 @@ let useDebounce4 = ReactUse.useDebounce4
|
|
|
34
33
|
let useUpdate = () => {
|
|
35
34
|
let (_, setState) = React.useState(_ => 0)
|
|
36
35
|
|
|
37
|
-
React.
|
|
36
|
+
React.useCallback(() => setState(SafeIncrement.increment), [])
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
let useDebounceValue = (~debounceDuration=200, value) => {
|
|
@@ -51,7 +50,7 @@ let useGetSet = initialStateGetter => {
|
|
|
51
50
|
let state = React.useRef(initialStateGetter())
|
|
52
51
|
let update = useUpdate()
|
|
53
52
|
|
|
54
|
-
React.
|
|
53
|
+
React.useMemo(() => (
|
|
55
54
|
// get
|
|
56
55
|
() => state.current,
|
|
57
56
|
// set
|
|
@@ -65,7 +64,7 @@ let usePrevious = ReactUse.usePrevious
|
|
|
65
64
|
let useInitialPrevious = value => {
|
|
66
65
|
let previousRef = React.useRef(value)
|
|
67
66
|
|
|
68
|
-
React.
|
|
67
|
+
React.useEffectOnEveryRender(() => {
|
|
69
68
|
previousRef.current = value
|
|
70
69
|
None
|
|
71
70
|
})
|
|
@@ -106,7 +105,7 @@ let useFetcher = (~options: option<Swr.fetcherOptions>=?, key: 'key, fn: 'fn): f
|
|
|
106
105
|
),
|
|
107
106
|
)
|
|
108
107
|
|
|
109
|
-
(data->Obj.magic, isValidating, () => Promise.Js.fromBsPromise(mutate(
|
|
108
|
+
(data->Obj.magic, isValidating, () => Promise.Js.fromBsPromise(mutate())->Promise.Js.toResult)
|
|
110
109
|
}
|
|
111
110
|
|
|
112
111
|
let useOptionalFetcher = (~options: option<Swr.fetcherOptions>=?, key: 'key, fn: 'fn): fetcher<
|
|
@@ -124,7 +123,7 @@ let useOptionalFetcher = (~options: option<Swr.fetcherOptions>=?, key: 'key, fn:
|
|
|
124
123
|
),
|
|
125
124
|
)
|
|
126
125
|
|
|
127
|
-
(data->Obj.magic, isValidating, () => mutate(
|
|
126
|
+
(data->Obj.magic, isValidating, () => mutate()->Promise.Js.fromBsPromise->Promise.Js.toResult)
|
|
128
127
|
}
|
|
129
128
|
|
|
130
129
|
// ----------------------
|
|
@@ -143,9 +142,9 @@ let useDisclosure = (~defaultIsOpen=?, ()) => {
|
|
|
143
142
|
|
|
144
143
|
{
|
|
145
144
|
isOpen,
|
|
146
|
-
show: React.useCallback(() => setIsOpen(_ => true)),
|
|
147
|
-
hide: React.useCallback(() => setIsOpen(_ => false)),
|
|
148
|
-
toggle: React.useCallback(() => setIsOpen(isOpen => !isOpen)),
|
|
145
|
+
show: React.useCallback(() => setIsOpen(_ => true), []),
|
|
146
|
+
hide: React.useCallback(() => setIsOpen(_ => false), []),
|
|
147
|
+
toggle: React.useCallback(() => setIsOpen(isOpen => !isOpen), []),
|
|
149
148
|
}
|
|
150
149
|
}
|
|
151
150
|
|
|
@@ -162,7 +161,7 @@ type clipboard = {
|
|
|
162
161
|
|
|
163
162
|
let useClipboard = (~onCopyNotificationMessage: option<string>=?, value: string) => {
|
|
164
163
|
let (hasCopied, setHasCopied) = React.useState(() => false)
|
|
165
|
-
let onCopy = React.
|
|
164
|
+
let onCopy = React.useCallback(() => {
|
|
166
165
|
onCopyNotificationMessage->Option.forEach(message =>
|
|
167
166
|
Toolkit__Ui_Snackbar.show(~title=message, ~variant=#success, ())->ignore
|
|
168
167
|
)
|
|
@@ -171,7 +170,7 @@ let useClipboard = (~onCopyNotificationMessage: option<string>=?, value: string)
|
|
|
171
170
|
setHasCopied(_ => didCopy)
|
|
172
171
|
}, [value])
|
|
173
172
|
|
|
174
|
-
React.
|
|
173
|
+
React.useEffect(() =>
|
|
175
174
|
hasCopied
|
|
176
175
|
? {
|
|
177
176
|
let id = Js.Global.setTimeout(() => setHasCopied(_ => false), 1500)
|
|
@@ -198,9 +197,9 @@ let useRequest = (~debounce=true, fn, deps) => {
|
|
|
198
197
|
let lastCallId = React.useRef(0)
|
|
199
198
|
let canceled = React.useRef(false)
|
|
200
199
|
let (state, set) = React.useState(() => NotAsked)
|
|
201
|
-
let isMounted =
|
|
200
|
+
let isMounted = ReactUse.useMountedState(.)
|
|
202
201
|
|
|
203
|
-
let trigger = React.
|
|
202
|
+
let trigger = React.useCallback(args => {
|
|
204
203
|
lastCallId.current = lastCallId.current->SafeIncrement.increment
|
|
205
204
|
let callId = lastCallId.current
|
|
206
205
|
|
|
@@ -211,7 +210,7 @@ let useRequest = (~debounce=true, fn, deps) => {
|
|
|
211
210
|
fn(args)->Promise.map(result => {
|
|
212
211
|
let isCanceled = (debounce ? callId !== lastCallId.current : false) || canceled.current
|
|
213
212
|
|
|
214
|
-
if isMounted(
|
|
213
|
+
if isMounted() && !isCanceled {
|
|
215
214
|
set(_ => Done(result))
|
|
216
215
|
}
|
|
217
216
|
|
|
@@ -219,7 +218,7 @@ let useRequest = (~debounce=true, fn, deps) => {
|
|
|
219
218
|
})
|
|
220
219
|
}, deps)
|
|
221
220
|
|
|
222
|
-
let cancel = React.
|
|
221
|
+
let cancel = React.useCallback(() => canceled.current = true, [])
|
|
223
222
|
|
|
224
223
|
(state, trigger, cancel)
|
|
225
224
|
}
|
|
@@ -242,14 +241,14 @@ type mediaQuery = {
|
|
|
242
241
|
}
|
|
243
242
|
|
|
244
243
|
let useMediaQuery = () => {
|
|
245
|
-
let isXs = React.
|
|
246
|
-
let isSm = React.
|
|
247
|
-
let isLg = React.
|
|
244
|
+
let isXs = React.useMemo(() => matchMedia("(max-width: 639px)").matches, [])
|
|
245
|
+
let isSm = React.useMemo(() => matchMedia("(min-width: 640px)").matches, [])
|
|
246
|
+
let isLg = React.useMemo(() => matchMedia("(min-width: 1024px)").matches, [])
|
|
248
247
|
{isXs, isSm, isLg}
|
|
249
248
|
}
|
|
250
249
|
|
|
251
250
|
let useOnClickOutside = (ref: React.ref<Js.Nullable.t<Dom.element>>, handler) => {
|
|
252
|
-
React.
|
|
251
|
+
React.useEffect(() => {
|
|
253
252
|
let listener = event => {
|
|
254
253
|
switch ref.current->Js.Nullable.toOption {
|
|
255
254
|
| None => ()
|
|
@@ -288,7 +287,7 @@ let useIsVisibleOnViewport = (~options: option<ReactUse.intersectionOptions<'a>>
|
|
|
288
287
|
}),
|
|
289
288
|
)
|
|
290
289
|
|
|
291
|
-
React.
|
|
290
|
+
React.useEffect(() => {
|
|
292
291
|
intersection
|
|
293
292
|
->Js.Nullable.toOption
|
|
294
293
|
->Option.forEach(intersection => {
|
|
@@ -309,16 +308,14 @@ let useQueryParams = (~decoder, ~defaultParams) => {
|
|
|
309
308
|
location->search
|
|
310
309
|
}
|
|
311
310
|
|
|
312
|
-
React.
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
[queryString],
|
|
321
|
-
)
|
|
311
|
+
React.useMemo(() =>
|
|
312
|
+
queryString
|
|
313
|
+
->Js.String2.sliceToEnd(~from=1)
|
|
314
|
+
->Qs.parse
|
|
315
|
+
->Obj.magic
|
|
316
|
+
->decoder
|
|
317
|
+
->Result.getWithDefault(defaultParams)
|
|
318
|
+
, [queryString])
|
|
322
319
|
}
|
|
323
320
|
|
|
324
321
|
type localstorageStateOptions<'state> = {defaultValue?: 'state, storageSync?: bool}
|
|
@@ -329,31 +326,15 @@ external useLocalStorageState: (
|
|
|
329
326
|
localstorageStateOptions<'state>,
|
|
330
327
|
) => ('state, ('state => 'state) => unit) = "default"
|
|
331
328
|
|
|
332
|
-
// ----------------------
|
|
333
|
-
// useIsMounted
|
|
334
|
-
// ----------------------
|
|
335
|
-
|
|
336
|
-
let useIsMounted = () => {
|
|
337
|
-
let mountedRef = React.useRef(false)
|
|
338
|
-
let get = React.useCallback0(() => mountedRef.current)
|
|
339
|
-
|
|
340
|
-
React.useEffect(() => {
|
|
341
|
-
mountedRef.current = true
|
|
342
|
-
Some(() => mountedRef.current = false)
|
|
343
|
-
})
|
|
344
|
-
|
|
345
|
-
get
|
|
346
|
-
}
|
|
347
|
-
|
|
348
329
|
external promiseErrorToJsObj: Js.Promise.error => Js.Exn.t = "%identity"
|
|
349
330
|
|
|
350
331
|
let usePromise = (~debounce=true, fn, deps) => {
|
|
351
332
|
let lastCallId = React.useRef(0)
|
|
352
333
|
let canceled = React.useRef(false)
|
|
353
334
|
let (state, set) = React.useState(() => NotAsked)
|
|
354
|
-
let isMounted =
|
|
335
|
+
let isMounted = ReactUse.useMountedState()
|
|
355
336
|
|
|
356
|
-
let trigger = React.
|
|
337
|
+
let trigger = React.useCallback(args => {
|
|
357
338
|
lastCallId.current = lastCallId.current->SafeIncrement.increment
|
|
358
339
|
|
|
359
340
|
let callId = lastCallId.current
|
|
@@ -372,7 +353,7 @@ let usePromise = (~debounce=true, fn, deps) => {
|
|
|
372
353
|
})
|
|
373
354
|
}, deps)
|
|
374
355
|
|
|
375
|
-
let cancel = React.
|
|
356
|
+
let cancel = React.useCallback(() => canceled.current = true, [])
|
|
376
357
|
|
|
377
358
|
(state, trigger, cancel)
|
|
378
359
|
}
|
|
@@ -386,9 +367,9 @@ let usePromiseV2 = (~debounce=true, fn, deps) => {
|
|
|
386
367
|
let lastCallId = React.useRef(0)
|
|
387
368
|
let canceled = React.useRef(false)
|
|
388
369
|
let (state, set) = React.useState(() => NotAsked)
|
|
389
|
-
let isMounted =
|
|
370
|
+
let isMounted = ReactUse.useMountedState()
|
|
390
371
|
|
|
391
|
-
let trigger = React.
|
|
372
|
+
let trigger = React.useCallback(() => {
|
|
392
373
|
lastCallId.current = lastCallId.current->SafeIncrement.increment
|
|
393
374
|
|
|
394
375
|
fn()
|
|
@@ -411,12 +392,12 @@ let usePromiseV2 = (~debounce=true, fn, deps) => {
|
|
|
411
392
|
->ignore
|
|
412
393
|
}, deps)
|
|
413
394
|
|
|
414
|
-
let cancel = React.
|
|
395
|
+
let cancel = React.useCallback(() => {
|
|
415
396
|
canceled.current = true
|
|
416
397
|
()
|
|
417
|
-
})
|
|
398
|
+
}, [])
|
|
418
399
|
|
|
419
|
-
React.
|
|
400
|
+
React.useEffect(() => {
|
|
420
401
|
trigger()
|
|
421
402
|
None
|
|
422
403
|
}, deps)
|
|
@@ -433,9 +414,9 @@ let usePromiseV3 = (~debounce=true, fn, deps) => {
|
|
|
433
414
|
let lastCallId = React.useRef(0)
|
|
434
415
|
let canceled = React.useRef(false)
|
|
435
416
|
let (state, set) = React.useState(() => NotAsked)
|
|
436
|
-
let isMounted =
|
|
417
|
+
let isMounted = ReactUse.useMountedState()
|
|
437
418
|
|
|
438
|
-
let trigger = React.
|
|
419
|
+
let trigger = React.useCallback(() => {
|
|
439
420
|
lastCallId.current = lastCallId.current->SafeIncrement.increment
|
|
440
421
|
|
|
441
422
|
fn()
|
|
@@ -458,12 +439,12 @@ let usePromiseV3 = (~debounce=true, fn, deps) => {
|
|
|
458
439
|
->ignore
|
|
459
440
|
}, deps)
|
|
460
441
|
|
|
461
|
-
let cancel = React.
|
|
442
|
+
let cancel = React.useCallback(() => {
|
|
462
443
|
canceled.current = true
|
|
463
444
|
()
|
|
464
|
-
})
|
|
445
|
+
}, [])
|
|
465
446
|
|
|
466
|
-
React.
|
|
447
|
+
React.useEffect(() => {
|
|
467
448
|
trigger()
|
|
468
449
|
None
|
|
469
450
|
}, deps)
|