@capsitech/react-utilities 0.1.7 → 0.1.8

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 (80) hide show
  1. package/lib/Components.d.ts +2 -0
  2. package/lib/Components.js +5 -0
  3. package/lib/Components.js.map +1 -0
  4. package/lib/Hooks/index.d.ts +2 -2
  5. package/lib/Hooks.d.ts +2 -0
  6. package/lib/Hooks.js +67 -0
  7. package/lib/Hooks.js.map +1 -0
  8. package/lib/Utilities.d.ts +2 -0
  9. package/lib/Utilities.js +54 -0
  10. package/lib/Utilities.js.map +1 -0
  11. package/lib/dayjs-aKjfjjRl.mjs +605 -0
  12. package/lib/dayjs-aKjfjjRl.mjs.map +1 -0
  13. package/lib/index.js +69 -3458
  14. package/lib/index.js.map +1 -1
  15. package/lib/src/Components/SuspenseRoute.d.ts +2 -0
  16. package/lib/src/Components/SuspenseRoute.js +22 -0
  17. package/lib/src/Components/SuspenseRoute.js.map +1 -0
  18. package/lib/src/Components/index.d.ts +2 -0
  19. package/lib/src/Components/index.js +5 -0
  20. package/lib/src/Components/index.js.map +1 -0
  21. package/lib/src/Hooks/index.d.ts +2 -0
  22. package/lib/src/Hooks/index.js +20 -0
  23. package/lib/src/Hooks/index.js.map +1 -0
  24. package/lib/src/Hooks/useInfiniteScroll.d.ts +2 -0
  25. package/lib/src/Hooks/useInfiniteScroll.js +20 -0
  26. package/lib/src/Hooks/useInfiniteScroll.js.map +1 -0
  27. package/lib/src/Hooks/useNetworkState.d.ts +2 -0
  28. package/lib/src/Hooks/useNetworkState.js +33 -0
  29. package/lib/src/Hooks/useNetworkState.js.map +1 -0
  30. package/lib/src/Hooks/useShortcuts.d.ts +2 -0
  31. package/lib/src/Hooks/useShortcuts.js +43 -0
  32. package/lib/src/Hooks/useShortcuts.js.map +1 -0
  33. package/lib/src/Utilities/ApiUtility.axios.d.ts +2 -0
  34. package/lib/src/Utilities/ApiUtility.axios.js +222 -0
  35. package/lib/src/Utilities/ApiUtility.axios.js.map +1 -0
  36. package/lib/src/Utilities/BrowserInfo.d.ts +2 -0
  37. package/lib/src/Utilities/BrowserInfo.js +51 -0
  38. package/lib/src/Utilities/BrowserInfo.js.map +1 -0
  39. package/lib/src/Utilities/Countries.d.ts +2 -0
  40. package/lib/src/Utilities/Countries.js +512 -0
  41. package/lib/src/Utilities/Countries.js.map +1 -0
  42. package/lib/src/Utilities/CustomEventEmitter.d.ts +2 -0
  43. package/lib/src/Utilities/CustomEventEmitter.js +24 -0
  44. package/lib/src/Utilities/CustomEventEmitter.js.map +1 -0
  45. package/lib/src/Utilities/FastCompare.d.ts +2 -0
  46. package/lib/src/Utilities/FastCompare.js +56 -0
  47. package/lib/src/Utilities/FastCompare.js.map +1 -0
  48. package/lib/src/Utilities/HideablePromise.d.ts +2 -0
  49. package/lib/src/Utilities/HideablePromise.js +12 -0
  50. package/lib/src/Utilities/HideablePromise.js.map +1 -0
  51. package/lib/src/Utilities/LoadScripts.d.ts +2 -0
  52. package/lib/src/Utilities/LoadScripts.js +26 -0
  53. package/lib/src/Utilities/LoadScripts.js.map +1 -0
  54. package/lib/src/Utilities/MTDFraudPrevention.d.ts +2 -0
  55. package/lib/src/Utilities/MTDFraudPrevention.js +60 -0
  56. package/lib/src/Utilities/MTDFraudPrevention.js.map +1 -0
  57. package/lib/src/Utilities/Nationalities.d.ts +2 -0
  58. package/lib/src/Utilities/Nationalities.js +250 -0
  59. package/lib/src/Utilities/Nationalities.js.map +1 -0
  60. package/lib/src/Utilities/RouteUtils.d.ts +2 -0
  61. package/lib/src/Utilities/RouteUtils.js +192 -0
  62. package/lib/src/Utilities/RouteUtils.js.map +1 -0
  63. package/lib/src/Utilities/TimeZones.d.ts +2 -0
  64. package/lib/src/Utilities/TimeZones.js +1074 -0
  65. package/lib/src/Utilities/TimeZones.js.map +1 -0
  66. package/lib/src/Utilities/Types.d.ts +1 -0
  67. package/lib/src/Utilities/Types.js +2 -0
  68. package/lib/src/Utilities/Types.js.map +1 -0
  69. package/lib/src/Utilities/Utils.d.ts +2 -0
  70. package/lib/src/Utilities/Utils.js +271 -0
  71. package/lib/src/Utilities/Utils.js.map +1 -0
  72. package/lib/src/Utilities/dayjs.d.ts +2 -0
  73. package/lib/src/Utilities/dayjs.js +6 -0
  74. package/lib/src/Utilities/dayjs.js.map +1 -0
  75. package/lib/src/Utilities/index.d.ts +2 -0
  76. package/lib/src/Utilities/index.js +54 -0
  77. package/lib/src/Utilities/index.js.map +1 -0
  78. package/package.json +28 -3
  79. package/lib/index.cjs +0 -2
  80. package/lib/index.cjs.map +0 -1
