@colisweb/rescript-toolkit 4.29.3 → 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.
Files changed (49) hide show
  1. package/package.json +25 -23
  2. package/{bsconfig.json → rescript.json} +10 -5
  3. package/src/decoders/Decoders__UnitMeasure.res +251 -0
  4. package/src/decoders/Toolkit__Decoders.res +118 -412
  5. package/src/decoders/index.md +5 -5
  6. package/src/form/Reform.res +18 -18
  7. package/src/form/Toolkit__Form.res +53 -50
  8. package/src/hooks/Toolkit__Hooks.res +40 -42
  9. package/src/hooks/index.md +2 -2
  10. package/src/identifier/Toolkit__Identifier.res +27 -70
  11. package/src/identifier/index.md +3 -3
  12. package/src/intl/Toolkit__Intl.res +1 -1
  13. package/src/mock/MockOverlay.res +1 -1
  14. package/src/request/index.md +11 -11
  15. package/src/router/Toolkit__Router.res +11 -11
  16. package/src/ui/Toolkit__Ui_Autocomplete.res +2 -2
  17. package/src/ui/Toolkit__Ui_Button.res +1 -1
  18. package/src/ui/Toolkit__Ui_ButtonGroup2.res +1 -1
  19. package/src/ui/Toolkit__Ui_Checkbox.res +1 -1
  20. package/src/ui/Toolkit__Ui_Coordinates.res +4 -4
  21. package/src/ui/Toolkit__Ui_DatetimeInput.res +3 -4
  22. package/src/ui/Toolkit__Ui_Dropdown.res +1 -1
  23. package/src/ui/Toolkit__Ui_DropdownList.res +1 -1
  24. package/src/ui/Toolkit__Ui_IconButton.res +5 -5
  25. package/src/ui/Toolkit__Ui_Layout.res +6 -6
  26. package/src/ui/Toolkit__Ui_Listbox.res +17 -21
  27. package/src/ui/Toolkit__Ui_MultiSelect.res +1 -1
  28. package/src/ui/Toolkit__Ui_MultiSelectWithValidation.res +1 -1
  29. package/src/ui/Toolkit__Ui_Notice.res +37 -26
  30. package/src/ui/Toolkit__Ui_Portal.res +1 -1
  31. package/src/ui/Toolkit__Ui_PortalDropdown.res +8 -6
  32. package/src/ui/Toolkit__Ui_RadioGroup.res +1 -1
  33. package/src/ui/Toolkit__Ui_SearchListbox.res +4 -5
  34. package/src/ui/Toolkit__Ui_SelectWithValidation.res +1 -1
  35. package/src/ui/Toolkit__Ui_Snackbar.res +2 -2
  36. package/src/ui/Toolkit__Ui_Switch.res +1 -1
  37. package/src/ui/Toolkit__Ui_TextInput.res +3 -4
  38. package/src/ui/Toolkit__Ui_TextareaInput.res +2 -23
  39. package/src/ui/Toolkit__Ui_Tooltip.res +1 -1
  40. package/src/ui/Toolkit__Ui_WeekDateFilter.res +1 -1
  41. package/src/unleash/Toolkit__Unleash.res +6 -6
  42. package/src/unleash/index.md +1 -1
  43. package/src/utils/Toolkit__Utils.res +20 -0
  44. package/src/utils/Toolkit__Utils_UnitMeasure.res +72 -110
  45. package/src/vendors/Axios.res +2 -2
  46. package/src/vendors/DatadogRum.res +3 -3
  47. package/src/vendors/ReactDayPicker.res +4 -4
  48. package/src/vendors/ReactUse.res +1 -1
  49. package/src/vendors/Zendesk.res +1 -1
@@ -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
- state.fieldsState
374
- ->Belt.List.fromArray
375
- ->Belt.List.getBy(((nameField, _nameFieldState)) =>
376
- switch nameField == field {
377
- | true => true
378
- | _ => false
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
- getFieldState(field) |> (
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
- <Toolkit__Ui_RadioGroup
31
- defaultValue=value onChange={v => handleChange(v)} elements ?inline
32
- />
33
- <ErrorMessage ?error />
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
- <Toolkit__Ui_Checkbox
368
- ?className
369
- checked={value->Obj.magic}
370
- value={value->Obj.magic}
371
- ?name
372
- ?disabled
373
- onChange={(checked, _value) => handleChange(checked)}>
374
- label
375
- </Toolkit__Ui_Checkbox>
376
- <ErrorMessage ?error />
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
- <Toolkit__Ui_Switch
627
- ?label
628
- onChange={value => handleChange(value)}
629
- name=id
630
- checked=value
631
- ?size
632
- ?displayTitle
633
- ?switchClassName
634
- className=?{labelClassName}
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.useEffect1(() =>
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.useCallback1(() => setState(SafeIncrement.increment), [])
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.useMemo1(() => (
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.useEffect(() => {
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(.))->Promise.Js.toResult)
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(.)->Promise.Js.fromBsPromise->Promise.Js.toResult)
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.useCallback1(() => {
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.useEffect1(() =>
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.useCallback1(args => {
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(.) && !isCanceled {
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.useCallback0(() => canceled.current = true)
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.useMemo0(() => matchMedia("(max-width: 639px)").matches)
246
- let isSm = React.useMemo0(() => matchMedia("(min-width: 640px)").matches)
247
- let isLg = React.useMemo0(() => matchMedia("(min-width: 1024px)").matches)
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.useEffect2(() => {
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.useEffect1(() => {
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.useMemo1(
313
- () =>
314
- queryString
315
- ->Js.String2.sliceToEnd(~from=1)
316
- ->Qs.parse
317
- ->Obj.magic
318
- ->decoder
319
- ->Result.getWithDefault(defaultParams),
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.useCallback0(() => mountedRef.current)
336
+ let get = React.useCallback(() => mountedRef.current, [])
339
337
 
340
- React.useEffect(() => {
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.useCallback1(args => {
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.useCallback0(() => canceled.current = true)
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.useCallback1(() => {
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.useCallback0(() => {
412
+ let cancel = React.useCallback(() => {
415
413
  canceled.current = true
416
414
  ()
417
- })
415
+ }, [])
418
416
 
419
- React.useEffect1(() => {
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.useCallback1(() => {
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.useCallback0(() => {
459
+ let cancel = React.useCallback(() => {
462
460
  canceled.current = true
463
461
  ()
464
- })
462
+ }, [])
465
463
 
466
- React.useEffect1(() => {
464
+ React.useEffect(() => {
467
465
  trigger()
468
466
  None
469
467
  }, deps)
@@ -26,9 +26,9 @@ module API = {
26
26
  module Config = {
27
27
  type argument = unit;
28
28
 
29
- [@decco]
29
+ [@spice]
30
30
  type response = array(user)
31
- [@decco]
31
+ [@spice]
32
32
  and user = {
33
33
  name: string
34
34
  };