codeforlife 2.14.9 → 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 (89) 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/server/server.cjs.js +3 -2
  54. package/dist/server/server.cjs.js.map +1 -1
  55. package/dist/server/server.es.js +26 -18
  56. package/dist/server/server.es.js.map +1 -1
  57. package/dist/src/api/models.d.ts +1 -1
  58. package/dist/src/server/server.d.ts +1 -0
  59. package/dist/src/utils/general.d.ts +0 -11
  60. package/dist/src/utils/location.d.ts +7 -0
  61. package/dist/src/utils/object.d.ts +11 -0
  62. package/dist/{urls-BG788CnL.js → urls-CQ1fgrB1.js} +2 -2
  63. package/dist/{urls-BG788CnL.js.map → urls-CQ1fgrB1.js.map} +1 -1
  64. package/dist/{urls-2gheISSO.cjs → urls-DJiVb_ID.cjs} +2 -2
  65. package/dist/{urls-2gheISSO.cjs.map → urls-DJiVb_ID.cjs.map} +1 -1
  66. package/dist/utils/api.cjs.js +1 -1
  67. package/dist/utils/api.es.js +2 -2
  68. package/dist/utils/form.cjs.js +1 -1
  69. package/dist/utils/form.cjs.js.map +1 -1
  70. package/dist/utils/form.es.js +16 -16
  71. package/dist/utils/form.es.js.map +1 -1
  72. package/dist/utils/general.cjs.js +1 -1
  73. package/dist/utils/general.cjs.js.map +1 -1
  74. package/dist/utils/general.es.js +31 -947
  75. package/dist/utils/general.es.js.map +1 -1
  76. package/dist/utils/router.cjs.js +1 -1
  77. package/dist/utils/router.es.js +1 -1
  78. package/package.json +4 -4
  79. package/dist/api-G8CV5bUa.cjs +0 -2
  80. package/dist/api-G8CV5bUa.cjs.map +0 -1
  81. package/dist/api-uh8UKwsU.js.map +0 -1
  82. package/dist/index-BhTYGZm3.cjs +0 -2
  83. package/dist/index-BhTYGZm3.cjs.map +0 -1
  84. package/dist/index-Uk65JJpc.js.map +0 -1
  85. package/dist/schemas-UIk-meAN.js +0 -162
  86. package/dist/schemas-UIk-meAN.js.map +0 -1
  87. package/dist/schemas-hIW9-H6-.cjs +0 -2
  88. package/dist/schemas-hIW9-H6-.cjs.map +0 -1
  89. /package/dist/src/utils/{general.test.d.ts → object.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"general.es.js","sources":["../../src/utils/general.ts"],"sourcesContent":["export type Required<T, K extends keyof T> = { [P in K]-?: T[P] }\nexport type Optional<T, K extends keyof T> = Partial<Pick<T, K>>\nexport type OptionalPropertyNames<T> = {\n [K in keyof T]-?: {} extends { [P in K]: T[K] } ? K : never\n}[keyof T]\nexport type IsOptional<T, K extends keyof T> =\n K extends OptionalPropertyNames<T> ? true : false\n\nexport function openInNewTab(url: string, target = \"_blank\"): void {\n window.open(url, target)\n}\n\nexport function wrap(\n newFn: {\n before?: (...args: any[]) => void\n after?: (...args: any[]) => void\n },\n fn?: (...args: any[]) => any,\n): (...args: any[]) => any {\n return (...args) => {\n if (newFn.before !== undefined) {\n newFn.before(...(args as unknown[]))\n }\n let value\n if (fn !== undefined) {\n value = fn(...(args as unknown[])) as unknown\n }\n if (newFn.after !== undefined) {\n newFn.after(...(args as unknown[]))\n }\n return value\n }\n}\n\nexport function snakeCaseToCamelCase(obj: Record<string, any>): void {\n Object.entries(obj).forEach(([snakeKey, value]) => {\n if (typeof value === \"object\") snakeCaseToCamelCase(value as object)\n\n const camelKey = snakeKey.replace(/_+[a-z]/g, _char =>\n _char[_char.length - 1].toUpperCase(),\n )\n\n delete obj[snakeKey]\n obj[camelKey] = value as unknown\n })\n}\n\nexport function camelCaseToSnakeCase(obj: Record<string, any>): void {\n Object.entries(obj).forEach(([camelKey, value]) => {\n if (typeof value === \"object\") camelCaseToSnakeCase(value as object)\n\n const snakeKey = camelKey.replace(\n /[A-Z]/g,\n char => `_${char.toLowerCase()}`,\n )\n\n delete obj[camelKey]\n obj[snakeKey] = value as unknown\n })\n}\n\nexport const MIN_DATE = new Date(0, 0, 0)\n\nexport const COUNTRY_ISO_CODES = [\n \"AD\",\n \"AE\",\n \"AF\",\n \"AG\",\n \"AI\",\n \"AL\",\n \"AM\",\n \"AO\",\n \"AQ\",\n \"AR\",\n \"AS\",\n \"AT\",\n \"AU\",\n \"AW\",\n \"AX\",\n \"AZ\",\n \"BA\",\n \"BB\",\n \"BD\",\n \"BE\",\n \"BF\",\n \"BG\",\n \"BH\",\n \"BI\",\n \"BJ\",\n \"BL\",\n \"BM\",\n \"BN\",\n \"BO\",\n \"BQ\",\n \"BR\",\n \"BS\",\n \"BT\",\n \"BV\",\n \"BW\",\n \"BY\",\n \"BZ\",\n \"CA\",\n \"CC\",\n \"CD\",\n \"CF\",\n \"CG\",\n \"CH\",\n \"CI\",\n \"CK\",\n \"CL\",\n \"CM\",\n \"CN\",\n \"CO\",\n \"CR\",\n \"CU\",\n \"CV\",\n \"CW\",\n \"CX\",\n \"CY\",\n \"CZ\",\n \"DE\",\n \"DJ\",\n \"DK\",\n \"DM\",\n \"DO\",\n \"DZ\",\n \"EC\",\n \"EE\",\n \"EG\",\n \"EH\",\n \"ER\",\n \"ES\",\n \"ET\",\n \"FI\",\n \"FJ\",\n \"FK\",\n \"FM\",\n \"FO\",\n \"FR\",\n \"GA\",\n \"GB\",\n \"GD\",\n \"GE\",\n \"GF\",\n \"GG\",\n \"GH\",\n \"GI\",\n \"GL\",\n \"GM\",\n \"GN\",\n \"GP\",\n \"GQ\",\n \"GR\",\n \"GS\",\n \"GT\",\n \"GU\",\n \"GW\",\n \"GY\",\n \"HK\",\n \"HM\",\n \"HN\",\n \"HR\",\n \"HT\",\n \"HU\",\n \"ID\",\n \"IE\",\n \"IL\",\n \"IM\",\n \"IN\",\n \"IO\",\n \"IQ\",\n \"IR\",\n \"IS\",\n \"IT\",\n \"JE\",\n \"JM\",\n \"JO\",\n \"JP\",\n \"KE\",\n \"KG\",\n \"KH\",\n \"KI\",\n \"KM\",\n \"KN\",\n \"KP\",\n \"KR\",\n \"KW\",\n \"KY\",\n \"KZ\",\n \"LA\",\n \"LB\",\n \"LC\",\n \"LI\",\n \"LK\",\n \"LR\",\n \"LS\",\n \"LT\",\n \"LU\",\n \"LV\",\n \"LY\",\n \"MA\",\n \"MC\",\n \"MD\",\n \"ME\",\n \"MF\",\n \"MG\",\n \"MH\",\n \"MK\",\n \"ML\",\n \"MM\",\n \"MN\",\n \"MO\",\n \"MP\",\n \"MQ\",\n \"MR\",\n \"MS\",\n \"MT\",\n \"MU\",\n \"MV\",\n \"MW\",\n \"MX\",\n \"MY\",\n \"MZ\",\n \"NA\",\n \"NC\",\n \"NE\",\n \"NF\",\n \"NG\",\n \"NI\",\n \"NL\",\n \"NO\",\n \"NP\",\n \"NR\",\n \"NU\",\n \"NZ\",\n \"OM\",\n \"PA\",\n \"PE\",\n \"PF\",\n \"PG\",\n \"PH\",\n \"PK\",\n \"PL\",\n \"PM\",\n \"PN\",\n \"PR\",\n \"PS\",\n \"PT\",\n \"PW\",\n \"PY\",\n \"QA\",\n \"RE\",\n \"RO\",\n \"RS\",\n \"RU\",\n \"RW\",\n \"SA\",\n \"SB\",\n \"SC\",\n \"SD\",\n \"SE\",\n \"SG\",\n \"SH\",\n \"SI\",\n \"SJ\",\n \"SK\",\n \"SL\",\n \"SM\",\n \"SN\",\n \"SO\",\n \"SR\",\n \"SS\",\n \"ST\",\n \"SV\",\n \"SX\",\n \"SY\",\n \"SZ\",\n \"TC\",\n \"TD\",\n \"TF\",\n \"TG\",\n \"TH\",\n \"TJ\",\n \"TK\",\n \"TL\",\n \"TM\",\n \"TN\",\n \"TO\",\n \"TR\",\n \"TT\",\n \"TV\",\n \"TW\",\n \"TZ\",\n \"UA\",\n \"UG\",\n \"UM\",\n \"US\",\n \"UY\",\n \"UZ\",\n \"VA\",\n \"VC\",\n \"VE\",\n \"VG\",\n \"VI\",\n \"VN\",\n \"VU\",\n \"WF\",\n \"WS\",\n \"YE\",\n \"YT\",\n \"ZA\",\n \"ZM\",\n \"ZW\",\n] as const\n\nexport type CountryIsoCodes = (typeof COUNTRY_ISO_CODES)[number]\n\nexport const COUNTRIES = [\n \"Andorra\",\n \"United Arab Emirates (the)\",\n \"Afghanistan\",\n \"Antigua and Barbuda\",\n \"Anguilla\",\n \"Albania\",\n \"Armenia\",\n \"Angola\",\n \"Antarctica\",\n \"Argentina\",\n \"American Samoa\",\n \"Austria\",\n \"Australia\",\n \"Aruba\",\n \"Åland Islands\",\n \"Azerbaijan\",\n \"Bosnia and Herzegovina\",\n \"Barbados\",\n \"Bangladesh\",\n \"Belgium\",\n \"Burkina Faso\",\n \"Bulgaria\",\n \"Bahrain\",\n \"Burundi\",\n \"Benin\",\n \"Saint Barthélemy\",\n \"Bermuda\",\n \"Brunei Darussalam\",\n \"Bolivia (Plurinational State of)\",\n \"Bonaire, Sint Eustatius and Saba\",\n \"Brazil\",\n \"Bahamas (the)\",\n \"Bhutan\",\n \"Bouvet Island\",\n \"Botswana\",\n \"Belarus\",\n \"Belize\",\n \"Canada\",\n \"Cocos (Keeling) Islands (the)\",\n \"Congo (the Democratic Republic of the)\",\n \"Central African Republic (the)\",\n \"Congo (the)\",\n \"Switzerland\",\n \"Côte d'Ivoire\",\n \"Cook Islands (the)\",\n \"Chile\",\n \"Cameroon\",\n \"China\",\n \"Colombia\",\n \"Costa Rica\",\n \"Cuba\",\n \"Cabo Verde\",\n \"Curaçao\",\n \"Christmas Island\",\n \"Cyprus\",\n \"Czechia\",\n \"Germany\",\n \"Djibouti\",\n \"Denmark\",\n \"Dominica\",\n \"Dominican Republic (the\",\n \"Algeria\",\n \"Ecuador\",\n \"Estonia\",\n \"Egypt\",\n \"Western Sahara\",\n \"Eritrea\",\n \"Spain\",\n \"Ethiopia\",\n \"Finland\",\n \"Fiji\",\n \"Falkland Islands (the) [Malvinas]\",\n \"Micronesia (Federated States of)\",\n \"Faroe Islands (the)\",\n \"France\",\n \"Gabon\",\n \"United Kingdom of Great Britain and Northern Ireland (the)\",\n \"Grenada\",\n \"Georgia\",\n \"French Guiana\",\n \"Guernsey\",\n \"Ghana\",\n \"Gibraltar\",\n \"Greenland\",\n \"Gambia (the)\",\n \"Guinea\",\n \"Guadeloupe\",\n \"Equatorial Guinea\",\n \"Greece\",\n \"South Georgia and the South Sandwich Islands\",\n \"Guatemala\",\n \"Guam\",\n \"Guinea-Bissau\",\n \"Guyana\",\n \"Hong Kong\",\n \"Heard Island and McDonald Islands\",\n \"Honduras\",\n \"Croatia\",\n \"Haiti\",\n \"Hungary\",\n \"Indonesia\",\n \"Ireland\",\n \"Israel\",\n \"Isle of Man\",\n \"India\",\n \"British Indian Ocean Territory (the)\",\n \"Iraq\",\n \"Iran (Islamic Republic of)\",\n \"Iceland\",\n \"Italy\",\n \"Jersey\",\n \"Jamaica\",\n \"Jordan\",\n \"Japan\",\n \"Kenya\",\n \"Kyrgyzstan\",\n \"Cambodia\",\n \"Kiribati\",\n \"Comoros (the)\",\n \"Saint Kitts and Nevis\",\n \"Korea (the Democratic People's Republic of)\",\n \"Korea (the Republic of)\",\n \"Kuwait\",\n \"Cayman Islands (the)\",\n \"Kazakhstan\",\n \"Lao People's Democratic Republic (the)\",\n \"Lebanon\",\n \"Saint Lucia\",\n \"Liechtenstein\",\n \"Sri Lanka\",\n \"Liberia\",\n \"Lesotho\",\n \"Lithuania\",\n \"Luxembourg\",\n \"Latvia\",\n \"Libya\",\n \"Morocco\",\n \"Monaco\",\n \"Moldova (the Republic of)\",\n \"Montenegro\",\n \"Saint Martin (French part)\",\n \"Madagascar\",\n \"Marshall Islands (the)\",\n \"Republic of North Macedonia\",\n \"Mali\",\n \"Myanmar\",\n \"Mongolia\",\n \"Macao\",\n \"Northern Mariana Islands (the)\",\n \"Martinique\",\n \"Mauritania\",\n \"Montserrat\",\n \"Malta\",\n \"Mauritius\",\n \"Maldives\",\n \"Malawi\",\n \"Mexico\",\n \"Malaysia\",\n \"Mozambique\",\n \"Namibia\",\n \"New Caledonia\",\n \"Niger (the)\",\n \"Norfolk Island\",\n \"Nigeria\",\n \"Nicaragua\",\n \"Netherlands (the)\",\n \"Norway\",\n \"Nepal\",\n \"Nauru\",\n \"Niue\",\n \"New Zealand\",\n \"Oman\",\n \"Panama\",\n \"Peru\",\n \"French Polynesia\",\n \"Papua New Guinea\",\n \"Philippines (the)\",\n \"Pakistan\",\n \"Poland\",\n \"Saint Pierre and Miquelon\",\n \"Pitcairn\",\n \"Puerto Rico\",\n \"Palestine, State of\",\n \"Portugal\",\n \"Palau\",\n \"Paraguay\",\n \"Qatar\",\n \"Réunion\",\n \"Romania\",\n \"Serbia\",\n \"Russian Federation (the)\",\n \"Rwanda\",\n \"Saudi Arabia\",\n \"Solomon Islands\",\n \"Seychelles\",\n \"Sudan (the)\",\n \"Sweden\",\n \"Singapore\",\n \"Saint Helena, Ascension and Tristan da Cunha\",\n \"Slovenia\",\n \"Svalbard and Jan Mayen\",\n \"Slovakia\",\n \"Sierra Leone\",\n \"San Marino\",\n \"Senegal\",\n \"Somalia\",\n \"Suriname\",\n \"South Sudan\",\n \"Sao Tome and Principe\",\n \"El Salvador\",\n \"Sint Maarten (Dutch part)\",\n \"Syrian Arab Republic\",\n \"Eswatini\",\n \"Turks and Caicos Islands (the)\",\n \"Chad\",\n \"French Southern Territories (the)\",\n \"Togo\",\n \"Thailand\",\n \"Tajikistan\",\n \"Tokelau\",\n \"Timor-Leste\",\n \"Turkmenistan\",\n \"Tunisia\",\n \"Tonga\",\n \"Turkey\",\n \"Trinidad and Tobago\",\n \"Tuvalu\",\n \"Taiwan (Province of China)\",\n \"Tanzania, United Republic of\",\n \"Ukraine\",\n \"Uganda\",\n \"United States Minor Outlying Islands (the)\",\n \"United States of America (the)\",\n \"Uruguay\",\n \"Uzbekistan\",\n \"Holy See (the)\",\n \"Saint Vincent and the Grenadines\",\n \"Venezuela (Bolivarian Republic of)\",\n \"Virgin Islands (British)\",\n \"Virgin Islands (U.S.)\",\n \"Viet Nam\",\n \"Vanuatu\",\n \"Wallis and Futuna\",\n \"Samoa\",\n \"Yemen\",\n \"Mayotte\",\n \"South Africa\",\n \"Zambia\",\n \"Zimbabwe\",\n] as const\n\nexport type Countries = (typeof COUNTRIES)[number]\n\nexport const COUNTRY_ISO_CODE_MAPPING: Record<CountryIsoCodes, Countries> = {\n AD: \"Andorra\",\n AE: \"United Arab Emirates (the)\",\n AF: \"Afghanistan\",\n AG: \"Antigua and Barbuda\",\n AI: \"Anguilla\",\n AL: \"Albania\",\n AM: \"Armenia\",\n AO: \"Angola\",\n AQ: \"Antarctica\",\n AR: \"Argentina\",\n AS: \"American Samoa\",\n AT: \"Austria\",\n AU: \"Australia\",\n AW: \"Aruba\",\n AX: \"Åland Islands\",\n AZ: \"Azerbaijan\",\n BA: \"Bosnia and Herzegovina\",\n BB: \"Barbados\",\n BD: \"Bangladesh\",\n BE: \"Belgium\",\n BF: \"Burkina Faso\",\n BG: \"Bulgaria\",\n BH: \"Bahrain\",\n BI: \"Burundi\",\n BJ: \"Benin\",\n BL: \"Saint Barthélemy\",\n BM: \"Bermuda\",\n BN: \"Brunei Darussalam\",\n BO: \"Bolivia (Plurinational State of)\",\n BQ: \"Bonaire, Sint Eustatius and Saba\",\n BR: \"Brazil\",\n BS: \"Bahamas (the)\",\n BT: \"Bhutan\",\n BV: \"Bouvet Island\",\n BW: \"Botswana\",\n BY: \"Belarus\",\n BZ: \"Belize\",\n CA: \"Canada\",\n CC: \"Cocos (Keeling) Islands (the)\",\n CD: \"Congo (the Democratic Republic of the)\",\n CF: \"Central African Republic (the)\",\n CG: \"Congo (the)\",\n CH: \"Switzerland\",\n CI: \"Côte d'Ivoire\",\n CK: \"Cook Islands (the)\",\n CL: \"Chile\",\n CM: \"Cameroon\",\n CN: \"China\",\n CO: \"Colombia\",\n CR: \"Costa Rica\",\n CU: \"Cuba\",\n CV: \"Cabo Verde\",\n CW: \"Curaçao\",\n CX: \"Christmas Island\",\n CY: \"Cyprus\",\n CZ: \"Czechia\",\n DE: \"Germany\",\n DJ: \"Djibouti\",\n DK: \"Denmark\",\n DM: \"Dominica\",\n DO: \"Dominican Republic (the\",\n DZ: \"Algeria\",\n EC: \"Ecuador\",\n EE: \"Estonia\",\n EG: \"Egypt\",\n EH: \"Western Sahara\",\n ER: \"Eritrea\",\n ES: \"Spain\",\n ET: \"Ethiopia\",\n FI: \"Finland\",\n FJ: \"Fiji\",\n FK: \"Falkland Islands (the) [Malvinas]\",\n FM: \"Micronesia (Federated States of)\",\n FO: \"Faroe Islands (the)\",\n FR: \"France\",\n GA: \"Gabon\",\n GB: \"United Kingdom of Great Britain and Northern Ireland (the)\",\n GD: \"Grenada\",\n GE: \"Georgia\",\n GF: \"French Guiana\",\n GG: \"Guernsey\",\n GH: \"Ghana\",\n GI: \"Gibraltar\",\n GL: \"Greenland\",\n GM: \"Gambia (the)\",\n GN: \"Guinea\",\n GP: \"Guadeloupe\",\n GQ: \"Equatorial Guinea\",\n GR: \"Greece\",\n GS: \"South Georgia and the South Sandwich Islands\",\n GT: \"Guatemala\",\n GU: \"Guam\",\n GW: \"Guinea-Bissau\",\n GY: \"Guyana\",\n HK: \"Hong Kong\",\n HM: \"Heard Island and McDonald Islands\",\n HN: \"Honduras\",\n HR: \"Croatia\",\n HT: \"Haiti\",\n HU: \"Hungary\",\n ID: \"Indonesia\",\n IE: \"Ireland\",\n IL: \"Israel\",\n IM: \"Isle of Man\",\n IN: \"India\",\n IO: \"British Indian Ocean Territory (the)\",\n IQ: \"Iraq\",\n IR: \"Iran (Islamic Republic of)\",\n IS: \"Iceland\",\n IT: \"Italy\",\n JE: \"Jersey\",\n JM: \"Jamaica\",\n JO: \"Jordan\",\n JP: \"Japan\",\n KE: \"Kenya\",\n KG: \"Kyrgyzstan\",\n KH: \"Cambodia\",\n KI: \"Kiribati\",\n KM: \"Comoros (the)\",\n KN: \"Saint Kitts and Nevis\",\n KP: \"Korea (the Democratic People's Republic of)\",\n KR: \"Korea (the Republic of)\",\n KW: \"Kuwait\",\n KY: \"Cayman Islands (the)\",\n KZ: \"Kazakhstan\",\n LA: \"Lao People's Democratic Republic (the)\",\n LB: \"Lebanon\",\n LC: \"Saint Lucia\",\n LI: \"Liechtenstein\",\n LK: \"Sri Lanka\",\n LR: \"Liberia\",\n LS: \"Lesotho\",\n LT: \"Lithuania\",\n LU: \"Luxembourg\",\n LV: \"Latvia\",\n LY: \"Libya\",\n MA: \"Morocco\",\n MC: \"Monaco\",\n MD: \"Moldova (the Republic of)\",\n ME: \"Montenegro\",\n MF: \"Saint Martin (French part)\",\n MG: \"Madagascar\",\n MH: \"Marshall Islands (the)\",\n MK: \"Republic of North Macedonia\",\n ML: \"Mali\",\n MM: \"Myanmar\",\n MN: \"Mongolia\",\n MO: \"Macao\",\n MP: \"Northern Mariana Islands (the)\",\n MQ: \"Martinique\",\n MR: \"Mauritania\",\n MS: \"Montserrat\",\n MT: \"Malta\",\n MU: \"Mauritius\",\n MV: \"Maldives\",\n MW: \"Malawi\",\n MX: \"Mexico\",\n MY: \"Malaysia\",\n MZ: \"Mozambique\",\n NA: \"Namibia\",\n NC: \"New Caledonia\",\n NE: \"Niger (the)\",\n NF: \"Norfolk Island\",\n NG: \"Nigeria\",\n NI: \"Nicaragua\",\n NL: \"Netherlands (the)\",\n NO: \"Norway\",\n NP: \"Nepal\",\n NR: \"Nauru\",\n NU: \"Niue\",\n NZ: \"New Zealand\",\n OM: \"Oman\",\n PA: \"Panama\",\n PE: \"Peru\",\n PF: \"French Polynesia\",\n PG: \"Papua New Guinea\",\n PH: \"Philippines (the)\",\n PK: \"Pakistan\",\n PL: \"Poland\",\n PM: \"Saint Pierre and Miquelon\",\n PN: \"Pitcairn\",\n PR: \"Puerto Rico\",\n PS: \"Palestine, State of\",\n PT: \"Portugal\",\n PW: \"Palau\",\n PY: \"Paraguay\",\n QA: \"Qatar\",\n RE: \"Réunion\",\n RO: \"Romania\",\n RS: \"Serbia\",\n RU: \"Russian Federation (the)\",\n RW: \"Rwanda\",\n SA: \"Saudi Arabia\",\n SB: \"Solomon Islands\",\n SC: \"Seychelles\",\n SD: \"Sudan (the)\",\n SE: \"Sweden\",\n SG: \"Singapore\",\n SH: \"Saint Helena, Ascension and Tristan da Cunha\",\n SI: \"Slovenia\",\n SJ: \"Svalbard and Jan Mayen\",\n SK: \"Slovakia\",\n SL: \"Sierra Leone\",\n SM: \"San Marino\",\n SN: \"Senegal\",\n SO: \"Somalia\",\n SR: \"Suriname\",\n SS: \"South Sudan\",\n ST: \"Sao Tome and Principe\",\n SV: \"El Salvador\",\n SX: \"Sint Maarten (Dutch part)\",\n SY: \"Syrian Arab Republic\",\n SZ: \"Eswatini\",\n TC: \"Turks and Caicos Islands (the)\",\n TD: \"Chad\",\n TF: \"French Southern Territories (the)\",\n TG: \"Togo\",\n TH: \"Thailand\",\n TJ: \"Tajikistan\",\n TK: \"Tokelau\",\n TL: \"Timor-Leste\",\n TM: \"Turkmenistan\",\n TN: \"Tunisia\",\n TO: \"Tonga\",\n TR: \"Turkey\",\n TT: \"Trinidad and Tobago\",\n TV: \"Tuvalu\",\n TW: \"Taiwan (Province of China)\",\n TZ: \"Tanzania, United Republic of\",\n UA: \"Ukraine\",\n UG: \"Uganda\",\n UM: \"United States Minor Outlying Islands (the)\",\n US: \"United States of America (the)\",\n UY: \"Uruguay\",\n UZ: \"Uzbekistan\",\n VA: \"Holy See (the)\",\n VC: \"Saint Vincent and the Grenadines\",\n VE: \"Venezuela (Bolivarian Republic of)\",\n VG: \"Virgin Islands (British)\",\n VI: \"Virgin Islands (U.S.)\",\n VN: \"Viet Nam\",\n VU: \"Vanuatu\",\n WF: \"Wallis and Futuna\",\n WS: \"Samoa\",\n YE: \"Yemen\",\n YT: \"Mayotte\",\n ZA: \"South Africa\",\n ZM: \"Zambia\",\n ZW: \"Zimbabwe\",\n}\n\nexport const UK_COUNTIES = [\n \"Aberdeen City\",\n \"Aberdeenshire\",\n \"Angus\",\n \"Argyll and Bute\",\n \"Bedfordshire\",\n \"Belfast\",\n \"Belfast Greater\",\n \"Berkshire\",\n \"Blaenau Gwent\",\n \"Bridgend\",\n \"Buckinghamshire\",\n \"Caerphilly\",\n \"Cambridgeshire\",\n \"Cardiff\",\n \"Carmarthenshire\",\n \"Ceredigion\",\n \"Channel Islands\",\n \"Cheshire\",\n \"City of Edinburgh\",\n \"Clackmannanshire\",\n \"Conwy\",\n \"Cornwall\",\n \"County Antrim\",\n \"County Armagh\",\n \"County Down\",\n \"County Fermanagh\",\n \"County Londonderry\",\n \"County Tyrone\",\n \"County of Bristol\",\n \"Cumbria\",\n \"Denbighshire\",\n \"Derbyshire\",\n \"Devon\",\n \"Dorset\",\n \"Dumfries and Galloway\",\n \"Dunbartonshire\",\n \"Dundee City\",\n \"Durham\",\n \"East Ayrshire\",\n \"East Dunbartonshire\",\n \"East Lothian\",\n \"East Renfrewshire\",\n \"East Riding of Yorkshire\",\n \"East Sussex\",\n \"Essex\",\n \"Falkirk\",\n \"Fife\",\n \"Flintshire\",\n \"Glasgow City\",\n \"Gloucestershire\",\n \"Greater London\",\n \"Greater Manchester\",\n \"Guernsey Channel Islands\",\n \"Gwynedd\",\n \"Hampshire\",\n \"Hereford and Worcester\",\n \"Herefordshire\",\n \"Hertfordshire\",\n \"Highland\",\n \"Inverclyde\",\n \"Inverness\",\n \"Isle of Anglesey\",\n \"Isle of Barra\",\n \"Isle of Man\",\n \"Isle of Wight\",\n \"Jersey Channel Islands\",\n \"Kent\",\n \"Lancashire\",\n \"Leicestershire\",\n \"Lincolnshire\",\n \"Merseyside\",\n \"Merthyr Tydfil\",\n \"Midlothian\",\n \"Monmouthshire\",\n \"Moray\",\n \"Neath Port Talbot\",\n \"Newport\",\n \"Norfolk\",\n \"North Ayrshire\",\n \"North Lanarkshire\",\n \"North Yorkshire\",\n \"Northamptonshire\",\n \"Northumberland\",\n \"Nottinghamshire\",\n \"Orkney\",\n \"Orkney Islands\",\n \"Oxfordshire\",\n \"Pembrokeshire\",\n \"Perth and Kinross\",\n \"Powys\",\n \"Renfrewshire\",\n \"Rhondda Cynon Taff\",\n \"Rutland\",\n \"Scottish Borders\",\n \"Shetland Islands\",\n \"Shropshire\",\n \"Somerset\",\n \"South Ayrshire\",\n \"South Lanarkshire\",\n \"South Yorkshire\",\n \"Staffordshire\",\n \"Stirling\",\n \"Suffolk\",\n \"Surrey\",\n \"Swansea\",\n \"Torfaen\",\n \"Tyne and Wear\",\n \"Vale of Glamorgan\",\n \"Warwickshire\",\n \"West Dunbart\",\n \"West Lothian\",\n \"West Midlands\",\n \"West Sussex\",\n \"West Yorkshire\",\n \"Western Isles\",\n \"Wiltshire\",\n \"Worcestershire\",\n \"Wrexham\",\n] as const\n\nexport type UkCounties = (typeof UK_COUNTIES)[number]\n\nexport function getNestedProperty(\n obj: Record<string, any>,\n dotPath: string | string[],\n): any {\n if (typeof dotPath === \"string\") dotPath = dotPath.split(\".\")\n\n let value: unknown = obj\n for (let i = 0; i < dotPath.length; i++) {\n value = (value as Record<string, any>)[dotPath[i]]\n if (\n i !== dotPath.length - 1 &&\n (typeof value !== \"object\" || value === null)\n )\n return\n }\n\n return value\n}\n\nexport function withKeyPaths(obj: object, delimiter: string = \".\"): object {\n function _withKeyPaths(obj: object, path: string[]) {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => {\n const _path = [...path, key]\n\n if (typeof value === \"object\" && value !== null)\n value = _withKeyPaths(value as object, _path)\n\n return [_path.join(delimiter), value]\n }),\n )\n }\n\n return _withKeyPaths(obj, [])\n}\n\nexport function getKeyPaths(obj: object, delimiter: string = \".\"): string[] {\n function _getKeyPaths(obj: object, path: string[]): string[] {\n return Object.entries(obj)\n .map(([key, value]) => {\n const _path = [...path, key]\n const keyPath = _path.join(delimiter)\n\n return typeof value === \"object\" && value !== null\n ? [keyPath, ..._getKeyPaths(value as object, _path)]\n : [keyPath]\n })\n .flat()\n }\n\n return _getKeyPaths(obj, [])\n}\n\nexport function excludeKeyPaths(\n obj: object,\n exclude: string[],\n delimiter: string = \".\",\n): any {\n function _excludeKeyPaths(obj: object, path: string[]) {\n return Object.fromEntries(\n Object.entries(obj)\n .map(([key, value]: [string, unknown]) => {\n const _path = [...path, key]\n\n if (\n typeof value === \"object\" &&\n value !== null &&\n !(value instanceof Date)\n )\n value = _excludeKeyPaths(value, _path)\n\n return exclude.includes(_path.join(delimiter)) ? [] : [key, value]\n })\n .filter(entry => entry.length),\n ) as object\n }\n\n return exclude.length ? _excludeKeyPaths(obj, []) : obj\n}\n\nexport function generateSecureRandomString(\n length: number,\n charSet: string = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\n) {\n // Create an array of 32-bit unsigned integers\n const randomValues = window.crypto.getRandomValues(new Uint8Array(length))\n\n // Map the random values to characters from our string\n let result = \"\"\n for (let i = 0; i < length; i++) {\n result += charSet.charAt(randomValues[i] % charSet.length)\n }\n\n return result\n}\n"],"names":["openInNewTab","url","target","wrap","newFn","fn","args","value","snakeCaseToCamelCase","obj","snakeKey","camelKey","_char","camelCaseToSnakeCase","char","MIN_DATE","COUNTRY_ISO_CODES","COUNTRIES","COUNTRY_ISO_CODE_MAPPING","UK_COUNTIES","getNestedProperty","dotPath","withKeyPaths","delimiter","_withKeyPaths","path","key","_path","getKeyPaths","_getKeyPaths","keyPath","excludeKeyPaths","exclude","_excludeKeyPaths","entry","generateSecureRandomString","length","charSet","randomValues","result","i"],"mappings":"AAQO,SAASA,EAAaC,GAAaC,IAAS,UAAgB;AACjE,SAAO,KAAKD,GAAKC,CAAM;AACzB;AAEO,SAASC,EACdC,GAIAC,GACyB;AACzB,SAAO,IAAIC,MAAS;AAClB,IAAIF,EAAM,WAAW,UACnBA,EAAM,OAAO,GAAIE,CAAkB;AAErC,QAAIC;AACJ,WAAIF,MAAO,WACTE,IAAQF,EAAG,GAAIC,CAAkB,IAE/BF,EAAM,UAAU,UAClBA,EAAM,MAAM,GAAIE,CAAkB,GAE7BC;AAAA,EACT;AACF;AAEO,SAASC,EAAqBC,GAAgC;AACnE,SAAO,QAAQA,CAAG,EAAE,QAAQ,CAAC,CAACC,GAAUH,CAAK,MAAM;AACjD,IAAI,OAAOA,KAAU,YAAUC,EAAqBD,CAAe;AAEnE,UAAMI,IAAWD,EAAS;AAAA,MAAQ;AAAA,MAAY,OAC5CE,EAAMA,EAAM,SAAS,CAAC,EAAE,YAAA;AAAA,IAAY;AAGtC,WAAOH,EAAIC,CAAQ,GACnBD,EAAIE,CAAQ,IAAIJ;AAAA,EAClB,CAAC;AACH;AAEO,SAASM,EAAqBJ,GAAgC;AACnE,SAAO,QAAQA,CAAG,EAAE,QAAQ,CAAC,CAACE,GAAUJ,CAAK,MAAM;AACjD,IAAI,OAAOA,KAAU,YAAUM,EAAqBN,CAAe;AAEnE,UAAMG,IAAWC,EAAS;AAAA,MACxB;AAAA,MACA,CAAAG,MAAQ,IAAIA,EAAK,YAAA,CAAa;AAAA,IAAA;AAGhC,WAAOL,EAAIE,CAAQ,GACnBF,EAAIC,CAAQ,IAAIH;AAAA,EAClB,CAAC;AACH;AAEO,MAAMQ,IAAW,IAAI,KAAK,GAAG,GAAG,CAAC,GAE3BC,IAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAIaC,IAAY;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAIaC,IAA+D;AAAA,EAC1E,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEaC,IAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,SAASC,EACdX,GACAY,GACK;AACL,EAAI,OAAOA,KAAY,aAAUA,IAAUA,EAAQ,MAAM,GAAG;AAE5D,MAAId,IAAiBE;AACrB,WAAS,IAAI,GAAG,IAAIY,EAAQ,QAAQ;AAElC,QADAd,IAASA,EAA8Bc,EAAQ,CAAC,CAAC,GAE/C,MAAMA,EAAQ,SAAS,MACtB,OAAOd,KAAU,YAAYA,MAAU;AAExC;AAGJ,SAAOA;AACT;AAEO,SAASe,EAAab,GAAac,IAAoB,KAAa;AACzE,WAASC,EAAcf,GAAagB,GAAgB;AAClD,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQhB,CAAG,EAAE,IAAI,CAAC,CAACiB,GAAKnB,CAAK,MAAM;AACxC,cAAMoB,IAAQ,CAAC,GAAGF,GAAMC,CAAG;AAE3B,eAAI,OAAOnB,KAAU,YAAYA,MAAU,SACzCA,IAAQiB,EAAcjB,GAAiBoB,CAAK,IAEvC,CAACA,EAAM,KAAKJ,CAAS,GAAGhB,CAAK;AAAA,MACtC,CAAC;AAAA,IAAA;AAAA,EAEL;AAEA,SAAOiB,EAAcf,GAAK,EAAE;AAC9B;AAEO,SAASmB,EAAYnB,GAAac,IAAoB,KAAe;AAC1E,WAASM,EAAapB,GAAagB,GAA0B;AAC3D,WAAO,OAAO,QAAQhB,CAAG,EACtB,IAAI,CAAC,CAACiB,GAAKnB,CAAK,MAAM;AACrB,YAAMoB,IAAQ,CAAC,GAAGF,GAAMC,CAAG,GACrBI,IAAUH,EAAM,KAAKJ,CAAS;AAEpC,aAAO,OAAOhB,KAAU,YAAYA,MAAU,OAC1C,CAACuB,GAAS,GAAGD,EAAatB,GAAiBoB,CAAK,CAAC,IACjD,CAACG,CAAO;AAAA,IACd,CAAC,EACA,KAAA;AAAA,EACL;AAEA,SAAOD,EAAapB,GAAK,EAAE;AAC7B;AAEO,SAASsB,EACdtB,GACAuB,GACAT,IAAoB,KACf;AACL,WAASU,EAAiBxB,GAAagB,GAAgB;AACrD,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQhB,CAAG,EACf,IAAI,CAAC,CAACiB,GAAKnB,CAAK,MAAyB;AACxC,cAAMoB,IAAQ,CAAC,GAAGF,GAAMC,CAAG;AAE3B,eACE,OAAOnB,KAAU,YACjBA,MAAU,QACV,EAAEA,aAAiB,UAEnBA,IAAQ0B,EAAiB1B,GAAOoB,CAAK,IAEhCK,EAAQ,SAASL,EAAM,KAAKJ,CAAS,CAAC,IAAI,CAAA,IAAK,CAACG,GAAKnB,CAAK;AAAA,MACnE,CAAC,EACA,OAAO,CAAA2B,MAASA,EAAM,MAAM;AAAA,IAAA;AAAA,EAEnC;AAEA,SAAOF,EAAQ,SAASC,EAAiBxB,GAAK,CAAA,CAAE,IAAIA;AACtD;AAEO,SAAS0B,EACdC,GACAC,IAAkB,kEAClB;AAEA,QAAMC,IAAe,OAAO,OAAO,gBAAgB,IAAI,WAAWF,CAAM,CAAC;AAGzE,MAAIG,IAAS;AACb,WAASC,IAAI,GAAGA,IAAIJ,GAAQI;AAC1B,IAAAD,KAAUF,EAAQ,OAAOC,EAAaE,CAAC,IAAIH,EAAQ,MAAM;AAG3D,SAAOE;AACT;"}
