@colisweb/rescript-toolkit 4.29.2 → 5.0.0
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 +40 -42
- 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/Browser.resi +1 -0
- 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 {
|
|
@@ -34,7 +34,7 @@ let useDebounce4 = ReactUse.useDebounce4
|
|
|
34
34
|
let useUpdate = () => {
|
|
35
35
|
let (_, setState) = React.useState(_ => 0)
|
|
36
36
|
|
|
37
|
-
React.
|
|
37
|
+
React.useCallback(() => setState(SafeIncrement.increment), [])
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
let useDebounceValue = (~debounceDuration=200, value) => {
|
|
@@ -51,7 +51,7 @@ let useGetSet = initialStateGetter => {
|
|
|
51
51
|
let state = React.useRef(initialStateGetter())
|
|
52
52
|
let update = useUpdate()
|
|
53
53
|
|
|
54
|
-
React.
|
|
54
|
+
React.useMemo(() => (
|
|
55
55
|
// get
|
|
56
56
|
() => state.current,
|
|
57
57
|
// set
|
|
@@ -65,7 +65,7 @@ let usePrevious = ReactUse.usePrevious
|
|
|
65
65
|
let useInitialPrevious = value => {
|
|
66
66
|
let previousRef = React.useRef(value)
|
|
67
67
|
|
|
68
|
-
React.
|
|
68
|
+
React.useEffectOnEveryRender(() => {
|
|
69
69
|
previousRef.current = value
|
|
70
70
|
None
|
|
71
71
|
})
|
|
@@ -106,7 +106,7 @@ let useFetcher = (~options: option<Swr.fetcherOptions>=?, key: 'key, fn: 'fn): f
|
|
|
106
106
|
),
|
|
107
107
|
)
|
|
108
108
|
|
|
109
|
-
(data->Obj.magic, isValidating, () => Promise.Js.fromBsPromise(mutate(
|
|
109
|
+
(data->Obj.magic, isValidating, () => Promise.Js.fromBsPromise(mutate())->Promise.Js.toResult)
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
let useOptionalFetcher = (~options: option<Swr.fetcherOptions>=?, key: 'key, fn: 'fn): fetcher<
|
|
@@ -124,7 +124,7 @@ let useOptionalFetcher = (~options: option<Swr.fetcherOptions>=?, key: 'key, fn:
|
|
|
124
124
|
),
|
|
125
125
|
)
|
|
126
126
|
|
|
127
|
-
(data->Obj.magic, isValidating, () => mutate(
|
|
127
|
+
(data->Obj.magic, isValidating, () => mutate()->Promise.Js.fromBsPromise->Promise.Js.toResult)
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
// ----------------------
|
|
@@ -143,9 +143,9 @@ let useDisclosure = (~defaultIsOpen=?, ()) => {
|
|
|
143
143
|
|
|
144
144
|
{
|
|
145
145
|
isOpen,
|
|
146
|
-
show: React.useCallback(() => setIsOpen(_ => true)),
|
|
147
|
-
hide: React.useCallback(() => setIsOpen(_ => false)),
|
|
148
|
-
toggle: React.useCallback(() => setIsOpen(isOpen => !isOpen)),
|
|
146
|
+
show: React.useCallback(() => setIsOpen(_ => true), []),
|
|
147
|
+
hide: React.useCallback(() => setIsOpen(_ => false), []),
|
|
148
|
+
toggle: React.useCallback(() => setIsOpen(isOpen => !isOpen), []),
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
|
|
@@ -162,7 +162,7 @@ type clipboard = {
|
|
|
162
162
|
|
|
163
163
|
let useClipboard = (~onCopyNotificationMessage: option<string>=?, value: string) => {
|
|
164
164
|
let (hasCopied, setHasCopied) = React.useState(() => false)
|
|
165
|
-
let onCopy = React.
|
|
165
|
+
let onCopy = React.useCallback(() => {
|
|
166
166
|
onCopyNotificationMessage->Option.forEach(message =>
|
|
167
167
|
Toolkit__Ui_Snackbar.show(~title=message, ~variant=#success, ())->ignore
|
|
168
168
|
)
|
|
@@ -171,7 +171,7 @@ let useClipboard = (~onCopyNotificationMessage: option<string>=?, value: string)
|
|
|
171
171
|
setHasCopied(_ => didCopy)
|
|
172
172
|
}, [value])
|
|
173
173
|
|
|
174
|
-
React.
|
|
174
|
+
React.useEffect(() =>
|
|
175
175
|
hasCopied
|
|
176
176
|
? {
|
|
177
177
|
let id = Js.Global.setTimeout(() => setHasCopied(_ => false), 1500)
|
|
@@ -198,9 +198,9 @@ let useRequest = (~debounce=true, fn, deps) => {
|
|
|
198
198
|
let lastCallId = React.useRef(0)
|
|
199
199
|
let canceled = React.useRef(false)
|
|
200
200
|
let (state, set) = React.useState(() => NotAsked)
|
|
201
|
-
let isMounted = useIsMounted(
|
|
201
|
+
let isMounted = useIsMounted()
|
|
202
202
|
|
|
203
|
-
let trigger = React.
|
|
203
|
+
let trigger = React.useCallback(args => {
|
|
204
204
|
lastCallId.current = lastCallId.current->SafeIncrement.increment
|
|
205
205
|
let callId = lastCallId.current
|
|
206
206
|
|
|
@@ -211,7 +211,7 @@ let useRequest = (~debounce=true, fn, deps) => {
|
|
|
211
211
|
fn(args)->Promise.map(result => {
|
|
212
212
|
let isCanceled = (debounce ? callId !== lastCallId.current : false) || canceled.current
|
|
213
213
|
|
|
214
|
-
if isMounted(
|
|
214
|
+
if isMounted() && !isCanceled {
|
|
215
215
|
set(_ => Done(result))
|
|
216
216
|
}
|
|
217
217
|
|
|
@@ -219,7 +219,7 @@ let useRequest = (~debounce=true, fn, deps) => {
|
|
|
219
219
|
})
|
|
220
220
|
}, deps)
|
|
221
221
|
|
|
222
|
-
let cancel = React.
|
|
222
|
+
let cancel = React.useCallback(() => canceled.current = true, [])
|
|
223
223
|
|
|
224
224
|
(state, trigger, cancel)
|
|
225
225
|
}
|
|
@@ -242,14 +242,14 @@ type mediaQuery = {
|
|
|
242
242
|
}
|
|
243
243
|
|
|
244
244
|
let useMediaQuery = () => {
|
|
245
|
-
let isXs = React.
|
|
246
|
-
let isSm = React.
|
|
247
|
-
let isLg = React.
|
|
245
|
+
let isXs = React.useMemo(() => matchMedia("(max-width: 639px)").matches, [])
|
|
246
|
+
let isSm = React.useMemo(() => matchMedia("(min-width: 640px)").matches, [])
|
|
247
|
+
let isLg = React.useMemo(() => matchMedia("(min-width: 1024px)").matches, [])
|
|
248
248
|
{isXs, isSm, isLg}
|
|
249
249
|
}
|
|
250
250
|
|
|
251
251
|
let useOnClickOutside = (ref: React.ref<Js.Nullable.t<Dom.element>>, handler) => {
|
|
252
|
-
React.
|
|
252
|
+
React.useEffect(() => {
|
|
253
253
|
let listener = event => {
|
|
254
254
|
switch ref.current->Js.Nullable.toOption {
|
|
255
255
|
| None => ()
|
|
@@ -288,7 +288,7 @@ let useIsVisibleOnViewport = (~options: option<ReactUse.intersectionOptions<'a>>
|
|
|
288
288
|
}),
|
|
289
289
|
)
|
|
290
290
|
|
|
291
|
-
React.
|
|
291
|
+
React.useEffect(() => {
|
|
292
292
|
intersection
|
|
293
293
|
->Js.Nullable.toOption
|
|
294
294
|
->Option.forEach(intersection => {
|
|
@@ -309,16 +309,14 @@ let useQueryParams = (~decoder, ~defaultParams) => {
|
|
|
309
309
|
location->search
|
|
310
310
|
}
|
|
311
311
|
|
|
312
|
-
React.
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
[queryString],
|
|
321
|
-
)
|
|
312
|
+
React.useMemo(() =>
|
|
313
|
+
queryString
|
|
314
|
+
->Js.String2.sliceToEnd(~from=1)
|
|
315
|
+
->Qs.parse
|
|
316
|
+
->Obj.magic
|
|
317
|
+
->decoder
|
|
318
|
+
->Result.getWithDefault(defaultParams)
|
|
319
|
+
, [queryString])
|
|
322
320
|
}
|
|
323
321
|
|
|
324
322
|
type localstorageStateOptions<'state> = {defaultValue?: 'state, storageSync?: bool}
|
|
@@ -335,9 +333,9 @@ external useLocalStorageState: (
|
|
|
335
333
|
|
|
336
334
|
let useIsMounted = () => {
|
|
337
335
|
let mountedRef = React.useRef(false)
|
|
338
|
-
let get = React.
|
|
336
|
+
let get = React.useCallback(() => mountedRef.current, [])
|
|
339
337
|
|
|
340
|
-
React.
|
|
338
|
+
React.useEffectOnEveryRender(() => {
|
|
341
339
|
mountedRef.current = true
|
|
342
340
|
Some(() => mountedRef.current = false)
|
|
343
341
|
})
|
|
@@ -353,7 +351,7 @@ let usePromise = (~debounce=true, fn, deps) => {
|
|
|
353
351
|
let (state, set) = React.useState(() => NotAsked)
|
|
354
352
|
let isMounted = useIsMounted()
|
|
355
353
|
|
|
356
|
-
let trigger = React.
|
|
354
|
+
let trigger = React.useCallback(args => {
|
|
357
355
|
lastCallId.current = lastCallId.current->SafeIncrement.increment
|
|
358
356
|
|
|
359
357
|
let callId = lastCallId.current
|
|
@@ -372,7 +370,7 @@ let usePromise = (~debounce=true, fn, deps) => {
|
|
|
372
370
|
})
|
|
373
371
|
}, deps)
|
|
374
372
|
|
|
375
|
-
let cancel = React.
|
|
373
|
+
let cancel = React.useCallback(() => canceled.current = true, [])
|
|
376
374
|
|
|
377
375
|
(state, trigger, cancel)
|
|
378
376
|
}
|
|
@@ -388,7 +386,7 @@ let usePromiseV2 = (~debounce=true, fn, deps) => {
|
|
|
388
386
|
let (state, set) = React.useState(() => NotAsked)
|
|
389
387
|
let isMounted = useIsMounted()
|
|
390
388
|
|
|
391
|
-
let trigger = React.
|
|
389
|
+
let trigger = React.useCallback(() => {
|
|
392
390
|
lastCallId.current = lastCallId.current->SafeIncrement.increment
|
|
393
391
|
|
|
394
392
|
fn()
|
|
@@ -411,12 +409,12 @@ let usePromiseV2 = (~debounce=true, fn, deps) => {
|
|
|
411
409
|
->ignore
|
|
412
410
|
}, deps)
|
|
413
411
|
|
|
414
|
-
let cancel = React.
|
|
412
|
+
let cancel = React.useCallback(() => {
|
|
415
413
|
canceled.current = true
|
|
416
414
|
()
|
|
417
|
-
})
|
|
415
|
+
}, [])
|
|
418
416
|
|
|
419
|
-
React.
|
|
417
|
+
React.useEffect(() => {
|
|
420
418
|
trigger()
|
|
421
419
|
None
|
|
422
420
|
}, deps)
|
|
@@ -435,7 +433,7 @@ let usePromiseV3 = (~debounce=true, fn, deps) => {
|
|
|
435
433
|
let (state, set) = React.useState(() => NotAsked)
|
|
436
434
|
let isMounted = useIsMounted()
|
|
437
435
|
|
|
438
|
-
let trigger = React.
|
|
436
|
+
let trigger = React.useCallback(() => {
|
|
439
437
|
lastCallId.current = lastCallId.current->SafeIncrement.increment
|
|
440
438
|
|
|
441
439
|
fn()
|
|
@@ -458,12 +456,12 @@ let usePromiseV3 = (~debounce=true, fn, deps) => {
|
|
|
458
456
|
->ignore
|
|
459
457
|
}, deps)
|
|
460
458
|
|
|
461
|
-
let cancel = React.
|
|
459
|
+
let cancel = React.useCallback(() => {
|
|
462
460
|
canceled.current = true
|
|
463
461
|
()
|
|
464
|
-
})
|
|
462
|
+
}, [])
|
|
465
463
|
|
|
466
|
-
React.
|
|
464
|
+
React.useEffect(() => {
|
|
467
465
|
trigger()
|
|
468
466
|
None
|
|
469
467
|
}, deps)
|