codeforlife 2.14.10 → 2.15.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 (84) hide show
  1. package/dist/{Countdown-B8t-gwPp.cjs → Countdown-BlWW6v4w.cjs} +2 -2
  2. package/dist/{Countdown-B8t-gwPp.cjs.map → Countdown-BlWW6v4w.cjs.map} +1 -1
  3. package/dist/{Countdown-B4alF-zt.js → Countdown-CawuOdYd.js} +2 -2
  4. package/dist/{Countdown-B4alF-zt.js.map → Countdown-CawuOdYd.js.map} +1 -1
  5. package/dist/{LinkButton-EQvTNtbi.js → LinkButton-BeFBbR7x.js} +2 -2
  6. package/dist/{LinkButton-EQvTNtbi.js.map → LinkButton-BeFBbR7x.js.map} +1 -1
  7. package/dist/{LinkButton-C_pRNvqs.cjs → LinkButton-CT5GnUkH.cjs} +2 -2
  8. package/dist/{LinkButton-C_pRNvqs.cjs.map → LinkButton-CT5GnUkH.cjs.map} +1 -1
  9. package/dist/{Navigate-CmvxpGu9.js → Navigate-DBH0qlzU.js} +2 -2
  10. package/dist/{Navigate-CmvxpGu9.js.map → Navigate-DBH0qlzU.js.map} +1 -1
  11. package/dist/{Navigate-N_lhvJqc.cjs → Navigate-w-jtzle_.cjs} +2 -2
  12. package/dist/{Navigate-N_lhvJqc.cjs.map → Navigate-w-jtzle_.cjs.map} +1 -1
  13. package/dist/api/endpoints/index.cjs.js +1 -1
  14. package/dist/api/endpoints/index.es.js +2 -2
  15. package/dist/api/index.cjs.js +1 -1
  16. package/dist/api/index.es.js +3 -3
  17. package/dist/api-CaEovEUU.cjs +2 -0
  18. package/dist/api-CaEovEUU.cjs.map +1 -0
  19. package/dist/{api-uh8UKwsU.js → api-r7TLkejc.js} +5 -5
  20. package/dist/api-r7TLkejc.js.map +1 -0
  21. package/dist/{auth-C3UdJFcP.js → auth-BXLedrZH.js} +3 -3
  22. package/dist/{auth-C3UdJFcP.js.map → auth-BXLedrZH.js.map} +1 -1
  23. package/dist/{auth--UJpsJx8.cjs → auth-DdbHSDCh.cjs} +2 -2
  24. package/dist/{auth--UJpsJx8.cjs.map → auth-DdbHSDCh.cjs.map} +1 -1
  25. package/dist/components/form/index.cjs.js +1 -1
  26. package/dist/components/form/index.es.js +1 -1
  27. package/dist/components/index.cjs.js +1 -1
  28. package/dist/components/index.es.js +7 -7
  29. package/dist/components/page/index.cjs.js +1 -1
  30. package/dist/components/page/index.es.js +1 -1
  31. package/dist/components/router/index.cjs.js +1 -1
  32. package/dist/components/router/index.es.js +2 -2
  33. package/dist/features/index.cjs.js +1 -1
  34. package/dist/features/index.es.js +4 -4
  35. package/dist/hooks/index.cjs.js +1 -1
  36. package/dist/hooks/index.es.js +1 -1
  37. package/dist/{index-BUG2k4XI.cjs → index-BepQQq9P.cjs} +2 -2
  38. package/dist/{index-BUG2k4XI.cjs.map → index-BepQQq9P.cjs.map} +1 -1
  39. package/dist/{index-Uk65JJpc.js → index-CTYVnDkQ.js} +28 -28
  40. package/dist/index-CTYVnDkQ.js.map +1 -0
  41. package/dist/index-CgShi-oQ.cjs +2 -0
  42. package/dist/index-CgShi-oQ.cjs.map +1 -0
  43. package/dist/{index-CYI_rUWI.js → index-DeEIS6R8.js} +3 -3
  44. package/dist/{index-CYI_rUWI.js.map → index-DeEIS6R8.js.map} +1 -1
  45. package/dist/object-C0ukOmY8.cjs +2 -0
  46. package/dist/object-C0ukOmY8.cjs.map +1 -0
  47. package/dist/object-CcXAH2vY.js +34 -0
  48. package/dist/object-CcXAH2vY.js.map +1 -0
  49. package/dist/schemas-B1L2Knka.cjs +2 -0
  50. package/dist/schemas-B1L2Knka.cjs.map +1 -0
  51. package/dist/schemas-BEK79Cdh.js +783 -0
  52. package/dist/schemas-BEK79Cdh.js.map +1 -0
  53. package/dist/src/api/models.d.ts +1 -1
  54. package/dist/src/utils/general.d.ts +0 -11
  55. package/dist/src/utils/location.d.ts +7 -0
  56. package/dist/src/utils/object.d.ts +11 -0
  57. package/dist/{urls-BG788CnL.js → urls-CQ1fgrB1.js} +2 -2
  58. package/dist/{urls-BG788CnL.js.map → urls-CQ1fgrB1.js.map} +1 -1
  59. package/dist/{urls-2gheISSO.cjs → urls-DJiVb_ID.cjs} +2 -2
  60. package/dist/{urls-2gheISSO.cjs.map → urls-DJiVb_ID.cjs.map} +1 -1
  61. package/dist/utils/api.cjs.js +1 -1
  62. package/dist/utils/api.es.js +2 -2
  63. package/dist/utils/form.cjs.js +1 -1
  64. package/dist/utils/form.cjs.js.map +1 -1
  65. package/dist/utils/form.es.js +16 -16
  66. package/dist/utils/form.es.js.map +1 -1
  67. package/dist/utils/general.cjs.js +1 -1
  68. package/dist/utils/general.cjs.js.map +1 -1
  69. package/dist/utils/general.es.js +31 -947
  70. package/dist/utils/general.es.js.map +1 -1
  71. package/dist/utils/router.cjs.js +1 -1
  72. package/dist/utils/router.es.js +1 -1
  73. package/package.json +2 -2
  74. package/dist/api-G8CV5bUa.cjs +0 -2
  75. package/dist/api-G8CV5bUa.cjs.map +0 -1
  76. package/dist/api-uh8UKwsU.js.map +0 -1
  77. package/dist/index-BhTYGZm3.cjs +0 -2
  78. package/dist/index-BhTYGZm3.cjs.map +0 -1
  79. package/dist/index-Uk65JJpc.js.map +0 -1
  80. package/dist/schemas-UIk-meAN.js +0 -162
  81. package/dist/schemas-UIk-meAN.js.map +0 -1
  82. package/dist/schemas-hIW9-H6-.cjs +0 -2
  83. package/dist/schemas-hIW9-H6-.cjs.map +0 -1
  84. /package/dist/src/utils/{general.test.d.ts → object.test.d.ts} +0 -0
@@ -1,21 +1,21 @@
1
1
  import { jsx as o, Fragment as j, jsxs as k } from "react/jsx-runtime";
2
- import { CircularProgress as H, Button as M, Autocomplete as K, TextField as N, FormControl as G, FormControlLabel as W, Checkbox as J, FormHelperText as U, InputAdornment as w, IconButton as Q } from "@mui/material";
2
+ import { CircularProgress as H, Button as $, Autocomplete as K, TextField as N, FormControl as G, FormControlLabel as W, Checkbox as J, FormHelperText as M, InputAdornment as w, IconButton as Q } from "@mui/material";
3
3
  import { useState as E, useEffect as B, forwardRef as X, Children as Z, useRef as ee } from "react";
4
- import { S as te } from "./api-uh8UKwsU.js";
4
+ import { S as te } from "./api-r7TLkejc.js";
5
5
  import { u as re } from "./api-Cs4Y-WeI.js";
6
6
  import { Field as T, Formik as oe, Form as ne } from "formik";
7
7
  import { string as I, number as ie, bool as se, date as le, array as ae } from "yup";
8
8
  import { schemaToFieldValidator as V, submitForm as ce } from "./utils/form.es.js";
9
- import { getNestedProperty as y, COUNTRY_ISO_CODE_MAPPING as ue, COUNTRY_ISO_CODES as de, getKeyPaths as he, UK_COUNTIES as pe } from "./utils/general.es.js";
10
- import { d as fe } from "./dayjs.min-Bgcc5o9W.js";
11
- import { LocalizationProvider as me, DatePicker as ge } from "@mui/x-date-pickers";
12
- import { AdapterDayjs as be } from "@mui/x-date-pickers/AdapterDayjs";
13
- import { EmailOutlined as ye, PersonOutlined as Fe, Visibility as Ce, VisibilityOff as Pe } from "@mui/icons-material";
9
+ import { a as y, g as ue } from "./object-CcXAH2vY.js";
10
+ import { d as de } from "./dayjs.min-Bgcc5o9W.js";
11
+ import { LocalizationProvider as he, DatePicker as pe } from "@mui/x-date-pickers";
12
+ import { AdapterDayjs as fe } from "@mui/x-date-pickers/AdapterDayjs";
13
+ import { EmailOutlined as me, PersonOutlined as ge, Visibility as be, VisibilityOff as ye } from "@mui/icons-material";
14
14
  import "@reduxjs/toolkit/query/react";
15
15
  import "@reduxjs/toolkit";
16
16
  import "./utils/cookies.es.js";