1
+ {"version":3,"file":"general.es.js","sources":["../../src/utils/general.ts"],"sourcesContent":["export type Required<T, K extends keyof T> = { [P in K]-?: T[P] }\nexport type Optional<T, K extends keyof T> = Partial<Pick<T, K>>\nexport type OptionalPropertyNames<T> = {\n [K in keyof T]-?: {} extends { [P in K]: T[K] } ? K : never\n}[keyof T]\nexport type IsOptional<T, K extends keyof T> =\n K extends OptionalPropertyNames<T> ? true : false\n\nexport function openInNewTab(url: string, target = \"_blank\"): void {\n window.open(url, target)\n}\n\nexport function wrap(\n newFn: {\n before?: (...args: any[]) => void\n after?: (...args: any[]) => void\n },\n fn?: (...args: any[]) => any,\n): (...args: any[]) => any {\n return (...args) => {\n if (newFn.before !== undefined) {\n newFn.before(...(args as unknown[]))\n }\n let value\n if (fn !== undefined) {\n value = fn(...(args as unknown[])) as unknown\n }\n if (newFn.after !== undefined) {\n newFn.after(...(args as unknown[]))\n }\n return value\n }\n}\n\nexport function snakeCaseToCamelCase(obj: Record<string, any>): void {\n Object.entries(obj).forEach(([snakeKey, value]) => {\n if (typeof value === \"object\") snakeCaseToCamelCase(value as object)\n\n const camelKey = snakeKey.replace(/_+[a-z]/g, _char =>\n _char[_char.length - 1].toUpperCase(),\n )\n\n delete obj[snakeKey]\n obj[camelKey] = value as unknown\n })\n}\n\nexport function camelCaseToSnakeCase(obj: Record<string, any>): void {\n Object.entries(obj).forEach(([camelKey, value]) => {\n if (typeof value === \"object\") camelCaseToSnakeCase(value as object)\n\n const snakeKey = camelKey.replace(\n /[A-Z]/g,\n char => `_${char.toLowerCase()}`,\n )\n\n delete obj[camelKey]\n obj[snakeKey] = value as unknown\n })\n}\n\nexport const MIN_DATE = new Date(0, 0, 0)\n\nexport function generateSecureRandomString(\n length: number,\n charSet: string = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\n) {\n // Create an array of 32-bit unsigned integers\n const randomValues = window.crypto.getRandomValues(new Uint8Array(length))\n\n // Map the random values to characters from our string\n let result = \"\"\n for (let i = 0; i < length; i++) {\n result += charSet.charAt(randomValues[i] % charSet.length)\n }\n\n return result\n}\n"],"names":["openInNewTab","url","target","wrap","newFn","fn","args","value","snakeCaseToCamelCase","obj","snakeKey","camelKey","_char","camelCaseToSnakeCase","char","MIN_DATE","generateSecureRandomString","length","charSet","randomValues","result","i"],"mappings":"AAQO,SAASA,EAAaC,GAAaC,IAAS,UAAgB;AACjE,SAAO,KAAKD,GAAKC,CAAM;AACzB;AAEO,SAASC,EACdC,GAIAC,GACyB;AACzB,SAAO,IAAIC,MAAS;AAClB,IAAIF,EAAM,WAAW,UACnBA,EAAM,OAAO,GAAIE,CAAkB;AAErC,QAAIC;AACJ,WAAIF,MAAO,WACTE,IAAQF,EAAG,GAAIC,CAAkB,IAE/BF,EAAM,UAAU,UAClBA,EAAM,MAAM,GAAIE,CAAkB,GAE7BC;AAAA,EACT;AACF;AAEO,SAASC,EAAqBC,GAAgC;AACnE,SAAO,QAAQA,CAAG,EAAE,QAAQ,CAAC,CAACC,GAAUH,CAAK,MAAM;AACjD,IAAI,OAAOA,KAAU,YAAUC,EAAqBD,CAAe;AAEnE,UAAMI,IAAWD,EAAS;AAAA,MAAQ;AAAA,MAAY,OAC5CE,EAAMA,EAAM,SAAS,CAAC,EAAE,YAAA;AAAA,IAAY;AAGtC,WAAOH,EAAIC,CAAQ,GACnBD,EAAIE,CAAQ,IAAIJ;AAAA,EAClB,CAAC;AACH;AAEO,SAASM,EAAqBJ,GAAgC;AACnE,SAAO,QAAQA,CAAG,EAAE,QAAQ,CAAC,CAACE,GAAUJ,CAAK,MAAM;AACjD,IAAI,OAAOA,KAAU,YAAUM,EAAqBN,CAAe;AAEnE,UAAMG,IAAWC,EAAS;AAAA,MACxB;AAAA,MACA,CAAAG,MAAQ,IAAIA,EAAK,YAAA,CAAa;AAAA,IAAA;AAGhC,WAAOL,EAAIE,CAAQ,GACnBF,EAAIC,CAAQ,IAAIH;AAAA,EAClB,CAAC;AACH;AAEO,MAAMQ,IAAW,IAAI,KAAK,GAAG,GAAG,CAAC;AAEjC,SAASC,EACdC,GACAC,IAAkB,kEAClB;AAEA,QAAMC,IAAe,OAAO,OAAO,gBAAgB,IAAI,WAAWF,CAAM,CAAC;AAGzE,MAAIG,IAAS;AACb,WAASC,IAAI,GAAGA,IAAIJ,GAAQI;AAC1B,IAAAD,KAAUF,EAAQ,OAAOC,EAAaE,CAAC,IAAIH,EAAQ,MAAM;AAG3D,SAAOE;AACT;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react-router");require("react/jsx-runtime");require("react");require("@mui/icons-material");require("@mui/material");require("../palette-BnIdHKDE.cjs");require("../auth--UJpsJx8.cjs");function q(e,o={}){function c(r,g,t){typeof r.__=="object"&&(t=t?{...t,...r.__}:r.__);const _=typeof e=="string"&&t?l.generatePath(e,t):e;Object.entries(r).forEach(([u,i])=>{if(u!=="__")if(i=i,typeof i=="string"){if(typeof _=="string"&&(!g||u!=="_")){let n=_+i;n.endsWith("/")&&(n=n.slice(0,-1)),r[u]=n}}else c(i,!1,t)})}const f={...o,_:typeof e=="string"?e:"",__:e};return e===""?f._="/":c(f,!0),f}function s(e,o){return e.__[o]}exports.getParam=s;exports.path=q;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react-router");require("react/jsx-runtime");require("react");require("@mui/icons-material");require("@mui/material");require("../palette-BnIdHKDE.cjs");require("../auth-DdbHSDCh.cjs");function q(e,o={}){function c(r,g,t){typeof r.__=="object"&&(t=t?{...t,...r.__}:r.__);const _=typeof e=="string"&&t?l.generatePath(e,t):e;Object.entries(r).forEach(([u,i])=>{if(u!=="__")if(i=i,typeof i=="string"){if(typeof _=="string"&&(!g||u!=="_")){let n=_+i;n.endsWith("/")&&(n=n.slice(0,-1)),r[u]=n}}else c(i,!1,t)})}const f={...o,_:typeof e=="string"?e:"",__:e};return e===""?f._="/":c(f,!0),f}function s(e,o){return e.__[o]}exports.getParam=s;exports.path=q;
2
2
  //# sourceMappingURL=router.cjs.js.map