@@ -0,0 +1,2 @@
1
+ export * from '../../Components/SuspenseRoute'
2
+ export {}
@@ -0,0 +1,22 @@
1
+ import { jsx as t } from "react/jsx-runtime";
2
+ import i from "react";
3
+ const n = (e) => typeof e == "object" && e && e.hasOwnProperty("$$typeof") && e.hasOwnProperty("_payload") && e.hasOwnProperty("_init"), f = ({
4
+ children: e,
5
+ label: s = "Loading components...",
6
+ fallback: r
7
+ }) => n(e) ? (r || (r = o), /* @__PURE__ */ t(i.Suspense, { fallback: /* @__PURE__ */ t(r, { label: s }), children: /* @__PURE__ */ t(e, {}) })) : /* @__PURE__ */ t(e, {}), o = ({ label: e = "Loading components..." }) => /* @__PURE__ */ t("div", { style: {
8
+ position: "fixed",
9
+ top: 0,
10
+ left: 0,
11
+ width: "100%",
12
+ height: "100%",
13
+ backgroundColor: "rgba(0, 0, 0, 0.3)",
14
+ zIndex: 9999,
15
+ display: "flex",
16
+ justifyContent: "center",
17
+ alignItems: "center"
18
+ }, children: e });
19
+ export {
20
+ f as SuspenseRoute
21
+ };
22
+ //# sourceMappingURL=SuspenseRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuspenseRoute.js","sources":["../../../src/Components/SuspenseRoute.tsx"],"sourcesContent":["import React from \"react\";\r\n\r\ninterface ISuspenseRouteProps {\r\n label?: string;\r\n children?: any;\r\n fallback?: any;\r\n}\r\n\r\nconst isSuspenseComponent = (component: any) =>\r\n typeof component === \"object\" &&\r\n component &&\r\n component.hasOwnProperty(\"$$typeof\") &&\r\n component.hasOwnProperty(\"_payload\") &&\r\n component.hasOwnProperty(\"_init\");\r\n\r\nexport const SuspenseRoute = ({\r\n children: Component,\r\n label = \"Loading components...\",\r\n fallback: FallbackComponent,\r\n}: ISuspenseRouteProps) => {\r\n if (isSuspenseComponent(Component)) {\r\n if (!FallbackComponent)\r\n FallbackComponent = SuspenseRouteFallback;\r\n\r\n return <React.Suspense fallback={<FallbackComponent label={label} />}>\r\n <Component />\r\n </React.Suspense>\r\n }\r\n return (\r\n <Component />\r\n );\r\n};\r\n\r\nconst SuspenseRouteFallback = ({ label = \"Loading components...\" }: { label?: string }) => {\r\n return <div style={{\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n backgroundColor: 'rgba(0, 0, 0, 0.3)',\r\n zIndex: 9999,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center'\r\n }}>{label}</div>;\r\n}"],"names":["isSuspenseComponent","component","SuspenseRoute","Component","label","FallbackComponent","SuspenseRouteFallback","jsx","React"],"mappings":";;AAQA,MAAMA,IAAsB,CAACC,MAC3B,OAAOA,KAAc,YACrBA,KACAA,EAAU,eAAe,UAAU,KACnCA,EAAU,eAAe,UAAU,KACnCA,EAAU,eAAe,OAAO,GAErBC,IAAgB,CAAC;AAAA,EAC5B,UAAUC;AAAA,EACV,OAAAC,IAAQ;AAAA,EACR,UAAUC;AACZ,MACML,EAAoBG,CAAS,KAC1BE,MACHA,IAAoBC,IAEf,gBAAAC,EAACC,EAAM,UAAN,EAAe,UAAU,gBAAAD,EAACF,GAAA,EAAkB,OAAAD,EAAA,CAAc,GAChE,UAAA,gBAAAG,EAACJ,GAAA,CAAA,CAAU,EAAA,CACb,uBAGCA,GAAA,EAAU,GAITG,IAAwB,CAAC,EAAE,OAAAF,IAAQ,8BAChC,gBAAAG,EAAC,SAAI,OAAO;AAAA,EACjB,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,YAAY;AAAA,GACV,UAAAH,GAAM;"}
@@ -0,0 +1,2 @@
1
+ export * from '../../Components/index'
2
+ export {}
@@ -0,0 +1,5 @@
1
+ import { SuspenseRoute as p } from "./SuspenseRoute.js";
2
+ export {
3
+ p as SuspenseRoute
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,2 @@
1
+ export * from '../../Hooks/index'
2
+ export {}
@@ -0,0 +1,20 @@
1
+ import "react";
2
+ import { useInfiniteScroll as o } from "./useInfiniteScroll.js";
3
+ import { isBrowser as a, isNavigator as u, useNetworkState as i } from "./useNetworkState.js";
4
+ import { disabledEventPropagation as p, useShortcuts as l } from "./useShortcuts.js";
5
+ import { useCallbackRef as n, useFirstRenderState as c, useInterval as d, useLatestRef as x, useTimeout as S, useUpdateEffect as v } from "../../Hooks.js";
6
+ export {
7
+ p as disabledEventPropagation,
8
+ a as isBrowser,
9
+ u as isNavigator,
10
+ n as useCallbackRef,
11
+ c as useFirstRenderState,
12
+ o as useInfiniteScroll,
13
+ d as useInterval,
14
+ x as useLatestRef,
15
+ i as useNetworkState,
16
+ l as useShortcuts,
17
+ S as useTimeout,
18
+ v as useUpdateEffect
19
+ };
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,2 @@
1
+ export * from '../../Hooks/useInfiniteScroll'
2
+ export {}
@@ -0,0 +1,20 @@
1
+ import n from "react";
2
+ const a = (e, r) => {
3
+ const t = n.useCallback(
4
+ (o) => {
5
+ new IntersectionObserver((c) => {
6
+ c.forEach((i) => {
7
+ i.intersectionRatio > 0 && r({ type: "next-page" });
8
+ });
9
+ }).observe(o);
10
+ },
11
+ [r]
12
+ );
13
+ n.useEffect(() => {
14
+ e.current && t(e.current);
15
+ }, [t, e]);
16
+ };
17
+ export {
18
+ a as useInfiniteScroll
19
+ };
20
+ //# sourceMappingURL=useInfiniteScroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInfiniteScroll.js","sources":["../../../src/Hooks/useInfiniteScroll.ts"],"sourcesContent":["import React from 'react';\r\n\r\n/**\r\n * Infinite scrolling with intersection observer\r\n * @param scrollRef Reference object for observe bottom boundary\r\n * @param dispatch Trigger an action that updates the page number\r\n */\r\nexport const useInfiniteScroll = (scrollRef: React.MutableRefObject<any>, dispatch: any) => {\r\n const scrollObserver = React.useCallback(\r\n (node: any) => {\r\n new IntersectionObserver((entries) => {\r\n entries.forEach((en) => {\r\n if (en.intersectionRatio > 0) {\r\n dispatch({ type: 'next-page' });\r\n }\r\n });\r\n }).observe(node);\r\n },\r\n [dispatch]\r\n );\r\n\r\n React.useEffect(() => {\r\n if (scrollRef.current) {\r\n scrollObserver(scrollRef.current);\r\n }\r\n }, [scrollObserver, scrollRef]);\r\n};\r\n"],"names":["useInfiniteScroll","scrollRef","dispatch","scrollObserver","React","node","entries","en"],"mappings":";AAOO,MAAMA,IAAoB,CAACC,GAAwCC,MAAkB;AAC1F,QAAMC,IAAiBC,EAAM;AAAA,IAC3B,CAACC,MAAc;AACb,UAAI,qBAAqB,CAACC,MAAY;AACpC,QAAAA,EAAQ,QAAQ,CAACC,MAAO;AACtB,UAAIA,EAAG,oBAAoB,KACzBL,EAAS,EAAE,MAAM,aAAa;AAAA,QAElC,CAAC;AAAA,MACH,CAAC,EAAE,QAAQG,CAAI;AAAA,IACjB;AAAA,IACA,CAACH,CAAQ;AAAA,EAAA;AAGX,EAAAE,EAAM,UAAU,MAAM;AACpB,IAAIH,EAAU,WACZE,EAAeF,EAAU,OAAO;AAAA,EAEpC,GAAG,CAACE,GAAgBF,CAAS,CAAC;AAChC;"}
@@ -0,0 +1,2 @@
1
+ export * from '../../Hooks/useNetworkState'
2
+ export {}
@@ -0,0 +1,33 @@
1
+ import a from "react";
2
+ const v = typeof window < "u", c = typeof navigator < "u", t = c ? navigator : void 0, e = t && (t.connection || t.mozConnection || t.webkitConnection);
3
+ function r(o) {
4
+ const i = t?.onLine, s = o?.online;
5
+ return {
6
+ online: i,
7
+ previous: s,
8
+ since: i !== s ? /* @__PURE__ */ new Date() : o?.since,
9
+ downlink: e?.downlink,
10
+ downlinkMax: e?.downlinkMax,
11
+ effectiveType: e?.effectiveType,
12
+ rtt: e?.rtt,
13
+ saveData: e?.saveData,
14
+ type: e?.type
15
+ };
16
+ }
17
+ function w(o) {
18
+ const [i, s] = a.useState(o ?? r);
19
+ return a.useEffect(() => {
20
+ const n = () => {
21
+ s(r);
22
+ };
23
+ return window.addEventListener("online", n, { passive: !0 }), window.addEventListener("offline", n, { passive: !0 }), e && window.addEventListener("change", n, { passive: !0 }), () => {
24
+ window.removeEventListener("online", n), window.removeEventListener("offline", n), e && window.removeEventListener("change", n);
25
+ };
26
+ }, []), i;
27
+ }
28
+ export {
29
+ v as isBrowser,
30
+ c as isNavigator,
31
+ w as useNetworkState
32
+ };
33
+ //# sourceMappingURL=useNetworkState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNetworkState.js","sources":["../../../src/Hooks/useNetworkState.ts"],"sourcesContent":["import React from 'react';\r\n\r\nexport interface INetworkInformation extends EventTarget {\r\n readonly downlink: number;\r\n readonly downlinkMax: number;\r\n readonly effectiveType: 'slow-2g' | '2g' | '3g' | '4g';\r\n readonly rtt: number;\r\n readonly saveData: boolean;\r\n readonly type: 'bluetooth' | 'cellular' | 'ethernet' | 'none' | 'wifi' | 'wimax' | 'other' | 'unknown';\r\n\r\n onChange: (event: Event) => void;\r\n}\r\n\r\nexport interface IUseNetworkState {\r\n /**\r\n * @desc Whether browser connected to the network or not.\r\n */\r\n online: boolean | undefined;\r\n /**\r\n * @desc Previous value of `online` property. Helps to identify if browser\r\n * just connected or lost connection.\r\n */\r\n previous: boolean | undefined;\r\n /**\r\n * @desc The {Date} object pointing to the moment when state change occurred.\r\n */\r\n since: Date | undefined;\r\n /**\r\n * @desc Effective bandwidth estimate in megabits per second, rounded to the\r\n * nearest multiple of 25 kilobits per seconds.\r\n */\r\n downlink: INetworkInformation['downlink'] | undefined;\r\n /**\r\n * @desc Maximum downlink speed, in megabits per second (Mbps), for the\r\n * underlying connection technology\r\n */\r\n downlinkMax: INetworkInformation['downlinkMax'] | undefined;\r\n /**\r\n * @desc Effective type of the connection meaning one of 'slow-2g', '2g', '3g', or '4g'.\r\n * This value is determined using a combination of recently observed round-trip time\r\n * and downlink values.\r\n */\r\n effectiveType: INetworkInformation['effectiveType'] | undefined;\r\n /**\r\n * @desc Estimated effective round-trip time of the current connection, rounded\r\n * to the nearest multiple of 25 milliseconds\r\n */\r\n rtt: INetworkInformation['rtt'] | undefined;\r\n /**\r\n * @desc {true} if the user has set a reduced data usage option on the user agent.\r\n */\r\n saveData: INetworkInformation['saveData'] | undefined;\r\n /**\r\n * @desc The type of connection a device is using to communicate with the network.\r\n * It will be one of the following values:\r\n * - bluetooth\r\n * - cellular\r\n * - ethernet\r\n * - none\r\n * - wifi\r\n * - wimax\r\n * - other\r\n * - unknown\r\n */\r\n type: INetworkInformation['type'] | undefined;\r\n}\r\nexport const isBrowser = typeof window !== 'undefined';\r\nexport const isNavigator = typeof navigator !== 'undefined';\r\n\r\nconst nav: (Navigator & Partial<Record<'connection' | 'mozConnection' | 'webkitConnection', INetworkInformation>>) | undefined = isNavigator ? navigator : undefined;\r\nconst conn: INetworkInformation | undefined = nav && (nav.connection || nav.mozConnection || nav.webkitConnection);\r\n\r\nfunction getConnectionState(previousState?: IUseNetworkState): IUseNetworkState {\r\n const online = nav?.onLine;\r\n const previousOnline = previousState?.online;\r\n\r\n return {\r\n online,\r\n previous: previousOnline,\r\n since: online !== previousOnline ? new Date() : previousState?.since,\r\n downlink: conn?.downlink,\r\n downlinkMax: conn?.downlinkMax,\r\n effectiveType: conn?.effectiveType,\r\n rtt: conn?.rtt,\r\n saveData: conn?.saveData,\r\n type: conn?.type,\r\n };\r\n}\r\n\r\nexport type IHookStateInitialSetter<S> = () => S;\r\nexport type IHookStateInitAction<S> = S | IHookStateInitialSetter<S>;\r\n\r\nexport function useNetworkState(initialState?: IHookStateInitAction<IUseNetworkState>): IUseNetworkState {\r\n const [state, setState] = React.useState(initialState ?? getConnectionState);\r\n\r\n React.useEffect(() => {\r\n const handleStateChange = () => {\r\n setState(getConnectionState);\r\n };\r\n\r\n window.addEventListener('online', handleStateChange, { passive: true });\r\n window.addEventListener('offline', handleStateChange, { passive: true });\r\n\r\n if (conn) {\r\n window.addEventListener('change', handleStateChange, { passive: true });\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('online', handleStateChange);\r\n window.removeEventListener('offline', handleStateChange);\r\n\r\n if (conn) {\r\n window.removeEventListener('change', handleStateChange);\r\n }\r\n };\r\n }, []);\r\n\r\n return state;\r\n}\r\n"],"names":["isBrowser","isNavigator","nav","conn","getConnectionState","previousState","online","previousOnline","useNetworkState","initialState","state","setState","React","handleStateChange"],"mappings":";AAkEO,MAAMA,IAAY,OAAO,SAAW,KAC9BC,IAAc,OAAO,YAAc,KAE1CC,IAA2HD,IAAc,YAAY,QACrJE,IAAwCD,MAAQA,EAAI,cAAcA,EAAI,iBAAiBA,EAAI;AAEjG,SAASE,EAAmBC,GAAoD;AAC9E,QAAMC,IAASJ,GAAK,QACdK,IAAiBF,GAAe;AAEtC,SAAO;AAAA,IACL,QAAAC;AAAA,IACA,UAAUC;AAAA,IACV,OAAOD,MAAWC,IAAiB,oBAAI,KAAA,IAASF,GAAe;AAAA,IAC/D,UAAUF,GAAM;AAAA,IAChB,aAAaA,GAAM;AAAA,IACnB,eAAeA,GAAM;AAAA,IACrB,KAAKA,GAAM;AAAA,IACX,UAAUA,GAAM;AAAA,IAChB,MAAMA,GAAM;AAAA,EAAA;AAEhB;AAKO,SAASK,EAAgBC,GAAyE;AACvG,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAM,SAASH,KAAgBL,CAAkB;AAE3E,SAAAQ,EAAM,UAAU,MAAM;AACpB,UAAMC,IAAoB,MAAM;AAC9B,MAAAF,EAASP,CAAkB;AAAA,IAC7B;AAEA,kBAAO,iBAAiB,UAAUS,GAAmB,EAAE,SAAS,IAAM,GACtE,OAAO,iBAAiB,WAAWA,GAAmB,EAAE,SAAS,IAAM,GAEnEV,KACF,OAAO,iBAAiB,UAAUU,GAAmB,EAAE,SAAS,IAAM,GAGjE,MAAM;AACX,aAAO,oBAAoB,UAAUA,CAAiB,GACtD,OAAO,oBAAoB,WAAWA,CAAiB,GAEnDV,KACF,OAAO,oBAAoB,UAAUU,CAAiB;AAAA,IAE1D;AAAA,EACF,GAAG,CAAA,CAAE,GAEEH;AACT;"}
@@ -0,0 +1,2 @@
1
+ export * from '../../Hooks/useShortcuts'
2
+ export {}
@@ -0,0 +1,43 @@
1
+ import a from "react";
2
+ const y = ["INPUT", "TEXTAREA", "SELECT"], l = (t, n) => {
3
+ switch (n.type) {
4
+ case "set-key-down":
5
+ return { ...t, [n.key]: !0 };
6
+ case "set-key-up":
7
+ return { ...t, [n.key]: !1 };
8
+ case "reset-keys":
9
+ return { ...n.data };
10
+ default:
11
+ return t;
12
+ }
13
+ }, h = (t, n, d) => {
14
+ if (!Array.isArray(t)) throw new Error("The first parameter to `useShortcuts` must be an ordered array of `KeyboardEvent.key` strings.");
15
+ if (!t.length) throw new Error("The first parameter to `useShortcuts` must contain atleast one `KeyboardEvent.key` string.");
16
+ if (!n || typeof n != "function") throw new Error("The second parameter to `useShortcuts` must be a function that will be envoked when the keys are pressed.");
17
+ const { overrideSystem: i } = d || {}, f = t.reduce((e, r) => (e[r.toLowerCase()] = !1, e), {}), [s, u] = a.useReducer(l, f), w = a.useCallback(
18
+ (e) => (r) => {
19
+ const o = e.toLowerCase();
20
+ if (!r.repeat && !y.includes(r.target.tagName) && o === r.key.toLowerCase() && s[o] !== void 0)
21
+ return i && (r.preventDefault(), p(r)), u({ type: "set-key-down", key: o }), !1;
22
+ },
23
+ [s, i]
24
+ ), c = a.useCallback(
25
+ (e) => (r) => {
26
+ const o = e.toLowerCase();
27
+ if (!y.includes(r.target.tagName) && r.key.toLowerCase() === o && s[o] !== void 0)
28
+ return i && (r.preventDefault(), p(r)), u({ type: "set-key-up", key: o }), !1;
29
+ },
30
+ [s, i]
31
+ );
32
+ a.useEffect(() => {
33
+ Object.values(s).filter((e) => !e).length ? u({ type: "" }) : (n(s), u({ type: "reset-keys", data: f }));
34
+ }, [n, s]), a.useEffect(() => (t.forEach((e) => window.addEventListener("keydown", w(e))), () => t.forEach((e) => window.removeEventListener("keydown", w(e)))), []), a.useEffect(() => (t.forEach((e) => window.addEventListener("keyup", c(e))), () => t.forEach((e) => window.removeEventListener("keyup", c(e)))), []);
35
+ };
36
+ function p(t) {
37
+ t && (t.stopPropagation ? t.stopPropagation() : window.event && (window.event.cancelBubble = !0));
38
+ }
39
+ export {
40
+ p as disabledEventPropagation,
41
+ h as useShortcuts
42
+ };
43
+ //# sourceMappingURL=useShortcuts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useShortcuts.js","sources":["../../../src/Hooks/useShortcuts.ts"],"sourcesContent":["import React from 'react';\r\n\r\nconst blacklistedTargets = ['INPUT', 'TEXTAREA', 'SELECT'];\r\n\r\ntype KeysActions = { type: 'set-key-down' | 'set-key-up'; key: string } | { type: 'reset-keys'; data: any } | { type: '' };\r\ninterface IKeysState {\r\n [key: string]: any;\r\n}\r\n\r\nconst keysReducer = (state: IKeysState, action: KeysActions) => {\r\n switch (action.type) {\r\n case 'set-key-down':\r\n const keydownState = { ...state, [action.key]: true };\r\n return keydownState;\r\n case 'set-key-up':\r\n const keyUpState = { ...state, [action.key]: false };\r\n return keyUpState;\r\n case 'reset-keys':\r\n const resetState = { ...action.data };\r\n return resetState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const useShortcuts = (shortcutKeys: string[] | string, callback: (keys: string) => void, options?: { overrideSystem: boolean }) => {\r\n if (!Array.isArray(shortcutKeys)) throw new Error('The first parameter to `useShortcuts` must be an ordered array of `KeyboardEvent.key` strings.');\r\n\r\n if (!shortcutKeys.length) throw new Error('The first parameter to `useShortcuts` must contain atleast one `KeyboardEvent.key` string.');\r\n\r\n if (!callback || typeof callback !== 'function') throw new Error('The second parameter to `useShortcuts` must be a function that will be envoked when the keys are pressed.');\r\n\r\n const { overrideSystem } = options || {};\r\n const initalKeyMapping = shortcutKeys.reduce((currentKeys: any, key) => {\r\n currentKeys[key.toLowerCase()] = false;\r\n return currentKeys;\r\n }, {});\r\n\r\n const [keys, setKeys] = React.useReducer(keysReducer, initalKeyMapping);\r\n\r\n const keydownListener = React.useCallback(\r\n (assignedKey: string) => (keydownEvent: KeyboardEvent) => {\r\n const loweredKey = assignedKey.toLowerCase();\r\n\r\n if (keydownEvent.repeat) return;\r\n if (blacklistedTargets.includes((keydownEvent.target as any).tagName)) return;\r\n if (loweredKey !== keydownEvent.key.toLowerCase()) return;\r\n if (keys[loweredKey] === undefined) return;\r\n\r\n if (overrideSystem) {\r\n keydownEvent.preventDefault();\r\n disabledEventPropagation(keydownEvent);\r\n }\r\n\r\n setKeys({ type: 'set-key-down', key: loweredKey });\r\n return false;\r\n },\r\n [keys, overrideSystem]\r\n );\r\n\r\n const keyupListener = React.useCallback(\r\n (assignedKey: string) => (keyupEvent: KeyboardEvent) => {\r\n const raisedKey = assignedKey.toLowerCase();\r\n\r\n if (blacklistedTargets.includes((keyupEvent.target as any).tagName)) return;\r\n if (keyupEvent.key.toLowerCase() !== raisedKey) return;\r\n if (keys[raisedKey] === undefined) return;\r\n\r\n if (overrideSystem) {\r\n keyupEvent.preventDefault();\r\n disabledEventPropagation(keyupEvent);\r\n }\r\n\r\n setKeys({ type: 'set-key-up', key: raisedKey });\r\n return false;\r\n },\r\n [keys, overrideSystem]\r\n );\r\n\r\n React.useEffect(() => {\r\n //console.log('keys', keys);\r\n if (!Object.values(keys).filter((value) => !value).length) {\r\n callback(keys);\r\n setKeys({ type: 'reset-keys', data: initalKeyMapping });\r\n } else {\r\n setKeys({ type: '' });\r\n }\r\n }, [callback, keys]);\r\n\r\n React.useEffect(() => {\r\n shortcutKeys.forEach((k) => window.addEventListener('keydown', keydownListener(k)));\r\n return () => shortcutKeys.forEach((k) => window.removeEventListener('keydown', keydownListener(k)));\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n shortcutKeys.forEach((k) => window.addEventListener('keyup', keyupListener(k)));\r\n return () => shortcutKeys.forEach((k) => window.removeEventListener('keyup', keyupListener(k)));\r\n }, []);\r\n};\r\n\r\nexport function disabledEventPropagation(e: KeyboardEvent) {\r\n if (e) {\r\n if (e.stopPropagation) {\r\n e.stopPropagation();\r\n } else if (window.event) {\r\n window.event.cancelBubble = true;\r\n }\r\n }\r\n}\r\n"],"names":["blacklistedTargets","keysReducer","state","action","useShortcuts","shortcutKeys","callback","options","overrideSystem","initalKeyMapping","currentKeys","key","keys","setKeys","React","keydownListener","assignedKey","keydownEvent","loweredKey","disabledEventPropagation","keyupListener","keyupEvent","raisedKey","value","k","e"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from '../../Utilities/ApiUtility.axios'
2
+ export {}
@@ -0,0 +1,222 @@
1
+ import c from "axios";
2
+ import { saveAs as f } from "file-saver";
3
+ import { stringify as p } from "qs";
4
+ var u = /* @__PURE__ */ ((i) => (i.get = "get", i.post = "post", i))(u || {}), g = /* @__PURE__ */ ((i) => (i.downloading = "downloading", i.done = "done", i.error = "error", i))(g || {});
5
+ class y {
6
+ config = {};
7
+ get accessToken() {
8
+ return this.config.accessToken;
9
+ }
10
+ set accessToken(t) {
11
+ this.config.accessToken = t;
12
+ }
13
+ get handleError() {
14
+ return this.config.handleError || ((t, e) => {
15
+ });
16
+ }
17
+ set handleError(t) {
18
+ this.config.handleError = t;
19
+ }
20
+ /**
21
+ * Configure the API utility with base URL and other options
22
+ * @param config Configuration object
23
+ */
24
+ configure(t) {
25
+ this.config = { ...this.config, ...t };
26
+ }
27
+ // private getParams = (params?: any) => {
28
+ // if (params) {
29
+ // for (const key in params) {
30
+ // if (params[key] == null || params[key] === undefined || params[key] === '')
31
+ // delete params[key];
32
+ // }
33
+ // }
34
+ // return params;
35
+ // };
36
+ getResponse = async (t, e, r) => await c.get(t, {
37
+ params: e,
38
+ paramsSerializer: {
39
+ serialize: (o, s) => p(e, {
40
+ arrayFormat: "indices",
41
+ allowDots: !0,
42
+ skipNulls: !0
43
+ })
44
+ },
45
+ ...this._axiosOptions(r || {})
46
+ });
47
+ get = async (t, e, r, o) => {
48
+ const s = await this.getResponse(t, e, o);
49
+ return this.handleResponse(s, r);
50
+ };
51
+ getResult = async (t, e, r, o) => {
52
+ try {
53
+ const s = await this.get(t, e, void 0, o);
54
+ if (s.status)
55
+ return s.result;
56
+ this.handleErrorResponse(s.message, s.errors);
57
+ } catch (s) {
58
+ s.isAxiosError ? this.handleAxiosError(s, r) : this.handleResponse(s, r);
59
+ }
60
+ return null;
61
+ };
62
+ post = async (t, e, r, o) => {
63
+ try {
64
+ const s = await c.post(t, e, this._axiosOptions({ contentType: r, ...o || {} }));
65
+ return this.handleResponse(s);
66
+ } catch (s) {
67
+ if (s?.isAxiosError)
68
+ return this.handleAxiosError(s);
69
+ }
70
+ return {};
71
+ };
72
+ put = async (t, e, r, o) => {
73
+ try {
74
+ const s = await c.put(t, e, this._axiosOptions({ contentType: r, ...o || {} }));
75
+ return this.handleResponse(s);
76
+ } catch (s) {
77
+ if (s?.isAxiosError)
78
+ return this.handleAxiosError(s);
79
+ }
80
+ return {};
81
+ };
82
+ appendFormDataValues = (t, e, r) => {
83
+ if ((!r || r.length <= 0) && (r = ""), typeof e != "function" && typeof e != "object" && typeof e != "symbol" || e instanceof File) {
84
+ e && r && t.append(r, e);
85
+ return;
86
+ }
87
+ for (const o in e) {
88
+ const s = `${r}${r && !r.endsWith(".") ? "." : ""}${o}`;
89
+ if (e[o] instanceof FileList) {
90
+ const n = e[o];
91
+ for (let h = 0; h < n.length; h++)
92
+ t.append(`${s}[${h}]`, n[h]);
93
+ } else
94
+ Array.isArray(e[o]) ? e[o].forEach((n, h) => {
95
+ this.appendFormDataValues(t, n, `${s}[${h}]`);
96
+ }) : typeof e[o] == "object" ? this.appendFormDataValues(t, e[o], s) : e[o] && t.append(s, e[o]);
97
+ }
98
+ };
99
+ postForm = async (t, e, r) => {
100
+ let o = new FormData();
101
+ e instanceof FormData ? o = e : this.appendFormDataValues(o, e);
102
+ try {
103
+ const s = await c.post(t, o, this._axiosOptions({ contentType: "multipart/form-data", ...r || {} }));
104
+ return this.handleResponse(s);
105
+ } catch (s) {
106
+ if (s?.isAxiosError)
107
+ return this.handleAxiosError(s);
108
+ }
109
+ return {};
110
+ };
111
+ putForm = async (t, e, r) => {
112
+ let o = new FormData();
113
+ e instanceof FormData ? o = e : this.appendFormDataValues(o, e);
114
+ try {
115
+ const s = await c.putForm(t, o, this._axiosOptions({ contentType: "multipart/form-data", ...r || {} }));
116
+ return this.handleResponse(s);
117
+ } catch (s) {
118
+ if (s?.isAxiosError)
119
+ return this.handleAxiosError(s);
120
+ }
121
+ return {};
122
+ };
123
+ delete = async (t, e, r) => {
124
+ const o = await c.delete(t, this._axiosOptions({ contentType: e, ...r || {} }));
125
+ return this.handleResponse(o);
126
+ };
127
+ getFileName = (t) => {
128
+ var e = void 0;
129
+ if (t && t.indexOf("attachment") !== -1) {
130
+ var r = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/, o = r.exec(t);
131
+ o != null && o[1] && (e = o[1].replace(/['"]/g, ""));
132
+ }
133
+ return e;
134
+ };
135
+ downloadFile = async (t, e, r, o) => {
136
+ let s;
137
+ const n = {}, h = this.accessToken;
138
+ h && (n.Authorization = `Bearer ${h}`);
139
+ const l = { headers: n, ...o || {} };
140
+ r === "post" ? s = c.post(t, e, {
141
+ ...this._axiosOptions(l),
142
+ responseType: "blob"
143
+ }) : s = c.get(t, {
144
+ params: e,
145
+ paramsSerializer: {
146
+ serialize: (a, d) => p(e, {
147
+ arrayFormat: "indices",
148
+ allowDots: !0,
149
+ skipNulls: !0
150
+ })
151
+ },
152
+ ...this._axiosOptions(l),
153
+ responseType: "blob"
154
+ });
155
+ try {
156
+ const a = await s, d = this.getFileName(a.headers.get("Content-Disposition"));
157
+ return f(a.data, d), {
158
+ status: "done"
159
+ /* done */
160
+ };
161
+ } catch (a) {
162
+ return a.isAxiosError ? this.handleResponse(a.response) : this.handleResponse(a), a.response ? {
163
+ status: "error",
164
+ error: a.response.status
165
+ } : { status: "error", error: a.message };
166
+ }
167
+ };
168
+ getAuthHeader = (t) => {
169
+ const e = {
170
+ "Content-Type": t || "application/json",
171
+ Accept: "application/json"
172
+ }, r = this.accessToken;
173
+ return r && (e.Authorization = `Bearer ${r}`), e;
174
+ };
175
+ handleResponse = (t, e) => {
176
+ if (!t)
177
+ this.handleError && this.handleError("No response from the server, please try after some time.");
178
+ else if ([401, 403].indexOf(t.status) !== -1) {
179
+ if (e)
180
+ throw t;
181
+ console.error("401 Unauthorized or 403 Forbidden response returned from api");
182
+ }
183
+ return t?.data;
184
+ };
185
+ handleAxiosError = (t, e) => {
186
+ if (e && t.response?.status === 401) throw t;
187
+ if (t.response?.status === 400) {
188
+ const r = t.response.data;
189
+ if (r && r.errors) {
190
+ const o = [];
191
+ for (const s in r.errors)
192
+ r.errors[s] && r.errors[s].length > 0 && o.push(r.errors[s][0]);
193
+ return {
194
+ result: null,
195
+ status: !1,
196
+ message: o.length > 0 ? o[0] : "",
197
+ errors: o
198
+ };
199
+ }
200
+ }
201
+ return {};
202
+ };
203
+ handleErrorResponse = (t, e) => {
204
+ this.handleError && this.handleError(t, e);
205
+ };
206
+ _axiosOptions = (t) => {
207
+ const { contentType: e, headers: r, ...o } = t || {};
208
+ return {
209
+ headers: r || this.getAuthHeader(e),
210
+ baseURL: this.getBaseUrl(),
211
+ ...o
212
+ };
213
+ };
214
+ getBaseUrl = () => this.config.baseURL || process.env.REACT_APP_API_URL || typeof window < "u" && window.__API_BASE_URL__;
215
+ }
216
+ const E = new y();
217
+ export {
218
+ E as ApiUtility,
219
+ g as FileDownloadStatus,
220
+ u as HttpMethods
221
+ };
222
+ //# sourceMappingURL=ApiUtility.axios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiUtility.axios.js","sources":["../../../src/Utilities/ApiUtility.axios.ts"],"sourcesContent":["import Axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';\r\nimport { saveAs } from 'file-saver';\r\nimport { stringify } from 'qs';\r\n\r\nexport interface IApiResponse<T = any> {\r\n status: boolean;\r\n result: T;\r\n message?: string;\r\n errors?: {\r\n number: number;\r\n message: string;\r\n suggestion: string;\r\n exception: any;\r\n }[];\r\n}\r\nexport interface IApiListResult<T = any> {\r\n totalRecords: number;\r\n items: T[];\r\n moreRecords?: boolean;\r\n continuationToken?: string;\r\n}\r\n\r\nexport interface IApiListResultWithTotal<TItem = any, TTotal = any> extends IApiListResult<TItem> {\r\n total: TTotal;\r\n}\r\n\r\nexport enum HttpMethods {\r\n get = 'get',\r\n post = 'post',\r\n}\r\nexport enum FileDownloadStatus {\r\n downloading = 'downloading',\r\n done = 'done',\r\n error = 'error',\r\n}\r\nexport type DownloadCallback = (status: FileDownloadStatus, error?: any) => void;\r\n\r\nexport interface IAxiosRequestConfigWithoutParams extends Omit<AxiosRequestConfig, 'params' | 'paramsSerializer'> {\r\n contentType?: string;\r\n}\r\n\r\nexport interface IApiUtilityConfig {\r\n baseURL?: string;\r\n accessToken?: string;\r\n handleError?: (error: string, errors?: any) => void;\r\n}\r\n\r\nclass ApiUtilityBase {\r\n private config: IApiUtilityConfig = {};\r\n\r\n get accessToken() {\r\n return this.config.accessToken;\r\n }\r\n\r\n set accessToken(token: string | undefined) {\r\n this.config.accessToken = token;\r\n }\r\n\r\n get handleError() {\r\n return this.config.handleError || ((error, errors) => {});\r\n }\r\n\r\n set handleError(handler: (error: string, errors?: any) => void) {\r\n this.config.handleError = handler;\r\n }\r\n\r\n /**\r\n * Configure the API utility with base URL and other options\r\n * @param config Configuration object\r\n */\r\n configure(config: IApiUtilityConfig) {\r\n this.config = { ...this.config, ...config };\r\n }\r\n // private getParams = (params?: any) => {\r\n // if (params) {\r\n // for (const key in params) {\r\n // if (params[key] == null || params[key] === undefined || params[key] === '')\r\n // delete params[key];\r\n // }\r\n // }\r\n // return params;\r\n // };\r\n\r\n getResponse = async <T = any>(endpoint: string, params?: any, options?: IAxiosRequestConfigWithoutParams) => {\r\n return await Axios.get<T>(endpoint, {\r\n params,\r\n paramsSerializer: {\r\n serialize: (p, o) => {\r\n return stringify(params, {\r\n arrayFormat: 'indices',\r\n allowDots: true,\r\n skipNulls: true,\r\n });\r\n },\r\n },\r\n ...this._axiosOptions(options || {}),\r\n });\r\n };\r\n\r\n get = async <T = IApiResponse>(endpoint: string, params?: any, throwErrorOn401?: boolean, options?: IAxiosRequestConfigWithoutParams) => {\r\n const response = await this.getResponse<T>(endpoint, params, options);\r\n\r\n const data = this.handleResponse<T>(response, throwErrorOn401);\r\n return data;\r\n };\r\n getResult = async <T = any>(endpoint: string, params?: any, throwErrorOn401?: boolean, options?: IAxiosRequestConfigWithoutParams) => {\r\n try {\r\n const data = await this.get<IApiResponse<T>>(endpoint, params, undefined, options);\r\n\r\n if (data.status) {\r\n return data.result;\r\n } else {\r\n this.handleErrorResponse(data.message, data.errors);\r\n }\r\n } catch (error: any) {\r\n if (error!.isAxiosError) this.handleAxiosError(error, throwErrorOn401);\r\n else this.handleResponse(error, throwErrorOn401);\r\n }\r\n\r\n return null;\r\n };\r\n\r\n post = async <T = IApiResponse>(endpoint: string, body: any, contentType?: string, options?: IAxiosRequestConfigWithoutParams): Promise<T> => {\r\n try {\r\n const response = await Axios.post<T>(endpoint, body, this._axiosOptions({ contentType, ...(options || {}) }));\r\n const data = this.handleResponse<T>(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n put = async <T = IApiResponse>(endpoint: string, body: any, contentType?: string, options?: IAxiosRequestConfigWithoutParams): Promise<T> => {\r\n try {\r\n const response = await Axios.put<T>(endpoint, body, this._axiosOptions({ contentType, ...(options || {}) }));\r\n const data = this.handleResponse<T>(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n appendFormDataValues = (form: FormData, values: any, preFix?: string) => {\r\n if (!preFix || preFix.length <= 0) preFix = '';\r\n\r\n //check if given object is a string/number/boolean then add directly to the list with prefix\r\n if ((typeof values !== 'function' && typeof values !== 'object' && typeof values !== 'symbol') || values instanceof File) {\r\n if (values && preFix) {\r\n form.append(preFix, values);\r\n }\r\n return;\r\n }\r\n\r\n for (const key in values) {\r\n //prepare a field name\r\n const fieldName = `${preFix}${preFix && !preFix.endsWith('.') ? '.' : ''}${key}`;\r\n\r\n if (values[key] instanceof FileList) {\r\n const fileList: FileList = values[key];\r\n for (let fIndex = 0; fIndex < fileList.length; fIndex++) {\r\n form.append(`${fieldName}[${fIndex}]`, fileList[fIndex]);\r\n }\r\n } else {\r\n if (Array.isArray(values[key])) {\r\n values[key].forEach((el: any, idx: number) => {\r\n this.appendFormDataValues(form, el, `${fieldName}[${idx}]`);\r\n });\r\n } else {\r\n if (typeof values[key] === 'object') {\r\n this.appendFormDataValues(form, values[key], fieldName);\r\n } else if (values[key]) {\r\n form.append(fieldName, values[key]);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n postForm = async <T = IApiResponse>(endpoint: string, params: any, options?: IAxiosRequestConfigWithoutParams) => {\r\n let formData = new FormData();\r\n\r\n if (params instanceof FormData) {\r\n formData = params;\r\n } else {\r\n this.appendFormDataValues(formData, params);\r\n }\r\n\r\n try {\r\n const response = await Axios.post<T>(endpoint, formData, this._axiosOptions({ contentType: 'multipart/form-data', ...(options || {}) }));\r\n const data = this.handleResponse(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n putForm = async <T = IApiResponse>(endpoint: string, params: any, options?: IAxiosRequestConfigWithoutParams) => {\r\n let formData = new FormData();\r\n\r\n if (params instanceof FormData) {\r\n formData = params;\r\n } else {\r\n this.appendFormDataValues(formData, params);\r\n }\r\n\r\n try {\r\n const response = await Axios.putForm<T>(endpoint, formData, this._axiosOptions({ contentType: 'multipart/form-data', ...(options || {}) }));\r\n const data = this.handleResponse(response);\r\n return data;\r\n } catch (ex: any) {\r\n if (ex?.isAxiosError) {\r\n return this.handleAxiosError(ex);\r\n }\r\n }\r\n return {} as T;\r\n };\r\n\r\n delete = async <T = IApiResponse>(endpoint: string, contentType?: string, options?: IAxiosRequestConfigWithoutParams) => {\r\n const response = await Axios.delete<T>(endpoint, this._axiosOptions({ contentType, ...(options || {}) }));\r\n const data = this.handleResponse<T>(response);\r\n return data;\r\n };\r\n\r\n private getFileName = (contentDispositionValue: string) => {\r\n var filename: string | undefined = undefined;\r\n if (contentDispositionValue && contentDispositionValue.indexOf('attachment') !== -1) {\r\n var filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n var matches = filenameRegex.exec(contentDispositionValue);\r\n if (matches != null && matches[1]) {\r\n filename = matches[1].replace(/['\"]/g, '');\r\n }\r\n }\r\n return filename;\r\n };\r\n downloadFile = async (endpoint: string, params?: any, method?: HttpMethods, options?: IAxiosRequestConfigWithoutParams): Promise<{ status: FileDownloadStatus; error?: any }> => {\r\n let response: Promise<AxiosResponse<any>>;\r\n const headers: any = {};\r\n // return authorization header with jwt token\r\n const token = this.accessToken; // || AuthService.getAuthToken();\r\n if (token) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n const axiosOptions: IAxiosRequestConfigWithoutParams = { headers, ...(options || {}) };\r\n if (method === HttpMethods.post) {\r\n response = Axios.post(endpoint, params, {\r\n ...this._axiosOptions(axiosOptions),\r\n responseType: 'blob',\r\n });\r\n } else {\r\n response = Axios.get(endpoint, {\r\n params,\r\n paramsSerializer: {\r\n serialize: (p, o) => {\r\n return stringify(params, {\r\n arrayFormat: 'indices',\r\n allowDots: true,\r\n skipNulls: true,\r\n });\r\n },\r\n },\r\n ...this._axiosOptions(axiosOptions),\r\n responseType: 'blob',\r\n });\r\n }\r\n\r\n try {\r\n const result_1 = await response;\r\n //extract file name from Content-Disposition header\r\n const fileName = this.getFileName((result_1.headers.get as any)('Content-Disposition'));\r\n //invoke 'Save As' dialog\r\n saveAs(result_1.data, fileName);\r\n return { status: FileDownloadStatus.done };\r\n } catch (error: any) {\r\n if (error!.isAxiosError) {\r\n this.handleResponse(error.response);\r\n } else this.handleResponse(error);\r\n if (error.response) {\r\n return {\r\n status: FileDownloadStatus.error,\r\n error: error.response.status,\r\n };\r\n } else {\r\n return { status: FileDownloadStatus.error, error: error.message };\r\n }\r\n }\r\n };\r\n\r\n getAuthHeader = (contentType?: string) => {\r\n const headers: any = {\r\n 'Content-Type': contentType || 'application/json',\r\n Accept: 'application/json',\r\n };\r\n\r\n // return authorization header with jwt token\r\n const token = this.accessToken; //||AuthService.getAuthToken();\r\n if (token) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n return headers;\r\n };\r\n\r\n handleResponse = <T = IApiResponse>(response: AxiosResponse<T>, throwErrorOn401?: boolean) => {\r\n if (!response) {\r\n if (this.handleError) this.handleError('No response from the server, please try after some time.');\r\n } else if ([401, 403].indexOf(response.status) !== -1) {\r\n if (throwErrorOn401) {\r\n throw response;\r\n } else {\r\n console.error('401 Unauthorized or 403 Forbidden response returned from api');\r\n // // auto logout if 401 Unauthorized or 403 Forbidden response returned from api\r\n // AuthService.logout();\r\n\r\n // window.location.reload();\r\n }\r\n }\r\n return response?.data;\r\n };\r\n handleAxiosError = <T = IApiResponse>(error: AxiosError, throwErrorOn401?: boolean): T => {\r\n if (throwErrorOn401 && error.response?.status === 401) throw error;\r\n else if (error.response?.status === 400) {\r\n const data = (error.response as any).data;\r\n if (data && data.errors) {\r\n const arr: any[] = [];\r\n for (const key in data.errors) {\r\n if (data.errors[key] && data.errors[key].length > 0) {\r\n arr.push(data.errors[key][0]);\r\n }\r\n }\r\n return {\r\n result: null,\r\n status: false,\r\n message: arr.length > 0 ? arr[0] : '',\r\n errors: arr,\r\n } as unknown as T;\r\n }\r\n }\r\n return {} as T;\r\n };\r\n handleErrorResponse = (message: any, errors?: any) => {\r\n if (this.handleError) this.handleError(message, errors);\r\n };\r\n\r\n _axiosOptions = (options?: IAxiosRequestConfigWithoutParams): AxiosRequestConfig => {\r\n const { contentType, headers, ...rest } = options || {};\r\n return {\r\n headers: headers || this.getAuthHeader(contentType),\r\n baseURL: this.getBaseUrl(),\r\n ...rest,\r\n };\r\n };\r\n getBaseUrl = () => {\r\n // Priority: 1. Configured baseURL, 2. Environment variable, 3. undefined\r\n return this.config.baseURL || process.env.REACT_APP_API_URL || (typeof window !== 'undefined' && (window as any).__API_BASE_URL__);\r\n };\r\n}\r\n\r\nexport const ApiUtility = new ApiUtilityBase();\r\n"],"names":["HttpMethods","FileDownloadStatus","ApiUtilityBase","token","error","errors","handler","config","endpoint","params","options","Axios","p","o","stringify","throwErrorOn401","response","data","body","contentType","ex","form","values","preFix","key","fieldName","fileList","fIndex","el","idx","formData","contentDispositionValue","filename","filenameRegex","matches","method","headers","axiosOptions","result_1","fileName","saveAs","arr","message","rest","ApiUtility"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from '../../Utilities/BrowserInfo'
2
+ export {}
@@ -0,0 +1,51 @@
1
+ const o = {
2
+ deviceIpString: "",
3
+ deviceIpTimeStamp: ""
4
+ }, g = () => {
5
+ o.deviceIpString = "";
6
+ }, T = () => {
7
+ o.deviceIpTimeStamp = "";
8
+ }, I = () => new Promise((e, t) => {
9
+ o.deviceIpString !== "" && o.deviceIpTimeStamp !== "" && e(o);
10
+ const c = RTCPeerConnection;
11
+ c || t({ message: "WEBRTC_UNSUPPORTED_BROWSER", error: void 0 });
12
+ const a = [];
13
+ let r;
14
+ try {
15
+ r = new c();
16
+ } catch (n) {
17
+ t({ message: "WEBRTC_CONSTRUCTION_FAILED", error: n });
18
+ }
19
+ r.onicecandidate = (n) => {
20
+ if (!n || !n.candidate)
21
+ r.close(), a.length < 1 && t({ message: "NO_IP_FOUND", error: void 0 }), o.deviceIpString = a.join(","), o.deviceIpTimeStamp = (/* @__PURE__ */ new Date()).toISOString(), e(o);
22
+ else if (n.candidate.candidate) {
23
+ const s = n.candidate.candidate.split(" ");
24
+ s.length > 4 && a.push(s[4]);
25
+ }
26
+ }, r.createDataChannel(""), r.createOffer().then(r.setLocalDescription.bind(r)).catch((n) => {
27
+ t({ message: "CREATE_CONNECTION_ERROR", error: n });
28
+ });
29
+ }), D = () => Array.from(navigator.plugins, (e) => e && e.name).filter((e) => e).join(","), d = () => {
30
+ const e = (/* @__PURE__ */ new Date()).toString().split("GMT")[1], t = `${e[0]}${e[1]}${e[2]}`, c = `${e[3]}${e[4]}`;
31
+ return `${t}:${c}`;
32
+ }, l = () => `UTC${d()}`, i = (e) => isNaN(e) ? null : e, m = () => i(screen.width), N = () => i(screen.height), p = () => i(window.devicePixelRatio), S = () => i(screen.colorDepth), f = () => i(window.innerWidth), C = () => i(window.innerHeight), w = () => {
33
+ const e = window, t = navigator;
34
+ return e.doNotTrack && e.doNotTrack === "1" || t.doNotTrack && (t.doNotTrack === "yes" || t.doNotTrack === "1") || t.msDoNotTrack && t.msDoNotTrack === "1" || e.external && e.external.msTrackingProtectionEnabled && e.external.msTrackingProtectionEnabled() ? "true" : "false";
35
+ }, E = () => navigator.userAgent;
36
+ export {
37
+ w as getBrowserDoNotTrackStatus,
38
+ D as getBrowserPluginsAsString,
39
+ I as getDeviceLocalIPAsString,
40
+ S as getScreenColourDepth,
41
+ N as getScreenHeight,
42
+ p as getScreenScalingFactor,
43
+ m as getScreenWidth,
44
+ l as getTimezone,
45
+ E as getUserAgent,
46
+ C as getWindowHeight,
47
+ f as getWindowWidth,
48
+ g as resetDeviceIpString,
49
+ T as resetDeviceIpTimeStamp
50
+ };
51
+ //# sourceMappingURL=BrowserInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserInfo.js","sources":["../../../src/Utilities/BrowserInfo.ts"],"sourcesContent":["const ICE_CANDIDATE_IP_INDEX = 4;\r\n\r\n// store deviceIpString as a global variable as generating it is expensive and often required several times\r\nconst deviceIpData = {\r\n deviceIpString: '',\r\n deviceIpTimeStamp: '',\r\n};\r\n\r\n/**\r\n * This reset function is valuable only for unit testing\r\n */\r\nexport const resetDeviceIpString = () => {\r\n deviceIpData.deviceIpString = '';\r\n};\r\n\r\nexport const resetDeviceIpTimeStamp = () => {\r\n deviceIpData.deviceIpTimeStamp = '';\r\n};\r\n\r\n/**\r\n * Function that returns the local IP address as a string as an async promise.\r\n * It uses RTCPeerConnection object's onicecandidate event handler which gets called\r\n * automatically when a new Ice Candidate is available.\r\n * @returns {Promise} Promise to get users devices IP address\r\n */\r\nexport const getDeviceLocalIPAsString = (): Promise<typeof deviceIpData> => {\r\n return new Promise((resolve, reject) => {\r\n if (deviceIpData.deviceIpString !== '' && deviceIpData.deviceIpTimeStamp !== '') {\r\n resolve(deviceIpData);\r\n }\r\n const WebRTCConnection = RTCPeerConnection;\r\n if (!WebRTCConnection) {\r\n reject({ message: 'WEBRTC_UNSUPPORTED_BROWSER', error: undefined });\r\n }\r\n //RTCPeerConection is supported, so will try to find the IP\r\n const ip: string[] = [];\r\n let pc: RTCPeerConnection;\r\n try {\r\n pc = new WebRTCConnection();\r\n } catch (err) {\r\n reject({ message: 'WEBRTC_CONSTRUCTION_FAILED', error: err });\r\n }\r\n\r\n pc!.onicecandidate = (event) => {\r\n if (!event || !event.candidate) {\r\n pc.close();\r\n if (ip.length < 1) {\r\n reject({ message: 'NO_IP_FOUND', error: undefined });\r\n }\r\n deviceIpData.deviceIpString = ip.join(',');\r\n deviceIpData.deviceIpTimeStamp = new Date().toISOString();\r\n resolve(deviceIpData);\r\n } else if (event.candidate.candidate) {\r\n const candidateValues = event.candidate.candidate.split(' ');\r\n if (candidateValues.length > ICE_CANDIDATE_IP_INDEX) {\r\n ip.push(candidateValues[ICE_CANDIDATE_IP_INDEX]);\r\n }\r\n }\r\n };\r\n pc!.createDataChannel('');\r\n pc!\r\n .createOffer()\r\n .then(pc!.setLocalDescription.bind(pc!))\r\n .catch((err) => {\r\n reject({ message: 'CREATE_CONNECTION_ERROR', error: err });\r\n });\r\n });\r\n};\r\n\r\n/**\r\n * Function that returns user's browser's all plugin as a comma separated string\r\n * @returns {string} comma separated user's browser's plugins\r\n */\r\nexport const getBrowserPluginsAsString = (): string => {\r\n return Array.from(navigator.plugins, (plugin) => plugin && plugin.name)\r\n .filter((name) => name)\r\n .join(',');\r\n};\r\n\r\nconst getFormattedOffset = () => {\r\n // Date().toString() is in format like \"Wed Sep 30 2020 23:11:02 GMT+0100 (British Summer Time)\"\r\n // To format the offset, we split on \"GMT\"\r\n // and then pick the relevant characters based on their position and reformat with a \":\"\r\n const offset = new Date().toString().split('GMT')[1];\r\n const hourOffset = `${offset[0]}${offset[1]}${offset[2]}`;\r\n const minuteOffset = `${offset[3]}${offset[4]}`;\r\n const formattedUTC = `${hourOffset}:${minuteOffset}`;\r\n return formattedUTC;\r\n};\r\n\r\n/**\r\n * Function that returns user's timezone offset relative to UTC\r\n * @returns {string} UTC concatenated with user's browser's timezone offset\r\n */\r\nexport const getTimezone = (): string => `UTC${getFormattedOffset()}`;\r\n\r\nconst validateAndGetScreenDetail = (value: number): number | null => {\r\n if (isNaN(value)) {\r\n return null;\r\n } else {\r\n return value;\r\n }\r\n};\r\n\r\n/**\r\n * Function that validates the user's screen's width value, and then returns it.\r\n * If it fails validation, it returns null\r\n * @returns {number | null} validated value of screen width\r\n */\r\nexport const getScreenWidth = (): number | null => validateAndGetScreenDetail(screen.width);\r\n\r\n/**\r\n * Function that validates the user's screen's height value, and then returns it.\r\n * If it fails validation, it returns null\r\n * @returns {number | null} validated value of screen height\r\n */\r\nexport const getScreenHeight = (): number | null => validateAndGetScreenDetail(screen.height);\r\n\r\n/**\r\n * Function that validates the user's device's pixel ratio, and then returns it.\r\n * If it fails validation, it returns null\r\n * @returns {number | null} validated value of window's devicePixelRatio\r\n */\r\nexport const getScreenScalingFactor = (): number | null => validateAndGetScreenDetail(window.devicePixelRatio);\r\n\r\n/**\r\n * Function that validates the user's screen's colorDepth, and then returns it.\r\n * If it fails validation, it returns null\r\n * @returns {number | null} validated value of screen's colorDepth\r\n */\r\nexport const getScreenColourDepth = (): number | null => validateAndGetScreenDetail(screen.colorDepth);\r\n\r\n/**\r\n * Function that validates the user's window's interior width in pixels, and then returns it.\r\n * If it fails validation, it returns null\r\n * @returns {number | null} validated value of window's innerWidth\r\n */\r\nexport const getWindowWidth = (): number | null => validateAndGetScreenDetail(window.innerWidth);\r\n\r\n/**\r\n * Function that validates the user's window's interior height in pixels, and then returns it.\r\n * If it fails validation, it returns null\r\n * @returns {number | null} validated value of window's innerHeight\r\n */\r\nexport const getWindowHeight = (): number | null => validateAndGetScreenDetail(window.innerHeight);\r\n\r\n/**\r\n * The function returns users browser's do not track setting by checking the navigator\r\n * and window object for the same\r\n * @returns {string} true or false based on users Do Not Track setting\r\n */\r\nexport const getBrowserDoNotTrackStatus = (): string => {\r\n const windowVar = window as any,\r\n navigatorVar = navigator as any;\r\n const isBrowserDoNotTrack =\r\n (windowVar.doNotTrack && windowVar.doNotTrack === '1') ||\r\n (navigatorVar.doNotTrack && (navigatorVar.doNotTrack === 'yes' || navigatorVar.doNotTrack === '1')) ||\r\n (navigatorVar.msDoNotTrack && navigatorVar.msDoNotTrack === '1') ||\r\n (windowVar.external && windowVar.external.msTrackingProtectionEnabled && windowVar.external.msTrackingProtectionEnabled());\r\n return isBrowserDoNotTrack ? 'true' : 'false';\r\n};\r\n\r\n/**\r\n * This function returns user agent by checking the navigator\r\n * @returns {String} user agent for the current browser\r\n */\r\nexport const getUserAgent = (): string => {\r\n return navigator.userAgent;\r\n};\r\n"],"names":["deviceIpData","resetDeviceIpString","resetDeviceIpTimeStamp","getDeviceLocalIPAsString","resolve","reject","WebRTCConnection","ip","pc","err","event","candidateValues","getBrowserPluginsAsString","plugin","name","getFormattedOffset","offset","hourOffset","minuteOffset","getTimezone","validateAndGetScreenDetail","value","getScreenWidth","getScreenHeight","getScreenScalingFactor","getScreenColourDepth","getWindowWidth","getWindowHeight","getBrowserDoNotTrackStatus","windowVar","navigatorVar","getUserAgent"],"mappings":"AAGA,MAAMA,IAAe;AAAA,EACnB,gBAAgB;AAAA,EAChB,mBAAmB;AACrB,GAKaC,IAAsB,MAAM;AACvC,EAAAD,EAAa,iBAAiB;AAChC,GAEaE,IAAyB,MAAM;AAC1C,EAAAF,EAAa,oBAAoB;AACnC,GAQaG,IAA2B,MAC/B,IAAI,QAAQ,CAACC,GAASC,MAAW;AACtC,EAAIL,EAAa,mBAAmB,MAAMA,EAAa,sBAAsB,MAC3EI,EAAQJ,CAAY;AAEtB,QAAMM,IAAmB;AACzB,EAAKA,KACHD,EAAO,EAAE,SAAS,8BAA8B,OAAO,QAAW;AAGpE,QAAME,IAAe,CAAA;AACrB,MAAIC;AACJ,MAAI;AACF,IAAAA,IAAK,IAAIF,EAAA;AAAA,EACX,SAASG,GAAK;AACZ,IAAAJ,EAAO,EAAE,SAAS,8BAA8B,OAAOI,GAAK;AAAA,EAC9D;AAEA,EAAAD,EAAI,iBAAiB,CAACE,MAAU;AAC9B,QAAI,CAACA,KAAS,CAACA,EAAM;AACnB,MAAAF,EAAG,MAAA,GACCD,EAAG,SAAS,KACdF,EAAO,EAAE,SAAS,eAAe,OAAO,QAAW,GAErDL,EAAa,iBAAiBO,EAAG,KAAK,GAAG,GACzCP,EAAa,qBAAoB,oBAAI,KAAA,GAAO,YAAA,GAC5CI,EAAQJ,CAAY;AAAA,aACXU,EAAM,UAAU,WAAW;AACpC,YAAMC,IAAkBD,EAAM,UAAU,UAAU,MAAM,GAAG;AAC3D,MAAIC,EAAgB,SAAS,KAC3BJ,EAAG,KAAKI,EAAgB,CAAsB,CAAC;AAAA,IAEnD;AAAA,EACF,GACAH,EAAI,kBAAkB,EAAE,GACxBA,EACG,YAAA,EACA,KAAKA,EAAI,oBAAoB,KAAKA,CAAG,CAAC,EACtC,MAAM,CAACC,MAAQ;AACd,IAAAJ,EAAO,EAAE,SAAS,2BAA2B,OAAOI,GAAK;AAAA,EAC3D,CAAC;AACL,CAAC,GAOUG,IAA4B,MAChC,MAAM,KAAK,UAAU,SAAS,CAACC,MAAWA,KAAUA,EAAO,IAAI,EACnE,OAAO,CAACC,MAASA,CAAI,EACrB,KAAK,GAAG,GAGPC,IAAqB,MAAM;AAI/B,QAAMC,yBAAa,KAAA,GAAO,WAAW,MAAM,KAAK,EAAE,CAAC,GAC7CC,IAAa,GAAGD,EAAO,CAAC,CAAC,GAAGA,EAAO,CAAC,CAAC,GAAGA,EAAO,CAAC,CAAC,IACjDE,IAAe,GAAGF,EAAO,CAAC,CAAC,GAAGA,EAAO,CAAC,CAAC;AAE7C,SADqB,GAAGC,CAAU,IAAIC,CAAY;AAEpD,GAMaC,IAAc,MAAc,MAAMJ,GAAoB,IAE7DK,IAA6B,CAACC,MAC9B,MAAMA,CAAK,IACN,OAEAA,GASEC,IAAiB,MAAqBF,EAA2B,OAAO,KAAK,GAO7EG,IAAkB,MAAqBH,EAA2B,OAAO,MAAM,GAO/EI,IAAyB,MAAqBJ,EAA2B,OAAO,gBAAgB,GAOhGK,IAAuB,MAAqBL,EAA2B,OAAO,UAAU,GAOxFM,IAAiB,MAAqBN,EAA2B,OAAO,UAAU,GAOlFO,IAAkB,MAAqBP,EAA2B,OAAO,WAAW,GAOpFQ,IAA6B,MAAc;AACtD,QAAMC,IAAY,QAChBC,IAAe;AAMjB,SAJGD,EAAU,cAAcA,EAAU,eAAe,OACjDC,EAAa,eAAeA,EAAa,eAAe,SAASA,EAAa,eAAe,QAC7FA,EAAa,gBAAgBA,EAAa,iBAAiB,OAC3DD,EAAU,YAAYA,EAAU,SAAS,+BAA+BA,EAAU,SAAS,4BAAA,IACjE,SAAS;AACxC,GAMaE,IAAe,MACnB,UAAU;"}
@@ -0,0 +1,2 @@
1
+ export * from '../../Utilities/Countries'
2
+ export {}