@colisweb/rescript-toolkit 2.8.0 → 2.8.4

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colisweb/rescript-toolkit",
3
- "version": "2.8.0",
3
+ "version": "2.8.4",
4
4
  "scripts": {
5
5
  "clean": "rescript clean",
6
6
  "build": "rescript build",
@@ -169,14 +169,18 @@ module UnitMeasure = {
169
169
  let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Dimension.t> = json =>
170
170
  switch Decco.stringFromJson(json) {
171
171
  | Belt.Result.Ok(v) =>
172
- let valueUnitArray = v |> Js.String.split(" ")
173
- switch valueUnitArray->Array.get(1) {
174
- | Some("mm") => #mm(valueUnitArray->Array.getExn(0)->Js.Float.fromString)->Ok
175
- | Some("cm") => #cm(valueUnitArray->Array.getExn(0)->Js.Float.fromString)->Ok
176
- | Some("dm") => #dm(valueUnitArray->Array.getExn(0)->Js.Float.fromString)->Ok
177
- | Some("km") => #km(valueUnitArray->Array.getExn(0)->Js.Float.fromString)->Ok
178
- | None => raise(Js.Exn.raiseError("unhandled no unit"))
179
- | _ => raise(Js.Exn.raiseError("unhandled weight unit"))
172
+ let valueUnitArray = v->Js.String2.split(" ")
173
+ switch (
174
+ valueUnitArray[0]->Belt.Option.flatMap(Belt.Float.fromString),
175
+ valueUnitArray[1],
176
+ ) {
177
+ | (Some(v), Some("mm")) => #mm(v)->Ok
178
+ | (Some(v), Some("cm")) => #cm(v)->Ok
179
+ | (Some(v), Some("dm")) => #dm(v)->Ok
180
+ | (Some(v), Some("km")) => #km(v)->Ok
181
+ | (None, _) => Decco.error("unhandled no value", json)
182
+ | (_, None) => Decco.error("unhandled no unit", json)
183
+ | (_, Some(_)) => Decco.error("unhandled dimension unit", json)
180
184
  }
181
185
  | Belt.Result.Error(_) as err => err
182
186
  }
@@ -233,12 +237,16 @@ module UnitMeasure = {
233
237
  let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Weight.t> = json =>
234
238
  switch Decco.stringFromJson(json) {
235
239
  | Ok(v) =>
236
- let valueUnitArray = v |> Js.String.split(" ")
237
- switch valueUnitArray->Array.get(1) {
238
- | Some("g") => #g(valueUnitArray->Array.getExn(0)->Js.Float.fromString)->Ok
239
- | Some("kg") => #kg(valueUnitArray->Array.getExn(0)->Js.Float.fromString)->Ok
240
- | None => raise(Js.Exn.raiseError("unhandled no unit"))
241
- | _ => raise(Js.Exn.raiseError("unhandled weight unit"))
240
+ let valueUnitArray = v->Js.String2.split(" ")
241
+ switch (
242
+ valueUnitArray[0]->Belt.Option.flatMap(Belt.Float.fromString),
243
+ valueUnitArray[1],
244
+ ) {
245
+ | (Some(v), Some("g")) => #g(v)->Ok
246
+ | (Some(v), Some("kg")) => #kg(v)->Ok
247
+ | (None, _) => Decco.error("unhandled no value", json)
248
+ | (_, None) => Decco.error("unhandled no unit", json)
249
+ | (_, Some(_)) => Decco.error("unhandled weight unit", json)
242
250
  }
243
251
 
244
252
  | Error(_) as err => err
@@ -282,6 +290,74 @@ module UnitMeasure = {
282
290
  let convert = Toolkit__Utils_UnitMeasure.Weight.makeKg
283
291
  })
284
292
  }
293
+
294
+ module Time = {
295
+ module WithUnit = {
296
+ let encoder: Decco.encoder<Toolkit__Utils_UnitMeasure.Time.t> = value =>
297
+ switch value {
298
+ | #min(v) => Js.Json.string(v->Js.Float.toString ++ " min")
299
+ | #h(v) => Js.Json.string(v->Js.Float.toString ++ " h")
300
+ }
301
+
302
+ let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Time.t> = json =>
303
+ switch Decco.stringFromJson(json) {
304
+ | Ok(v) =>
305
+ let valueUnitArray = v->Js.String2.split(" ")
306
+ switch (
307
+ valueUnitArray[0]->Belt.Option.flatMap(Belt.Float.fromString),
308
+ valueUnitArray[1],
309
+ ) {
310
+ | (Some(v), Some("min")) => #min(v)->Ok
311
+ | (Some(v), Some("h")) => #h(v)->Ok
312
+ | (None, _) => Decco.error("unhandled no value", json)
313
+ | (_, None) => Decco.error("unhandled no unit", json)
314
+ | (_, Some(_)) => Decco.error("unhandled time unit", json)
315
+ }
316
+
317
+ | Error(_) as err => err
318
+ }
319
+
320
+ let codec: Decco.codec<Toolkit__Utils_UnitMeasure.Time.t> = (encoder, decoder)
321
+
322
+ @decco
323
+ type t = @decco.codec(codec) Toolkit__Utils_UnitMeasure.Time.t
324
+ }
325
+
326
+ module type TimeConfig = {
327
+ let convert: float => Toolkit__Utils_UnitMeasure.Time.t
328
+ }
329
+
330
+ module Make = (C: TimeConfig) => {
331
+ type time = Toolkit__Utils_UnitMeasure.Time.t
332
+
333
+ let encoder: Decco.encoder<Toolkit__Utils_UnitMeasure.Time.t> = value =>
334
+ switch value {
335
+ | #min(v) => Js.Json.string(v->Js.Float.toString ++ " min")
336
+ | #h(v) => Js.Json.string(v->Js.Float.toString ++ " h")
337
+ }
338
+
339
+ let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Time.t> = json =>
340
+ switch Decco.floatFromJson(json) {
341
+ | Ok(v) => v->C.convert->Ok
342
+ | Error(_) as err => err
343
+ }
344
+
345
+ let codec: Decco.codec<time> = (encoder, decoder)
346
+
347
+ let toValue = Toolkit__Utils_UnitMeasure.Time.toValue
348
+ let display = Toolkit__Utils_UnitMeasure.Time.display
349
+
350
+ @decco
351
+ type t = @decco.codec(codec) Toolkit__Utils_UnitMeasure.Time.t
352
+ }
353
+
354
+ module Min = Make({
355
+ let convert = Toolkit__Utils_UnitMeasure.Time.makeMin
356
+ })
357
+ module H = Make({
358
+ let convert = Toolkit__Utils_UnitMeasure.Time.makeH
359
+ })
360
+ }
285
361
  }
286
362
 
287
363
  // StringArray
@@ -54,13 +54,18 @@ let toResult = (
54
54
  | Ok(response) =>
55
55
  switch response["data"]->mapData {
56
56
  | Ok(_) as ok => ok
57
- | Error(error) =>
58
- Error(
59
- #invalidResponseData(
60
- response->castToUndecodedResponse,
61
- "\"" ++ (error.path ++ ("\" " ++ error.message)),
62
- ),
63
- )
57
+ | Error(error) => {
58
+ %log.error(
59
+ "Decoder failure"
60
+ ("err", error)
61
+ )
62
+ Error(
63
+ #invalidResponseData(
64
+ response->castToUndecodedResponse,
65
+ "\"" ++ (error.path ++ ("\" " ++ error.message)),
66
+ ),
67
+ )
68
+ }
64
69
  }
65
70
  | Error(error) =>
66
71
  if (error->castToJs)["response"] {
@@ -11,8 +11,7 @@ module.exports = {
11
11
  },
12
12
  boxShadow: {
13
13
  sidenav: "inset 0 0 1px 2px rgba(0, 0, 0, 0.2)",
14
- sm:
15
- "0px 2px 1px -1px rgba(0,0,0,0.1), 0px 1px 1px 0px rgba(0,0,0,0.1), 0px 1px 3px 0px rgba(0,0,0,0.1)",
14
+ sm: "0px 2px 1px -1px rgba(0,0,0,0.1), 0px 1px 1px 0px rgba(0,0,0,0.1), 0px 1px 3px 0px rgba(0,0,0,0.1)",
16
15
  },
17
16
  borderColor: {
18
17
  currentColor: "currentColor",
@@ -142,7 +141,7 @@ module.exports = {
142
141
  purple: {
143
142
  50: "#F8F1FF",
144
143
  100: "#DDC8F0",
145
- 300: "#8787E0",
144
+ 300: "#B787E0",
146
145
  400: "#9151C9",
147
146
  500: "#6C1CB2",
148
147
  600: "#55158B",
@@ -14,10 +14,10 @@ let make = (~title, ~description=?, ~status, ~className=?) =>
14
14
  className->Option.getWithDefault(""),
15
15
  ])}>
16
16
  {switch status {
17
- | #success => <BsReactIcons.MdCheckCircle size=28 className="text-success-500" />
18
- | #error => <BsReactIcons.MdWarning size=28 className="text-danger-600" />
19
- | #warning => <BsReactIcons.MdWarning size=28 className="text-warning-500" />
20
- | #info => <BsReactIcons.MdInfoOutline size=28 className="text-info-500" />
17
+ | #success => <BsReactIcons.MdCheckCircle size=28 className="text-success-500 flex-shrink-0" />
18
+ | #error => <BsReactIcons.MdWarning size=28 className="text-danger-600 flex-shrink-0" />
19
+ | #warning => <BsReactIcons.MdWarning size=28 className="text-warning-500 flex-shrink-0" />
20
+ | #info => <BsReactIcons.MdInfoOutline size=28 className="text-info-500 flex-shrink-0" />
21
21
  }}
22
22
  <div className="mx-3">
23
23
  <div className={description->Option.isSome ? "font-bold" : ""}> title </div>
@@ -17,6 +17,57 @@ module Weight = {
17
17
  let makeKg = (value: float) => #kg(value)
18
18
  }
19
19
 
20
+ module Time = {
21
+ type t = [#min(float) | #h(float)]
22
+
23
+ let toValue = value =>
24
+ switch value {
25
+ | #min(v)
26
+ | #h(v) => v
27
+ }
28
+
29
+ type separator = [#units | #colon]
30
+ let display = (value, ~separator=#units, ()) => {
31
+ let _initialDate = Js.Date.make()
32
+ let duration = switch value {
33
+ | #min(v) =>
34
+ BsDateFns.intervalToDuration(
35
+ ~interval={
36
+ start: _initialDate,
37
+ end_: _initialDate->BsDateFns.addMinutes(v),
38
+ },
39
+ )
40
+ | #h(v) =>
41
+ BsDateFns.intervalToDuration(
42
+ ~interval={start: _initialDate, end_: _initialDate->BsDateFns.addHours(v)},
43
+ )
44
+ }
45
+
46
+ let mainSeparator = {
47
+ switch separator {
48
+ | #units => " h "
49
+ | #colon => ":"
50
+ }
51
+ }
52
+ let secondarySeparator = {
53
+ switch separator {
54
+ | #units => " min"
55
+ | #colon => ""
56
+ }
57
+ }
58
+
59
+ switch (duration.hours, duration.minutes) {
60
+ | (Some(h), Some(min)) =>
61
+ `${h->Int.toString}${mainSeparator}${min->Int.toString}${secondarySeparator}`
62
+ | (Some(h), _) => `${h->Int.toString} h`
63
+ | (_, Some(min)) => `${min->Int.toString} min`
64
+ | _ => ""
65
+ }
66
+ }
67
+ let makeMin = (value: float) => #min(value)
68
+ let makeH = (value: float) => #h(value)
69
+ }
70
+
20
71
  module Dimension = {
21
72
  type t = [
22
73
  | #mm(float)
@@ -60,6 +60,8 @@ external setSeconds: (Js.Date.t, float) => Js.Date.t = "setSeconds"
60
60
  @module("date-fns")
61
61
  external setMinutes: (Js.Date.t, float) => Js.Date.t = "setMinutes"
62
62
  @module("date-fns")
63
+ external addMinutes: (Js.Date.t, float) => Js.Date.t = "addMinutes"
64
+ @module("date-fns")
63
65
  external setHours: (Js.Date.t, float) => Js.Date.t = "setHours"
64
66
  @module("date-fns")
65
67
  external addHours: (Js.Date.t, float) => Js.Date.t = "addHours"