@@ -4,7 +4,7 @@ import "react";
4
4
  import "@mui/icons-material";
5
5
  import "@mui/material";
6
6
  import "../palette-CYwuLBW7.js";
7
- import "../auth-C3UdJFcP.js";
7
+ import "../auth-BXLedrZH.js";
8
8
  function x(t, n = {}) {
9
9
  function c(i, l, e) {
10
10
  typeof i.__ == "object" && (e = e ? { ...e, ...i.__ } : i.__);
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "codeforlife",
3
3
  "description": "Common frontend code",
4
4
  "private": false,
5
- "version": "2.14.9",
5
+ "version": "2.15.0",
6
6
  "type": "module",
7
7
  "types": "dist/index.d.ts",
8
8
  "module": "dist/index.es.js",
@@ -203,15 +203,15 @@
203
203
  "@reduxjs/toolkit": "2.9.0",
204
204
  "compression": "1.8.1",
205
205
  "dayjs": "1.11.19",
206
- "express": "4.22.1",
206
+ "express": "4.22.2",
207
207
  "formik": "2.4.9",
208
208
  "js-cookie": "3.0.5",
209
209
  "memory-cache": "0.2.0",
210
- "qs": "6.14.2",
210
+ "qs": "6.15.2",
211
211
  "react": "19.1.1",
212
212
  "react-dom": "19.1.1",
213
213
  "react-redux": "9.2.0",
214
- "react-router": "7.12.0",
214
+ "react-router": "7.15.0",
215
215
  "sirv": "3.0.2",
216
216
  "yup": "1.7.1"
217
217
  },
@@ -1,2 +0,0 @@
1
- "use strict";const f=require("react/jsx-runtime"),d=require("@mui/material");require("react");const S=require("./utils/general.cjs.js");require("yup");const p=require("@mui/icons-material"),h=()=>f.jsxs(d.Stack,{alignItems:"center",alignContent:"center",children:[f.jsx(p.SyncProblem,{color:"error"}),f.jsx(d.Typography,{color:"error.main",children:"Failed to sync data"})]});function m(r,t){if(t.url&&Object.entries(t.url).forEach(([o,s])=>{r=r.replace(`<${o}>`,String(s))}),t.search){const o=[];for(const s in t.search){const c=t.search[s];if(c!==void 0)if(Array.isArray(c))for(const i of c)o.push([s,String(i)]);else o.push([s,String(c)])}o.length!==0&&(r+=`?${new URLSearchParams(o).toString()}`)}return r}function l(r){return typeof r=="number"||typeof r=="string"}function g(r){return{type:r,id:"LIST"}}function A(r,t){const{includeListTag:o=!1,argKeysAreIds:s=!1,id:c="id"}=t||{};function i(e,u=o){const n=e.map(y=>({type:r,id:String(y)}));return u&&n.push(g(r)),n}function a(e){return S.getNestedProperty(e,c)}return(e,u,n)=>{if(!u){if(n){if(l(n))return i([n]);if(Array.isArray(n)){if(n.length&&l(n[0]))return i(n)}else if(typeof n=="object"&&s)return i(Object.keys(n))}if(e)return Array.isArray(e)?i(e.map(a)):a(e)!==void 0?i([a(e)]):i(e.data.map(a),!0)}return i([])}}function j(r,t){if(r===t)throw Error("List and detail are the same.");return{list:r,detail:t}}function E(r,t,o){const{data:s,isLoading:c,isSuccess:i}=r,a=r.error,{loading:e=f.jsx(d.CircularProgress,{}),error:u=f.jsx(h,{})}=o||{};if(a)return console.error(a),u;if(c)return e;if(s)return t(s);if(i)throw Error("Expected to get data from API but got nothing.");return e}function b(r){return["GET","HEAD","OPTIONS","TRACE"].includes(r.toUpperCase())}exports.SyncError=h;exports.buildUrl=m;exports.handleResultState=E;exports.isModelId=l;exports.isSafeHttpMethod=b;exports.listTag=g;exports.modelUrls=j;exports.tagData=A;
2
- //# sourceMappingURL=api-G8CV5bUa.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-G8CV5bUa.cjs","sources":["../src/components/SyncError.tsx","../src/utils/api.tsx"],"sourcesContent":["import { Stack, Typography } from \"@mui/material\"\nimport { type FC } from \"react\"\nimport { SyncProblem as SyncProblemIcon } from \"@mui/icons-material\"\n\nexport interface SyncErrorProps {}\n\nconst SyncError: FC<SyncErrorProps> = () => (\n <Stack alignItems=\"center\" alignContent=\"center\">\n <SyncProblemIcon color=\"error\" />\n <Typography color=\"error.main\">Failed to sync data</Typography>\n </Stack>\n)\n\nexport default SyncError\n","import type {\n FetchBaseQueryError,\n TypedUseMutationResult,\n TypedUseQueryHookResult,\n TypedUseQueryStateResult,\n} from \"@reduxjs/toolkit/query/react\"\nimport { CircularProgress } from \"@mui/material\"\nimport { type ReactNode } from \"react\"\n\nimport { type Optional, type Required, getNestedProperty } from \"./general\"\nimport { type SchemaMap } from \"./schema\"\nimport SyncError from \"../components/SyncError\"\n\n// -----------------------------------------------------------------------------\n// Model Types\n// -----------------------------------------------------------------------------\n\n// The fields of a model.\nexport type Fields = Record<string, unknown>\n\nexport interface Tag<Type extends string> {\n type: Type\n id: string\n}\n\nexport type ModelId = string | number\n\n/**\n * A data model.\n * Id: The type of Id.\n * Data: The data fields.\n */\nexport type Model<Id extends ModelId, MFields extends Fields = Fields> = {\n id: Id\n} & Omit<MFields, \"id\">\n\nexport type Schemas<M extends Model<any>> = {\n [K in keyof M]-?: SchemaMap<M[K]>\n}\n\nexport type Result<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Pick<M, \"id\" | MFields>\n\nexport type Arg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = Required<M, RequiredFields> & Optional<M, OptionalFields>\n\n// -----------------------------------------------------------------------------\n// CRUD Types\n// https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions\n// -----------------------------------------------------------------------------\n\n// Create\n\nexport type CreateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\nexport type CreateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = Arg<M, RequiredFields, OptionalFields>\n\nexport type BulkCreateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Result<M, MFields> & ExtraFields>\n\nexport type BulkCreateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Arg<M, RequiredFields, OptionalFields> & ExtraFields>\n\n// Read\n\nexport type RetrieveResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\nexport type RetrieveArg<M extends Model<any>> = M[\"id\"]\n\nexport interface ListResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> {\n count: number\n offset: number\n limit: number\n max_limit: number\n data: Array<Result<M, MFields> & ExtraFields>\n}\n\nexport type ListArg<Filters extends Fields = Fields> = {\n limit: number\n offset: number\n} & Partial<Omit<Filters, \"limit\" | \"offset\">>\n\n// Update\n\nexport type UpdateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\ntype UpdateWithBody<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields>,\n> = Pick<M, \"id\"> & Arg<M, RequiredFields, OptionalFields>\n\n// NOTE: Sometimes update does not require a body. For example, if calling the\n// \"refresh\" action on an invitation object updates the expiry date to be 24\n// hours from now. In this case, you only need to pass the ID of the object.\nexport type UpdateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\"> = never,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = [RequiredFields] extends [never]\n ? [OptionalFields] extends [never]\n ? M[\"id\"]\n : UpdateWithBody<M, RequiredFields, OptionalFields>\n : UpdateWithBody<M, RequiredFields, OptionalFields>\n\nexport type BulkUpdateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Result<M, MFields> & ExtraFields>\n\nexport type BulkUpdateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n ExtraFields extends Fields = Fields,\n> = Record<M[\"id\"], Arg<M, RequiredFields, OptionalFields> & ExtraFields>\n\n// Delete\n\nexport type DestroyResult = null\n\nexport type DestroyArg<M extends Model<any>> = M[\"id\"]\n\nexport type BulkDestroyResult = null\n\nexport type BulkDestroyArg<M extends Model<any>> = Array<M[\"id\"]>\n\n// -----------------------------------------------------------------------------\n// Functions\n// -----------------------------------------------------------------------------\n\nexport function buildUrl(\n url: string,\n params: {\n search?: Fields\n url?: Fields\n },\n): string {\n if (params.url) {\n Object.entries(params.url).forEach(([key, value]) => {\n url = url.replace(`<${key}>`, String(value))\n })\n }\n\n if (params.search) {\n const searchParams: string[][] = []\n for (const key in params.search) {\n const values = params.search[key]\n if (values === undefined) continue\n\n if (Array.isArray(values)) {\n for (const value of values) searchParams.push([key, String(value)])\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n searchParams.push([key, String(values)])\n }\n }\n\n if (searchParams.length !== 0) {\n url += `?${new URLSearchParams(searchParams).toString()}`\n }\n }\n\n return url\n}\n\nexport function isModelId(value: unknown): boolean {\n return typeof value === \"number\" || typeof value === \"string\"\n}\n\nexport function listTag<Type extends string>(type: Type): Tag<Type> {\n return { type, id: \"LIST\" }\n}\n\nexport type TagDataOptions = Partial<{\n includeListTag: boolean\n argKeysAreIds: boolean\n id: string\n}>\n\nexport function tagData<Type extends string, M extends Model<any>>(\n type: Type,\n options?: TagDataOptions,\n): (\n result:\n | Result<M, any>\n | Array<Result<M, any>>\n | ListResult<M, any>\n | null\n | undefined,\n error: FetchBaseQueryError | undefined,\n arg:\n | Arg<M, any>\n | Array<Arg<M, any>>\n | Record<M[\"id\"], Arg<M, any>>\n | ListArg<any>\n | Array<M[\"id\"]>\n | string\n | number\n | undefined,\n) => Array<Tag<Type>> {\n const {\n includeListTag = false,\n argKeysAreIds = false,\n id = \"id\",\n } = options || {}\n\n function tags(\n ids: ModelId[],\n list: boolean = includeListTag,\n ): Array<Tag<Type>> {\n const tags = ids.map(id => ({ type, id: String(id) }))\n if (list) tags.push(listTag(type))\n return tags\n }\n\n function getModelId(result: Result<M, any>) {\n return getNestedProperty(result, id) as ModelId\n }\n\n return (result, error, arg) => {\n if (!error) {\n if (arg) {\n // The argument is an ID.\n if (isModelId(arg)) return tags([arg as ModelId])\n\n // The argument is an array of IDs.\n if (Array.isArray(arg)) {\n if (arg.length && isModelId(arg[0])) {\n return tags(arg as Array<M[\"id\"]>)\n }\n }\n // The argument is an object that contains the id field.\n else if (typeof arg === \"object\" && argKeysAreIds) {\n return tags(Object.keys(arg as Record<M[\"id\"], any>))\n }\n }\n\n if (result) {\n // The result is an array of models that contain the id field.\n if (Array.isArray(result)) {\n return tags(result.map(getModelId))\n }\n\n // The result is a model that contains the id field.\n if (getModelId(result as Result<M, any>) !== undefined) {\n return tags([getModelId(result as Result<M, any>)])\n }\n\n // The result is a list that contains an array of models that contain\n // the id field.\n return tags((result as ListResult<M, any>).data.map(getModelId), true)\n }\n }\n\n return tags([])\n }\n}\n\nexport function modelUrls(list: string, detail: string) {\n if (list === detail) throw Error(\"List and detail are the same.\")\n\n return { list, detail }\n}\n\nexport type HandleQueryStateOptions = Partial<{\n loading: ReactNode\n error: ReactNode\n}>\n\nexport function handleResultState<QueryArg, ResultType>(\n result:\n | TypedUseQueryHookResult<ResultType, QueryArg, any>\n | TypedUseQueryStateResult<ResultType, QueryArg, any>\n | TypedUseMutationResult<ResultType, QueryArg, any>,\n children: (data: NonNullable<ResultType>) => ReactNode,\n options?: HandleQueryStateOptions,\n): ReactNode {\n const { data, isLoading, isSuccess } = result\n const error = result.error as string | undefined\n\n const {\n loading: loadingNode = <CircularProgress />,\n error: errorNode = <SyncError />,\n } = options || {}\n\n // An error occurred.\n if (error) {\n console.error(error)\n return errorNode\n }\n\n // Busy calling the API.\n if (isLoading) return loadingNode\n\n // Called the API and got data.\n if (data) return children(data)\n\n // Called the API and did not get data.\n if (isSuccess) throw Error(\"Expected to get data from API but got nothing.\")\n\n // Have yet to call the API.\n return loadingNode\n}\n\nexport function isSafeHttpMethod(method: string) {\n // https://datatracker.ietf.org/doc/html/rfc9110.html#section-9.2.1\n return [\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\"].includes(method.toUpperCase())\n}\n"],"names":["SyncError","jsxs","Stack","jsx","SyncProblemIcon","Typography","buildUrl","url","params","key","value","searchParams","values","isModelId","listTag","type","tagData","options","includeListTag","argKeysAreIds","id","tags","ids","list","getModelId","result","getNestedProperty","error","arg","modelUrls","detail","handleResultState","children","data","isLoading","isSuccess","loadingNode","CircularProgress","errorNode","isSafeHttpMethod","method"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-uh8UKwsU.js","sources":["../src/components/SyncError.tsx","../src/utils/api.tsx"],"sourcesContent":["import { Stack, Typography } from \"@mui/material\"\nimport { type FC } from \"react\"\nimport { SyncProblem as SyncProblemIcon } from \"@mui/icons-material\"\n\nexport interface SyncErrorProps {}\n\nconst SyncError: FC<SyncErrorProps> = () => (\n <Stack alignItems=\"center\" alignContent=\"center\">\n <SyncProblemIcon color=\"error\" />\n <Typography color=\"error.main\">Failed to sync data</Typography>\n </Stack>\n)\n\nexport default SyncError\n","import type {\n FetchBaseQueryError,\n TypedUseMutationResult,\n TypedUseQueryHookResult,\n TypedUseQueryStateResult,\n} from \"@reduxjs/toolkit/query/react\"\nimport { CircularProgress } from \"@mui/material\"\nimport { type ReactNode } from \"react\"\n\nimport { type Optional, type Required, getNestedProperty } from \"./general\"\nimport { type SchemaMap } from \"./schema\"\nimport SyncError from \"../components/SyncError\"\n\n// -----------------------------------------------------------------------------\n// Model Types\n// -----------------------------------------------------------------------------\n\n// The fields of a model.\nexport type Fields = Record<string, unknown>\n\nexport interface Tag<Type extends string> {\n type: Type\n id: string\n}\n\nexport type ModelId = string | number\n\n/**\n * A data model.\n * Id: The type of Id.\n * Data: The data fields.\n */\nexport type Model<Id extends ModelId, MFields extends Fields = Fields> = {\n id: Id\n} & Omit<MFields, \"id\">\n\nexport type Schemas<M extends Model<any>> = {\n [K in keyof M]-?: SchemaMap<M[K]>\n}\n\nexport type Result<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Pick<M, \"id\" | MFields>\n\nexport type Arg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = Required<M, RequiredFields> & Optional<M, OptionalFields>\n\n// -----------------------------------------------------------------------------\n// CRUD Types\n// https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions\n// -----------------------------------------------------------------------------\n\n// Create\n\nexport type CreateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\nexport type CreateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = Arg<M, RequiredFields, OptionalFields>\n\nexport type BulkCreateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Result<M, MFields> & ExtraFields>\n\nexport type BulkCreateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Arg<M, RequiredFields, OptionalFields> & ExtraFields>\n\n// Read\n\nexport type RetrieveResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\nexport type RetrieveArg<M extends Model<any>> = M[\"id\"]\n\nexport interface ListResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> {\n count: number\n offset: number\n limit: number\n max_limit: number\n data: Array<Result<M, MFields> & ExtraFields>\n}\n\nexport type ListArg<Filters extends Fields = Fields> = {\n limit: number\n offset: number\n} & Partial<Omit<Filters, \"limit\" | \"offset\">>\n\n// Update\n\nexport type UpdateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\ntype UpdateWithBody<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields>,\n> = Pick<M, \"id\"> & Arg<M, RequiredFields, OptionalFields>\n\n// NOTE: Sometimes update does not require a body. For example, if calling the\n// \"refresh\" action on an invitation object updates the expiry date to be 24\n// hours from now. In this case, you only need to pass the ID of the object.\nexport type UpdateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\"> = never,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = [RequiredFields] extends [never]\n ? [OptionalFields] extends [never]\n ? M[\"id\"]\n : UpdateWithBody<M, RequiredFields, OptionalFields>\n : UpdateWithBody<M, RequiredFields, OptionalFields>\n\nexport type BulkUpdateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Result<M, MFields> & ExtraFields>\n\nexport type BulkUpdateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n ExtraFields extends Fields = Fields,\n> = Record<M[\"id\"], Arg<M, RequiredFields, OptionalFields> & ExtraFields>\n\n// Delete\n\nexport type DestroyResult = null\n\nexport type DestroyArg<M extends Model<any>> = M[\"id\"]\n\nexport type BulkDestroyResult = null\n\nexport type BulkDestroyArg<M extends Model<any>> = Array<M[\"id\"]>\n\n// -----------------------------------------------------------------------------\n// Functions\n// -----------------------------------------------------------------------------\n\nexport function buildUrl(\n url: string,\n params: {\n search?: Fields\n url?: Fields\n },\n): string {\n if (params.url) {\n Object.entries(params.url).forEach(([key, value]) => {\n url = url.replace(`<${key}>`, String(value))\n })\n }\n\n if (params.search) {\n const searchParams: string[][] = []\n for (const key in params.search) {\n const values = params.search[key]\n if (values === undefined) continue\n\n if (Array.isArray(values)) {\n for (const value of values) searchParams.push([key, String(value)])\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n searchParams.push([key, String(values)])\n }\n }\n\n if (searchParams.length !== 0) {\n url += `?${new URLSearchParams(searchParams).toString()}`\n }\n }\n\n return url\n}\n\nexport function isModelId(value: unknown): boolean {\n return typeof value === \"number\" || typeof value === \"string\"\n}\n\nexport function listTag<Type extends string>(type: Type): Tag<Type> {\n return { type, id: \"LIST\" }\n}\n\nexport type TagDataOptions = Partial<{\n includeListTag: boolean\n argKeysAreIds: boolean\n id: string\n}>\n\nexport function tagData<Type extends string, M extends Model<any>>(\n type: Type,\n options?: TagDataOptions,\n): (\n result:\n | Result<M, any>\n | Array<Result<M, any>>\n | ListResult<M, any>\n | null\n | undefined,\n error: FetchBaseQueryError | undefined,\n arg:\n | Arg<M, any>\n | Array<Arg<M, any>>\n | Record<M[\"id\"], Arg<M, any>>\n | ListArg<any>\n | Array<M[\"id\"]>\n | string\n | number\n | undefined,\n) => Array<Tag<Type>> {\n const {\n includeListTag = false,\n argKeysAreIds = false,\n id = \"id\",\n } = options || {}\n\n function tags(\n ids: ModelId[],\n list: boolean = includeListTag,\n ): Array<Tag<Type>> {\n const tags = ids.map(id => ({ type, id: String(id) }))\n if (list) tags.push(listTag(type))\n return tags\n }\n\n function getModelId(result: Result<M, any>) {\n return getNestedProperty(result, id) as ModelId\n }\n\n return (result, error, arg) => {\n if (!error) {\n if (arg) {\n // The argument is an ID.\n if (isModelId(arg)) return tags([arg as ModelId])\n\n // The argument is an array of IDs.\n if (Array.isArray(arg)) {\n if (arg.length && isModelId(arg[0])) {\n return tags(arg as Array<M[\"id\"]>)\n }\n }\n // The argument is an object that contains the id field.\n else if (typeof arg === \"object\" && argKeysAreIds) {\n return tags(Object.keys(arg as Record<M[\"id\"], any>))\n }\n }\n\n if (result) {\n // The result is an array of models that contain the id field.\n if (Array.isArray(result)) {\n return tags(result.map(getModelId))\n }\n\n // The result is a model that contains the id field.\n if (getModelId(result as Result<M, any>) !== undefined) {\n return tags([getModelId(result as Result<M, any>)])\n }\n\n // The result is a list that contains an array of models that contain\n // the id field.\n return tags((result as ListResult<M, any>).data.map(getModelId), true)\n }\n }\n\n return tags([])\n }\n}\n\nexport function modelUrls(list: string, detail: string) {\n if (list === detail) throw Error(\"List and detail are the same.\")\n\n return { list, detail }\n}\n\nexport type HandleQueryStateOptions = Partial<{\n loading: ReactNode\n error: ReactNode\n}>\n\nexport function handleResultState<QueryArg, ResultType>(\n result:\n | TypedUseQueryHookResult<ResultType, QueryArg, any>\n | TypedUseQueryStateResult<ResultType, QueryArg, any>\n | TypedUseMutationResult<ResultType, QueryArg, any>,\n children: (data: NonNullable<ResultType>) => ReactNode,\n options?: HandleQueryStateOptions,\n): ReactNode {\n const { data, isLoading, isSuccess } = result\n const error = result.error as string | undefined\n\n const {\n loading: loadingNode = <CircularProgress />,\n error: errorNode = <SyncError />,\n } = options || {}\n\n // An error occurred.\n if (error) {\n console.error(error)\n return errorNode\n }\n\n // Busy calling the API.\n if (isLoading) return loadingNode\n\n // Called the API and got data.\n if (data) return children(data)\n\n // Called the API and did not get data.\n if (isSuccess) throw Error(\"Expected to get data from API but got nothing.\")\n\n // Have yet to call the API.\n return loadingNode\n}\n\nexport function isSafeHttpMethod(method: string) {\n // https://datatracker.ietf.org/doc/html/rfc9110.html#section-9.2.1\n return [\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\"].includes(method.toUpperCase())\n}\n"],"names":["SyncError","jsxs","Stack","jsx","SyncProblemIcon","Typography","buildUrl","url","params","key","value","searchParams","values","isModelId","listTag","type","tagData","options","includeListTag","argKeysAreIds","id","tags","ids","list","getModelId","result","getNestedProperty","error","arg","modelUrls","detail","handleResultState","children","data","isLoading","isSuccess","loadingNode","CircularProgress","errorNode","isSafeHttpMethod","method"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";const e=require("react/jsx-runtime"),m=require("@mui/material"),T=require("react"),Z=require("./api-G8CV5bUa.cjs"),ee=require("./api-DIgp_6Vr.cjs"),O=require("formik"),_=require("yup"),E=require("./utils/form.cjs.js"),g=require("./utils/general.cjs.js"),te=require("./dayjs.min-BDMWgl2D.cjs"),w=require("@mui/x-date-pickers"),re=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 oe=require("./schemas-hIW9-H6-.cjs");require("./urls-2gheISSO.cjs");const R=({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:f,offset:p},x]=ee.usePagination(),[{options:b,hasMore:F},S]=T.useState({options:{},hasMore:!0});T.useEffect(()=>{const j={limit:f,offset:p,...t};l&&(j[s]=l),a(j,!0).unwrap().then(({data:C,offset:q,limit:N,count:V})=>{S(({options:X})=>{const k={...X};return C.forEach(L=>{k[o(L)]=L}),{options:k,hasMore:q+N<V}})}).catch(C=>{C&&console.error(C)})},[a,f,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 y(){x(({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(Z.SyncError,{},"is-error")),F&&N.push(e.jsx(m.Button,{onClick:y,children:"Load more"},"load-more"))),e.jsx("ul",{...C,ref:q,onScroll:V=>{!u&&V.currentTarget.clientHeight+V.currentTarget.scrollTop>=V.currentTarget.scrollHeight&&y()},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"?_.string().oneOf(t,u):_.number().oneOf(t,u);l&&(c=c.required());const f={name:i,type:typeof t[0]=="string"?"text":"number",validate:E.schemaToFieldValidator(c,n)};return e.jsx(O.Field,{...f,children:({form:p,meta:x})=>{const b=g.getNestedProperty(p.values,a),F=g.getNestedProperty(p.touched,a),S=g.getNestedProperty(p.errors,a);return e.jsx(m.Autocomplete,{options:t,defaultValue:x.initialValue===""?void 0:x.initialValue,renderInput:({id:h,...y})=>e.jsx(m.TextField,{id:s??i,name:i,required:l,type:"text",value:b,error:F&&!!S,helperText:F&&S,...d,...y}),onChange:(h,y)=>{p.setFieldValue(i,y??void 0,!0)},onBlur:p.handleBlur,...o})}})},M=({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=_.bool();o&&(a=a.oneOf([!0],s));const u={name:t,type:"checkbox",validate:E.schemaToFieldValidator(a,i)};return e.jsx(O.Field,{...u,children:({form:c,meta:f})=>{const p=g.getNestedProperty(c.touched,d),x=g.getNestedProperty(c.errors,d),b=g.getNestedProperty(c.values,d),F=p&&!!x;return e.jsxs(m.FormControl,{error:F,required:o,children:[e.jsx(m.FormControlLabel,{control:e.jsx(m.Checkbox,{defaultChecked:f.initialValue,id:r??t,name:t,value:b,onChange:c.handleChange,onBlur:c.handleBlur,...l}),...n}),F&&e.jsx(m.FormHelperText,{children:x})]})}})},U=({textFieldProps:r,...t})=>{const{name:n="country",label:o="Country",placeholder:s="Select your country",...i}=r||{};return e.jsx(B,{options:g.COUNTRY_ISO_CODES,getOptionLabel:l=>g.COUNTRY_ISO_CODE_MAPPING[l],textFieldProps:{name:n,label:o,placeholder:s,...i},...t})},Y=({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=_.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(O.Field,{...u,children:({form:c})=>{const f=g.getNestedProperty(c.errors,l),p=g.getNestedProperty(c.touched,l);let x=g.getNestedProperty(c.values,l);x=x?te.dayjs(x):null;function b(F){c.setFieldValue(r,F&&F.isValid()?F.format("YYYY-MM-DD"):null,!0)}return e.jsx(w.LocalizationProvider,{dateAdapter:re.AdapterDayjs,adapterLocale:"en-gb",children:e.jsx(w.DatePicker,{name:r,value:x,minDate:n,maxDate:o,onChange:b,slotProps:{textField:{id:r,onChange:F=>{b(F)},onBlur:c.handleBlur,required:t,error:p&&!!f,helperText:p&&f}},...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[f,p]=T.useState(""),x=t.split(".");function b(){let h=n;if(h=s?h.required():h.optional(),i&&!a&&(h=h.notOneOf([f],"cannot be initial value")),!a)return h;let y=_.array().of(h);return y=s?y.required().min(1):y.optional(),(l||d)&&(y=y.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&&(y=y.notOneOf([f],"cannot be initial value")),y}const F={name:t,type:o,validate:E.schemaToFieldValidator(b(),u)},S=({form:h})=>{const y=g.getNestedProperty(h.initialValues,x),P=g.getNestedProperty(h.values,x),j=g.getNestedProperty(h.errors,x),C=g.getNestedProperty(h.touched,x);return T.useEffect(()=>{p(y)},[y]),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(O.Field,{...F,children:S})},D=({name:r="email",label:t="Email address",placeholder:n="Enter your email address",InputProps:o={},...s})=>e.jsx(v,{type:"email",schema:_.string().email(),name:r,label:t,placeholder:n,InputProps:{endAdornment:e.jsx(m.InputAdornment,{position:"end",children:e.jsx(I.EmailOutlined,{})}),...o},...s}),H=({name:r="first_name",label:t="First name",placeholder:n="Enter your first name",InputProps:o={},...s})=>e.jsx(v,{schema:oe.user.first_name,name:r,label:t,placeholder:n,InputProps:{endAdornment:e.jsx(m.InputAdornment,{position:"end",children:e.jsx(I.PersonOutlined,{})}),...o},...s}),z={behavior:"smooth",block:"start"},ne=({scrollIntoViewOptions:r=z,...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})},K=({children:r,scrollIntoViewOptions:t=z,nonFieldErrorsProps:n,fieldRefs:o=[],...s})=>e.jsx(O.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=g.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(O.Form,{children:typeof r=="function"?r(i):r})]})}}),se=({useMutation:r,submitOptions:t,...n})=>{const[o]=r();return e.jsx(K,{...n,onSubmit:E.submitForm(o,n.initialValues,t)})},$=r=>"onSubmit"in r?e.jsx(K,{...r}):se(r),G=({name:r="otp",label:t="OTP",placeholder:n="Enter your OTP",...o})=>e.jsx(v,{name:r,label:t,schema:_.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("."),f=g.getNestedProperty(u.values,c),p=t.split("."),x=g.getNestedProperty(u.values,p),b=g.getNestedProperty(u.touched,p),F=g.getNestedProperty(u.errors,p);return T.useEffect(()=>{n(f)},[n,f]),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:x,onChange:u.handleChange,onBlur:u.handleBlur,error:b&&!!F,helperText:b&&F,...a})},A=({name:r,type:t="text",validateOptions:n,...o})=>{const[s,i]=T.useState(""),l=`${r}_repeat`,d={name:l,type:t,validate:E.schemaToFieldValidator(_.string().required().equals([s],"does not match"),n)};return e.jsx(O.Field,{...d,children:a=>e.jsx(ie,{name:r,type:t,repeatName:l,setValue:i,fieldProps:a,...o})})},W=({name:r="password",label:t="Password",placeholder:n="Enter your password",schema:o=_.string(),InputProps:s={},withRepeatField:i=!1,repeatFieldProps:l={},...d})=>{const[a,u]=T.useState(!1),c=a?"text":"password",f=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:f,...s},...d}),i&&e.jsx(A,{name:r,type:c,...l,InputProps:{endAdornment:f,...l.InputProps}})]})},J=({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(O.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})})},Q=({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:g.UK_COUNTIES,textFieldProps:{name:n,label:o,placeholder:s,...i},...t})},le=Object.freeze(Object.defineProperty({__proto__:null,ApiAutocompleteField:R,AutocompleteField:B,CheckboxField:M,CountryField:U,DatePickerField:Y,EmailField:D,FirstNameField:H,Form:$,OtpField:G,PasswordField:W,RepeatField:A,SubmitButton:J,TextField:v,UkCountyField:Q},Symbol.toStringTag,{value:"Module"}));exports.ApiAutocompleteField=R;exports.AutocompleteField=B;exports.CheckboxField=M;exports.CountryField=U;exports.DatePickerField=Y;exports.EmailField=D;exports.FirstNameField=H;exports.Form=$;exports.OtpField=G;exports.PasswordField=W;exports.RepeatField=A;exports.SubmitButton=J;exports.TextField=v;exports.UkCountyField=Q;exports.index=le;
2
- //# sourceMappingURL=index-BhTYGZm3.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BhTYGZm3.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/general\"\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/general\"\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/general\"\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/general\"\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/general\"\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/general\"\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/general\"\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/general\"\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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-Uk65JJpc.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/general\"\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/general\"\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/general\"\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/general\"\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/general\"\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/general\"\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/general\"\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/general\"\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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"}