17
- import { u as Oe } from "./schemas-UIk-meAN.js";
18
- import "./urls-BG788CnL.js";
17
+ import { C as Fe, a as Ce, u as Pe, U as Oe } from "./schemas-BEK79Cdh.js";
18
+ import "./urls-CQ1fgrB1.js";
19
19
  const xe = ({
20
20
  useLazyListQuery: t,
21
21
  filterOptions: e,
@@ -31,8 +31,8 @@ const xe = ({
31
31
  l && (F[i] = l), a(F, !0).unwrap().then(({ data: O, offset: S, limit: x, count: v }) => {
32
32
  _(({ options: D }) => {
33
33
  const R = { ...D };
34
- return O.forEach(($) => {
35
- R[r($)] = $;
34
+ return O.forEach((U) => {
35
+ R[r(U)] = U;
36
36
  }), { options: R, hasMore: S + x < v };
37
37
  });
38
38
  }).catch((O) => {
@@ -67,7 +67,7 @@ const xe = ({
67
67
  ListboxComponent: X(({ children: F, ...O }, S) => {
68
68
  const x = Z.toArray(F);
69
69
  return u ? x.push(/* @__PURE__ */ o(H, {}, "is-loading")) : (c && x.push(/* @__PURE__ */ o(te, {}, "is-error")), g && x.push(
70
- /* @__PURE__ */ o(M, { onClick: b, children: "Load more" }, "load-more")
70
+ /* @__PURE__ */ o($, { onClick: b, children: "Load more" }, "load-more")
71
71
  )), /* @__PURE__ */ o(
72
72
  "ul",
73
73
  {
@@ -174,7 +174,7 @@ const xe = ({
174
174
  ...n
175
175
  }
176
176
  ),
177
- g && /* @__PURE__ */ o(U, { children: f })
177
+ g && /* @__PURE__ */ o(M, { children: f })
178
178
  ] });
179
179
  } });
180
180
  }, _e = ({
@@ -190,8 +190,8 @@ const xe = ({
190
190
  return /* @__PURE__ */ o(
191
191
  L,
192
192
  {
193
- options: de,
194
- getOptionLabel: (l) => ue[l],
193
+ options: Ce,
194
+ getOptionLabel: (l) => Fe[l],
195
195
  textFieldProps: { name: n, label: r, placeholder: i, ...s },
196
196
  ...e
197
197
  }
@@ -227,7 +227,7 @@ const xe = ({
227
227
  c.values,
228
228
  l
229
229
  );
230
- f = f ? fe(f) : null;
230
+ f = f ? de(f) : null;
231
231
  function C(g) {
232
232
  c.setFieldValue(
233
233
  t,
@@ -236,12 +236,12 @@ const xe = ({
236
236
  );
237
237
  }
238
238
  return /* @__PURE__ */ o(
239
- me,
239
+ he,
240
240
  {
241
- dateAdapter: be,
241
+ dateAdapter: fe,
242
242
  adapterLocale: "en-gb",
243
243
  children: /* @__PURE__ */ o(
244
- ge,
244
+ pe,
245
245
  {
246
246
  name: t,
247
247
  value: f,
@@ -350,7 +350,7 @@ const xe = ({
350
350
  label: e,
351
351
  placeholder: n,
352
352
  InputProps: {
353
- endAdornment: /* @__PURE__ */ o(w, { position: "end", children: /* @__PURE__ */ o(ye, {}) }),
353
+ endAdornment: /* @__PURE__ */ o(w, { position: "end", children: /* @__PURE__ */ o(me, {}) }),
354
354
  ...r
355
355
  },
356
356
  ...i
@@ -364,12 +364,12 @@ const xe = ({
364
364
  }) => /* @__PURE__ */ o(
365
365
  A,
366
366
  {
367
- schema: Oe.first_name,
367
+ schema: Pe.first_name,
368
368
  name: t,
369
369
  label: e,
370
370
  placeholder: n,
371
371
  InputProps: {
372
- endAdornment: /* @__PURE__ */ o(w, { position: "end", children: /* @__PURE__ */ o(Fe, {}) }),
372
+ endAdornment: /* @__PURE__ */ o(w, { position: "end", children: /* @__PURE__ */ o(ge, {}) }),
373
373
  ...r
374
374
  },
375
375
  ...i
@@ -384,7 +384,7 @@ const xe = ({
384
384
  const n = ee(null);
385
385
  return B(() => {
386
386
  n.current && n.current.scrollIntoView(t);
387
- }, [t]), /* @__PURE__ */ o(U, { ref: n, error: !0, ...e });
387
+ }, [t]), /* @__PURE__ */ o(M, { ref: n, error: !0, ...e });
388
388
  }, Y = ({
389
389
  children: t,
390
390
  scrollIntoViewOptions: e = q,
@@ -394,7 +394,7 @@ const xe = ({
394
394
  }) => /* @__PURE__ */ o(oe, { ...i, children: (s) => {
395
395
  const l = !!Object.keys(s.errors).length, d = l && typeof s.errors.__all__ == "string";
396
396
  if (l && !d && s.isSubmitting && r.length) {
397
- const a = he(s.errors), u = r.find(({ name: c }) => a.includes(c))?.inputRef.current;
397
+ const a = ue(s.errors), u = r.find(({ name: c }) => a.includes(c))?.inputRef.current;
398
398
  u && u.scrollIntoView(e);
399
399
  }
400
400
  return /* @__PURE__ */ k(j, { children: [
@@ -512,7 +512,7 @@ const xe = ({
512
512
  u((p) => !p);
513
513
  },
514
514
  edge: "end",
515
- children: a ? /* @__PURE__ */ o(Ce, {}) : /* @__PURE__ */ o(Pe, {})
515
+ children: a ? /* @__PURE__ */ o(be, {}) : /* @__PURE__ */ o(ye, {})
516
516
  }
517
517
  ) });
518
518
  return /* @__PURE__ */ k(j, { children: [
@@ -552,7 +552,7 @@ const xe = ({
552
552
  return i;
553
553
  }
554
554
  return /* @__PURE__ */ o(T, { name: "submit", type: "submit", children: ({ form: r }) => /* @__PURE__ */ o(
555
- M,
555
+ $,
556
556
  {
557
557
  type: "button",
558
558
  onClick: () => {
@@ -578,7 +578,7 @@ const xe = ({
578
578
  return /* @__PURE__ */ o(
579
579
  L,
580
580
  {
581
- options: pe,
581
+ options: Oe,
582
582
  textFieldProps: { name: n, label: r, placeholder: i, ...s },
583
583
  ...e
584
584
  }
@@ -617,4 +617,4 @@ export {
617
617
  Ve as c,
618
618
  tt as i
619
619
  };
620
- //# sourceMappingURL=index-Uk65JJpc.js.map
620
+ //# sourceMappingURL=index-CTYVnDkQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CTYVnDkQ.js","sources":["../src/components/form/ApiAutocompleteField.tsx","../src/components/form/AutocompleteField.tsx","../src/components/form/CheckboxField.tsx","../src/components/form/CountryField.tsx","../src/components/form/DatePickerField.tsx","../src/components/form/TextField.tsx","../src/components/form/EmailField.tsx","../src/components/form/FirstNameField.tsx","../src/components/form/Form.tsx","../src/components/form/OtpField.tsx","../src/components/form/RepeatField.tsx","../src/components/form/PasswordField.tsx","../src/components/form/SubmitButton.tsx","../src/components/form/UkCountyField.tsx"],"sourcesContent":["import { Button, type ChipTypeMap, CircularProgress } from \"@mui/material\"\nimport {\n Children,\n type ElementType,\n type ForwardRefRenderFunction,\n type HTMLAttributes,\n type JSX,\n forwardRef,\n useEffect,\n useState,\n} from \"react\"\nimport type { TypedUseLazyQuery } from \"@reduxjs/toolkit/query/react\"\n\nimport {\n AutocompleteField,\n type AutocompleteFieldProps,\n} from \"../../components/form\"\nimport type { ListArg, ListResult, ModelId } from \"../../utils/api\"\nimport SyncError from \"../SyncError\"\nimport { usePagination } from \"../../hooks/api\"\n\nexport interface ApiAutocompleteFieldProps<\n SearchKey extends keyof Omit<QueryArg, \"limit\" | \"offset\">,\n // api type args\n QueryArg extends ListArg,\n ResultType extends ListResult<any>,\n // autocomplete type args\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n> extends Omit<\n AutocompleteFieldProps<\n ModelId,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >,\n | \"options\"\n | \"ListboxComponent\"\n | \"filterOptions\"\n | \"getOptionLabel\"\n | \"getOptionKey\"\n | \"onInputChange\"\n > {\n useLazyListQuery: TypedUseLazyQuery<ResultType, QueryArg, any>\n filterOptions?: Omit<QueryArg, \"limit\" | \"offset\" | SearchKey>\n getOptionLabel: (result: ResultType[\"data\"][number]) => string\n getOptionKey?: (result: ResultType[\"data\"][number]) => ModelId\n searchKey: SearchKey\n}\n\nconst ApiAutocompleteField = <\n SearchKey extends keyof Omit<QueryArg, \"limit\" | \"offset\">,\n // api type args\n QueryArg extends ListArg,\n ResultType extends ListResult<any>,\n // autocomplete type args\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n>({\n useLazyListQuery,\n filterOptions,\n getOptionLabel,\n getOptionKey = result => result.id as ModelId,\n searchKey,\n ...otherAutocompleteFieldProps\n}: ApiAutocompleteFieldProps<\n SearchKey,\n // api type args\n QueryArg,\n ResultType,\n // autocomplete type args\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n>): JSX.Element => {\n const [search, setSearch] = useState(\"\")\n const [trigger, { isLoading, isError }] = useLazyListQuery()\n const [{ limit, offset }, setPagination] = usePagination()\n const [{ options, hasMore }, setState] = useState<{\n options: Record<ModelId, ResultType[\"data\"][number]>\n hasMore: boolean\n }>({ options: {}, hasMore: true })\n\n // Call api\n useEffect(\n () => {\n const arg = { limit, offset, ...filterOptions } as QueryArg\n // @ts-expect-error search key can index arg\n if (search) arg[searchKey] = search\n\n trigger(arg, true)\n .unwrap()\n .then(({ data, offset, limit, count }) => {\n setState(({ options: previousOptions }) => {\n const options = { ...previousOptions }\n data.forEach(result => {\n options[getOptionKey(result)] = result\n })\n return { options, hasMore: offset + limit < count }\n })\n })\n .catch(error => {\n if (error) console.error(error)\n // TODO: gracefully handle error\n })\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n trigger,\n limit,\n offset,\n searchKey,\n search,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n ...Object.values(filterOptions || {}),\n ],\n )\n\n // Get options keys\n let optionKeys: ModelId[] = Object.keys(options)\n if (!optionKeys.length) return <></>\n if (typeof getOptionKey(Object.values(options)[0]) === \"number\") {\n optionKeys = optionKeys.map(Number)\n }\n\n function loadNextPage() {\n setPagination(({ page, limit }) => ({ page: page + 1, limit }))\n }\n\n const ListboxComponent: ForwardRefRenderFunction<\n unknown,\n HTMLAttributes<HTMLElement>\n > = ({ children, ...props }, ref) => {\n const listItems = Children.toArray(children)\n if (isLoading) listItems.push(<CircularProgress key=\"is-loading\" />)\n else {\n if (isError) listItems.push(<SyncError key=\"is-error\" />)\n if (hasMore) {\n listItems.push(\n <Button key=\"load-more\" onClick={loadNextPage}>\n Load more\n </Button>,\n )\n }\n }\n\n return (\n <ul\n {...props}\n // @ts-expect-error ref is assignable\n ref={ref}\n onScroll={event => {\n // If not already loading and scrolled to bottom\n if (\n !isLoading &&\n event.currentTarget.clientHeight + event.currentTarget.scrollTop >=\n event.currentTarget.scrollHeight\n ) {\n loadNextPage()\n }\n }}\n >\n {listItems}\n </ul>\n )\n }\n\n return (\n <AutocompleteField\n options={optionKeys}\n getOptionLabel={id => getOptionLabel(options[id])}\n onInputChange={(_, value, reason) => {\n setSearch(reason === \"input\" ? value : \"\")\n }}\n ListboxComponent={forwardRef(ListboxComponent)}\n {...otherAutocompleteFieldProps}\n />\n )\n}\n\nexport default ApiAutocompleteField\n","import {\n Autocomplete,\n type AutocompleteProps,\n type ChipTypeMap,\n TextField,\n type TextFieldProps,\n} from \"@mui/material\"\nimport { type ElementType, type JSX } from \"react\"\nimport { Field, type FieldConfig, type FieldProps } from \"formik\"\nimport {\n type ValidateOptions,\n number as YupNumber,\n string as YupString,\n} from \"yup\"\n\nimport { type FormValues, schemaToFieldValidator } from \"../../utils/form\"\nimport { getNestedProperty } from \"../../utils/object\"\n\nexport interface AutocompleteFieldProps<\n Value extends string | number,\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n> extends Omit<\n AutocompleteProps<\n Value,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >,\n \"renderInput\" | \"defaultValue\" | \"onChange\" | \"onBlur\" | \"value\"\n > {\n textFieldProps: Omit<\n TextFieldProps,\n | \"name\"\n | \"value\"\n | \"onChange\"\n | \"onBlur\"\n | \"error\"\n | \"helperText\"\n | \"defaultValue\"\n | \"type\"\n > & {\n name: string\n }\n validateOptions?: ValidateOptions\n}\n\nconst AutocompleteField = <\n Value extends string | number,\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n>({\n textFieldProps,\n options,\n validateOptions,\n ...otherAutocompleteProps\n}: AutocompleteFieldProps<\n Value,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n>): JSX.Element => {\n const { id, name, required, ...otherTextFieldProps } = textFieldProps\n\n const dotPath = name.split(\".\")\n\n const message = \"not a valid option\"\n let schema =\n typeof options[0] === \"string\"\n ? YupString().oneOf(options as readonly string[], message)\n : YupNumber().oneOf(options as readonly number[], message)\n if (required) schema = schema.required()\n\n const fieldConfig: FieldConfig = {\n name,\n type: typeof options[0] === \"string\" ? \"text\" : \"number\",\n validate: schemaToFieldValidator(schema, validateOptions),\n }\n\n return (\n <Field {...fieldConfig}>\n {({ form, meta }: FieldProps) => {\n const value = getNestedProperty(\n form.values as FormValues,\n dotPath,\n ) as string\n const touched = getNestedProperty(form.touched, dotPath) as boolean\n const error = getNestedProperty(form.errors, dotPath) as\n | string\n | undefined\n\n return (\n <Autocomplete\n options={options}\n // @ts-expect-error value can be assigned\n defaultValue={\n meta.initialValue === \"\"\n ? undefined\n : (meta.initialValue as string)\n }\n renderInput={({\n id: _, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...otherParams\n }) => (\n <TextField\n id={id ?? name}\n name={name}\n required={required}\n type=\"text\" // Force to be string to avoid number incrementor/decrementor\n value={value}\n error={touched && Boolean(error)}\n helperText={touched && error}\n {...otherTextFieldProps}\n {...otherParams}\n />\n )}\n onChange={(_, value) => {\n void form.setFieldValue(name, value ?? undefined, true)\n }}\n onBlur={form.handleBlur}\n {...otherAutocompleteProps}\n />\n )\n }}\n </Field>\n )\n}\n\nexport default AutocompleteField\n","import {\n Checkbox,\n type CheckboxProps,\n FormControl,\n FormControlLabel,\n type FormControlLabelProps,\n FormHelperText,\n} from \"@mui/material\"\nimport { Field, type FieldConfig, type FieldProps } from \"formik\"\nimport { type ValidateOptions, bool as YupBool } from \"yup\"\nimport { type FC } from \"react\"\n\nimport { type FormValues, schemaToFieldValidator } from \"../../utils/form\"\nimport { getNestedProperty } from \"../../utils/object\"\n\nexport interface CheckboxFieldProps\n extends Omit<\n CheckboxProps,\n \"defaultChecked\" | \"value\" | \"onChange\" | \"onBlur\"\n > {\n name: string\n formControlLabelProps: Omit<FormControlLabelProps, \"control\">\n errorMessage?: string\n validateOptions?: ValidateOptions\n}\n\nconst CheckboxField: FC<CheckboxFieldProps> = ({\n id,\n name,\n formControlLabelProps,\n required = false,\n errorMessage = \"this is a required field\",\n validateOptions,\n ...otherCheckboxProps\n}) => {\n const dotPath = name.split(\".\")\n\n let schema = YupBool()\n if (required) schema = schema.oneOf([true], errorMessage)\n\n const fieldConfig: FieldConfig = {\n name,\n type: \"checkbox\",\n validate: schemaToFieldValidator(schema, validateOptions),\n }\n\n return (\n <Field {...fieldConfig}>\n {({ form, meta }: FieldProps) => {\n const touched = getNestedProperty(form.touched, dotPath) as boolean\n const error = getNestedProperty(form.errors, dotPath) as\n | string\n | undefined\n const value = getNestedProperty(\n form.values as FormValues,\n dotPath,\n ) as boolean\n\n const hasError = touched && Boolean(error)\n\n // https://mui.com/material-ui/react-checkbox/#formgroup\n return (\n <FormControl error={hasError} required={required}>\n <FormControlLabel\n control={\n <Checkbox\n defaultChecked={meta.initialValue as boolean}\n id={id ?? name}\n name={name}\n value={value}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n {...otherCheckboxProps}\n />\n }\n {...formControlLabelProps}\n />\n {hasError && <FormHelperText>{error}</FormHelperText>}\n </FormControl>\n )\n }}\n </Field>\n )\n}\n\nexport default CheckboxField\n","import { type ElementType, type JSX } from \"react\"\nimport { type ChipTypeMap } from \"@mui/material\"\n\nimport AutocompleteField, {\n type AutocompleteFieldProps,\n} from \"./AutocompleteField\"\nimport {\n COUNTRY_ISO_CODES,\n COUNTRY_ISO_CODE_MAPPING,\n type CountryIsoCodes,\n} from \"../../utils/location\"\n\nexport interface CountryFieldProps<\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n> extends Omit<\n AutocompleteFieldProps<\n string,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >,\n \"options\" | \"textFieldProps\" | \"getOptionLabel\"\n > {\n textFieldProps?: Omit<\n AutocompleteFieldProps<\n string,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >[\"textFieldProps\"],\n \"name\"\n > & {\n name?: string\n }\n}\n\nconst CountryField = <\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n>({\n textFieldProps,\n ...otherAutocompleteFieldProps\n}: CountryFieldProps<\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n>): JSX.Element => {\n const {\n name = \"country\",\n label = \"Country\",\n placeholder = \"Select your country\",\n ...otherTextFieldProps\n } = textFieldProps || {}\n\n return (\n <AutocompleteField\n options={COUNTRY_ISO_CODES}\n getOptionLabel={isoCode =>\n COUNTRY_ISO_CODE_MAPPING[isoCode as CountryIsoCodes]\n }\n textFieldProps={{ name, label, placeholder, ...otherTextFieldProps }}\n {...otherAutocompleteFieldProps}\n />\n )\n}\n\nexport default CountryField\n","import \"dayjs/locale/en-gb\"\nimport {\n DatePicker,\n type DatePickerProps,\n LocalizationProvider,\n} from \"@mui/x-date-pickers\"\nimport { Field, type FieldConfig, type FieldProps } from \"formik\"\nimport { type ValidateOptions, date as YupDate } from \"yup\"\nimport dayjs, { type Dayjs } from \"dayjs\"\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\"\nimport { type JSX } from \"react\"\n\nimport { type FormValues, schemaToFieldValidator } from \"../../utils/form\"\nimport { getNestedProperty } from \"../../utils/object\"\n\nexport interface DatePickerFieldProps<\n TEnableAccessibleFieldDOMStructure extends boolean = true,\n> extends Omit<\n DatePickerProps<TEnableAccessibleFieldDOMStructure>,\n \"name\" | \"value\" | \"onChange\" | \"slotProps\"\n > {\n name: string\n required?: boolean\n validateOptions?: ValidateOptions\n}\n\nconst DatePickerField = <\n TEnableAccessibleFieldDOMStructure extends boolean = false,\n>({\n name,\n required,\n minDate,\n maxDate,\n validateOptions,\n ...otherDatePickerProps\n}: DatePickerFieldProps<TEnableAccessibleFieldDOMStructure>): JSX.Element => {\n const dotPath = name.split(\".\")\n\n function dateToString(date: Dayjs) {\n return date.locale(\"en-gb\").format(\"L\")\n }\n\n let schema = YupDate()\n if (required) schema = schema.required()\n if (minDate) {\n schema = schema.min(\n minDate,\n `this field must be after or equal to ${dateToString(minDate)}`,\n )\n }\n if (maxDate) {\n schema = schema.max(\n maxDate,\n `this field must be before or equal to ${dateToString(maxDate)}`,\n )\n }\n\n const fieldConfig: FieldConfig = {\n name,\n type: \"date\",\n validate: schemaToFieldValidator(schema, validateOptions),\n }\n\n return (\n <Field {...fieldConfig}>\n {({ form }: FieldProps) => {\n const error = getNestedProperty(form.errors, dotPath) as\n | string\n | undefined\n const touched = getNestedProperty(form.touched, dotPath) as boolean\n let value: Dayjs | null | string = getNestedProperty(\n form.values as FormValues,\n dotPath,\n ) as string\n\n value = value ? dayjs(value) : null\n\n function handleChange(value: Dayjs | null) {\n void form.setFieldValue(\n name,\n value && value.isValid() ? value.format(\"YYYY-MM-DD\") : null,\n true,\n )\n }\n\n return (\n <LocalizationProvider\n dateAdapter={AdapterDayjs}\n adapterLocale=\"en-gb\"\n >\n <DatePicker\n name={name}\n value={value}\n minDate={minDate}\n maxDate={maxDate}\n onChange={handleChange}\n slotProps={{\n textField: {\n id: name,\n // @ts-expect-error value is compatible\n onChange: value => {\n handleChange(value as Dayjs | null)\n },\n onBlur: form.handleBlur,\n required,\n error: touched && Boolean(error),\n helperText: (touched && error) as false | string,\n },\n }}\n {...otherDatePickerProps}\n />\n </LocalizationProvider>\n )\n }}\n </Field>\n )\n}\n\nexport default DatePickerField\n","import { type FC, useEffect, useState } from \"react\"\nimport { Field, type FieldConfig, type FieldProps } from \"formik\"\nimport {\n TextField as MuiTextField,\n type TextFieldProps as MuiTextFieldProps,\n} from \"@mui/material\"\nimport { type StringSchema, type ValidateOptions, array as YupArray } from \"yup\"\n\nimport { type FormValues, schemaToFieldValidator } from \"../../utils/form\"\nimport { getNestedProperty } from \"../../utils/object\"\n\nexport type TextFieldProps = Omit<\n MuiTextFieldProps,\n | \"name\"\n | \"value\"\n | \"onChange\"\n | \"onBlur\"\n | \"error\"\n | \"defaultValue\"\n | \"helperText\"\n> & {\n name: string\n schema: StringSchema\n validateOptions?: ValidateOptions\n dirty?: boolean\n split?: string | RegExp\n unique?: boolean\n uniqueCaseInsensitive?: boolean\n}\n\n// https://formik.org/docs/examples/with-material-ui\nconst TextField: FC<TextFieldProps> = ({\n id,\n name,\n schema,\n type = \"text\",\n required = false,\n dirty = false,\n unique = false,\n uniqueCaseInsensitive = false,\n split,\n validateOptions,\n ...otherTextFieldProps\n}) => {\n const [initialValue, setInitialValue] = useState<string | string[]>(\"\")\n\n const dotPath = name.split(\".\")\n\n function buildSchema() {\n // Build a schema for a single string.\n let stringSchema = schema\n // 1: Validate string is required.\n stringSchema = required ? stringSchema.required() : stringSchema.optional()\n // 2: Validate string is dirty.\n if (dirty && !split)\n stringSchema = stringSchema.notOneOf(\n [initialValue as string],\n \"cannot be initial value\",\n )\n // Return a schema for a single string.\n if (!split) return stringSchema\n\n // Build a schema for an array of strings.\n let arraySchema = YupArray().of(stringSchema)\n // 1: Validate array has min one string.\n arraySchema = required\n ? arraySchema.required().min(1)\n : arraySchema.optional()\n // 2: Validate array has unique strings.\n if (unique || uniqueCaseInsensitive)\n arraySchema = arraySchema.test({\n message: \"cannot have duplicates\",\n test: values => {\n if (\n Array.isArray(values) &&\n values.length >= 2 &&\n values.every(value => typeof value === \"string\")\n ) {\n return (\n new Set(\n uniqueCaseInsensitive\n ? values.map(value => value.toLowerCase())\n : values,\n ).size === values.length\n )\n }\n\n return true\n },\n })\n // 3: Validate array is dirty.\n if (dirty)\n arraySchema = arraySchema.notOneOf(\n [initialValue as string[]],\n \"cannot be initial value\",\n )\n // Return a schema for an array of strings.\n return arraySchema\n }\n\n const fieldConfig: FieldConfig = {\n name,\n type,\n validate: schemaToFieldValidator(buildSchema(), validateOptions),\n }\n\n const FieldInternal: FC<FieldProps> = ({ form }) => {\n const initialValue = getNestedProperty(\n form.initialValues as FormValues,\n dotPath,\n ) as string\n const value = getNestedProperty(\n form.values as FormValues,\n dotPath,\n ) as string\n const error = getNestedProperty(form.errors, dotPath) as string | undefined\n const touched = getNestedProperty(form.touched, dotPath) as boolean\n\n useEffect(() => {\n setInitialValue(initialValue)\n }, [initialValue])\n\n useEffect(() => {\n void form.setFieldValue(\n name,\n split && typeof value === \"string\" ? value.split(split) : value,\n true,\n )\n }, [value]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <MuiTextField\n id={id ?? name}\n name={name}\n type={type}\n required={required}\n value={value}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n error={touched && Boolean(error)}\n helperText={(touched && error) as false | string}\n {...otherTextFieldProps}\n />\n )\n }\n\n return <Field {...fieldConfig}>{FieldInternal}</Field>\n}\n\nexport default TextField\n","import { EmailOutlined as EmailOutlinedIcon } from \"@mui/icons-material\"\nimport type { FC } from \"react\"\nimport { InputAdornment } from \"@mui/material\"\nimport { string as YupString } from \"yup\"\n\nimport TextField, { type TextFieldProps } from \"./TextField\"\n\nexport type EmailFieldProps = Omit<TextFieldProps, \"type\" | \"name\" | \"schema\"> &\n Partial<Pick<TextFieldProps, \"name\">>\n\nconst EmailField: FC<EmailFieldProps> = ({\n name = \"email\",\n label = \"Email address\",\n placeholder = \"Enter your email address\",\n InputProps = {},\n ...otherTextFieldProps\n}) => {\n return (\n <TextField\n type=\"email\"\n schema={YupString().email()}\n name={name}\n label={label}\n placeholder={placeholder}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <EmailOutlinedIcon />\n </InputAdornment>\n ),\n ...InputProps,\n }}\n {...otherTextFieldProps}\n />\n )\n}\n\nexport default EmailField\n","import type { FC } from \"react\"\nimport { InputAdornment } from \"@mui/material\"\nimport { PersonOutlined as PersonOutlinedIcon } from \"@mui/icons-material\"\n\nimport TextField, { type TextFieldProps } from \"./TextField\"\nimport { schemas } from \"../../api\"\n\nexport type FirstNameFieldProps = Omit<\n TextFieldProps,\n \"type\" | \"name\" | \"schema\"\n> &\n Partial<Pick<TextFieldProps, \"name\">>\n\nconst FirstNameField: FC<FirstNameFieldProps> = ({\n name = \"first_name\",\n label = \"First name\",\n placeholder = \"Enter your first name\",\n InputProps = {},\n ...otherTextFieldProps\n}) => {\n return (\n <TextField\n schema={schemas.user.first_name}\n name={name}\n label={label}\n placeholder={placeholder}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <PersonOutlinedIcon />\n </InputAdornment>\n ),\n ...InputProps,\n }}\n {...otherTextFieldProps}\n />\n )\n}\n\nexport default FirstNameField\n","import {\n type FC,\n type JSX,\n type ReactNode,\n type RefObject,\n useEffect,\n useRef,\n} from \"react\"\nimport { FormHelperText, type FormHelperTextProps } from \"@mui/material\"\nimport {\n Formik,\n type FormikConfig,\n type FormikErrors,\n Form as FormikForm,\n type FormikProps,\n} from \"formik\"\nimport type { TypedUseMutation } from \"@reduxjs/toolkit/query/react\"\n\nimport {\n type FormValues,\n type SubmitFormOptions,\n submitForm,\n} from \"../../utils/form\"\nimport { getKeyPaths } from \"../../utils/object\"\n\nconst SCROLL_INTO_VIEW_OPTIONS: ScrollIntoViewOptions = {\n behavior: \"smooth\",\n block: \"start\",\n}\n\ntype NonFieldErrorsProps = Omit<FormHelperTextProps, \"error\" | \"ref\"> & {\n scrollIntoViewOptions?: ScrollIntoViewOptions\n}\n\nconst NonFieldErrors: FC<NonFieldErrorsProps> = ({\n scrollIntoViewOptions = SCROLL_INTO_VIEW_OPTIONS,\n ...formHelperTextProps\n}) => {\n const pRef = useRef<HTMLParagraphElement>(null)\n\n useEffect(() => {\n if (pRef.current) pRef.current.scrollIntoView(scrollIntoViewOptions)\n }, [scrollIntoViewOptions])\n\n return <FormHelperText ref={pRef} error {...formHelperTextProps} />\n}\n\nexport type FormErrors<Values> = FormikErrors<\n Omit<Values, \"__all__\"> & { __all__: string }\n>\n\ntype _FormikProps<Values> = Omit<FormikProps<Values>, \"errors\"> & {\n errors: FormErrors<Values>\n}\n\ntype BaseFormProps<Values> = Omit<FormikConfig<Values>, \"children\"> & {\n children: ReactNode | ((props: _FormikProps<Values>) => ReactNode)\n scrollIntoViewOptions?: ScrollIntoViewOptions\n nonFieldErrorsProps?: Omit<NonFieldErrorsProps, \"children\">\n fieldRefs?: Array<{\n name: string\n inputRef: RefObject<HTMLInputElement | null>\n }>\n}\n\nconst BaseForm = <Values extends FormValues>({\n children,\n scrollIntoViewOptions = SCROLL_INTO_VIEW_OPTIONS,\n nonFieldErrorsProps,\n fieldRefs = [],\n ...otherFormikProps\n}: BaseFormProps<Values>) => (\n <Formik {...otherFormikProps}>\n {/* @ts-expect-error value is assignable */}\n {(formik: _FormikProps<Values>) => {\n const hasErrors = Boolean(Object.keys(formik.errors).length)\n const hasNonFieldErrors =\n hasErrors && typeof formik.errors.__all__ === \"string\"\n\n // If a submission was attempted and refs to the fields were provided.\n if (\n hasErrors &&\n !hasNonFieldErrors &&\n formik.isSubmitting &&\n fieldRefs.length\n ) {\n const errorNames = getKeyPaths(formik.errors)\n\n const input = fieldRefs.find(({ name }) => errorNames.includes(name))\n ?.inputRef.current\n\n if (input) input.scrollIntoView(scrollIntoViewOptions)\n }\n\n return (\n <>\n {hasNonFieldErrors && (\n <NonFieldErrors {...nonFieldErrorsProps}>\n {formik.errors.__all__ as string}\n </NonFieldErrors>\n )}\n <FormikForm>\n {typeof children === \"function\" ? children(formik) : children}\n </FormikForm>\n </>\n )\n }}\n </Formik>\n)\n\ntype SubmitFormProps<\n Values extends FormValues,\n QueryArg extends FormValues,\n ResultType,\n> = Omit<BaseFormProps<Values>, \"onSubmit\"> & {\n useMutation: TypedUseMutation<ResultType, QueryArg, any>\n} & (Values extends QueryArg\n ? { submitOptions?: SubmitFormOptions<Values, QueryArg, ResultType> }\n : { submitOptions: SubmitFormOptions<Values, QueryArg, ResultType> })\n\nconst SubmitForm = <\n Values extends FormValues,\n QueryArg extends FormValues,\n ResultType,\n>({\n useMutation,\n submitOptions,\n ...baseFormProps\n}: SubmitFormProps<Values, QueryArg, ResultType>): JSX.Element => {\n const [trigger] = useMutation()\n\n return (\n <BaseForm\n {...baseFormProps}\n onSubmit={submitForm<Values, QueryArg, ResultType>(\n trigger,\n baseFormProps.initialValues,\n submitOptions as SubmitFormOptions<Values, QueryArg, ResultType>,\n )}\n />\n )\n}\n\nexport type FormProps<\n Values extends FormValues,\n QueryArg extends FormValues,\n ResultType,\n> = BaseFormProps<Values> | SubmitFormProps<Values, QueryArg, ResultType>\n\nconst Form: {\n <Values extends FormValues>(props: BaseFormProps<Values>): JSX.Element\n <Values extends FormValues, QueryArg extends FormValues, ResultType>(\n props: SubmitFormProps<Values, QueryArg, ResultType>,\n ): JSX.Element\n} = <\n Values extends FormValues = FormValues,\n QueryArg extends FormValues = FormValues,\n ResultType = any,\n>(\n props: FormProps<Values, QueryArg, ResultType>,\n): JSX.Element => {\n return \"onSubmit\" in props ? <BaseForm {...props} /> : SubmitForm(props)\n}\n\nexport default Form\n","import { type FC } from \"react\"\nimport { string as YupString } from \"yup\"\n\nimport TextField, { type TextFieldProps } from \"./TextField\"\n\nexport type OtpFieldProps = Omit<\n TextFieldProps,\n \"name\" | \"schema\" | \"required\"\n> &\n Partial<Pick<TextFieldProps, \"name\">>\n\nconst OtpField: FC<OtpFieldProps> = ({\n name = \"otp\",\n label = \"OTP\",\n placeholder = \"Enter your OTP\",\n ...otherTextFieldProps\n}) => (\n <TextField\n name={name}\n label={label}\n schema={YupString().matches(/^[0-9]{6}$/, \"Must be exactly 6 digits.\")}\n placeholder={placeholder}\n required\n {...otherTextFieldProps}\n />\n)\n\nexport default OtpField\n","import {\n type Dispatch,\n type FC,\n type SetStateAction,\n useEffect,\n useState,\n} from \"react\"\nimport { Field, type FieldConfig, type FieldProps } from \"formik\"\nimport { TextField as MuiTextField, type TextFieldProps } from \"@mui/material\"\nimport { type ValidateOptions, string as YupString } from \"yup\"\n\nimport { type FormValues, schemaToFieldValidator } from \"../../utils/form\"\nimport { getNestedProperty } from \"../../utils/object\"\n\nexport type RepeatFieldProps = Omit<\n TextFieldProps,\n | \"name\"\n | \"value\"\n | \"onChange\"\n | \"onBlur\"\n | \"error\"\n | \"helperText\"\n | \"defaultValue\"\n | \"required\"\n> & {\n name: string\n validateOptions?: ValidateOptions\n}\n\nconst TextField: FC<\n RepeatFieldProps & {\n repeatName: string\n setValue: Dispatch<SetStateAction<string>>\n fieldProps: FieldProps\n }\n> = ({\n id,\n repeatName,\n setValue,\n fieldProps,\n name,\n label,\n placeholder,\n type,\n ...otherTextFieldProps\n}) => {\n const { form } = fieldProps\n\n const dotPath = name.split(\".\")\n const value = getNestedProperty(form.values as FormValues, dotPath) as string\n\n const repeatDotPath = repeatName.split(\".\")\n const repeatValue = getNestedProperty(\n form.values as FormValues,\n repeatDotPath,\n ) as string\n const repeatTouched = getNestedProperty(\n form.touched,\n repeatDotPath,\n ) as boolean\n const repeatError = getNestedProperty(form.errors, repeatDotPath) as\n | string\n | undefined\n\n useEffect(() => {\n setValue(value)\n }, [setValue, value])\n\n return (\n <MuiTextField\n required\n type={type}\n label={label ?? `Repeat ${name.replace(\"_\", \" \")}`}\n placeholder={placeholder ?? `Enter your ${name.replace(\"_\", \" \")} again`}\n id={id ?? repeatName}\n name={repeatName}\n value={repeatValue}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n error={repeatTouched && Boolean(repeatError)}\n helperText={(repeatTouched && repeatError) as false | string}\n {...otherTextFieldProps}\n />\n )\n}\n\n// https://formik.org/docs/examples/with-material-ui\nconst RepeatField: FC<RepeatFieldProps> = ({\n name,\n type = \"text\",\n validateOptions,\n ...otherTextFieldProps\n}) => {\n const [value, setValue] = useState(\"\")\n\n const repeatName = `${name}_repeat`\n\n const fieldConfig: FieldConfig = {\n name: repeatName,\n type,\n validate: schemaToFieldValidator(\n YupString().required().equals([value], \"does not match\"),\n validateOptions,\n ),\n }\n\n return (\n <Field {...fieldConfig}>\n {(fieldProps: FieldProps) => (\n <TextField\n name={name}\n type={type}\n repeatName={repeatName}\n setValue={setValue}\n fieldProps={fieldProps}\n {...otherTextFieldProps}\n />\n )}\n </Field>\n )\n}\n\nexport default RepeatField\n","import { type FC, useState } from \"react\"\nimport { IconButton, InputAdornment } from \"@mui/material\"\nimport {\n Visibility as VisibilityIcon,\n VisibilityOff as VisibilityOffIcon,\n} from \"@mui/icons-material\"\nimport { string as YupString } from \"yup\"\n\nimport RepeatField, { type RepeatFieldProps } from \"./RepeatField\"\nimport TextField, { type TextFieldProps } from \"./TextField\"\n\nexport type PasswordFieldProps = Omit<\n TextFieldProps,\n \"type\" | \"name\" | \"schema\" | \"autoComplete\"\n> &\n Partial<Pick<TextFieldProps, \"name\" | \"schema\">> & {\n withRepeatField?: boolean\n repeatFieldProps?: Omit<RepeatFieldProps, \"name\" | \"type\">\n }\n\nconst PasswordField: FC<PasswordFieldProps> = ({\n name = \"password\",\n label = \"Password\",\n placeholder = \"Enter your password\",\n schema = YupString(),\n InputProps = {},\n withRepeatField = false,\n repeatFieldProps = {},\n ...otherTextFieldProps\n}) => {\n const [isVisible, setIsVisible] = useState(false)\n\n const type = isVisible ? \"text\" : \"password\"\n const endAdornment = (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => {\n setIsVisible(previousIsVisible => !previousIsVisible)\n }}\n edge=\"end\"\n >\n {isVisible ? <VisibilityIcon /> : <VisibilityOffIcon />}\n </IconButton>\n </InputAdornment>\n )\n\n return (\n <>\n <TextField\n autoComplete=\"off\"\n type={type}\n name={name}\n label={label}\n schema={schema}\n placeholder={placeholder}\n InputProps={{ endAdornment, ...InputProps }}\n {...otherTextFieldProps}\n />\n {withRepeatField && (\n <RepeatField\n name={name}\n type={type}\n {...repeatFieldProps}\n InputProps={{ endAdornment, ...repeatFieldProps.InputProps }}\n />\n )}\n </>\n )\n}\n\nexport default PasswordField\n","import { Button, type ButtonProps } from \"@mui/material\"\nimport { Field, type FieldProps } from \"formik\"\nimport type { FC } from \"react\"\n\nimport { type FormValues } from \"../../utils/form\"\n\nexport interface SubmitButtonProps\n extends Omit<ButtonProps, \"type\" | \"onClick\"> {}\n\nconst SubmitButton: FC<SubmitButtonProps> = ({\n children = \"Submit\",\n ...otherButtonProps\n}) => {\n function getTouched(\n values: Record<string, any>,\n touched?: Record<string, any>,\n ) {\n touched = touched || {}\n for (const key in values) {\n const value: unknown = values[key]\n touched[key] =\n value instanceof Object && value.constructor === Object\n ? getTouched(value, touched)\n : true\n }\n\n return touched\n }\n\n return (\n <Field name=\"submit\" type=\"submit\">\n {({ form }: FieldProps) => (\n <Button\n type=\"button\"\n onClick={() => {\n void form\n .setTouched(getTouched(form.values as FormValues), true)\n .then(errors => {\n const hasErrors = Boolean(errors && Object.keys(errors).length)\n // If has errors, set isSubmitting=true so fields in the form are\n // aware that a submission was attempted. Else, set\n // isSubmitting=false as it will be set to true when calling\n // submitForm().\n form.setSubmitting(hasErrors)\n if (!hasErrors) void form.submitForm()\n })\n }}\n {...otherButtonProps}\n >\n {children}\n </Button>\n )}\n </Field>\n )\n}\n\nexport default SubmitButton\n","import { type ElementType, type JSX } from \"react\"\nimport { type ChipTypeMap } from \"@mui/material\"\n\nimport AutocompleteField, {\n type AutocompleteFieldProps,\n} from \"./AutocompleteField\"\nimport { UK_COUNTIES } from \"../../utils/location\"\n\nexport interface UkCountyFieldProps<\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n> extends Omit<\n AutocompleteFieldProps<\n string,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >,\n \"options\" | \"textFieldProps\"\n > {\n textFieldProps?: Omit<\n AutocompleteFieldProps<\n string,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >[\"textFieldProps\"],\n \"name\"\n > & {\n name?: string\n }\n}\n\nconst UkCountyField = <\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n>({\n textFieldProps,\n ...otherAutocompleteFieldProps\n}: UkCountyFieldProps<\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n>): JSX.Element => {\n const {\n name = \"uk_county\",\n label = \"UK county\",\n placeholder = \"Select your UK county\",\n ...otherTextFieldProps\n } = textFieldProps || {}\n\n return (\n <AutocompleteField\n options={UK_COUNTIES}\n textFieldProps={{ name, label, placeholder, ...otherTextFieldProps }}\n {...otherAutocompleteFieldProps}\n />\n )\n}\n\nexport default UkCountyField\n"],"names":["ApiAutocompleteField","useLazyListQuery","filterOptions","getOptionLabel","getOptionKey","result","searchKey","otherAutocompleteFieldProps","search","setSearch","useState","trigger","isLoading","isError","limit","offset","setPagination","usePagination","options","hasMore","setState","useEffect","arg","data","count","previousOptions","error","optionKeys","jsx","Fragment","loadNextPage","page","AutocompleteField","id","_","value","reason","forwardRef","children","props","ref","listItems","Children","CircularProgress","SyncError","Button","event","textFieldProps","validateOptions","otherAutocompleteProps","name","required","otherTextFieldProps","dotPath","message","schema","YupString","YupNumber","fieldConfig","schemaToFieldValidator","Field","form","meta","getNestedProperty","touched","Autocomplete","otherParams","TextField","CheckboxField","formControlLabelProps","errorMessage","otherCheckboxProps","YupBool","hasError","jsxs","FormControl","FormControlLabel","Checkbox","FormHelperText","CountryField","label","placeholder","COUNTRY_ISO_CODES","isoCode","COUNTRY_ISO_CODE_MAPPING","DatePickerField","minDate","maxDate","otherDatePickerProps","dateToString","date","YupDate","dayjs","handleChange","LocalizationProvider","AdapterDayjs","DatePicker","type","dirty","unique","uniqueCaseInsensitive","split","initialValue","setInitialValue","buildSchema","stringSchema","arraySchema","YupArray","values","MuiTextField","EmailField","InputProps","InputAdornment","EmailOutlinedIcon","FirstNameField","schemas.user","PersonOutlinedIcon","SCROLL_INTO_VIEW_OPTIONS","NonFieldErrors","scrollIntoViewOptions","formHelperTextProps","pRef","useRef","BaseForm","nonFieldErrorsProps","fieldRefs","otherFormikProps","Formik","formik","hasErrors","hasNonFieldErrors","errorNames","getKeyPaths","input","FormikForm","SubmitForm","useMutation","submitOptions","baseFormProps","submitForm","Form","OtpField","repeatName","setValue","fieldProps","repeatDotPath","repeatValue","repeatTouched","repeatError","RepeatField","PasswordField","withRepeatField","repeatFieldProps","isVisible","setIsVisible","endAdornment","IconButton","previousIsVisible","VisibilityIcon","VisibilityOffIcon","SubmitButton","otherButtonProps","getTouched","key","errors","UkCountyField","UK_COUNTIES"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("react/jsx-runtime"),m=require("@mui/material"),T=require("react"),ee=require("./api-CaEovEUU.cjs"),te=require("./api-DIgp_6Vr.cjs"),_=require("formik"),O=require("yup"),E=require("./utils/form.cjs.js"),y=require("./object-C0ukOmY8.cjs"),re=require("./dayjs.min-BDMWgl2D.cjs"),R=require("@mui/x-date-pickers"),oe=require("@mui/x-date-pickers/AdapterDayjs"),I=require("@mui/icons-material");require("@reduxjs/toolkit/query/react");require("@reduxjs/toolkit");require("./utils/cookies.cjs.js");const A=require("./schemas-B1L2Knka.cjs");require("./urls-DJiVb_ID.cjs");const M=({useLazyListQuery:r,filterOptions:t,getOptionLabel:n,getOptionKey:o=l=>l.id,searchKey:s,...i})=>{const[l,d]=T.useState(""),[a,{isLoading:u,isError:c}]=r(),[{limit:x,offset:p},g]=te.usePagination(),[{options:b,hasMore:f},S]=T.useState({options:{},hasMore:!0});T.useEffect(()=>{const j={limit:x,offset:p,...t};l&&(j[s]=l),a(j,!0).unwrap().then(({data:C,offset:q,limit:N,count:V})=>{S(({options:Z})=>{const L={...Z};return C.forEach(w=>{L[o(w)]=w}),{options:L,hasMore:q+N<V}})}).catch(C=>{C&&console.error(C)})},[a,x,p,s,l,...Object.values(t||{})]);let h=Object.keys(b);if(!h.length)return e.jsx(e.Fragment,{});typeof o(Object.values(b)[0])=="number"&&(h=h.map(Number));function F(){g(({page:j,limit:C})=>({page:j+1,limit:C}))}const P=({children:j,...C},q)=>{const N=T.Children.toArray(j);return u?N.push(e.jsx(m.CircularProgress,{},"is-loading")):(c&&N.push(e.jsx(ee.SyncError,{},"is-error")),f&&N.push(e.jsx(m.Button,{onClick:F,children:"Load more"},"load-more"))),e.jsx("ul",{...C,ref:q,onScroll:V=>{!u&&V.currentTarget.clientHeight+V.currentTarget.scrollTop>=V.currentTarget.scrollHeight&&F()},children:N})};return e.jsx(B,{options:h,getOptionLabel:j=>n(b[j]),onInputChange:(j,C,q)=>{d(q==="input"?C:"")},ListboxComponent:T.forwardRef(P),...i})},B=({textFieldProps:r,options:t,validateOptions:n,...o})=>{const{id:s,name:i,required:l,...d}=r,a=i.split("."),u="not a valid option";let c=typeof t[0]=="string"?O.string().oneOf(t,u):O.number().oneOf(t,u);l&&(c=c.required());const x={name:i,type:typeof t[0]=="string"?"text":"number",validate:E.schemaToFieldValidator(c,n)};return e.jsx(_.Field,{...x,children:({form:p,meta:g})=>{const b=y.getNestedProperty(p.values,a),f=y.getNestedProperty(p.touched,a),S=y.getNestedProperty(p.errors,a);return e.jsx(m.Autocomplete,{options:t,defaultValue:g.initialValue===""?void 0:g.initialValue,renderInput:({id:h,...F})=>e.jsx(m.TextField,{id:s??i,name:i,required:l,type:"text",value:b,error:f&&!!S,helperText:f&&S,...d,...F}),onChange:(h,F)=>{p.setFieldValue(i,F??void 0,!0)},onBlur:p.handleBlur,...o})}})},U=({id:r,name:t,formControlLabelProps:n,required:o=!1,errorMessage:s="this is a required field",validateOptions:i,...l})=>{const d=t.split(".");let a=O.bool();o&&(a=a.oneOf([!0],s));const u={name:t,type:"checkbox",validate:E.schemaToFieldValidator(a,i)};return e.jsx(_.Field,{...u,children:({form:c,meta:x})=>{const p=y.getNestedProperty(c.touched,d),g=y.getNestedProperty(c.errors,d),b=y.getNestedProperty(c.values,d),f=p&&!!g;return e.jsxs(m.FormControl,{error:f,required:o,children:[e.jsx(m.FormControlLabel,{control:e.jsx(m.Checkbox,{defaultChecked:x.initialValue,id:r??t,name:t,value:b,onChange:c.handleChange,onBlur:c.handleBlur,...l}),...n}),f&&e.jsx(m.FormHelperText,{children:g})]})}})},Y=({textFieldProps:r,...t})=>{const{name:n="country",label:o="Country",placeholder:s="Select your country",...i}=r||{};return e.jsx(B,{options:A.COUNTRY_ISO_CODES,getOptionLabel:l=>A.COUNTRY_ISO_CODE_MAPPING[l],textFieldProps:{name:n,label:o,placeholder:s,...i},...t})},D=({name:r,required:t,minDate:n,maxDate:o,validateOptions:s,...i})=>{const l=r.split(".");function d(c){return c.locale("en-gb").format("L")}let a=O.date();t&&(a=a.required()),n&&(a=a.min(n,`this field must be after or equal to ${d(n)}`)),o&&(a=a.max(o,`this field must be before or equal to ${d(o)}`));const u={name:r,type:"date",validate:E.schemaToFieldValidator(a,s)};return e.jsx(_.Field,{...u,children:({form:c})=>{const x=y.getNestedProperty(c.errors,l),p=y.getNestedProperty(c.touched,l);let g=y.getNestedProperty(c.values,l);g=g?re.dayjs(g):null;function b(f){c.setFieldValue(r,f&&f.isValid()?f.format("YYYY-MM-DD"):null,!0)}return e.jsx(R.LocalizationProvider,{dateAdapter:oe.AdapterDayjs,adapterLocale:"en-gb",children:e.jsx(R.DatePicker,{name:r,value:g,minDate:n,maxDate:o,onChange:b,slotProps:{textField:{id:r,onChange:f=>{b(f)},onBlur:c.handleBlur,required:t,error:p&&!!x,helperText:p&&x}},...i})})}})},v=({id:r,name:t,schema:n,type:o="text",required:s=!1,dirty:i=!1,unique:l=!1,uniqueCaseInsensitive:d=!1,split:a,validateOptions:u,...c})=>{const[x,p]=T.useState(""),g=t.split(".");function b(){let h=n;if(h=s?h.required():h.optional(),i&&!a&&(h=h.notOneOf([x],"cannot be initial value")),!a)return h;let F=O.array().of(h);return F=s?F.required().min(1):F.optional(),(l||d)&&(F=F.test({message:"cannot have duplicates",test:P=>Array.isArray(P)&&P.length>=2&&P.every(j=>typeof j=="string")?new Set(d?P.map(j=>j.toLowerCase()):P).size===P.length:!0})),i&&(F=F.notOneOf([x],"cannot be initial value")),F}const f={name:t,type:o,validate:E.schemaToFieldValidator(b(),u)},S=({form:h})=>{const F=y.getNestedProperty(h.initialValues,g),P=y.getNestedProperty(h.values,g),j=y.getNestedProperty(h.errors,g),C=y.getNestedProperty(h.touched,g);return T.useEffect(()=>{p(F)},[F]),T.useEffect(()=>{h.setFieldValue(t,a&&typeof P=="string"?P.split(a):P,!0)},[P]),e.jsx(m.TextField,{id:r??t,name:t,type:o,required:s,value:P,onChange:h.handleChange,onBlur:h.handleBlur,error:C&&!!j,helperText:C&&j,...c})};return e.jsx(_.Field,{...f,children:S})},H=({name:r="email",label:t="Email address",placeholder:n="Enter your email address",InputProps:o={},...s})=>e.jsx(v,{type:"email",schema:O.string().email(),name:r,label:t,placeholder:n,InputProps:{endAdornment:e.jsx(m.InputAdornment,{position:"end",children:e.jsx(I.EmailOutlined,{})}),...o},...s}),z=({name:r="first_name",label:t="First name",placeholder:n="Enter your first name",InputProps:o={},...s})=>e.jsx(v,{schema:A.user.first_name,name:r,label:t,placeholder:n,InputProps:{endAdornment:e.jsx(m.InputAdornment,{position:"end",children:e.jsx(I.PersonOutlined,{})}),...o},...s}),K={behavior:"smooth",block:"start"},ne=({scrollIntoViewOptions:r=K,...t})=>{const n=T.useRef(null);return T.useEffect(()=>{n.current&&n.current.scrollIntoView(r)},[r]),e.jsx(m.FormHelperText,{ref:n,error:!0,...t})},$=({children:r,scrollIntoViewOptions:t=K,nonFieldErrorsProps:n,fieldRefs:o=[],...s})=>e.jsx(_.Formik,{...s,children:i=>{const l=!!Object.keys(i.errors).length,d=l&&typeof i.errors.__all__=="string";if(l&&!d&&i.isSubmitting&&o.length){const a=y.getKeyPaths(i.errors),u=o.find(({name:c})=>a.includes(c))?.inputRef.current;u&&u.scrollIntoView(t)}return e.jsxs(e.Fragment,{children:[d&&e.jsx(ne,{...n,children:i.errors.__all__}),e.jsx(_.Form,{children:typeof r=="function"?r(i):r})]})}}),se=({useMutation:r,submitOptions:t,...n})=>{const[o]=r();return e.jsx($,{...n,onSubmit:E.submitForm(o,n.initialValues,t)})},G=r=>"onSubmit"in r?e.jsx($,{...r}):se(r),W=({name:r="otp",label:t="OTP",placeholder:n="Enter your OTP",...o})=>e.jsx(v,{name:r,label:t,schema:O.string().matches(/^[0-9]{6}$/,"Must be exactly 6 digits."),placeholder:n,required:!0,...o}),ie=({id:r,repeatName:t,setValue:n,fieldProps:o,name:s,label:i,placeholder:l,type:d,...a})=>{const{form:u}=o,c=s.split("."),x=y.getNestedProperty(u.values,c),p=t.split("."),g=y.getNestedProperty(u.values,p),b=y.getNestedProperty(u.touched,p),f=y.getNestedProperty(u.errors,p);return T.useEffect(()=>{n(x)},[n,x]),e.jsx(m.TextField,{required:!0,type:d,label:i??`Repeat ${s.replace("_"," ")}`,placeholder:l??`Enter your ${s.replace("_"," ")} again`,id:r??t,name:t,value:g,onChange:u.handleChange,onBlur:u.handleBlur,error:b&&!!f,helperText:b&&f,...a})},k=({name:r,type:t="text",validateOptions:n,...o})=>{const[s,i]=T.useState(""),l=`${r}_repeat`,d={name:l,type:t,validate:E.schemaToFieldValidator(O.string().required().equals([s],"does not match"),n)};return e.jsx(_.Field,{...d,children:a=>e.jsx(ie,{name:r,type:t,repeatName:l,setValue:i,fieldProps:a,...o})})},J=({name:r="password",label:t="Password",placeholder:n="Enter your password",schema:o=O.string(),InputProps:s={},withRepeatField:i=!1,repeatFieldProps:l={},...d})=>{const[a,u]=T.useState(!1),c=a?"text":"password",x=e.jsx(m.InputAdornment,{position:"end",children:e.jsx(m.IconButton,{onClick:()=>{u(p=>!p)},edge:"end",children:a?e.jsx(I.Visibility,{}):e.jsx(I.VisibilityOff,{})})});return e.jsxs(e.Fragment,{children:[e.jsx(v,{autoComplete:"off",type:c,name:r,label:t,schema:o,placeholder:n,InputProps:{endAdornment:x,...s},...d}),i&&e.jsx(k,{name:r,type:c,...l,InputProps:{endAdornment:x,...l.InputProps}})]})},Q=({children:r="Submit",...t})=>{function n(o,s){s=s||{};for(const i in o){const l=o[i];s[i]=l instanceof Object&&l.constructor===Object?n(l,s):!0}return s}return e.jsx(_.Field,{name:"submit",type:"submit",children:({form:o})=>e.jsx(m.Button,{type:"button",onClick:()=>{o.setTouched(n(o.values),!0).then(s=>{const i=!!(s&&Object.keys(s).length);o.setSubmitting(i),i||o.submitForm()})},...t,children:r})})},X=({textFieldProps:r,...t})=>{const{name:n="uk_county",label:o="UK county",placeholder:s="Select your UK county",...i}=r||{};return e.jsx(B,{options:A.UK_COUNTIES,textFieldProps:{name:n,label:o,placeholder:s,...i},...t})},le=Object.freeze(Object.defineProperty({__proto__:null,ApiAutocompleteField:M,AutocompleteField:B,CheckboxField:U,CountryField:Y,DatePickerField:D,EmailField:H,FirstNameField:z,Form:G,OtpField:W,PasswordField:J,RepeatField:k,SubmitButton:Q,TextField:v,UkCountyField:X},Symbol.toStringTag,{value:"Module"}));exports.ApiAutocompleteField=M;exports.AutocompleteField=B;exports.CheckboxField=U;exports.CountryField=Y;exports.DatePickerField=D;exports.EmailField=H;exports.FirstNameField=z;exports.Form=G;exports.OtpField=W;exports.PasswordField=J;exports.RepeatField=k;exports.SubmitButton=Q;exports.TextField=v;exports.UkCountyField=X;exports.index=le;
2
+ //# sourceMappingURL=index-CgShi-oQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CgShi-oQ.cjs","sources":["../src/components/form/ApiAutocompleteField.tsx","../src/components/form/AutocompleteField.tsx","../src/components/form/CheckboxField.tsx","../src/components/form/CountryField.tsx","../src/components/form/DatePickerField.tsx","../src/components/form/TextField.tsx","../src/components/form/EmailField.tsx","../src/components/form/FirstNameField.tsx","../src/components/form/Form.tsx","../src/components/form/OtpField.tsx","../src/components/form/RepeatField.tsx","../src/components/form/PasswordField.tsx","../src/components/form/SubmitButton.tsx","../src/components/form/UkCountyField.tsx"],"sourcesContent":["import { Button, type ChipTypeMap, CircularProgress } from \"@mui/material\"\nimport {\n Children,\n type ElementType,\n type ForwardRefRenderFunction,\n type HTMLAttributes,\n type JSX,\n forwardRef,\n useEffect,\n useState,\n} from \"react\"\nimport type { TypedUseLazyQuery } from \"@reduxjs/toolkit/query/react\"\n\nimport {\n AutocompleteField,\n type AutocompleteFieldProps,\n} from \"../../components/form\"\nimport type { ListArg, ListResult, ModelId } from \"../../utils/api\"\nimport SyncError from \"../SyncError\"\nimport { usePagination } from \"../../hooks/api\"\n\nexport interface ApiAutocompleteFieldProps<\n SearchKey extends keyof Omit<QueryArg, \"limit\" | \"offset\">,\n // api type args\n QueryArg extends ListArg,\n ResultType extends ListResult<any>,\n // autocomplete type args\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n> extends Omit<\n AutocompleteFieldProps<\n ModelId,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >,\n | \"options\"\n | \"ListboxComponent\"\n | \"filterOptions\"\n | \"getOptionLabel\"\n | \"getOptionKey\"\n | \"onInputChange\"\n > {\n useLazyListQuery: TypedUseLazyQuery<ResultType, QueryArg, any>\n filterOptions?: Omit<QueryArg, \"limit\" | \"offset\" | SearchKey>\n getOptionLabel: (result: ResultType[\"data\"][number]) => string\n getOptionKey?: (result: ResultType[\"data\"][number]) => ModelId\n searchKey: SearchKey\n}\n\nconst ApiAutocompleteField = <\n SearchKey extends keyof Omit<QueryArg, \"limit\" | \"offset\">,\n // api type args\n QueryArg extends ListArg,\n ResultType extends ListResult<any>,\n // autocomplete type args\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n>({\n useLazyListQuery,\n filterOptions,\n getOptionLabel,\n getOptionKey = result => result.id as ModelId,\n searchKey,\n ...otherAutocompleteFieldProps\n}: ApiAutocompleteFieldProps<\n SearchKey,\n // api type args\n QueryArg,\n ResultType,\n // autocomplete type args\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n>): JSX.Element => {\n const [search, setSearch] = useState(\"\")\n const [trigger, { isLoading, isError }] = useLazyListQuery()\n const [{ limit, offset }, setPagination] = usePagination()\n const [{ options, hasMore }, setState] = useState<{\n options: Record<ModelId, ResultType[\"data\"][number]>\n hasMore: boolean\n }>({ options: {}, hasMore: true })\n\n // Call api\n useEffect(\n () => {\n const arg = { limit, offset, ...filterOptions } as QueryArg\n // @ts-expect-error search key can index arg\n if (search) arg[searchKey] = search\n\n trigger(arg, true)\n .unwrap()\n .then(({ data, offset, limit, count }) => {\n setState(({ options: previousOptions }) => {\n const options = { ...previousOptions }\n data.forEach(result => {\n options[getOptionKey(result)] = result\n })\n return { options, hasMore: offset + limit < count }\n })\n })\n .catch(error => {\n if (error) console.error(error)\n // TODO: gracefully handle error\n })\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n trigger,\n limit,\n offset,\n searchKey,\n search,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n ...Object.values(filterOptions || {}),\n ],\n )\n\n // Get options keys\n let optionKeys: ModelId[] = Object.keys(options)\n if (!optionKeys.length) return <></>\n if (typeof getOptionKey(Object.values(options)[0]) === \"number\") {\n optionKeys = optionKeys.map(Number)\n }\n\n function loadNextPage() {\n setPagination(({ page, limit }) => ({ page: page + 1, limit }))\n }\n\n const ListboxComponent: ForwardRefRenderFunction<\n unknown,\n HTMLAttributes<HTMLElement>\n > = ({ children, ...props }, ref) => {\n const listItems = Children.toArray(children)\n if (isLoading) listItems.push(<CircularProgress key=\"is-loading\" />)\n else {\n if (isError) listItems.push(<SyncError key=\"is-error\" />)\n if (hasMore) {\n listItems.push(\n <Button key=\"load-more\" onClick={loadNextPage}>\n Load more\n </Button>,\n )\n }\n }\n\n return (\n <ul\n {...props}\n // @ts-expect-error ref is assignable\n ref={ref}\n onScroll={event => {\n // If not already loading and scrolled to bottom\n if (\n !isLoading &&\n event.currentTarget.clientHeight + event.currentTarget.scrollTop >=\n event.currentTarget.scrollHeight\n ) {\n loadNextPage()\n }\n }}\n >\n {listItems}\n </ul>\n )\n }\n\n return (\n <AutocompleteField\n options={optionKeys}\n getOptionLabel={id => getOptionLabel(options[id])}\n onInputChange={(_, value, reason) => {\n setSearch(reason === \"input\" ? value : \"\")\n }}\n ListboxComponent={forwardRef(ListboxComponent)}\n {...otherAutocompleteFieldProps}\n />\n )\n}\n\nexport default ApiAutocompleteField\n","import {\n Autocomplete,\n type AutocompleteProps,\n type ChipTypeMap,\n TextField,\n type TextFieldProps,\n} from \"@mui/material\"\nimport { type ElementType, type JSX } from \"react\"\nimport { Field, type FieldConfig, type FieldProps } from \"formik\"\nimport {\n type ValidateOptions,\n number as YupNumber,\n string as YupString,\n} from \"yup\"\n\nimport { type FormValues, schemaToFieldValidator } from \"../../utils/form\"\nimport { getNestedProperty } from \"../../utils/object\"\n\nexport interface AutocompleteFieldProps<\n Value extends string | number,\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n> extends Omit<\n AutocompleteProps<\n Value,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >,\n \"renderInput\" | \"defaultValue\" | \"onChange\" | \"onBlur\" | \"value\"\n > {\n textFieldProps: Omit<\n TextFieldProps,\n | \"name\"\n | \"value\"\n | \"onChange\"\n | \"onBlur\"\n | \"error\"\n | \"helperText\"\n | \"defaultValue\"\n | \"type\"\n > & {\n name: string\n }\n validateOptions?: ValidateOptions\n}\n\nconst AutocompleteField = <\n Value extends string | number,\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n>({\n textFieldProps,\n options,\n validateOptions,\n ...otherAutocompleteProps\n}: AutocompleteFieldProps<\n Value,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n>): JSX.Element => {\n const { id, name, required, ...otherTextFieldProps } = textFieldProps\n\n const dotPath = name.split(\".\")\n\n const message = \"not a valid option\"\n let schema =\n typeof options[0] === \"string\"\n ? YupString().oneOf(options as readonly string[], message)\n : YupNumber().oneOf(options as readonly number[], message)\n if (required) schema = schema.required()\n\n const fieldConfig: FieldConfig = {\n name,\n type: typeof options[0] === \"string\" ? \"text\" : \"number\",\n validate: schemaToFieldValidator(schema, validateOptions),\n }\n\n return (\n <Field {...fieldConfig}>\n {({ form, meta }: FieldProps) => {\n const value = getNestedProperty(\n form.values as FormValues,\n dotPath,\n ) as string\n const touched = getNestedProperty(form.touched, dotPath) as boolean\n const error = getNestedProperty(form.errors, dotPath) as\n | string\n | undefined\n\n return (\n <Autocomplete\n options={options}\n // @ts-expect-error value can be assigned\n defaultValue={\n meta.initialValue === \"\"\n ? undefined\n : (meta.initialValue as string)\n }\n renderInput={({\n id: _, // eslint-disable-line @typescript-eslint/no-unused-vars\n ...otherParams\n }) => (\n <TextField\n id={id ?? name}\n name={name}\n required={required}\n type=\"text\" // Force to be string to avoid number incrementor/decrementor\n value={value}\n error={touched && Boolean(error)}\n helperText={touched && error}\n {...otherTextFieldProps}\n {...otherParams}\n />\n )}\n onChange={(_, value) => {\n void form.setFieldValue(name, value ?? undefined, true)\n }}\n onBlur={form.handleBlur}\n {...otherAutocompleteProps}\n />\n )\n }}\n </Field>\n )\n}\n\nexport default AutocompleteField\n","import {\n Checkbox,\n type CheckboxProps,\n FormControl,\n FormControlLabel,\n type FormControlLabelProps,\n FormHelperText,\n} from \"@mui/material\"\nimport { Field, type FieldConfig, type FieldProps } from \"formik\"\nimport { type ValidateOptions, bool as YupBool } from \"yup\"\nimport { type FC } from \"react\"\n\nimport { type FormValues, schemaToFieldValidator } from \"../../utils/form\"\nimport { getNestedProperty } from \"../../utils/object\"\n\nexport interface CheckboxFieldProps\n extends Omit<\n CheckboxProps,\n \"defaultChecked\" | \"value\" | \"onChange\" | \"onBlur\"\n > {\n name: string\n formControlLabelProps: Omit<FormControlLabelProps, \"control\">\n errorMessage?: string\n validateOptions?: ValidateOptions\n}\n\nconst CheckboxField: FC<CheckboxFieldProps> = ({\n id,\n name,\n formControlLabelProps,\n required = false,\n errorMessage = \"this is a required field\",\n validateOptions,\n ...otherCheckboxProps\n}) => {\n const dotPath = name.split(\".\")\n\n let schema = YupBool()\n if (required) schema = schema.oneOf([true], errorMessage)\n\n const fieldConfig: FieldConfig = {\n name,\n type: \"checkbox\",\n validate: schemaToFieldValidator(schema, validateOptions),\n }\n\n return (\n <Field {...fieldConfig}>\n {({ form, meta }: FieldProps) => {\n const touched = getNestedProperty(form.touched, dotPath) as boolean\n const error = getNestedProperty(form.errors, dotPath) as\n | string\n | undefined\n const value = getNestedProperty(\n form.values as FormValues,\n dotPath,\n ) as boolean\n\n const hasError = touched && Boolean(error)\n\n // https://mui.com/material-ui/react-checkbox/#formgroup\n return (\n <FormControl error={hasError} required={required}>\n <FormControlLabel\n control={\n <Checkbox\n defaultChecked={meta.initialValue as boolean}\n id={id ?? name}\n name={name}\n value={value}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n {...otherCheckboxProps}\n />\n }\n {...formControlLabelProps}\n />\n {hasError && <FormHelperText>{error}</FormHelperText>}\n </FormControl>\n )\n }}\n </Field>\n )\n}\n\nexport default CheckboxField\n","import { type ElementType, type JSX } from \"react\"\nimport { type ChipTypeMap } from \"@mui/material\"\n\nimport AutocompleteField, {\n type AutocompleteFieldProps,\n} from \"./AutocompleteField\"\nimport {\n COUNTRY_ISO_CODES,\n COUNTRY_ISO_CODE_MAPPING,\n type CountryIsoCodes,\n} from \"../../utils/location\"\n\nexport interface CountryFieldProps<\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n> extends Omit<\n AutocompleteFieldProps<\n string,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >,\n \"options\" | \"textFieldProps\" | \"getOptionLabel\"\n > {\n textFieldProps?: Omit<\n AutocompleteFieldProps<\n string,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >[\"textFieldProps\"],\n \"name\"\n > & {\n name?: string\n }\n}\n\nconst CountryField = <\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n>({\n textFieldProps,\n ...otherAutocompleteFieldProps\n}: CountryFieldProps<\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n>): JSX.Element => {\n const {\n name = \"country\",\n label = \"Country\",\n placeholder = \"Select your country\",\n ...otherTextFieldProps\n } = textFieldProps || {}\n\n return (\n <AutocompleteField\n options={COUNTRY_ISO_CODES}\n getOptionLabel={isoCode =>\n COUNTRY_ISO_CODE_MAPPING[isoCode as CountryIsoCodes]\n }\n textFieldProps={{ name, label, placeholder, ...otherTextFieldProps }}\n {...otherAutocompleteFieldProps}\n />\n )\n}\n\nexport default CountryField\n","import \"dayjs/locale/en-gb\"\nimport {\n DatePicker,\n type DatePickerProps,\n LocalizationProvider,\n} from \"@mui/x-date-pickers\"\nimport { Field, type FieldConfig, type FieldProps } from \"formik\"\nimport { type ValidateOptions, date as YupDate } from \"yup\"\nimport dayjs, { type Dayjs } from \"dayjs\"\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\"\nimport { type JSX } from \"react\"\n\nimport { type FormValues, schemaToFieldValidator } from \"../../utils/form\"\nimport { getNestedProperty } from \"../../utils/object\"\n\nexport interface DatePickerFieldProps<\n TEnableAccessibleFieldDOMStructure extends boolean = true,\n> extends Omit<\n DatePickerProps<TEnableAccessibleFieldDOMStructure>,\n \"name\" | \"value\" | \"onChange\" | \"slotProps\"\n > {\n name: string\n required?: boolean\n validateOptions?: ValidateOptions\n}\n\nconst DatePickerField = <\n TEnableAccessibleFieldDOMStructure extends boolean = false,\n>({\n name,\n required,\n minDate,\n maxDate,\n validateOptions,\n ...otherDatePickerProps\n}: DatePickerFieldProps<TEnableAccessibleFieldDOMStructure>): JSX.Element => {\n const dotPath = name.split(\".\")\n\n function dateToString(date: Dayjs) {\n return date.locale(\"en-gb\").format(\"L\")\n }\n\n let schema = YupDate()\n if (required) schema = schema.required()\n if (minDate) {\n schema = schema.min(\n minDate,\n `this field must be after or equal to ${dateToString(minDate)}`,\n )\n }\n if (maxDate) {\n schema = schema.max(\n maxDate,\n `this field must be before or equal to ${dateToString(maxDate)}`,\n )\n }\n\n const fieldConfig: FieldConfig = {\n name,\n type: \"date\",\n validate: schemaToFieldValidator(schema, validateOptions),\n }\n\n return (\n <Field {...fieldConfig}>\n {({ form }: FieldProps) => {\n const error = getNestedProperty(form.errors, dotPath) as\n | string\n | undefined\n const touched = getNestedProperty(form.touched, dotPath) as boolean\n let value: Dayjs | null | string = getNestedProperty(\n form.values as FormValues,\n dotPath,\n ) as string\n\n value = value ? dayjs(value) : null\n\n function handleChange(value: Dayjs | null) {\n void form.setFieldValue(\n name,\n value && value.isValid() ? value.format(\"YYYY-MM-DD\") : null,\n true,\n )\n }\n\n return (\n <LocalizationProvider\n dateAdapter={AdapterDayjs}\n adapterLocale=\"en-gb\"\n >\n <DatePicker\n name={name}\n value={value}\n minDate={minDate}\n maxDate={maxDate}\n onChange={handleChange}\n slotProps={{\n textField: {\n id: name,\n // @ts-expect-error value is compatible\n onChange: value => {\n handleChange(value as Dayjs | null)\n },\n onBlur: form.handleBlur,\n required,\n error: touched && Boolean(error),\n helperText: (touched && error) as false | string,\n },\n }}\n {...otherDatePickerProps}\n />\n </LocalizationProvider>\n )\n }}\n </Field>\n )\n}\n\nexport default DatePickerField\n","import { type FC, useEffect, useState } from \"react\"\nimport { Field, type FieldConfig, type FieldProps } from \"formik\"\nimport {\n TextField as MuiTextField,\n type TextFieldProps as MuiTextFieldProps,\n} from \"@mui/material\"\nimport { type StringSchema, type ValidateOptions, array as YupArray } from \"yup\"\n\nimport { type FormValues, schemaToFieldValidator } from \"../../utils/form\"\nimport { getNestedProperty } from \"../../utils/object\"\n\nexport type TextFieldProps = Omit<\n MuiTextFieldProps,\n | \"name\"\n | \"value\"\n | \"onChange\"\n | \"onBlur\"\n | \"error\"\n | \"defaultValue\"\n | \"helperText\"\n> & {\n name: string\n schema: StringSchema\n validateOptions?: ValidateOptions\n dirty?: boolean\n split?: string | RegExp\n unique?: boolean\n uniqueCaseInsensitive?: boolean\n}\n\n// https://formik.org/docs/examples/with-material-ui\nconst TextField: FC<TextFieldProps> = ({\n id,\n name,\n schema,\n type = \"text\",\n required = false,\n dirty = false,\n unique = false,\n uniqueCaseInsensitive = false,\n split,\n validateOptions,\n ...otherTextFieldProps\n}) => {\n const [initialValue, setInitialValue] = useState<string | string[]>(\"\")\n\n const dotPath = name.split(\".\")\n\n function buildSchema() {\n // Build a schema for a single string.\n let stringSchema = schema\n // 1: Validate string is required.\n stringSchema = required ? stringSchema.required() : stringSchema.optional()\n // 2: Validate string is dirty.\n if (dirty && !split)\n stringSchema = stringSchema.notOneOf(\n [initialValue as string],\n \"cannot be initial value\",\n )\n // Return a schema for a single string.\n if (!split) return stringSchema\n\n // Build a schema for an array of strings.\n let arraySchema = YupArray().of(stringSchema)\n // 1: Validate array has min one string.\n arraySchema = required\n ? arraySchema.required().min(1)\n : arraySchema.optional()\n // 2: Validate array has unique strings.\n if (unique || uniqueCaseInsensitive)\n arraySchema = arraySchema.test({\n message: \"cannot have duplicates\",\n test: values => {\n if (\n Array.isArray(values) &&\n values.length >= 2 &&\n values.every(value => typeof value === \"string\")\n ) {\n return (\n new Set(\n uniqueCaseInsensitive\n ? values.map(value => value.toLowerCase())\n : values,\n ).size === values.length\n )\n }\n\n return true\n },\n })\n // 3: Validate array is dirty.\n if (dirty)\n arraySchema = arraySchema.notOneOf(\n [initialValue as string[]],\n \"cannot be initial value\",\n )\n // Return a schema for an array of strings.\n return arraySchema\n }\n\n const fieldConfig: FieldConfig = {\n name,\n type,\n validate: schemaToFieldValidator(buildSchema(), validateOptions),\n }\n\n const FieldInternal: FC<FieldProps> = ({ form }) => {\n const initialValue = getNestedProperty(\n form.initialValues as FormValues,\n dotPath,\n ) as string\n const value = getNestedProperty(\n form.values as FormValues,\n dotPath,\n ) as string\n const error = getNestedProperty(form.errors, dotPath) as string | undefined\n const touched = getNestedProperty(form.touched, dotPath) as boolean\n\n useEffect(() => {\n setInitialValue(initialValue)\n }, [initialValue])\n\n useEffect(() => {\n void form.setFieldValue(\n name,\n split && typeof value === \"string\" ? value.split(split) : value,\n true,\n )\n }, [value]) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <MuiTextField\n id={id ?? name}\n name={name}\n type={type}\n required={required}\n value={value}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n error={touched && Boolean(error)}\n helperText={(touched && error) as false | string}\n {...otherTextFieldProps}\n />\n )\n }\n\n return <Field {...fieldConfig}>{FieldInternal}</Field>\n}\n\nexport default TextField\n","import { EmailOutlined as EmailOutlinedIcon } from \"@mui/icons-material\"\nimport type { FC } from \"react\"\nimport { InputAdornment } from \"@mui/material\"\nimport { string as YupString } from \"yup\"\n\nimport TextField, { type TextFieldProps } from \"./TextField\"\n\nexport type EmailFieldProps = Omit<TextFieldProps, \"type\" | \"name\" | \"schema\"> &\n Partial<Pick<TextFieldProps, \"name\">>\n\nconst EmailField: FC<EmailFieldProps> = ({\n name = \"email\",\n label = \"Email address\",\n placeholder = \"Enter your email address\",\n InputProps = {},\n ...otherTextFieldProps\n}) => {\n return (\n <TextField\n type=\"email\"\n schema={YupString().email()}\n name={name}\n label={label}\n placeholder={placeholder}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <EmailOutlinedIcon />\n </InputAdornment>\n ),\n ...InputProps,\n }}\n {...otherTextFieldProps}\n />\n )\n}\n\nexport default EmailField\n","import type { FC } from \"react\"\nimport { InputAdornment } from \"@mui/material\"\nimport { PersonOutlined as PersonOutlinedIcon } from \"@mui/icons-material\"\n\nimport TextField, { type TextFieldProps } from \"./TextField\"\nimport { schemas } from \"../../api\"\n\nexport type FirstNameFieldProps = Omit<\n TextFieldProps,\n \"type\" | \"name\" | \"schema\"\n> &\n Partial<Pick<TextFieldProps, \"name\">>\n\nconst FirstNameField: FC<FirstNameFieldProps> = ({\n name = \"first_name\",\n label = \"First name\",\n placeholder = \"Enter your first name\",\n InputProps = {},\n ...otherTextFieldProps\n}) => {\n return (\n <TextField\n schema={schemas.user.first_name}\n name={name}\n label={label}\n placeholder={placeholder}\n InputProps={{\n endAdornment: (\n <InputAdornment position=\"end\">\n <PersonOutlinedIcon />\n </InputAdornment>\n ),\n ...InputProps,\n }}\n {...otherTextFieldProps}\n />\n )\n}\n\nexport default FirstNameField\n","import {\n type FC,\n type JSX,\n type ReactNode,\n type RefObject,\n useEffect,\n useRef,\n} from \"react\"\nimport { FormHelperText, type FormHelperTextProps } from \"@mui/material\"\nimport {\n Formik,\n type FormikConfig,\n type FormikErrors,\n Form as FormikForm,\n type FormikProps,\n} from \"formik\"\nimport type { TypedUseMutation } from \"@reduxjs/toolkit/query/react\"\n\nimport {\n type FormValues,\n type SubmitFormOptions,\n submitForm,\n} from \"../../utils/form\"\nimport { getKeyPaths } from \"../../utils/object\"\n\nconst SCROLL_INTO_VIEW_OPTIONS: ScrollIntoViewOptions = {\n behavior: \"smooth\",\n block: \"start\",\n}\n\ntype NonFieldErrorsProps = Omit<FormHelperTextProps, \"error\" | \"ref\"> & {\n scrollIntoViewOptions?: ScrollIntoViewOptions\n}\n\nconst NonFieldErrors: FC<NonFieldErrorsProps> = ({\n scrollIntoViewOptions = SCROLL_INTO_VIEW_OPTIONS,\n ...formHelperTextProps\n}) => {\n const pRef = useRef<HTMLParagraphElement>(null)\n\n useEffect(() => {\n if (pRef.current) pRef.current.scrollIntoView(scrollIntoViewOptions)\n }, [scrollIntoViewOptions])\n\n return <FormHelperText ref={pRef} error {...formHelperTextProps} />\n}\n\nexport type FormErrors<Values> = FormikErrors<\n Omit<Values, \"__all__\"> & { __all__: string }\n>\n\ntype _FormikProps<Values> = Omit<FormikProps<Values>, \"errors\"> & {\n errors: FormErrors<Values>\n}\n\ntype BaseFormProps<Values> = Omit<FormikConfig<Values>, \"children\"> & {\n children: ReactNode | ((props: _FormikProps<Values>) => ReactNode)\n scrollIntoViewOptions?: ScrollIntoViewOptions\n nonFieldErrorsProps?: Omit<NonFieldErrorsProps, \"children\">\n fieldRefs?: Array<{\n name: string\n inputRef: RefObject<HTMLInputElement | null>\n }>\n}\n\nconst BaseForm = <Values extends FormValues>({\n children,\n scrollIntoViewOptions = SCROLL_INTO_VIEW_OPTIONS,\n nonFieldErrorsProps,\n fieldRefs = [],\n ...otherFormikProps\n}: BaseFormProps<Values>) => (\n <Formik {...otherFormikProps}>\n {/* @ts-expect-error value is assignable */}\n {(formik: _FormikProps<Values>) => {\n const hasErrors = Boolean(Object.keys(formik.errors).length)\n const hasNonFieldErrors =\n hasErrors && typeof formik.errors.__all__ === \"string\"\n\n // If a submission was attempted and refs to the fields were provided.\n if (\n hasErrors &&\n !hasNonFieldErrors &&\n formik.isSubmitting &&\n fieldRefs.length\n ) {\n const errorNames = getKeyPaths(formik.errors)\n\n const input = fieldRefs.find(({ name }) => errorNames.includes(name))\n ?.inputRef.current\n\n if (input) input.scrollIntoView(scrollIntoViewOptions)\n }\n\n return (\n <>\n {hasNonFieldErrors && (\n <NonFieldErrors {...nonFieldErrorsProps}>\n {formik.errors.__all__ as string}\n </NonFieldErrors>\n )}\n <FormikForm>\n {typeof children === \"function\" ? children(formik) : children}\n </FormikForm>\n </>\n )\n }}\n </Formik>\n)\n\ntype SubmitFormProps<\n Values extends FormValues,\n QueryArg extends FormValues,\n ResultType,\n> = Omit<BaseFormProps<Values>, \"onSubmit\"> & {\n useMutation: TypedUseMutation<ResultType, QueryArg, any>\n} & (Values extends QueryArg\n ? { submitOptions?: SubmitFormOptions<Values, QueryArg, ResultType> }\n : { submitOptions: SubmitFormOptions<Values, QueryArg, ResultType> })\n\nconst SubmitForm = <\n Values extends FormValues,\n QueryArg extends FormValues,\n ResultType,\n>({\n useMutation,\n submitOptions,\n ...baseFormProps\n}: SubmitFormProps<Values, QueryArg, ResultType>): JSX.Element => {\n const [trigger] = useMutation()\n\n return (\n <BaseForm\n {...baseFormProps}\n onSubmit={submitForm<Values, QueryArg, ResultType>(\n trigger,\n baseFormProps.initialValues,\n submitOptions as SubmitFormOptions<Values, QueryArg, ResultType>,\n )}\n />\n )\n}\n\nexport type FormProps<\n Values extends FormValues,\n QueryArg extends FormValues,\n ResultType,\n> = BaseFormProps<Values> | SubmitFormProps<Values, QueryArg, ResultType>\n\nconst Form: {\n <Values extends FormValues>(props: BaseFormProps<Values>): JSX.Element\n <Values extends FormValues, QueryArg extends FormValues, ResultType>(\n props: SubmitFormProps<Values, QueryArg, ResultType>,\n ): JSX.Element\n} = <\n Values extends FormValues = FormValues,\n QueryArg extends FormValues = FormValues,\n ResultType = any,\n>(\n props: FormProps<Values, QueryArg, ResultType>,\n): JSX.Element => {\n return \"onSubmit\" in props ? <BaseForm {...props} /> : SubmitForm(props)\n}\n\nexport default Form\n","import { type FC } from \"react\"\nimport { string as YupString } from \"yup\"\n\nimport TextField, { type TextFieldProps } from \"./TextField\"\n\nexport type OtpFieldProps = Omit<\n TextFieldProps,\n \"name\" | \"schema\" | \"required\"\n> &\n Partial<Pick<TextFieldProps, \"name\">>\n\nconst OtpField: FC<OtpFieldProps> = ({\n name = \"otp\",\n label = \"OTP\",\n placeholder = \"Enter your OTP\",\n ...otherTextFieldProps\n}) => (\n <TextField\n name={name}\n label={label}\n schema={YupString().matches(/^[0-9]{6}$/, \"Must be exactly 6 digits.\")}\n placeholder={placeholder}\n required\n {...otherTextFieldProps}\n />\n)\n\nexport default OtpField\n","import {\n type Dispatch,\n type FC,\n type SetStateAction,\n useEffect,\n useState,\n} from \"react\"\nimport { Field, type FieldConfig, type FieldProps } from \"formik\"\nimport { TextField as MuiTextField, type TextFieldProps } from \"@mui/material\"\nimport { type ValidateOptions, string as YupString } from \"yup\"\n\nimport { type FormValues, schemaToFieldValidator } from \"../../utils/form\"\nimport { getNestedProperty } from \"../../utils/object\"\n\nexport type RepeatFieldProps = Omit<\n TextFieldProps,\n | \"name\"\n | \"value\"\n | \"onChange\"\n | \"onBlur\"\n | \"error\"\n | \"helperText\"\n | \"defaultValue\"\n | \"required\"\n> & {\n name: string\n validateOptions?: ValidateOptions\n}\n\nconst TextField: FC<\n RepeatFieldProps & {\n repeatName: string\n setValue: Dispatch<SetStateAction<string>>\n fieldProps: FieldProps\n }\n> = ({\n id,\n repeatName,\n setValue,\n fieldProps,\n name,\n label,\n placeholder,\n type,\n ...otherTextFieldProps\n}) => {\n const { form } = fieldProps\n\n const dotPath = name.split(\".\")\n const value = getNestedProperty(form.values as FormValues, dotPath) as string\n\n const repeatDotPath = repeatName.split(\".\")\n const repeatValue = getNestedProperty(\n form.values as FormValues,\n repeatDotPath,\n ) as string\n const repeatTouched = getNestedProperty(\n form.touched,\n repeatDotPath,\n ) as boolean\n const repeatError = getNestedProperty(form.errors, repeatDotPath) as\n | string\n | undefined\n\n useEffect(() => {\n setValue(value)\n }, [setValue, value])\n\n return (\n <MuiTextField\n required\n type={type}\n label={label ?? `Repeat ${name.replace(\"_\", \" \")}`}\n placeholder={placeholder ?? `Enter your ${name.replace(\"_\", \" \")} again`}\n id={id ?? repeatName}\n name={repeatName}\n value={repeatValue}\n onChange={form.handleChange}\n onBlur={form.handleBlur}\n error={repeatTouched && Boolean(repeatError)}\n helperText={(repeatTouched && repeatError) as false | string}\n {...otherTextFieldProps}\n />\n )\n}\n\n// https://formik.org/docs/examples/with-material-ui\nconst RepeatField: FC<RepeatFieldProps> = ({\n name,\n type = \"text\",\n validateOptions,\n ...otherTextFieldProps\n}) => {\n const [value, setValue] = useState(\"\")\n\n const repeatName = `${name}_repeat`\n\n const fieldConfig: FieldConfig = {\n name: repeatName,\n type,\n validate: schemaToFieldValidator(\n YupString().required().equals([value], \"does not match\"),\n validateOptions,\n ),\n }\n\n return (\n <Field {...fieldConfig}>\n {(fieldProps: FieldProps) => (\n <TextField\n name={name}\n type={type}\n repeatName={repeatName}\n setValue={setValue}\n fieldProps={fieldProps}\n {...otherTextFieldProps}\n />\n )}\n </Field>\n )\n}\n\nexport default RepeatField\n","import { type FC, useState } from \"react\"\nimport { IconButton, InputAdornment } from \"@mui/material\"\nimport {\n Visibility as VisibilityIcon,\n VisibilityOff as VisibilityOffIcon,\n} from \"@mui/icons-material\"\nimport { string as YupString } from \"yup\"\n\nimport RepeatField, { type RepeatFieldProps } from \"./RepeatField\"\nimport TextField, { type TextFieldProps } from \"./TextField\"\n\nexport type PasswordFieldProps = Omit<\n TextFieldProps,\n \"type\" | \"name\" | \"schema\" | \"autoComplete\"\n> &\n Partial<Pick<TextFieldProps, \"name\" | \"schema\">> & {\n withRepeatField?: boolean\n repeatFieldProps?: Omit<RepeatFieldProps, \"name\" | \"type\">\n }\n\nconst PasswordField: FC<PasswordFieldProps> = ({\n name = \"password\",\n label = \"Password\",\n placeholder = \"Enter your password\",\n schema = YupString(),\n InputProps = {},\n withRepeatField = false,\n repeatFieldProps = {},\n ...otherTextFieldProps\n}) => {\n const [isVisible, setIsVisible] = useState(false)\n\n const type = isVisible ? \"text\" : \"password\"\n const endAdornment = (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() => {\n setIsVisible(previousIsVisible => !previousIsVisible)\n }}\n edge=\"end\"\n >\n {isVisible ? <VisibilityIcon /> : <VisibilityOffIcon />}\n </IconButton>\n </InputAdornment>\n )\n\n return (\n <>\n <TextField\n autoComplete=\"off\"\n type={type}\n name={name}\n label={label}\n schema={schema}\n placeholder={placeholder}\n InputProps={{ endAdornment, ...InputProps }}\n {...otherTextFieldProps}\n />\n {withRepeatField && (\n <RepeatField\n name={name}\n type={type}\n {...repeatFieldProps}\n InputProps={{ endAdornment, ...repeatFieldProps.InputProps }}\n />\n )}\n </>\n )\n}\n\nexport default PasswordField\n","import { Button, type ButtonProps } from \"@mui/material\"\nimport { Field, type FieldProps } from \"formik\"\nimport type { FC } from \"react\"\n\nimport { type FormValues } from \"../../utils/form\"\n\nexport interface SubmitButtonProps\n extends Omit<ButtonProps, \"type\" | \"onClick\"> {}\n\nconst SubmitButton: FC<SubmitButtonProps> = ({\n children = \"Submit\",\n ...otherButtonProps\n}) => {\n function getTouched(\n values: Record<string, any>,\n touched?: Record<string, any>,\n ) {\n touched = touched || {}\n for (const key in values) {\n const value: unknown = values[key]\n touched[key] =\n value instanceof Object && value.constructor === Object\n ? getTouched(value, touched)\n : true\n }\n\n return touched\n }\n\n return (\n <Field name=\"submit\" type=\"submit\">\n {({ form }: FieldProps) => (\n <Button\n type=\"button\"\n onClick={() => {\n void form\n .setTouched(getTouched(form.values as FormValues), true)\n .then(errors => {\n const hasErrors = Boolean(errors && Object.keys(errors).length)\n // If has errors, set isSubmitting=true so fields in the form are\n // aware that a submission was attempted. Else, set\n // isSubmitting=false as it will be set to true when calling\n // submitForm().\n form.setSubmitting(hasErrors)\n if (!hasErrors) void form.submitForm()\n })\n }}\n {...otherButtonProps}\n >\n {children}\n </Button>\n )}\n </Field>\n )\n}\n\nexport default SubmitButton\n","import { type ElementType, type JSX } from \"react\"\nimport { type ChipTypeMap } from \"@mui/material\"\n\nimport AutocompleteField, {\n type AutocompleteFieldProps,\n} from \"./AutocompleteField\"\nimport { UK_COUNTIES } from \"../../utils/location\"\n\nexport interface UkCountyFieldProps<\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n> extends Omit<\n AutocompleteFieldProps<\n string,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >,\n \"options\" | \"textFieldProps\"\n > {\n textFieldProps?: Omit<\n AutocompleteFieldProps<\n string,\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n >[\"textFieldProps\"],\n \"name\"\n > & {\n name?: string\n }\n}\n\nconst UkCountyField = <\n Multiple extends boolean | undefined = false,\n DisableClearable extends boolean | undefined = false,\n FreeSolo extends boolean | undefined = false,\n ChipComponent extends ElementType = ChipTypeMap[\"defaultComponent\"],\n>({\n textFieldProps,\n ...otherAutocompleteFieldProps\n}: UkCountyFieldProps<\n Multiple,\n DisableClearable,\n FreeSolo,\n ChipComponent\n>): JSX.Element => {\n const {\n name = \"uk_county\",\n label = \"UK county\",\n placeholder = \"Select your UK county\",\n ...otherTextFieldProps\n } = textFieldProps || {}\n\n return (\n <AutocompleteField\n options={UK_COUNTIES}\n textFieldProps={{ name, label, placeholder, ...otherTextFieldProps }}\n {...otherAutocompleteFieldProps}\n />\n )\n}\n\nexport default UkCountyField\n"],"names":["ApiAutocompleteField","useLazyListQuery","filterOptions","getOptionLabel","getOptionKey","result","searchKey","otherAutocompleteFieldProps","search","setSearch","useState","trigger","isLoading","isError","limit","offset","setPagination","usePagination","options","hasMore","setState","useEffect","arg","data","count","previousOptions","error","optionKeys","jsx","Fragment","loadNextPage","page","ListboxComponent","children","props","ref","listItems","Children","CircularProgress","SyncError","Button","event","AutocompleteField","id","_","value","reason","forwardRef","textFieldProps","validateOptions","otherAutocompleteProps","name","required","otherTextFieldProps","dotPath","message","schema","YupString","YupNumber","fieldConfig","schemaToFieldValidator","Field","form","meta","getNestedProperty","touched","Autocomplete","otherParams","TextField","CheckboxField","formControlLabelProps","errorMessage","otherCheckboxProps","YupBool","hasError","jsxs","FormControl","FormControlLabel","Checkbox","FormHelperText","CountryField","label","placeholder","COUNTRY_ISO_CODES","isoCode","COUNTRY_ISO_CODE_MAPPING","DatePickerField","minDate","maxDate","otherDatePickerProps","dateToString","date","YupDate","dayjs","handleChange","LocalizationProvider","AdapterDayjs","DatePicker","type","dirty","unique","uniqueCaseInsensitive","split","initialValue","setInitialValue","buildSchema","stringSchema","arraySchema","YupArray","values","FieldInternal","MuiTextField","EmailField","InputProps","InputAdornment","EmailOutlinedIcon","FirstNameField","schemas.user","PersonOutlinedIcon","SCROLL_INTO_VIEW_OPTIONS","NonFieldErrors","scrollIntoViewOptions","formHelperTextProps","pRef","useRef","BaseForm","nonFieldErrorsProps","fieldRefs","otherFormikProps","Formik","formik","hasErrors","hasNonFieldErrors","errorNames","getKeyPaths","input","FormikForm","SubmitForm","useMutation","submitOptions","baseFormProps","submitForm","Form","OtpField","repeatName","setValue","fieldProps","repeatDotPath","repeatValue","repeatTouched","repeatError","RepeatField","PasswordField","withRepeatField","repeatFieldProps","isVisible","setIsVisible","endAdornment","IconButton","previousIsVisible","VisibilityIcon","VisibilityOffIcon","SubmitButton","otherButtonProps","getTouched","key","errors","UkCountyField","UK_COUNTIES"],"mappings":"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"}
@@ -5,8 +5,8 @@ import { useState as _, useEffect as y, Children as k } from "react";
5
5
  import { useLocation as P, useParams as Y, useNavigate as E, generatePath as R } from "react-router";
6
6
  import { ErrorOutline as A, InfoOutlined as V, CloseOutlined as q, ChevronLeft as z, ChevronRight as F } from "@mui/icons-material";
7
7
  import { p as O, t as M, s as W, a as b } from "./palette-CYwuLBW7.js";
8
- import { a as D } from "./auth-C3UdJFcP.js";
9
- import { L as T } from "./LinkButton-EQvTNtbi.js";
8
+ import { a as D } from "./auth-BXLedrZH.js";
9
+ import { L as T } from "./LinkButton-BeFBbR7x.js";
10
10
  import { object as G, string as H } from "yup";
11
11
  import { tryValidateSync as J } from "./utils/schema.es.js";
12
12
  const m = ({ boxProps: s, ...t }) => /* @__PURE__ */ r(B, { ...s, children: /* @__PURE__ */ r(L, { ...t }) }), w = ({
@@ -239,4 +239,4 @@ export {
239
239
  U as T,
240
240
  cr as i
241
241
  };
242
- //# sourceMappingURL=index-CYI_rUWI.js.map
242
+ //# sourceMappingURL=index-DeEIS6R8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-CYI_rUWI.js","sources":["../src/components/page/Section.tsx","../src/components/page/Notification.tsx","../src/components/page/Page.tsx","../src/components/page/Banner.tsx","../src/components/page/TabBar.tsx"],"sourcesContent":["import {\n Box,\n type BoxProps,\n Container,\n type ContainerProps,\n} from \"@mui/material\"\nimport type { FC } from \"react\"\n\nexport interface SectionProps extends ContainerProps {\n boxProps?: Omit<BoxProps, \"children\">\n}\n\nconst Section: FC<SectionProps> = ({ boxProps, ...containerProps }) => {\n return (\n <Box {...boxProps}>\n <Container {...containerProps} />\n </Box>\n )\n}\n\nexport default Section\n","import {\n CloseOutlined as CloseOutlinedIcon,\n ErrorOutline as ErrorOutlineIcon,\n InfoOutlined as InfoOutlinedIcon,\n} from \"@mui/icons-material\"\nimport { type FC, type ReactNode, useEffect, useState } from \"react\"\nimport { IconButton, Stack, Typography } from \"@mui/material\"\n\nimport Section from \"./Section\"\nimport palette from \"../../theme/palette\"\n\nexport interface NotificationProps {\n open?: boolean\n error?: boolean\n onClose?: () => void\n children: ReactNode\n bgcolor?: \"secondary\" | \"tertiary\"\n}\n\nconst Notification: FC<NotificationProps> = ({\n open = true,\n error = false,\n onClose,\n children,\n bgcolor = \"secondary\",\n}) => {\n const [_open, _setOpen] = useState(open)\n\n useEffect(() => {\n _setOpen(open)\n }, [open])\n\n if (!_open) return <></>\n\n // @ts-expect-error guaranteed to be in palette\n const contrastText = palette[bgcolor].contrastText as string\n\n return (\n <Section\n boxProps={{\n bgcolor: {\n secondary: \"#ffd23b\",\n tertiary: \"#08bafc\",\n }[bgcolor],\n }}\n sx={{ paddingY: \"5px\" }}\n >\n <Stack direction=\"row\" alignItems=\"center\" gap={2}>\n {error ? (\n <ErrorOutlineIcon htmlColor={contrastText} />\n ) : (\n <InfoOutlinedIcon htmlColor={contrastText} />\n )}\n <Typography variant=\"body2\" color={contrastText} mb={0}>\n {children}\n </Typography>\n <IconButton\n style={{ marginLeft: \"auto\" }}\n onClick={() => {\n _setOpen(false)\n if (onClose !== undefined) onClose()\n }}\n >\n <CloseOutlinedIcon htmlColor={contrastText} />\n </IconButton>\n </Stack>\n </Section>\n )\n}\n\nexport default Notification\n","import { Children, type JSX, useEffect } from \"react\"\nimport { type Location, useLocation } from \"react-router\"\n\nimport Notification, { type NotificationProps } from \"./Notification\"\nimport {\n type SelectIsLoggedIn,\n type SessionMetadata,\n type UseSessionChildren,\n type UseSessionChildrenFunction,\n type UseSessionOptions,\n useSession,\n} from \"../../hooks/auth\"\n\nexport type PageState = {\n notifications: Array<{\n index?: number\n props: NotificationProps\n }>\n scroll: { x: number; y: number }\n}\n\nexport interface PageProps<\n SessionUserType extends SessionMetadata[\"user_type\"] | undefined,\n> {\n selectIsLoggedIn: SelectIsLoggedIn\n children: UseSessionChildren<SessionUserType>\n session?: UseSessionOptions<SessionUserType>\n}\n\nconst Page = <\n SessionUserType extends SessionMetadata[\"user_type\"] | undefined = undefined,\n>({\n selectIsLoggedIn,\n children,\n session,\n}: PageProps<SessionUserType>): JSX.Element => {\n const { state } = useLocation() as Location<null | Partial<PageState>>\n\n let { scroll, notifications } = state || {}\n scroll = scroll || { x: 0, y: 0 }\n notifications = notifications || []\n\n useEffect(() => {\n window.scroll(scroll.x, scroll.y)\n }, [scroll.x, scroll.y])\n\n return (\n <>\n {useSession(\n selectIsLoggedIn,\n (metadata?: SessionMetadata) => {\n if (typeof children === \"function\") {\n children = metadata\n ? (children as UseSessionChildrenFunction<true>)(metadata)\n : (children as UseSessionChildrenFunction<false>)(metadata)\n }\n\n if (notifications.length) {\n const childrenArray = Children.toArray(children)\n\n notifications.forEach((notification, index) => {\n void childrenArray.splice(\n notification.index ?? index,\n 0,\n <Notification {...notification.props} />,\n )\n })\n\n return childrenArray\n }\n\n return children\n },\n session,\n )}\n </>\n )\n}\n\nexport default Page\n","import { Stack, Typography } from \"@mui/material\"\n\nimport Image, { type ImageProps } from \"../Image\"\nimport { LinkButton, type LinkButtonProps } from \"../router\"\nimport { primary, secondary, tertiary } from \"../../theme/colors\"\nimport Section from \"./Section\"\nimport palette from \"../../theme/palette\"\n\nexport interface BannerProps<\n Button1State extends Record<string, any> = Record<string, any>,\n Button2State extends Record<string, any> = Record<string, any>,\n> {\n header: string\n subheader?: string\n textAlign?: \"start\" | \"center\"\n imageProps?: ImageProps\n button1Props?: LinkButtonProps<\"to\", Button1State>\n button2Props?: LinkButtonProps<\"to\", Button2State>\n bgcolor?: \"primary\" | \"secondary\" | \"tertiary\"\n}\n\nconst Banner = <\n Button1State extends Record<string, any> = Record<string, any>,\n Button2State extends Record<string, any> = Record<string, any>,\n>({\n header,\n subheader,\n textAlign = \"start\",\n imageProps,\n button1Props,\n button2Props,\n bgcolor = \"primary\",\n}: BannerProps<Button1State, Button2State>) => {\n // @ts-expect-error guaranteed to be in palette\n const contrastText = palette[bgcolor].contrastText as string\n\n return (\n <Section\n boxProps={{\n bgcolor: {\n primary: primary[500],\n secondary: secondary[500],\n tertiary: tertiary[500],\n }[bgcolor],\n }}\n sx={{ paddingY: 0 }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent={textAlign}\n gap={2}\n >\n <Stack\n py={{\n xs: \"80px\",\n md: imageProps !== undefined ? 0 : \"100px\",\n }}\n textAlign={textAlign}\n >\n <Typography\n variant=\"h2\"\n color={contrastText}\n mb={subheader !== undefined ? undefined : 0}\n >\n {header}\n </Typography>\n {subheader !== undefined && (\n <Typography\n color={contrastText}\n variant=\"h4\"\n mb={button1Props !== undefined ? undefined : 0}\n >\n {subheader}\n </Typography>\n )}\n <Stack direction=\"row\" gap={2}>\n {button1Props !== undefined && <LinkButton {...button1Props} />}\n {button2Props !== undefined && <LinkButton {...button2Props} />}\n </Stack>\n </Stack>\n {imageProps !== undefined && (\n <Image\n {...imageProps}\n display={{ xs: \"none\", md: \"block\" }}\n maxWidth=\"320px\"\n marginLeft=\"auto\"\n />\n )}\n </Stack>\n </Section>\n )\n}\n\nexport default Banner\n","import {\n ChevronLeft as ChevronLeftIcon,\n ChevronRight as ChevronRightIcon,\n} from \"@mui/icons-material\"\nimport { type FC, type ReactNode, useEffect, useState } from \"react\"\nimport {\n IconButton,\n Tab,\n type TabScrollButtonProps,\n Tabs,\n Typography,\n} from \"@mui/material\"\nimport { object as YupObject, string as YupString } from \"yup\"\nimport { generatePath, useNavigate, useParams } from \"react-router\"\n\nimport Section from \"./Section\"\nimport { primary } from \"../../theme/colors\"\nimport { tryValidateSync } from \"../../utils/schema\"\n\nexport interface TabBarProps {\n header: string\n tabs: Array<{\n label: string\n children: ReactNode\n path: string\n }>\n originalPath: string\n value?: number\n}\n\nconst TabBar: FC<TabBarProps> = ({ header, tabs, originalPath, value = 0 }) => {\n const params = useParams()\n const navigate = useNavigate()\n const [_value, _setValue] = useState(\n value < 0 ? 0 : value >= tabs.length ? tabs.length - 1 : value,\n )\n\n const labels = tabs.map(tab => tab.label)\n const children = tabs.map(tab => tab.children)\n const paths = tabs.map(tab => tab.path)\n\n useEffect(() => {\n _setValue(value)\n }, [value])\n\n useEffect(() => {\n const tab = tryValidateSync(\n params,\n YupObject({\n tab: YupString().oneOf(paths).required(),\n }),\n )?.tab\n\n if (tab !== undefined) {\n _setValue(paths.indexOf(tab))\n }\n }, [params, paths])\n\n return (\n <>\n <Section\n boxProps={{ bgcolor: primary[500] }}\n sx={{ paddingY: \"100px\" }}\n className=\"flex-center\"\n >\n <Typography\n textAlign=\"center\"\n variant=\"h2\"\n style={{ color: \"white\" }}\n mb={0}\n >\n {header}\n </Typography>\n </Section>\n <Section\n boxProps={{ bgcolor: primary[300] }}\n sx={{ paddingY: \"6px\" }}\n className=\"flex-center\"\n >\n <Tabs\n value={_value}\n onChange={(_, value: number) => {\n void navigate(\n generatePath(originalPath, {\n tab: paths[value],\n }),\n )\n }}\n ScrollButtonComponent={({\n disabled,\n onClick,\n direction,\n }: TabScrollButtonProps) => {\n return (\n <>\n {disabled === false && (\n <IconButton\n onClick={onClick}\n style={{\n padding: 0,\n [direction === \"left\" ? \"marginRight\" : \"marginLeft\"]:\n \"15px\",\n color: \"white\",\n }}\n >\n {direction === \"left\" ? (\n <>\n <ChevronLeftIcon />\n </>\n ) : (\n <>\n <ChevronRightIcon />\n </>\n )}\n </IconButton>\n )}\n </>\n )\n }}\n >\n {labels.map(label => (\n <Tab disableRipple key={label} label={label} />\n ))}\n </Tabs>\n </Section>\n {children[_value]}\n </>\n )\n}\n\nexport default TabBar\n"],"names":["Section","boxProps","containerProps","jsx","Box","Container","Notification","open","error","onClose","children","bgcolor","_open","_setOpen","useState","useEffect","Fragment","contrastText","palette","Stack","ErrorOutlineIcon","InfoOutlinedIcon","Typography","IconButton","CloseOutlinedIcon","Page","selectIsLoggedIn","session","state","useLocation","scroll","notifications","useSession","metadata","childrenArray","Children","notification","index","Banner","header","subheader","textAlign","imageProps","button1Props","button2Props","primary","secondary","tertiary","jsxs","LinkButton","Image","TabBar","tabs","originalPath","value","params","useParams","navigate","useNavigate","_value","_setValue","labels","tab","paths","tryValidateSync","YupObject","YupString","Tabs","_","generatePath","disabled","onClick","direction","ChevronLeftIcon","ChevronRightIcon","label","Tab"],"mappings":";;;;;;;;;;;AAYA,MAAMA,IAA4B,CAAC,EAAE,UAAAC,GAAU,GAAGC,QAE9C,gBAAAC,EAACC,KAAK,GAAGH,GACP,4BAACI,GAAA,EAAW,GAAGH,GAAgB,EAAA,CACjC,GCGEI,IAAsC,CAAC;AAAA,EAC3C,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC,IAAU;AACZ,MAAM;AACJ,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAASP,CAAI;AAMvC,MAJAQ,EAAU,MAAM;AACd,IAAAF,EAASN,CAAI;AAAA,EACf,GAAG,CAACA,CAAI,CAAC,GAEL,CAACK,EAAO,QAAO,gBAAAT,EAAAa,GAAA,CAAA,CAAE;AAGrB,QAAMC,IAAeC,EAAQP,CAAO,EAAE;AAEtC,SACE,gBAAAR;AAAA,IAACH;AAAA,IAAA;AAAA,MACC,UAAU;AAAA,QACR,SAAS;AAAA,UACP,WAAW;AAAA,UACX,UAAU;AAAA,QAAA,EACVW,CAAO;AAAA,MAAA;AAAA,MAEX,IAAI,EAAE,UAAU,MAAA;AAAA,MAEhB,4BAACQ,GAAA,EAAM,WAAU,OAAM,YAAW,UAAS,KAAK,GAC7C,UAAA;AAAA,QAAAX,IACC,gBAAAL,EAACiB,KAAiB,WAAWH,EAAA,CAAc,IAE3C,gBAAAd,EAACkB,GAAA,EAAiB,WAAWJ,EAAA,CAAc;AAAA,QAE7C,gBAAAd,EAACmB,KAAW,SAAQ,SAAQ,OAAOL,GAAc,IAAI,GAClD,UAAAP,GACH;AAAA,QACA,gBAAAP;AAAA,UAACoB;AAAA,UAAA;AAAA,YACC,OAAO,EAAE,YAAY,OAAA;AAAA,YACrB,SAAS,MAAM;AACb,cAAAV,EAAS,EAAK,GACVJ,MAAY,UAAWA,EAAA;AAAA,YAC7B;AAAA,YAEA,UAAA,gBAAAN,EAACqB,GAAA,EAAkB,WAAWP,EAAA,CAAc;AAAA,UAAA;AAAA,QAAA;AAAA,MAC9C,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN,GCvCMQ,IAAO,CAEX;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAhB;AAAA,EACA,SAAAiB;AACF,MAA+C;AAC7C,QAAM,EAAE,OAAAC,EAAA,IAAUC,EAAA;AAElB,MAAI,EAAE,QAAAC,GAAQ,eAAAC,EAAA,IAAkBH,KAAS,CAAA;AACzC,SAAAE,IAASA,KAAU,EAAE,GAAG,GAAG,GAAG,EAAA,GAC9BC,IAAgBA,KAAiB,CAAA,GAEjChB,EAAU,MAAM;AACd,WAAO,OAAOe,EAAO,GAAGA,EAAO,CAAC;AAAA,EAClC,GAAG,CAACA,EAAO,GAAGA,EAAO,CAAC,CAAC,GAGrB,gBAAA3B,EAAAa,GAAA,EACG,UAAAgB;AAAA,IACCN;AAAA,IACA,CAACO,MAA+B;AAO9B,UANI,OAAOvB,KAAa,eACtBA,IACKA,EAA8CuB,CAAQ,IAIzDF,EAAc,QAAQ;AACxB,cAAMG,IAAgBC,EAAS,QAAQzB,CAAQ;AAE/C,eAAAqB,EAAc,QAAQ,CAACK,GAAcC,MAAU;AAC7C,UAAKH,EAAc;AAAA,YACjBE,EAAa,SAASC;AAAA,YACtB;AAAA,YACA,gBAAAlC,EAACG,GAAA,EAAc,GAAG8B,EAAa,MAAA,CAAO;AAAA,UAAA;AAAA,QAE1C,CAAC,GAEMF;AAAA,MACT;AAEA,aAAOxB;AAAA,IACT;AAAA,IACAiB;AAAA,EAAA,GAEJ;AAEJ,GCxDMW,IAAS,CAGb;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,SAAAjC,IAAU;AACZ,MAA+C;AAE7C,QAAMM,IAAeC,EAAQP,CAAO,EAAE;AAEtC,SACE,gBAAAR;AAAA,IAACH;AAAA,IAAA;AAAA,MACC,UAAU;AAAA,QACR,SAAS;AAAA,UACP,SAAS6C,EAAQ,GAAG;AAAA,UACpB,WAAWC,EAAU,GAAG;AAAA,UACxB,UAAUC,EAAS,GAAG;AAAA,QAAA,EACtBpC,CAAO;AAAA,MAAA;AAAA,MAEX,IAAI,EAAE,UAAU,EAAA;AAAA,MAEhB,UAAA,gBAAAqC;AAAA,QAAC7B;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,YAAW;AAAA,UACX,gBAAgBsB;AAAA,UAChB,KAAK;AAAA,UAEL,UAAA;AAAA,YAAA,gBAAAO;AAAA,cAAC7B;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,IAAI;AAAA,kBACJ,IAAIuB,MAAe,SAAY,IAAI;AAAA,gBAAA;AAAA,gBAErC,WAAAD;AAAA,gBAEA,UAAA;AAAA,kBAAA,gBAAAtC;AAAA,oBAACmB;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,OAAOL;AAAA,sBACP,IAAIuB,MAAc,SAAY,SAAY;AAAA,sBAEzC,UAAAD;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEFC,MAAc,UACb,gBAAArC;AAAA,oBAACmB;AAAA,oBAAA;AAAA,sBACC,OAAOL;AAAA,sBACP,SAAQ;AAAA,sBACR,IAAI0B,MAAiB,SAAY,SAAY;AAAA,sBAE5C,UAAAH;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGL,gBAAAQ,EAAC7B,GAAA,EAAM,WAAU,OAAM,KAAK,GACzB,UAAA;AAAA,oBAAAwB,MAAiB,UAAa,gBAAAxC,EAAC8C,GAAA,EAAY,GAAGN,EAAA,CAAc;AAAA,oBAC5DC,MAAiB,UAAa,gBAAAzC,EAAC8C,GAAA,EAAY,GAAGL,EAAA,CAAc;AAAA,kBAAA,EAAA,CAC/D;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAEDF,MAAe,UACd,gBAAAvC;AAAA,cAAC+C;AAAA,cAAA;AAAA,gBACE,GAAGR;AAAA,gBACJ,SAAS,EAAE,IAAI,QAAQ,IAAI,QAAA;AAAA,gBAC3B,UAAS;AAAA,gBACT,YAAW;AAAA,cAAA;AAAA,YAAA;AAAA,UACb;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAGN,GC9DMS,IAA0B,CAAC,EAAE,QAAAZ,GAAQ,MAAAa,GAAM,cAAAC,GAAc,OAAAC,IAAQ,QAAQ;AAC7E,QAAMC,IAASC,EAAA,GACTC,IAAWC,EAAA,GACX,CAACC,GAAQC,CAAS,IAAI9C;AAAA,IAC1BwC,IAAQ,IAAI,IAAIA,KAASF,EAAK,SAASA,EAAK,SAAS,IAAIE;AAAA,EAAA,GAGrDO,IAAST,EAAK,IAAI,CAAAU,MAAOA,EAAI,KAAK,GAClCpD,IAAW0C,EAAK,IAAI,CAAAU,MAAOA,EAAI,QAAQ,GACvCC,IAAQX,EAAK,IAAI,CAAAU,MAAOA,EAAI,IAAI;AAEtC,SAAA/C,EAAU,MAAM;AACd,IAAA6C,EAAUN,CAAK;AAAA,EACjB,GAAG,CAACA,CAAK,CAAC,GAEVvC,EAAU,MAAM;AACd,UAAM+C,IAAME;AAAA,MACVT;AAAA,MACAU,EAAU;AAAA,QACR,KAAKC,EAAA,EAAY,MAAMH,CAAK,EAAE,SAAA;AAAA,MAAS,CACxC;AAAA,IAAA,GACA;AAEH,IAAID,MAAQ,UACVF,EAAUG,EAAM,QAAQD,CAAG,CAAC;AAAA,EAEhC,GAAG,CAACP,GAAQQ,CAAK,CAAC,GAGhB,gBAAAf,EAAAhC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAb;AAAA,MAACH;AAAA,MAAA;AAAA,QACC,UAAU,EAAE,SAAS6C,EAAQ,GAAG,EAAA;AAAA,QAChC,IAAI,EAAE,UAAU,QAAA;AAAA,QAChB,WAAU;AAAA,QAEV,UAAA,gBAAA1C;AAAA,UAACmB;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAQ;AAAA,YACR,OAAO,EAAE,OAAO,QAAA;AAAA,YAChB,IAAI;AAAA,YAEH,UAAAiB;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,IAEF,gBAAApC;AAAA,MAACH;AAAA,MAAA;AAAA,QACC,UAAU,EAAE,SAAS6C,EAAQ,GAAG,EAAA;AAAA,QAChC,IAAI,EAAE,UAAU,MAAA;AAAA,QAChB,WAAU;AAAA,QAEV,UAAA,gBAAA1C;AAAA,UAACgE;AAAA,UAAA;AAAA,YACC,OAAOR;AAAA,YACP,UAAU,CAACS,GAAGd,MAAkB;AAC9B,cAAKG;AAAA,gBACHY,EAAahB,GAAc;AAAA,kBACzB,KAAKU,EAAMT,CAAK;AAAA,gBAAA,CACjB;AAAA,cAAA;AAAA,YAEL;AAAA,YACA,uBAAuB,CAAC;AAAA,cACtB,UAAAgB;AAAA,cACA,SAAAC;AAAA,cACA,WAAAC;AAAA,YAAA,MAGE,gBAAArE,EAAAa,GAAA,EACG,gBAAa,MACZ,gBAAAb;AAAA,cAACoB;AAAA,cAAA;AAAA,gBACC,SAAAgD;AAAA,gBACA,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,CAACC,MAAc,SAAS,gBAAgB,YAAY,GAClD;AAAA,kBACF,OAAO;AAAA,gBAAA;AAAA,gBAGR,UAAAA,MAAc,SACb,gBAAArE,EAAAa,GAAA,EACE,UAAA,gBAAAb,EAACsE,GAAA,CAAA,CAAgB,GACnB,IAEA,gBAAAtE,EAAAa,GAAA,EACE,UAAA,gBAAAb,EAACuE,GAAA,CAAA,CAAiB,EAAA,CACpB;AAAA,cAAA;AAAA,YAAA,GAIR;AAAA,YAIH,UAAAb,EAAO,IAAI,CAAAc,MACV,gBAAAxE,EAACyE,KAAI,eAAa,IAAa,OAAAD,EAAA,GAAPA,CAAqB,CAC9C;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,IAEDjE,EAASiD,CAAM;AAAA,EAAA,GAClB;AAEJ;;;;;;;;"}
1
+ {"version":3,"file":"index-DeEIS6R8.js","sources":["../src/components/page/Section.tsx","../src/components/page/Notification.tsx","../src/components/page/Page.tsx","../src/components/page/Banner.tsx","../src/components/page/TabBar.tsx"],"sourcesContent":["import {\n Box,\n type BoxProps,\n Container,\n type ContainerProps,\n} from \"@mui/material\"\nimport type { FC } from \"react\"\n\nexport interface SectionProps extends ContainerProps {\n boxProps?: Omit<BoxProps, \"children\">\n}\n\nconst Section: FC<SectionProps> = ({ boxProps, ...containerProps }) => {\n return (\n <Box {...boxProps}>\n <Container {...containerProps} />\n </Box>\n )\n}\n\nexport default Section\n","import {\n CloseOutlined as CloseOutlinedIcon,\n ErrorOutline as ErrorOutlineIcon,\n InfoOutlined as InfoOutlinedIcon,\n} from \"@mui/icons-material\"\nimport { type FC, type ReactNode, useEffect, useState } from \"react\"\nimport { IconButton, Stack, Typography } from \"@mui/material\"\n\nimport Section from \"./Section\"\nimport palette from \"../../theme/palette\"\n\nexport interface NotificationProps {\n open?: boolean\n error?: boolean\n onClose?: () => void\n children: ReactNode\n bgcolor?: \"secondary\" | \"tertiary\"\n}\n\nconst Notification: FC<NotificationProps> = ({\n open = true,\n error = false,\n onClose,\n children,\n bgcolor = \"secondary\",\n}) => {\n const [_open, _setOpen] = useState(open)\n\n useEffect(() => {\n _setOpen(open)\n }, [open])\n\n if (!_open) return <></>\n\n // @ts-expect-error guaranteed to be in palette\n const contrastText = palette[bgcolor].contrastText as string\n\n return (\n <Section\n boxProps={{\n bgcolor: {\n secondary: \"#ffd23b\",\n tertiary: \"#08bafc\",\n }[bgcolor],\n }}\n sx={{ paddingY: \"5px\" }}\n >\n <Stack direction=\"row\" alignItems=\"center\" gap={2}>\n {error ? (\n <ErrorOutlineIcon htmlColor={contrastText} />\n ) : (\n <InfoOutlinedIcon htmlColor={contrastText} />\n )}\n <Typography variant=\"body2\" color={contrastText} mb={0}>\n {children}\n </Typography>\n <IconButton\n style={{ marginLeft: \"auto\" }}\n onClick={() => {\n _setOpen(false)\n if (onClose !== undefined) onClose()\n }}\n >\n <CloseOutlinedIcon htmlColor={contrastText} />\n </IconButton>\n </Stack>\n </Section>\n )\n}\n\nexport default Notification\n","import { Children, type JSX, useEffect } from \"react\"\nimport { type Location, useLocation } from \"react-router\"\n\nimport Notification, { type NotificationProps } from \"./Notification\"\nimport {\n type SelectIsLoggedIn,\n type SessionMetadata,\n type UseSessionChildren,\n type UseSessionChildrenFunction,\n type UseSessionOptions,\n useSession,\n} from \"../../hooks/auth\"\n\nexport type PageState = {\n notifications: Array<{\n index?: number\n props: NotificationProps\n }>\n scroll: { x: number; y: number }\n}\n\nexport interface PageProps<\n SessionUserType extends SessionMetadata[\"user_type\"] | undefined,\n> {\n selectIsLoggedIn: SelectIsLoggedIn\n children: UseSessionChildren<SessionUserType>\n session?: UseSessionOptions<SessionUserType>\n}\n\nconst Page = <\n SessionUserType extends SessionMetadata[\"user_type\"] | undefined = undefined,\n>({\n selectIsLoggedIn,\n children,\n session,\n}: PageProps<SessionUserType>): JSX.Element => {\n const { state } = useLocation() as Location<null | Partial<PageState>>\n\n let { scroll, notifications } = state || {}\n scroll = scroll || { x: 0, y: 0 }\n notifications = notifications || []\n\n useEffect(() => {\n window.scroll(scroll.x, scroll.y)\n }, [scroll.x, scroll.y])\n\n return (\n <>\n {useSession(\n selectIsLoggedIn,\n (metadata?: SessionMetadata) => {\n if (typeof children === \"function\") {\n children = metadata\n ? (children as UseSessionChildrenFunction<true>)(metadata)\n : (children as UseSessionChildrenFunction<false>)(metadata)\n }\n\n if (notifications.length) {\n const childrenArray = Children.toArray(children)\n\n notifications.forEach((notification, index) => {\n void childrenArray.splice(\n notification.index ?? index,\n 0,\n <Notification {...notification.props} />,\n )\n })\n\n return childrenArray\n }\n\n return children\n },\n session,\n )}\n </>\n )\n}\n\nexport default Page\n","import { Stack, Typography } from \"@mui/material\"\n\nimport Image, { type ImageProps } from \"../Image\"\nimport { LinkButton, type LinkButtonProps } from \"../router\"\nimport { primary, secondary, tertiary } from \"../../theme/colors\"\nimport Section from \"./Section\"\nimport palette from \"../../theme/palette\"\n\nexport interface BannerProps<\n Button1State extends Record<string, any> = Record<string, any>,\n Button2State extends Record<string, any> = Record<string, any>,\n> {\n header: string\n subheader?: string\n textAlign?: \"start\" | \"center\"\n imageProps?: ImageProps\n button1Props?: LinkButtonProps<\"to\", Button1State>\n button2Props?: LinkButtonProps<\"to\", Button2State>\n bgcolor?: \"primary\" | \"secondary\" | \"tertiary\"\n}\n\nconst Banner = <\n Button1State extends Record<string, any> = Record<string, any>,\n Button2State extends Record<string, any> = Record<string, any>,\n>({\n header,\n subheader,\n textAlign = \"start\",\n imageProps,\n button1Props,\n button2Props,\n bgcolor = \"primary\",\n}: BannerProps<Button1State, Button2State>) => {\n // @ts-expect-error guaranteed to be in palette\n const contrastText = palette[bgcolor].contrastText as string\n\n return (\n <Section\n boxProps={{\n bgcolor: {\n primary: primary[500],\n secondary: secondary[500],\n tertiary: tertiary[500],\n }[bgcolor],\n }}\n sx={{ paddingY: 0 }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent={textAlign}\n gap={2}\n >\n <Stack\n py={{\n xs: \"80px\",\n md: imageProps !== undefined ? 0 : \"100px\",\n }}\n textAlign={textAlign}\n >\n <Typography\n variant=\"h2\"\n color={contrastText}\n mb={subheader !== undefined ? undefined : 0}\n >\n {header}\n </Typography>\n {subheader !== undefined && (\n <Typography\n color={contrastText}\n variant=\"h4\"\n mb={button1Props !== undefined ? undefined : 0}\n >\n {subheader}\n </Typography>\n )}\n <Stack direction=\"row\" gap={2}>\n {button1Props !== undefined && <LinkButton {...button1Props} />}\n {button2Props !== undefined && <LinkButton {...button2Props} />}\n </Stack>\n </Stack>\n {imageProps !== undefined && (\n <Image\n {...imageProps}\n display={{ xs: \"none\", md: \"block\" }}\n maxWidth=\"320px\"\n marginLeft=\"auto\"\n />\n )}\n </Stack>\n </Section>\n )\n}\n\nexport default Banner\n","import {\n ChevronLeft as ChevronLeftIcon,\n ChevronRight as ChevronRightIcon,\n} from \"@mui/icons-material\"\nimport { type FC, type ReactNode, useEffect, useState } from \"react\"\nimport {\n IconButton,\n Tab,\n type TabScrollButtonProps,\n Tabs,\n Typography,\n} from \"@mui/material\"\nimport { object as YupObject, string as YupString } from \"yup\"\nimport { generatePath, useNavigate, useParams } from \"react-router\"\n\nimport Section from \"./Section\"\nimport { primary } from \"../../theme/colors\"\nimport { tryValidateSync } from \"../../utils/schema\"\n\nexport interface TabBarProps {\n header: string\n tabs: Array<{\n label: string\n children: ReactNode\n path: string\n }>\n originalPath: string\n value?: number\n}\n\nconst TabBar: FC<TabBarProps> = ({ header, tabs, originalPath, value = 0 }) => {\n const params = useParams()\n const navigate = useNavigate()\n const [_value, _setValue] = useState(\n value < 0 ? 0 : value >= tabs.length ? tabs.length - 1 : value,\n )\n\n const labels = tabs.map(tab => tab.label)\n const children = tabs.map(tab => tab.children)\n const paths = tabs.map(tab => tab.path)\n\n useEffect(() => {\n _setValue(value)\n }, [value])\n\n useEffect(() => {\n const tab = tryValidateSync(\n params,\n YupObject({\n tab: YupString().oneOf(paths).required(),\n }),\n )?.tab\n\n if (tab !== undefined) {\n _setValue(paths.indexOf(tab))\n }\n }, [params, paths])\n\n return (\n <>\n <Section\n boxProps={{ bgcolor: primary[500] }}\n sx={{ paddingY: \"100px\" }}\n className=\"flex-center\"\n >\n <Typography\n textAlign=\"center\"\n variant=\"h2\"\n style={{ color: \"white\" }}\n mb={0}\n >\n {header}\n </Typography>\n </Section>\n <Section\n boxProps={{ bgcolor: primary[300] }}\n sx={{ paddingY: \"6px\" }}\n className=\"flex-center\"\n >\n <Tabs\n value={_value}\n onChange={(_, value: number) => {\n void navigate(\n generatePath(originalPath, {\n tab: paths[value],\n }),\n )\n }}\n ScrollButtonComponent={({\n disabled,\n onClick,\n direction,\n }: TabScrollButtonProps) => {\n return (\n <>\n {disabled === false && (\n <IconButton\n onClick={onClick}\n style={{\n padding: 0,\n [direction === \"left\" ? \"marginRight\" : \"marginLeft\"]:\n \"15px\",\n color: \"white\",\n }}\n >\n {direction === \"left\" ? (\n <>\n <ChevronLeftIcon />\n </>\n ) : (\n <>\n <ChevronRightIcon />\n </>\n )}\n </IconButton>\n )}\n </>\n )\n }}\n >\n {labels.map(label => (\n <Tab disableRipple key={label} label={label} />\n ))}\n </Tabs>\n </Section>\n {children[_value]}\n </>\n )\n}\n\nexport default TabBar\n"],"names":["Section","boxProps","containerProps","jsx","Box","Container","Notification","open","error","onClose","children","bgcolor","_open","_setOpen","useState","useEffect","Fragment","contrastText","palette","Stack","ErrorOutlineIcon","InfoOutlinedIcon","Typography","IconButton","CloseOutlinedIcon","Page","selectIsLoggedIn","session","state","useLocation","scroll","notifications","useSession","metadata","childrenArray","Children","notification","index","Banner","header","subheader","textAlign","imageProps","button1Props","button2Props","primary","secondary","tertiary","jsxs","LinkButton","Image","TabBar","tabs","originalPath","value","params","useParams","navigate","useNavigate","_value","_setValue","labels","tab","paths","tryValidateSync","YupObject","YupString","Tabs","_","generatePath","disabled","onClick","direction","ChevronLeftIcon","ChevronRightIcon","label","Tab"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";function u(s,t){typeof t=="string"&&(t=t.split("."));let e=s;for(let n=0;n<t.length;n++)if(e=e[t[n]],n!==t.length-1&&(typeof e!="object"||e===null))return;return e}function l(s,t="."){function e(n,f){return Object.entries(n).map(([o,i])=>{const r=[...f,o],c=r.join(t);return typeof i=="object"&&i!==null?[c,...e(i,r)]:[c]}).flat()}return e(s,[])}function y(s,t,e="."){function n(f,o){return Object.fromEntries(Object.entries(f).map(([i,r])=>{const c=[...o,i];return typeof r=="object"&&r!==null&&!(r instanceof Date)&&(r=n(r,c)),t.includes(c.join(e))?[]:[i,r]}).filter(i=>i.length))}return t.length?n(s,[]):s}exports.excludeKeyPaths=y;exports.getKeyPaths=l;exports.getNestedProperty=u;
2
+ //# sourceMappingURL=object-C0ukOmY8.cjs.map