@instincthub/react-ui 0.0.5 → 0.0.6

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 (122) hide show
  1. package/README.md +4 -3
  2. package/dist/src/assets/css/bootstrap/display.css +21 -0
  3. package/dist/src/assets/css/bootstrap/readme/display.md +20 -0
  4. package/dist/src/assets/css/forms/input-fields.css +3 -2
  5. package/dist/src/assets/css/main.css +3 -3
  6. package/dist/src/assets/css/modals/modal-updates.css +6 -3
  7. package/dist/src/assets/css/modals/modal.css +1 -1
  8. package/dist/src/assets/css/navbar/sidenav.css +8 -0
  9. package/dist/src/assets/css/ui/content-viewer.css +1 -0
  10. package/dist/src/assets/css/ui/create-button.css +140 -0
  11. package/dist/src/assets/css/ui/pagination.css +359 -0
  12. package/dist/src/assets/css/ui/ui-index.css +2 -0
  13. package/dist/src/components/auth/LoginForm.js +1 -1
  14. package/dist/src/components/auth/ReactClientProviders.js +1 -1
  15. package/dist/src/components/forms/CheckBoxes.js +2 -0
  16. package/dist/src/components/forms/CheckBoxes.js.map +1 -0
  17. package/dist/src/components/forms/ChipsInput.js +1 -1
  18. package/dist/src/components/forms/FileField.js +2 -0
  19. package/dist/src/components/forms/FileField.js.map +1 -0
  20. package/dist/src/components/forms/FilterArray.js +1 -1
  21. package/dist/src/components/forms/FilterObjects.js +1 -1
  22. package/dist/src/components/forms/SearchField.js +1 -1
  23. package/dist/src/components/forms/SearchObjectsFromDB.js +1 -1
  24. package/dist/src/components/forms/TextArea.js +1 -1
  25. package/dist/src/components/forms/TextArea.js.map +1 -1
  26. package/dist/src/components/lib/auth/actions.js +1 -1
  27. package/dist/src/components/lib/auth/dbRequestst.js +1 -1
  28. package/dist/src/components/lib/auth/dbRequestst.js.map +1 -1
  29. package/dist/src/components/lib/convertArrayToObject.js +2 -0
  30. package/dist/src/components/lib/convertArrayToObject.js.map +1 -0
  31. package/dist/src/components/lib/createSubscription.js +2 -0
  32. package/dist/src/components/lib/createSubscription.js.map +1 -0
  33. package/dist/src/components/lib/elementIsVisibleInViewport.js +2 -0
  34. package/dist/src/components/lib/elementIsVisibleInViewport.js.map +1 -0
  35. package/dist/src/components/lib/fileToBase64.js +2 -0
  36. package/dist/src/components/lib/fileToBase64.js.map +1 -0
  37. package/dist/src/components/lib/formError.js +2 -0
  38. package/dist/src/components/lib/formError.js.map +1 -0
  39. package/dist/src/components/lib/getPriceObjects.js +2 -0
  40. package/dist/src/components/lib/getPriceObjects.js.map +1 -0
  41. package/dist/src/components/lib/helpFunction.js +1 -1
  42. package/dist/src/components/lib/helpFunction.js.map +1 -1
  43. package/dist/src/components/lib/index.js +1 -1
  44. package/dist/src/components/lib/index.js.map +1 -1
  45. package/dist/src/components/lib/modals/modals.js +1 -1
  46. package/dist/src/components/lib/modals/modals.js.map +1 -1
  47. package/dist/src/components/lib/paystack.js.map +1 -1
  48. package/dist/src/components/lib/permissions.js +1 -1
  49. package/dist/src/components/lib/permissions.js.map +1 -1
  50. package/dist/src/components/lib/redux/index.js +1 -1
  51. package/dist/src/components/lib/redux/rootReducer.js +1 -1
  52. package/dist/src/components/lib/redux/rootReducer.js.map +1 -1
  53. package/dist/src/components/lib/redux/slices/authSlice/selectors.js +2 -0
  54. package/dist/src/components/lib/redux/slices/authSlice/selectors.js.map +1 -0
  55. package/dist/src/components/lib/redux/slices/generics/arraySlice.js +2 -0
  56. package/dist/src/components/lib/redux/slices/generics/arraySlice.js.map +1 -0
  57. package/dist/src/components/lib/redux/slices/generics/objectSlice.js +2 -0
  58. package/dist/src/components/lib/redux/slices/generics/objectSlice.js.map +1 -0
  59. package/dist/src/components/lib/redux/slices/generics/selectors.js +2 -0
  60. package/dist/src/components/lib/redux/slices/generics/selectors.js.map +1 -0
  61. package/dist/src/components/navbar/ChannelListAvatar.js +1 -1
  62. package/dist/src/components/navbar/SideNavbar.js +1 -1
  63. package/dist/src/components/status/DeleteConfirmationModal.js +1 -1
  64. package/dist/src/components/status/ModalExamples.js +1 -1
  65. package/dist/src/components/status/MultiPurposeModal.js +1 -1
  66. package/dist/src/components/status/ReactTimeTracker.js +1 -1
  67. package/dist/src/components/ui/ComponentLists.js +2 -0
  68. package/dist/src/components/ui/ComponentLists.js.map +1 -0
  69. package/dist/src/components/ui/create-button/CreateButton.js +2 -0
  70. package/dist/src/components/ui/create-button/CreateButton.js.map +1 -0
  71. package/dist/src/components/ui/create-button/CreateButtonExample.js +2 -0
  72. package/dist/src/components/ui/create-button/CreateButtonExample.js.map +1 -0
  73. package/dist/src/components/ui/editor/CustomTextEditor.js +1 -1
  74. package/dist/src/components/ui/pagination/Pagination.js +2 -0
  75. package/dist/src/components/ui/pagination/Pagination.js.map +1 -0
  76. package/dist/src/components/ui/pagination/PaginationDemo.js +2 -0
  77. package/dist/src/components/ui/pagination/PaginationDemo.js.map +1 -0
  78. package/dist/src/components/ui/tables/IHubTableServer.js +1 -1
  79. package/dist/src/index.js +1 -1
  80. package/dist/src/types/components/auth/LoginForm.d.ts +3 -1
  81. package/dist/src/types/components/auth/index.d.ts +5 -0
  82. package/dist/src/types/components/forms/CheckBoxes.d.ts +33 -6
  83. package/dist/src/types/components/forms/CheckboxesField.d.ts +24 -1
  84. package/dist/src/types/components/forms/FileField.d.ts +8 -4
  85. package/dist/src/types/components/forms/FilterArray.d.ts +12 -2
  86. package/dist/src/types/components/forms/FilterObjects.d.ts +11 -3
  87. package/dist/src/types/components/forms/SearchField.d.ts +16 -0
  88. package/dist/src/types/components/forms/TextArea.d.ts +12 -0
  89. package/dist/src/types/components/forms/index.d.ts +49 -0
  90. package/dist/src/types/components/lib/auth/dbRequestst.d.ts +2 -0
  91. package/dist/src/types/components/lib/convertArrayToObject.d.ts +30 -0
  92. package/dist/src/types/components/lib/helpFunction.d.ts +4 -0
  93. package/dist/src/types/components/lib/index.d.ts +6 -6
  94. package/dist/src/types/components/lib/modals/modals.d.ts +2 -1
  95. package/dist/src/types/components/lib/permissions.d.ts +12 -1
  96. package/dist/src/types/components/lib/redux/rootReducer.d.ts +2 -0
  97. package/dist/src/types/components/lib/redux/slices/generics/arraySlice.d.ts +20 -0
  98. package/dist/src/types/components/lib/redux/slices/generics/index.d.ts +2 -0
  99. package/dist/src/types/components/lib/redux/slices/generics/objectSlice.d.ts +12 -0
  100. package/dist/src/types/components/lib/redux/slices/generics/selectors.d.ts +3 -0
  101. package/dist/src/types/components/lib/redux/slices/index.d.ts +2 -0
  102. package/dist/src/types/components/lib/redux/slices/selectors.d.ts +5 -0
  103. package/dist/src/types/components/lib/redux/store.d.ts +6 -0
  104. package/dist/src/types/components/navbar/index.d.ts +5 -0
  105. package/dist/src/types/components/status/MultiPurposeModal.d.ts +27 -10
  106. package/dist/src/types/components/status/index.d.ts +11 -0
  107. package/dist/src/types/components/tabs/index.d.ts +3 -0
  108. package/dist/src/types/components/theme/index.d.ts +6 -0
  109. package/dist/src/types/components/ui/create-button/CreateButton.d.ts +54 -0
  110. package/dist/src/types/components/ui/create-button/CreateButtonExample.d.ts +3 -0
  111. package/dist/src/types/components/ui/editor/CustomTextEditor.d.ts +7 -3
  112. package/dist/src/types/components/ui/index.d.ts +16 -0
  113. package/dist/src/types/components/ui/pagination/Pagination.d.ts +8 -0
  114. package/dist/src/types/components/ui/pagination/PaginationDemo.d.ts +3 -0
  115. package/dist/src/types/index.d.ts +9 -3
  116. package/dist/src/types/types/index.d.ts +37 -5
  117. package/dist/src/types/types/navbar.d.ts +1 -0
  118. package/dist/tsconfig.tsbuildinfo +1 -1
  119. package/package.json +10 -2
  120. package/dist/src/components/ComponentLists.js +0 -2
  121. package/dist/src/components/ComponentLists.js.map +0 -1
  122. /package/dist/src/types/components/{ComponentLists.d.ts → ui/ComponentLists.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"helpFunction.js","sources":["../../../../src/components/lib/helpFunction.ts"],"sourcesContent":["// TypeScript version of the original JavaScript document\r\nimport { format } from \"date-fns\";\r\nimport { forbidden, notFound } from \"next/navigation\";\r\nimport { openToast } from \"./modals/modals\";\r\nimport React from \"react\";\r\n\r\n// Constants with Type Safety\r\nexport const IN_DEV_MODE: boolean = process.env.NODE_ENV === \"development\";\r\nexport const API_HOST_URL: string = process.env.NEXT_PUBLIC_API_HOST ?? \"\";\r\nexport const FILE_URL: string = process.env.NEXT_PUBLIC_FILE_URL ?? \"\";\r\nexport const VIDEO_URL: string = process.env.NEXT_PUBLIC_VIDEO_URL ?? \"\";\r\nexport const CODECS_URL_M3U8: string =\r\n process.env.NEXT_PUBLIC_VIDEO_URL_CODECS_M3U8 ?? \"\";\r\n\r\nexport const romansFigure: string[] = [\r\n \"I\",\r\n \"II\",\r\n \"III\",\r\n \"IV\",\r\n \"V\",\r\n \"VI\",\r\n \"VII\",\r\n \"VIII\",\r\n \"IX\",\r\n \"X\",\r\n];\r\n\r\n// Interfaces for Type Safety\r\ninterface VercelDomainRequest {\r\n name: string;\r\n}\r\n\r\ninterface VercelFetchOptions extends RequestInit {\r\n headers: {\r\n Authorization: string;\r\n [key: string]: string;\r\n };\r\n}\r\n\r\ninterface Course {\r\n credits: string | number;\r\n}\r\n\r\ninterface CourseObj {\r\n course: Course;\r\n}\r\n\r\ninterface SubDomainResult {\r\n value: string;\r\n field: \"username\" | \"domain\";\r\n}\r\n\r\ninterface FormItem {\r\n [key: string]: string | number | object | Blob | null | undefined | any[];\r\n}\r\n\r\ninterface RequestOptions extends RequestInit {\r\n headers: Record<string, string>;\r\n body?: BodyInit | FormData | null;\r\n}\r\n\r\n// Functions\r\n\r\n/**\r\n * Adds a subdomain to Vercel project.\r\n * @param domain The domain to add as a subdomain\r\n * @returns Promise resolving to the fetch Response\r\n */\r\nexport const addUserDomain = async (domain: string): Promise<Response> => {\r\n const payload: VercelDomainRequest = { name: `${domain}.instincthub.com` };\r\n const vercelOptions: VercelFetchOptions = {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${\r\n process.env.NEXT_PUBLIC_VERCEL_AUTH_BEARER_TOKEN ?? \"\"\r\n }`,\r\n },\r\n body: JSON.stringify(payload),\r\n };\r\n\r\n return fetch(\r\n `https://api.vercel.com/v10/projects/${process.env.NEXT_PUBLIC_VERCEL_PROJECT_ID}/domains?teamId=${process.env.NEXT_PUBLIC_VERCEL_TEAM_ID}`,\r\n vercelOptions\r\n );\r\n};\r\n\r\n/**\r\n * Strips HTML tags from a string.\r\n * @param str Input string with potential HTML tags\r\n * @returns Cleaned string without HTML tags\r\n */\r\nexport const stripHtmlTags = (str: string): string => {\r\n return str.replace(/<[^>]*>/g, \"\");\r\n};\r\n\r\n/**\r\n * Removes commas from a number string and converts to number.\r\n * @param str Input string or number\r\n * @returns Parsed number or 0 if invalid\r\n */\r\nexport const stripCommaFromNumber = (str: string | number): number => {\r\n try {\r\n if (typeof str === \"number\") return str;\r\n const val = str.replace(/,/g, \"\");\r\n return Number(val) || 0;\r\n } catch {\r\n return 0;\r\n }\r\n};\r\n\r\n/**\r\n * Calculates total credits from an array of course objects.\r\n * @param courses Array of course objects\r\n * @returns Total credits as a number\r\n */\r\nexport const calculateTotalCredits = (courses: CourseObj[]): number => {\r\n return courses.reduce((total, { course }) => {\r\n const credits = Number.parseInt(course.credits.toString(), 10) || 0;\r\n return total + credits;\r\n }, 0);\r\n};\r\n\r\n/**\r\n * Calculates amount after percentage deduction.\r\n * @param amount Base amount\r\n * @param percentage Percentage to deduct (0-100)\r\n * @returns Object with final amount or error details\r\n */\r\nexport const calculateAmountAfterDeduction = (\r\n amount: number,\r\n percentage: number\r\n): { amount: number; detail?: string } => {\r\n if (amount < 0 || percentage < 0 || percentage > 100) {\r\n return {\r\n amount: 0,\r\n detail:\r\n \"Amount and percentage should be positive, and percentage should be between 0 and 100.\",\r\n };\r\n }\r\n const deduction = (amount * percentage) / 100;\r\n return { amount: amount - deduction };\r\n};\r\n\r\n/**\r\n * Finds keys in an object that are null, undefined, or empty string.\r\n * @param namesArray Array of keys to check\r\n * @param obj Object to inspect\r\n * @returns Array of keys with null/empty values\r\n */\r\nexport const findNullOrEmptyKeys = <T extends Record<string, any>>(\r\n namesArray: string[],\r\n obj: T\r\n): string[] => {\r\n return namesArray.filter((key) => obj[key] == null || obj[key] === \"\");\r\n};\r\n\r\n/**\r\n * Extracts subdomain or domain from hostname.\r\n * @param hostname Hostname string\r\n * @returns Subdomain result or null\r\n */\r\nexport const extractSubDomain = (hostname: string): SubDomainResult | null => {\r\n if (IN_DEV_MODE) return { value: \"eportal.hust.edu.ng\", field: \"username\" };\r\n if (!hostname.includes(\"instincthub.com\") && !IN_DEV_MODE) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n\r\n const parts = hostname.split(\".\");\r\n if (parts.length > 1) {\r\n if (parts[1] === \"ngrok-free\")\r\n return { value: \"skills\", field: \"username\" };\r\n if (\r\n parts[parts.length - 2] !== \"instincthub\" &&\r\n !hostname.includes(\"localhost\")\r\n ) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n return { value: parts[0], field: \"username\" };\r\n }\r\n\r\n if (parts.length === 1 || parts.length === 2) {\r\n if (\r\n parts[0].includes(\"localhost:3000\") ||\r\n parts[0] === \"instincthub\" ||\r\n parts[1] === \"ngrok-free\"\r\n ) {\r\n return { value: \"eportal.hust.edu.ng\", field: \"username\" };\r\n }\r\n if (\r\n !parts[parts.length - 2]?.includes(\"instincthub\") &&\r\n !hostname.includes(\"localhost\")\r\n ) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n return { value: parts[0], field: \"domain\" };\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Converts an array of objects to FormData.\r\n * @param array Array of items to convert\r\n * @returns FormData object\r\n */\r\nexport const convertArrayToFormData = (array: FormItem[]): FormData => {\r\n const formData = new FormData();\r\n array.forEach((item, index) => {\r\n Object.entries(item).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n formData.append(`item[${index}].${key}`, JSON.stringify(value));\r\n } else if (typeof value === \"object\" && value !== null) {\r\n if (key === \"upload_result\" && \"objectURL\" in value) {\r\n fetch((value as { objectURL: string }).objectURL)\r\n .then((res) => res.blob())\r\n .then((blob) => {\r\n formData.append(\r\n `item[${index}].${key}`,\r\n blob,\r\n \"upload_result_file\"\r\n );\r\n })\r\n .catch((error) =>\r\n console.error(\"Error converting blob URL:\", error)\r\n );\r\n } else {\r\n formData.append(`item[${index}].${key}`, JSON.stringify(value));\r\n }\r\n } else {\r\n formData.append(`item[${index}].${key}`, String(value ?? \"\"));\r\n }\r\n });\r\n });\r\n return formData;\r\n};\r\n\r\n/**\r\n * Checks if an object is empty\r\n * @param obj Object to check\r\n * @returns True if empty, false otherwise\r\n */\r\nexport const objectIsEmpty = (obj: any): boolean => {\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) return false;\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Handles form validation errors.\r\n * @param e Event object from form input\r\n * @param formError Current error list\r\n * @param setFormError Function to update error list\r\n * @returns Error message with status code\r\n */\r\nexport const handleInvalid = (\r\n e: React.FormEvent<HTMLInputElement>,\r\n formError: string[],\r\n setFormError: (errors: string[]) => void\r\n): [string, number] => {\r\n const target = e.target as HTMLInputElement;\r\n if (!formError.includes(target.name)) {\r\n setFormError([...formError, target.dataset.name || target.name]);\r\n }\r\n\r\n const errTag = document.getElementById(`id_${target.name}`);\r\n if (errTag) errTag.scrollIntoView();\r\n\r\n return [`Error: ${formError.join(\", \")} field(s) cannot be left blank.`, 400];\r\n};\r\n\r\n/**\r\n * Calculates average rating from an array of numbers.\r\n * @param ratings Array of ratings\r\n * @returns Average rating as a string with 1 decimal place\r\n */\r\nexport const calculateAverageRating = (ratings: number[]): string => {\r\n if (!ratings.length) return \"0.0\";\r\n const sum = ratings.reduce((acc, rating) => acc + rating, 0);\r\n return (sum / ratings.length).toFixed(1);\r\n};\r\n\r\n/**\r\n * Converts a string to a float, removing commas.\r\n * @param value Input string\r\n * @returns Parsed float\r\n */\r\nexport const convertToFloat = (value: string): number => {\r\n return parseFloat(value.replace(/,/g, \"\")) || 0;\r\n};\r\n\r\n/**\r\n * Formats a number with commas.\r\n * @param number Input number\r\n * @returns Formatted string or error message\r\n */\r\nexport const formatNumberWithCommas = (number: number): string => {\r\n if (isNaN(number)) return \"Invalid number\";\r\n const [integer, decimal] = number.toString().split(\".\");\r\n const formattedInteger = integer.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n return decimal ? `${formattedInteger}.${decimal}` : formattedInteger;\r\n};\r\n\r\nexport const slugifyFileName = (fileName: string): string => {\r\n // Split the fileName by dot to separate the name and extension\r\n const parts: string[] = fileName.split(\".\");\r\n\r\n // Extract the extension\r\n const extension: string = parts.pop() || \"\";\r\n\r\n // Join the remaining parts with hyphen and replace special characters and brackets with hyphens\r\n const slugifiedName: string = parts\r\n .join(\"-\")\r\n .replace(/[^\\w\\s()-]/g, \"\")\r\n .replace(/[\\s_]+/g, \"-\")\r\n .toLowerCase();\r\n\r\n // Remove parentheses from the slugified name\r\n const nameWithoutParentheses: string = slugifiedName.replace(\r\n /\\(([^)]+)\\)/g,\r\n \"\"\r\n );\r\n\r\n // Only take first 50 characters\r\n const reduced_txt: string = nameWithoutParentheses.slice(0, 50);\r\n\r\n // Append the extension\r\n return reduced_txt + \".\" + extension.toLowerCase();\r\n};\r\n\r\n/**\r\n * Converts a string to a URL-friendly slug format.\r\n * @param value The string to convert to a slug\r\n * @example\r\n * ```ts\r\n * const slug = convertToSlug(\"Hello World\");\r\n * console.log(slug); // \"hello-world\"\r\n * ```\r\n * @returns A lowercase string with spaces and special characters replaced by hyphens\r\n * @throws Error if the resulting slug contains invalid characters\r\n */\r\nexport const convertToSlug = (value: string): string => {\r\n // Normalize the string to remove accents and other diacritics\r\n value = value.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\r\n\r\n // Convert to lowercase\r\n value = value.toLowerCase();\r\n\r\n // Replace any non-alphanumeric characters with a hyphen\r\n value = value.replace(/[^a-z0-9]+/g, \"-\");\r\n\r\n // Remove leading or trailing hyphens\r\n value = value.replace(/^-+|-+$/g, \"\");\r\n\r\n // Ensure the slug only contains valid characters\r\n if (!/^[a-z0-9_-]+$/.test(value)) {\r\n throw new Error(\r\n 'Enter a valid \"slug\" consisting of letters, numbers, underscores, or hyphens.'\r\n );\r\n }\r\n\r\n return value;\r\n};\r\n\r\n/**\r\n * Checks if an element is in the viewport.\r\n * @param element DOM element\r\n * @returns Boolean indicating visibility\r\n */\r\nexport const TrackViewPort = (element: HTMLElement | null): boolean => {\r\n if (!element) return false;\r\n const rect = element.getBoundingClientRect();\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <=\r\n (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n};\r\n\r\n/**\r\n * Formats duration in minutes to a readable string.\r\n * @param durationInMinutes Duration in minutes\r\n * @returns Formatted duration string\r\n */\r\nexport const formatDuration = (durationInMinutes: number): string => {\r\n if (durationInMinutes === 0) return \"...\";\r\n if (durationInMinutes < 60) {\r\n return Math.floor(durationInMinutes)\r\n ? `${Math.floor(durationInMinutes)} Minutes`\r\n : `${durationInMinutes.toFixed(1)} Seconds`;\r\n }\r\n const hours = Math.floor(durationInMinutes / 60);\r\n const minutes = Math.floor(durationInMinutes % 60);\r\n return minutes === 0\r\n ? `${hours} Hours`\r\n : `${hours} Hours, ${minutes} Minutes`;\r\n};\r\n\r\n/**\r\n * Truncates HTML content to a specified length.\r\n * @param markdownText HTML string\r\n * @param maxLength Maximum length\r\n * @returns Truncated string\r\n */\r\nexport const truncateHtml = (\r\n markdownText: string,\r\n maxLength: number\r\n): string => {\r\n return markdownText.length > maxLength\r\n ? `${markdownText.substring(0, maxLength)}...`\r\n : markdownText;\r\n};\r\n\r\n/**\r\n * Formats a date to a readable string.\r\n * @param date Date object or string\r\n * @param type Format type (default: \"iiii do MMMM yyyy\")\r\n * @returns Formatted date string\r\n */\r\nexport const formatDateToWord = (\r\n date: Date | string,\r\n type: string = \"iiii do MMMM yyyy\"\r\n): string => {\r\n if (!date) return \"\";\r\n return format(new Date(date), type);\r\n};\r\n\r\n/**\r\n * Encodes the current URL.\r\n * @returns Encoded URL string or undefined if not in browser\r\n */\r\nexport const hostUrlEncode = (): string | undefined => {\r\n if (typeof document !== \"undefined\") {\r\n return encodeURIComponent(window.location.href);\r\n }\r\n};\r\n\r\n/**\r\n * Validates if input is alphanumeric and at least 3 characters.\r\n * @param input Input string\r\n * @returns Boolean indicating validity\r\n */\r\nexport const isValidAlphanumeric = (input: string): boolean => {\r\n return input?.length >= 3 && /^[a-zA-Z0-9]+$/.test(input);\r\n};\r\n\r\n/**\r\n * Validates if input is a valid email.\r\n * @param input Input string\r\n * @returns Boolean indicating validity\r\n */\r\nexport const isValidEmail = (input: string): boolean => {\r\n return input?.length >= 3 && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(input);\r\n};\r\n\r\n/**\r\n * Converts a string to title case.\r\n * @param str Input string\r\n * @returns Title case string or original value if not a string\r\n */\r\nexport const toTitleCase = (str: any): any => {\r\n if (typeof str !== \"string\") return str;\r\n return str.replace(\r\n /\\w\\S*/g,\r\n (txt) => txt.charAt(0).toUpperCase() + txt.slice(1).toLowerCase()\r\n );\r\n};\r\n\r\n/**\r\n * Gets a cookie value by name.\r\n * @param cname Cookie name\r\n * @returns Cookie value or null\r\n */\r\nexport const getCookie = (cname: string): string | null => {\r\n if (typeof document === \"undefined\") return null;\r\n const name = `${cname}=`;\r\n const ca = document.cookie.split(\";\");\r\n for (const c of ca) {\r\n const trimmed = c.trim();\r\n if (trimmed.startsWith(name)) return trimmed.substring(name.length);\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Removes a cookie by name.\r\n * @param cname Cookie name\r\n */\r\nexport const removeCookie = (cname: string): void => {\r\n if (typeof document !== \"undefined\") {\r\n document.cookie = `${cname}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\r\n }\r\n};\r\n\r\n/**\r\n * Sets a cookie with name, value, and expiration days.\r\n * @param cname Cookie name\r\n * @param cvalue Cookie value\r\n * @param exdays Expiration days\r\n */\r\nexport const setCookie = (\r\n cname: string,\r\n cvalue: string,\r\n exdays: number\r\n): void => {\r\n if (typeof document !== \"undefined\") {\r\n const d = new Date();\r\n d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);\r\n document.cookie = `${cname}=${cvalue};expires=${d.toUTCString()};path=/`;\r\n }\r\n};\r\n\r\n/**\r\n * Prints an error message for a form field.\r\n * @param key Field name\r\n * @param value Error message\r\n * @param index Index for focusing first error\r\n */\r\nexport const printErr = (key: string, value: string, index: number): void => {\r\n const form = document.querySelector(\"#regForm\");\r\n if (!form) return;\r\n\r\n const inputField = form.querySelector<HTMLInputElement>(`[name=\"${key}\"]`);\r\n if (!inputField) return;\r\n\r\n inputField.style.borderColor = \"var(--TurkishRose)\";\r\n let errorTag: HTMLElement | null = null;\r\n\r\n if (inputField.type === \"radio\") {\r\n errorTag =\r\n inputField.parentElement?.parentElement?.parentElement?.querySelector(\r\n \".error\"\r\n ) || null;\r\n } else if (inputField.type === \"file\") {\r\n errorTag =\r\n inputField.parentElement?.parentElement?.querySelector(\".error\") || null;\r\n } else {\r\n errorTag = inputField.parentElement?.querySelector(\".error\") || null;\r\n }\r\n\r\n if (errorTag) {\r\n errorTag.textContent = value;\r\n } else {\r\n const span = document.createElement(\"span\");\r\n span.classList.add(\"error\");\r\n span.textContent = value;\r\n span.style.color = \"var(--TurkishRose)\";\r\n span.style.display = \"inline-block\";\r\n\r\n const parent =\r\n inputField.type === \"radio\"\r\n ? inputField.parentElement?.parentElement?.parentElement\r\n : inputField.type === \"file\" || inputField.nodeName === \"SELECT\"\r\n ? inputField.parentElement\r\n : inputField.parentElement?.parentElement;\r\n parent?.appendChild(span);\r\n }\r\n\r\n if (index === 0) inputField.focus();\r\n};\r\n\r\n/**\r\n * Handles server response errors for forms.\r\n * @param status HTTP status code\r\n * @param items Error or success data\r\n * @param registerForm Form element\r\n * @param r_path Redirect path\r\n */\r\nexport const handleError = (\r\n status: number,\r\n items: Record<string, string[]>,\r\n registerForm: HTMLFormElement | null,\r\n r_path: string | null\r\n): void => {\r\n const serverTag = document.querySelector(\".server_err\") as HTMLElement | null;\r\n if (!serverTag) return;\r\n\r\n if (status === 400) {\r\n if (items.user?.[0] === \"This field must be unique.\" || items.username) {\r\n serverTag.style.display = \"block\";\r\n serverTag.style.backgroundColor = \"var(--DarkCyan)\";\r\n serverTag.querySelector(\"h3\")!.textContent =\r\n \"We already have your details!\";\r\n if (\r\n [\"/register/details\", \"/register/details/\"].includes(\r\n document.location.pathname\r\n )\r\n ) {\r\n const button = serverTag.querySelector(\"a button span\");\r\n if (button) button.innerHTML = \"Take Assessment\";\r\n const link = serverTag.querySelector(\"a\");\r\n if (link) link.href = \"/quiz/\";\r\n }\r\n spinBtn(registerForm, \"none\", false);\r\n window.location.href = \"#Socials\";\r\n } else {\r\n spinBtn(registerForm, \"none\", false);\r\n Object.entries(items).forEach(([key, value], index) =>\r\n printErr(key, value[0], index)\r\n );\r\n serverTag.style.display = \"none\";\r\n }\r\n } else if ([200, 201, 202].includes(status) && r_path) {\r\n window.location.href = r_path;\r\n } else if (status === 401) {\r\n serverTag.style.display = \"block\";\r\n serverTag.querySelector(\"a\")!.innerHTML = \"\";\r\n serverTag.querySelector(\"h3\")!.textContent =\r\n typeof items.detail === \"string\" ? items.detail : \"Unauthorized\";\r\n spinBtn(registerForm, \"none\", false);\r\n window.location.href = \"#Socials\";\r\n }\r\n};\r\n\r\n/**\r\n * Gets a value from an object using a path string (e.g., \"course.title\" or \"course.lecturer.full_name\")\r\n * @param row The data object to extract value from\r\n * @param accessor The path to the value (e.g., \"course.title\")\r\n * @returns The value at the specified path or empty string if not found\r\n */\r\nexport function getNestedValue(row: any, accessor: string): any {\r\n try {\r\n return accessor\r\n .split(\".\")\r\n .reduce(\r\n (obj, key) => (obj && obj[key] !== undefined ? obj[key] : \"\"),\r\n row\r\n );\r\n } catch (error) {\r\n console.warn(`Error accessing ${accessor}:`, error);\r\n return \"\";\r\n }\r\n}\r\n\r\n/**\r\n * Creates request options for fetch API.\r\n * @param method HTTP method (GET, POST, PUT, DELETE)\r\n * @param data Request body (BodyInit | FormData | null)\r\n * @param token Auth token string or null\r\n * @param content_type Content type (json, form-data, null, false)\r\n * @param channel Channel ID string or null\r\n * @param auth_sk Use auth secret boolean (true, false)\r\n * @returns Request options object\r\n */\r\nexport const reqOptions = (\r\n method: string,\r\n data: BodyInit | FormData | null = null,\r\n token: string | null = null,\r\n content_type: \"json\" | \"form-data\" | null | false = false,\r\n channel: string | null = null,\r\n auth_sk: boolean = false\r\n): RequestOptions => {\r\n const headers: Record<string, string> = {\r\n \"instincthub-sk-header\":\r\n process.env.NEXT_PUBLIC_INSTINCTHUB_SK_HEADER ?? \"\",\r\n };\r\n\r\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\r\n if (channel) headers[\"channel-id\"] = channel;\r\n if (content_type === \"json\") headers[\"Content-Type\"] = \"application/json\";\r\n if (content_type === \"form-data\")\r\n headers[\"Content-Type\"] = \"multipart/form-data\";\r\n if (auth_sk) {\r\n headers[\"instincthub-auth-sk-header\"] =\r\n process.env.NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET ?? \"\";\r\n }\r\n\r\n const request: RequestOptions = { method, headers, redirect: \"follow\" };\r\n if (data) request[\"body\"] = data;\r\n else request[\"body\"] = null;\r\n\r\n if (IN_DEV_MODE) console.log(request);\r\n return request;\r\n};\r\n\r\n/**\r\n * Fetches paginated data from an API.\r\n * @function\r\n * @example\r\n * ```ts\r\n * fetchData(page, token, options, data, setData, setCount, setNext, setPrevious, setIsLoading, reset);\r\n * ```\r\n * @param page API endpoint\r\n * @param token Auth token\r\n * @param options Request options\r\n * @param data Existing data\r\n * @param setData Data setter\r\n * @param setCount Count setter\r\n * @param setNext Next page setter\r\n * @param setPrevious Previous page setter\r\n * @param setIsLoading Loading state setter\r\n * @param reset Reset state\r\n * @returns\r\n * @see {@link FetchDataType}\r\n */\r\n\r\nexport const fetchData = async (\r\n page: string,\r\n token: string | null,\r\n options: object,\r\n data: any[],\r\n setData: React.Dispatch<React.SetStateAction<any>>,\r\n setCount: React.Dispatch<React.SetStateAction<number>>,\r\n setNext: React.Dispatch<React.SetStateAction<string | null>>,\r\n setPrevious: React.Dispatch<React.SetStateAction<string | null>>,\r\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\r\n reset = false\r\n) => {\r\n // Fetch paginated data when user scrolls\r\n if (!token) return;\r\n\r\n try {\r\n // Fetch data from the server with pagination\r\n const response = await fetch(page, options);\r\n const newData: any = await response.json();\r\n if (response.status === 401) {\r\n openToast(\"Unauthorized fetchData\", 401);\r\n return;\r\n }\r\n\r\n // Append the new data to the existing data\r\n if (reset) {\r\n setData(newData.results);\r\n setCount(newData.count);\r\n } else {\r\n setData([...data, ...newData.results]);\r\n }\r\n setNext(newData.next);\r\n setPrevious(newData.previous);\r\n } catch (error) {\r\n openToast(\"Error fetching data\", 500);\r\n console.error(\"Error fetching data:\", error);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n};\r\n\r\n/**\r\n * Fetches data from an API with error handling.\r\n * @param session Callback or state setter\r\n * @param api API endpoint\r\n * @param reqOptions Request options\r\n * @param isFunctionComponent Is functional component\r\n * @param setIsLoading (optional) IsLoading state setter (boolean)\r\n * @param setStatus (optional) Status setter (number | null)\r\n * @param setError (optional) Error setter (any)\r\n * @param flag (optional) Handle status errors (boolean)\r\n * @returns Promise with result or error\r\n */\r\n\r\nexport const fetchAPI = async <T>(\r\n session:\r\n | ((data: T) => void)\r\n | { setState: (state: { data?: T; status?: number; error?: any }) => void },\r\n api: string,\r\n reqOptions: RequestOptions,\r\n isFunctionComponent: boolean = false,\r\n setIsLoading?: (((loading: boolean) => void) | null) | null,\r\n setStatus?: ((status: number | null) => void) | null,\r\n setError?: ((error: any) => void) | null,\r\n flag: boolean = false\r\n): Promise<T | Error> => {\r\n try {\r\n const response = await fetch(api, reqOptions);\r\n const status = response.status;\r\n const result = (await response.json()) as T;\r\n\r\n if (isFunctionComponent) {\r\n if ([400, 401, 404, 500].includes(status)) {\r\n setError?.(result);\r\n } else if ([200, 201].includes(status)) {\r\n (session as (data: T) => void)(result);\r\n setError?.(null);\r\n }\r\n setStatus?.(status);\r\n } else {\r\n (session as { setState: any }).setState({ data: result, status });\r\n }\r\n\r\n if (IN_DEV_MODE) {\r\n console.log(\r\n \"Request Options:\",\r\n reqOptions,\r\n \"Response Data:\",\r\n result,\r\n \"Status Code:\",\r\n status\r\n );\r\n }\r\n if (flag) handleStatusError(status);\r\n\r\n return result;\r\n } catch (error) {\r\n if (isFunctionComponent) {\r\n (session as (error: any) => void)(error);\r\n setError?.(error);\r\n setStatus?.(null);\r\n } else {\r\n (session as { setState: any }).setState({ error });\r\n }\r\n if (IN_DEV_MODE)\r\n console.log(\"Request Options:\", reqOptions, \"Error:\", error);\r\n return error as Error;\r\n } finally {\r\n if (setIsLoading) setIsLoading(false);\r\n }\r\n};\r\n\r\n/**\r\n * Handles HTTP status errors with navigation.\r\n * @param status HTTP status code\r\n */\r\nexport const handleStatusError = (status: number): void => {\r\n if (status === 401) forbidden();\r\n else if (status === 404) notFound();\r\n};\r\n\r\n/**\r\n * Toggles form button spinner and disabled state.\r\n * @param form Form element\r\n * @param display Spinner display style\r\n * @param status Disabled status\r\n */\r\nexport const spinBtn = (\r\n form: HTMLFormElement | null,\r\n display: \"none\" | \"inline-block\",\r\n status: boolean\r\n): void => {\r\n if (!form) return;\r\n const button = form.querySelector<HTMLButtonElement>(\"button.submit_bt\");\r\n if (button) {\r\n button.disabled = status;\r\n const spinner = button.querySelector(\".bt-spinner\") as HTMLElement | null;\r\n if (spinner) spinner.style.display = display;\r\n }\r\n form.disabled = status;\r\n};\r\n\r\n/**\r\n * Resends OTP to an email.\r\n * @param email User email\r\n * @returns Promise with response data\r\n */\r\nexport const handleResendOTP = async (email: string): Promise<any> => {\r\n const formData = new FormData();\r\n formData.append(\"email\", email);\r\n const requestOptions = reqOptions(\"POST\", formData);\r\n const response = await fetch(\r\n `${API_HOST_URL}auth/skills/request_new_otp/`,\r\n requestOptions\r\n );\r\n return response.json();\r\n};\r\n"],"names":["IN_DEV_MODE","process","env","NODE_ENV","API_HOST_URL","_process$env$NEXT_PUB","NEXT_PUBLIC_API_HOST","FILE_URL","_process$env$NEXT_PUB2","NEXT_PUBLIC_FILE_URL","VIDEO_URL","_process$env$NEXT_PUB3","NEXT_PUBLIC_VIDEO_URL","CODECS_URL_M3U8","_process$env$NEXT_PUB4","NEXT_PUBLIC_VIDEO_URL_CODECS_M3U8","romansFigure","addUserDomain","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","domain","_process$env$NEXT_PUB5","payload","vercelOptions","wrap","_context","prev","next","name","concat","method","headers","Authorization","NEXT_PUBLIC_VERCEL_AUTH_BEARER_TOKEN","body","JSON","stringify","abrupt","fetch","NEXT_PUBLIC_VERCEL_PROJECT_ID","NEXT_PUBLIC_VERCEL_TEAM_ID","stop","_x","apply","this","arguments","stripHtmlTags","str","replace","stripCommaFromNumber","val","Number","_unused","calculateTotalCredits","courses","reduce","total","_ref2","course","parseInt","credits","toString","calculateAmountAfterDeduction","amount","percentage","detail","findNullOrEmptyKeys","namesArray","obj","filter","key","extractSubDomain","hostname","value","field","includes","_parts","parts","split","length","convertArrayToFormData","array","formData","FormData","forEach","item","index","Object","entries","_ref3","_ref4","_slicedToArray","Array","isArray","append","_typeof","objectURL","then","res","blob","error","console","String","objectIsEmpty","prop","hasOwnProperty","handleInvalid","e","formError","setFormError","target","_toConsumableArray","dataset","errTag","document","getElementById","scrollIntoView","join","calculateAverageRating","ratings","acc","rating","toFixed","convertToFloat","parseFloat","formatNumberWithCommas","number","isNaN","_number$toString$spli","_number$toString$spli2","integer","decimal","formattedInteger","slugifyFileName","fileName","extension","pop","toLowerCase","slice","convertToSlug","normalize","test","Error","TrackViewPort","element","rect","getBoundingClientRect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","formatDuration","durationInMinutes","Math","floor","hours","minutes","truncateHtml","markdownText","maxLength","substring","formatDateToWord","date","type","undefined","format","Date","hostUrlEncode","encodeURIComponent","location","href","isValidAlphanumeric","input","isValidEmail","toTitleCase","txt","charAt","toUpperCase","getCookie","cname","_step","ca","cookie","_iterator","_createForOfIteratorHelper","s","n","done","trimmed","trim","startsWith","err","f","removeCookie","setCookie","cvalue","exdays","d","setTime","getTime","toUTCString","printErr","form","querySelector","inputField","style","borderColor","_inputField$parentEle","errorTag","parentElement","_inputField$parentEle2","_inputField$parentEle3","textContent","_inputField$parentEle4","_inputField$parentEle5","span","createElement","classList","add","color","display","parent","nodeName","appendChild","focus","handleError","status","items","registerForm","r_path","_items$user","serverTag","user","username","backgroundColor","pathname","button","innerHTML","link","spinBtn","_ref5","_ref6","getNestedValue","row","accessor","warn","reqOptions","_process$env$NEXT_PUB6","_process$env$NEXT_PUB7","data","token","content_type","channel","auth_sk","NEXT_PUBLIC_INSTINCTHUB_SK_HEADER","NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET","request","redirect","log","fetchData","_ref7","_callee2","page","options","setData","setCount","setNext","setPrevious","setIsLoading","reset","response","newData","_args2","_context2","sent","json","openToast","results","count","previous","t0","finish","_x2","_x3","_x4","_x5","_x6","_x7","_x8","_x9","_x10","fetchAPI","_ref8","_callee3","session","api","isFunctionComponent","setStatus","setError","flag","result","_args3","_context3","setState","handleStatusError","_x11","_x12","_x13","forbidden","notFound","disabled","spinner","handleResendOTP","_ref9","_callee4","email","requestOptions","_context4","_x14"],"mappings":"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"}
1
+ {"version":3,"file":"helpFunction.js","sources":["../../../../src/components/lib/helpFunction.ts"],"sourcesContent":["// TypeScript version of the original JavaScript document\r\nimport { format } from \"date-fns\";\r\nimport { forbidden, notFound } from \"next/navigation\";\r\nimport { openToast } from \"./modals/modals\";\r\nimport React from \"react\";\r\n\r\n// Constants with Type Safety\r\nexport const IN_DEV_MODE: boolean = process.env.NODE_ENV === \"development\";\r\nexport const API_HOST_URL: string = process.env.NEXT_PUBLIC_API_HOST ?? \"\";\r\nexport const FILE_URL: string = process.env.NEXT_PUBLIC_FILE_URL ?? \"\";\r\nexport const VIDEO_URL: string = process.env.NEXT_PUBLIC_VIDEO_URL ?? \"\";\r\nexport const CODECS_URL_M3U8: string =\r\n process.env.NEXT_PUBLIC_VIDEO_URL_CODECS_M3U8 ?? \"\";\r\n\r\nexport const romansFigure: string[] = [\r\n \"I\",\r\n \"II\",\r\n \"III\",\r\n \"IV\",\r\n \"V\",\r\n \"VI\",\r\n \"VII\",\r\n \"VIII\",\r\n \"IX\",\r\n \"X\",\r\n];\r\n\r\n// Interfaces for Type Safety\r\ninterface VercelDomainRequest {\r\n name: string;\r\n}\r\n\r\ninterface VercelFetchOptions extends RequestInit {\r\n headers: {\r\n Authorization: string;\r\n [key: string]: string;\r\n };\r\n}\r\n\r\ninterface Course {\r\n credits: string | number;\r\n}\r\n\r\ninterface CourseObj {\r\n course: Course;\r\n}\r\n\r\ninterface SubDomainResult {\r\n value: string;\r\n field: \"username\" | \"domain\";\r\n}\r\n\r\ninterface FormItem {\r\n [key: string]: string | number | object | Blob | null | undefined | any[];\r\n}\r\n\r\ninterface RequestOptions extends RequestInit {\r\n headers: Record<string, string>;\r\n body?: BodyInit | FormData | null;\r\n}\r\n\r\n// Functions\r\n\r\n/**\r\n * Adds a subdomain to Vercel project.\r\n * @param domain The domain to add as a subdomain\r\n * @returns Promise resolving to the fetch Response\r\n */\r\nexport const addUserDomain = async (domain: string): Promise<Response> => {\r\n const payload: VercelDomainRequest = { name: `${domain}.instincthub.com` };\r\n const vercelOptions: VercelFetchOptions = {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${\r\n process.env.NEXT_PUBLIC_VERCEL_AUTH_BEARER_TOKEN ?? \"\"\r\n }`,\r\n },\r\n body: JSON.stringify(payload),\r\n };\r\n\r\n return fetch(\r\n `https://api.vercel.com/v10/projects/${process.env.NEXT_PUBLIC_VERCEL_PROJECT_ID}/domains?teamId=${process.env.NEXT_PUBLIC_VERCEL_TEAM_ID}`,\r\n vercelOptions\r\n );\r\n};\r\n\r\n/**\r\n * Strips HTML tags from a string.\r\n * @param str Input string with potential HTML tags\r\n * @returns Cleaned string without HTML tags\r\n */\r\nexport const stripHtmlTags = (str: string): string => {\r\n return str.replace(/<[^>]*>/g, \"\");\r\n};\r\n\r\n/**\r\n * Removes commas from a number string and converts to number.\r\n * @param str Input string or number\r\n * @returns Parsed number or 0 if invalid\r\n */\r\nexport const stripCommaFromNumber = (str: string | number): number => {\r\n try {\r\n if (typeof str === \"number\") return str;\r\n const val = str.replace(/,/g, \"\");\r\n return Number(val) || 0;\r\n } catch {\r\n return 0;\r\n }\r\n};\r\n\r\n/**\r\n * Calculates total credits from an array of course objects.\r\n * @param courses Array of course objects\r\n * @returns Total credits as a number\r\n */\r\nexport const calculateTotalCredits = (courses: CourseObj[]): number => {\r\n return courses.reduce((total, { course }) => {\r\n const credits = Number.parseInt(course.credits.toString(), 10) || 0;\r\n return total + credits;\r\n }, 0);\r\n};\r\n\r\n/**\r\n * Calculates amount after percentage deduction.\r\n * @param amount Base amount\r\n * @param percentage Percentage to deduct (0-100)\r\n * @returns Object with final amount or error details\r\n */\r\nexport const calculateAmountAfterDeduction = (\r\n amount: number,\r\n percentage: number\r\n): { amount: number; detail?: string } => {\r\n if (amount < 0 || percentage < 0 || percentage > 100) {\r\n return {\r\n amount: 0,\r\n detail:\r\n \"Amount and percentage should be positive, and percentage should be between 0 and 100.\",\r\n };\r\n }\r\n const deduction = (amount * percentage) / 100;\r\n return { amount: amount - deduction };\r\n};\r\n\r\n/**\r\n * Finds keys in an object that are null, undefined, or empty string.\r\n * @param namesArray Array of keys to check\r\n * @param obj Object to inspect\r\n * @returns Array of keys with null/empty values\r\n */\r\nexport const findNullOrEmptyKeys = <T extends Record<string, any>>(\r\n namesArray: string[],\r\n obj: T\r\n): string[] => {\r\n return namesArray.filter((key) => obj[key] == null || obj[key] === \"\");\r\n};\r\n\r\n/**\r\n * Extracts subdomain or domain from hostname.\r\n * @param hostname Hostname string\r\n * @returns Subdomain result or null\r\n */\r\nexport const extractSubDomain = (hostname: string): SubDomainResult | null => {\r\n if (IN_DEV_MODE) return { value: \"eportal.hust.edu.ng\", field: \"username\" };\r\n if (!hostname.includes(\"instincthub.com\") && !IN_DEV_MODE) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n\r\n const parts = hostname.split(\".\");\r\n if (parts.length > 1) {\r\n if (parts[1] === \"ngrok-free\")\r\n return { value: \"skills\", field: \"username\" };\r\n if (\r\n parts[parts.length - 2] !== \"instincthub\" &&\r\n !hostname.includes(\"localhost\")\r\n ) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n return { value: parts[0], field: \"username\" };\r\n }\r\n\r\n if (parts.length === 1 || parts.length === 2) {\r\n if (\r\n parts[0].includes(\"localhost:3000\") ||\r\n parts[0] === \"instincthub\" ||\r\n parts[1] === \"ngrok-free\"\r\n ) {\r\n return { value: \"eportal.hust.edu.ng\", field: \"username\" };\r\n }\r\n if (\r\n !parts[parts.length - 2]?.includes(\"instincthub\") &&\r\n !hostname.includes(\"localhost\")\r\n ) {\r\n return { value: hostname, field: \"domain\" };\r\n }\r\n return { value: parts[0], field: \"domain\" };\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Converts an array of objects to FormData.\r\n * @param array Array of items to convert\r\n * @returns FormData object\r\n */\r\nexport const convertArrayToFormData = (array: FormItem[]): FormData => {\r\n const formData = new FormData();\r\n array.forEach((item, index) => {\r\n Object.entries(item).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n formData.append(`item[${index}].${key}`, JSON.stringify(value));\r\n } else if (typeof value === \"object\" && value !== null) {\r\n if (key === \"upload_result\" && \"objectURL\" in value) {\r\n fetch((value as { objectURL: string }).objectURL)\r\n .then((res) => res.blob())\r\n .then((blob) => {\r\n formData.append(\r\n `item[${index}].${key}`,\r\n blob,\r\n \"upload_result_file\"\r\n );\r\n })\r\n .catch((error) =>\r\n console.error(\"Error converting blob URL:\", error)\r\n );\r\n } else {\r\n formData.append(`item[${index}].${key}`, JSON.stringify(value));\r\n }\r\n } else {\r\n formData.append(`item[${index}].${key}`, String(value ?? \"\"));\r\n }\r\n });\r\n });\r\n return formData;\r\n};\r\n\r\n/**\r\n * Checks if an object is empty\r\n * @param obj Object to check\r\n * @returns True if empty, false otherwise\r\n */\r\nexport const objectIsEmpty = (obj: any): boolean => {\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) return false;\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Handles form validation errors.\r\n * @param e Event object from form input\r\n * @param formError Current error list\r\n * @param setFormError Function to update error list\r\n * @returns Error message with status code\r\n */\r\nexport const handleInvalid = (\r\n e: React.FormEvent<HTMLInputElement>,\r\n formError: string[],\r\n setFormError: (errors: string[]) => void\r\n): [string, number] => {\r\n const target = e.target as HTMLInputElement;\r\n if (!formError.includes(target.name)) {\r\n setFormError([...formError, target.dataset.name || target.name]);\r\n }\r\n\r\n const errTag = document.getElementById(`id_${target.name}`);\r\n if (errTag) errTag.scrollIntoView();\r\n\r\n return [`Error: ${formError.join(\", \")} field(s) cannot be left blank.`, 400];\r\n};\r\n\r\n/**\r\n * Calculates average rating from an array of numbers.\r\n * @param ratings Array of ratings\r\n * @returns Average rating as a string with 1 decimal place\r\n */\r\nexport const calculateAverageRating = (ratings: number[]): string => {\r\n if (!ratings.length) return \"0.0\";\r\n const sum = ratings.reduce((acc, rating) => acc + rating, 0);\r\n return (sum / ratings.length).toFixed(1);\r\n};\r\n\r\n/**\r\n * Converts a string to a float, removing commas.\r\n * @param value Input string\r\n * @returns Parsed float\r\n */\r\nexport const convertToFloat = (value: string): number => {\r\n return parseFloat(value.replace(/,/g, \"\")) || 0;\r\n};\r\n\r\n/**\r\n * Formats a number with commas.\r\n * @param number Input number\r\n * @returns Formatted string or error message\r\n */\r\nexport const formatNumberWithCommas = (number: number): string => {\r\n if (isNaN(number)) return \"Invalid number\";\r\n const [integer, decimal] = number.toString().split(\".\");\r\n const formattedInteger = integer.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n return decimal ? `${formattedInteger}.${decimal}` : formattedInteger;\r\n};\r\n\r\nexport const slugifyFileName = (fileName: string): string => {\r\n // Split the fileName by dot to separate the name and extension\r\n const parts: string[] = fileName.split(\".\");\r\n\r\n // Extract the extension\r\n const extension: string = parts.pop() || \"\";\r\n\r\n // Join the remaining parts with hyphen and replace special characters and brackets with hyphens\r\n const slugifiedName: string = parts\r\n .join(\"-\")\r\n .replace(/[^\\w\\s()-]/g, \"\")\r\n .replace(/[\\s_]+/g, \"-\")\r\n .toLowerCase();\r\n\r\n // Remove parentheses from the slugified name\r\n const nameWithoutParentheses: string = slugifiedName.replace(\r\n /\\(([^)]+)\\)/g,\r\n \"\"\r\n );\r\n\r\n // Only take first 50 characters\r\n const reduced_txt: string = nameWithoutParentheses.slice(0, 50);\r\n\r\n // Append the extension\r\n return reduced_txt + \".\" + extension.toLowerCase();\r\n};\r\n\r\n/**\r\n * Converts a string to a URL-friendly slug format.\r\n * @param value The string to convert to a slug\r\n * @example\r\n * ```ts\r\n * const slug = convertToSlug(\"Hello World\");\r\n * console.log(slug); // \"hello-world\"\r\n * ```\r\n * @returns A lowercase string with spaces and special characters replaced by hyphens\r\n * @throws Error if the resulting slug contains invalid characters\r\n */\r\nexport const convertToSlug = (value: string): string => {\r\n // Normalize the string to remove accents and other diacritics\r\n value = value.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\r\n\r\n // Convert to lowercase\r\n value = value.toLowerCase();\r\n\r\n // Replace any non-alphanumeric characters with a hyphen\r\n value = value.replace(/[^a-z0-9]+/g, \"-\");\r\n\r\n // Remove leading or trailing hyphens\r\n value = value.replace(/^-+|-+$/g, \"\");\r\n\r\n // Ensure the slug only contains valid characters\r\n if (!/^[a-z0-9_-]+$/.test(value)) {\r\n throw new Error(\r\n 'Enter a valid \"slug\" consisting of letters, numbers, underscores, or hyphens.'\r\n );\r\n }\r\n\r\n return value;\r\n};\r\n\r\n/**\r\n * Checks if an element is in the viewport.\r\n * @param element DOM element\r\n * @returns Boolean indicating visibility\r\n */\r\nexport const TrackViewPort = (element: HTMLElement | null): boolean => {\r\n if (!element) return false;\r\n const rect = element.getBoundingClientRect();\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <=\r\n (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n};\r\n\r\n/**\r\n * Formats duration in minutes to a readable string.\r\n * @param durationInMinutes Duration in minutes\r\n * @returns Formatted duration string\r\n */\r\nexport const formatDuration = (durationInMinutes: number): string => {\r\n if (durationInMinutes === 0) return \"...\";\r\n if (durationInMinutes < 60) {\r\n return Math.floor(durationInMinutes)\r\n ? `${Math.floor(durationInMinutes)} Minutes`\r\n : `${durationInMinutes.toFixed(1)} Seconds`;\r\n }\r\n const hours = Math.floor(durationInMinutes / 60);\r\n const minutes = Math.floor(durationInMinutes % 60);\r\n return minutes === 0\r\n ? `${hours} Hours`\r\n : `${hours} Hours, ${minutes} Minutes`;\r\n};\r\n\r\n/**\r\n * Truncates HTML content to a specified length.\r\n * @param markdownText HTML string\r\n * @param maxLength Maximum length\r\n * @returns Truncated string\r\n */\r\nexport const truncateHtml = (\r\n markdownText: string,\r\n maxLength: number\r\n): string => {\r\n return markdownText.length > maxLength\r\n ? `${markdownText.substring(0, maxLength)}...`\r\n : markdownText;\r\n};\r\n\r\n/**\r\n * Formats a date to a readable string.\r\n * @param date Date object or string\r\n * @param type Format type (default: \"iiii do MMMM yyyy\")\r\n * @returns Formatted date string\r\n */\r\nexport const formatDateToWord = (\r\n date: Date | string,\r\n type: string = \"iiii do MMMM yyyy\"\r\n): string => {\r\n if (!date) return \"\";\r\n return format(new Date(date), type);\r\n};\r\n\r\n/**\r\n * Encodes the current URL.\r\n * @returns Encoded URL string or undefined if not in browser\r\n */\r\nexport const hostUrlEncode = (): string | undefined => {\r\n if (typeof document !== \"undefined\") {\r\n return encodeURIComponent(window.location.href);\r\n }\r\n};\r\n\r\n/**\r\n * Validates if input is alphanumeric and at least 3 characters.\r\n * @param input Input string\r\n * @returns Boolean indicating validity\r\n */\r\nexport const isValidAlphanumeric = (input: string): boolean => {\r\n return input?.length >= 3 && /^[a-zA-Z0-9]+$/.test(input);\r\n};\r\n\r\n/**\r\n * Validates if input is a valid email.\r\n * @param input Input string\r\n * @returns Boolean indicating validity\r\n */\r\nexport const isValidEmail = (input: string): boolean => {\r\n return input?.length >= 3 && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(input);\r\n};\r\n\r\n/**\r\n * Converts a string to title case.\r\n * @param str Input string\r\n * @returns Title case string or original value if not a string\r\n */\r\nexport const toTitleCase = (str: any): any => {\r\n if (typeof str !== \"string\") return str;\r\n return str.replace(\r\n /\\w\\S*/g,\r\n (txt) => txt.charAt(0).toUpperCase() + txt.slice(1).toLowerCase()\r\n );\r\n};\r\n\r\n/**\r\n * Gets a cookie value by name.\r\n * @param cname Cookie name\r\n * @returns Cookie value or null\r\n */\r\nexport const getCookie = (cname: string): string | null => {\r\n if (typeof document === \"undefined\") return null;\r\n const name = `${cname}=`;\r\n const ca = document.cookie.split(\";\");\r\n for (const c of ca) {\r\n const trimmed = c.trim();\r\n if (trimmed.startsWith(name)) return trimmed.substring(name.length);\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Removes a cookie by name.\r\n * @param cname Cookie name\r\n */\r\nexport const removeCookie = (cname: string): void => {\r\n if (typeof document !== \"undefined\") {\r\n document.cookie = `${cname}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\r\n }\r\n};\r\n\r\n/**\r\n * Sets a cookie with name, value, and expiration days.\r\n * @param cname Cookie name\r\n * @param cvalue Cookie value\r\n * @param exdays Expiration days\r\n */\r\nexport const setCookie = (\r\n cname: string,\r\n cvalue: string,\r\n exdays: number\r\n): void => {\r\n if (typeof document !== \"undefined\") {\r\n const d = new Date();\r\n d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);\r\n document.cookie = `${cname}=${cvalue};expires=${d.toUTCString()};path=/`;\r\n }\r\n};\r\n\r\n/**\r\n * Prints an error message for a form field.\r\n * @param key Field name\r\n * @param value Error message\r\n * @param index Index for focusing first error\r\n */\r\nexport const printErr = (key: string, value: string, index: number): void => {\r\n const form = document.querySelector(\"#regForm\");\r\n if (!form) return;\r\n\r\n const inputField = form.querySelector<HTMLInputElement>(`[name=\"${key}\"]`);\r\n if (!inputField) return;\r\n\r\n inputField.style.borderColor = \"var(--TurkishRose)\";\r\n let errorTag: HTMLElement | null = null;\r\n\r\n if (inputField.type === \"radio\") {\r\n errorTag =\r\n inputField.parentElement?.parentElement?.parentElement?.querySelector(\r\n \".error\"\r\n ) || null;\r\n } else if (inputField.type === \"file\") {\r\n errorTag =\r\n inputField.parentElement?.parentElement?.querySelector(\".error\") || null;\r\n } else {\r\n errorTag = inputField.parentElement?.querySelector(\".error\") || null;\r\n }\r\n\r\n if (errorTag) {\r\n errorTag.textContent = value;\r\n } else {\r\n const span = document.createElement(\"span\");\r\n span.classList.add(\"error\");\r\n span.textContent = value;\r\n span.style.color = \"var(--TurkishRose)\";\r\n span.style.display = \"inline-block\";\r\n\r\n const parent =\r\n inputField.type === \"radio\"\r\n ? inputField.parentElement?.parentElement?.parentElement\r\n : inputField.type === \"file\" || inputField.nodeName === \"SELECT\"\r\n ? inputField.parentElement\r\n : inputField.parentElement?.parentElement;\r\n parent?.appendChild(span);\r\n }\r\n\r\n if (index === 0) inputField.focus();\r\n};\r\n\r\n/**\r\n * Handles server response errors for forms.\r\n * @param status HTTP status code\r\n * @param items Error or success data\r\n * @param registerForm Form element\r\n * @param r_path Redirect path\r\n */\r\nexport const handleError = (\r\n status: number,\r\n items: Record<string, string[]>,\r\n registerForm: HTMLFormElement | null,\r\n r_path: string | null\r\n): void => {\r\n const serverTag = document.querySelector(\".server_err\") as HTMLElement | null;\r\n if (!serverTag) return;\r\n\r\n if (status === 400) {\r\n if (items.user?.[0] === \"This field must be unique.\" || items.username) {\r\n serverTag.style.display = \"block\";\r\n serverTag.style.backgroundColor = \"var(--DarkCyan)\";\r\n serverTag.querySelector(\"h3\")!.textContent =\r\n \"We already have your details!\";\r\n if (\r\n [\"/register/details\", \"/register/details/\"].includes(\r\n document.location.pathname\r\n )\r\n ) {\r\n const button = serverTag.querySelector(\"a button span\");\r\n if (button) button.innerHTML = \"Take Assessment\";\r\n const link = serverTag.querySelector(\"a\");\r\n if (link) link.href = \"/quiz/\";\r\n }\r\n spinBtn(registerForm, \"none\", false);\r\n window.location.href = \"#Socials\";\r\n } else {\r\n spinBtn(registerForm, \"none\", false);\r\n Object.entries(items).forEach(([key, value], index) =>\r\n printErr(key, value[0], index)\r\n );\r\n serverTag.style.display = \"none\";\r\n }\r\n } else if ([200, 201, 202].includes(status) && r_path) {\r\n window.location.href = r_path;\r\n } else if (status === 401) {\r\n serverTag.style.display = \"block\";\r\n serverTag.querySelector(\"a\")!.innerHTML = \"\";\r\n serverTag.querySelector(\"h3\")!.textContent =\r\n typeof items.detail === \"string\" ? items.detail : \"Unauthorized\";\r\n spinBtn(registerForm, \"none\", false);\r\n window.location.href = \"#Socials\";\r\n }\r\n};\r\n\r\n/**\r\n * Gets a value from an object using a path string (e.g., \"course.title\" or \"course.lecturer.full_name\")\r\n * @param row The data object to extract value from\r\n * @param accessor The path to the value (e.g., \"course.title\")\r\n * @returns The value at the specified path or empty string if not found\r\n */\r\nexport function getNestedValue(row: any, accessor: string): any {\r\n try {\r\n return accessor\r\n .split(\".\")\r\n .reduce(\r\n (obj, key) => (obj && obj[key] !== undefined ? obj[key] : \"\"),\r\n row\r\n );\r\n } catch (error) {\r\n console.warn(`Error accessing ${accessor}:`, error);\r\n return \"\";\r\n }\r\n}\r\n\r\n/**\r\n * Creates request options for fetch API.\r\n * @param method HTTP method (GET, POST, PUT, DELETE)\r\n * @param data Request body (BodyInit | FormData | null)\r\n * @param token Auth token string or null\r\n * @param content_type Content type (json, form-data, null, false)\r\n * @param channel Channel ID string or null\r\n * @param auth_sk Use auth secret boolean (true, false)\r\n * @returns Request options object\r\n *\r\n * Set environment\r\n * NEXT_PUBLIC_INSTINCTHUB_SK_KEY=\"Your secret key name\"\r\n * NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET=\"Your seceret key\"\r\n */\r\nexport const reqOptions = (\r\n method: string,\r\n data: BodyInit | FormData | null = null,\r\n token: string | null = null,\r\n content_type: \"json\" | \"form-data\" | null | false = false,\r\n channel: string | null = null,\r\n auth_sk: boolean = false\r\n): RequestOptions => {\r\n const sk_header = process.env.NEXT_PUBLIC_INSTINCTHUB_SKH_KEY || \"\";\r\n const headers: Record<string, string> = {\r\n [sk_header]: process.env.NEXT_PUBLIC_INSTINCTHUB_SK_HEADER ?? \"\",\r\n };\r\n\r\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\r\n if (channel) headers[\"channel-id\"] = channel;\r\n if (content_type === \"json\") headers[\"Content-Type\"] = \"application/json\";\r\n if (content_type === \"form-data\")\r\n headers[\"Content-Type\"] = \"multipart/form-data\";\r\n if (auth_sk) {\r\n const sk_key = process.env.NEXT_PUBLIC_INSTINCTHUB_SK_KEY || \"\";\r\n headers[sk_key] = process.env.NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET ?? \"\";\r\n }\r\n\r\n const request: RequestOptions = { method, headers, redirect: \"follow\" };\r\n if (data) request[\"body\"] = data;\r\n else request[\"body\"] = null;\r\n\r\n if (IN_DEV_MODE) console.log(request);\r\n return request;\r\n};\r\n\r\n/**\r\n * Fetches paginated data from an API.\r\n * @function\r\n * @example\r\n * ```ts\r\n * fetchData(page, token, options, data, setData, setCount, setNext, setPrevious, setIsLoading, reset);\r\n * ```\r\n * @param page API endpoint\r\n * @param token Auth token\r\n * @param options Request options\r\n * @param data Existing data\r\n * @param setData Data setter\r\n * @param setCount Count setter\r\n * @param setNext Next page setter\r\n * @param setPrevious Previous page setter\r\n * @param setIsLoading Loading state setter\r\n * @param reset Reset state\r\n * @returns\r\n * @see {@link FetchDataType}\r\n */\r\n\r\nexport const fetchData = async (\r\n page: string,\r\n token: string | null,\r\n options: object,\r\n data: any[],\r\n setData: React.Dispatch<React.SetStateAction<any>>,\r\n setCount: React.Dispatch<React.SetStateAction<number>>,\r\n setNext: React.Dispatch<React.SetStateAction<string | null>>,\r\n setPrevious: React.Dispatch<React.SetStateAction<string | null>>,\r\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\r\n reset = false\r\n) => {\r\n // Fetch paginated data when user scrolls\r\n if (!token) return;\r\n\r\n try {\r\n // Fetch data from the server with pagination\r\n const response = await fetch(page, options);\r\n const newData: any = await response.json();\r\n if (response.status === 401) {\r\n openToast(\"Unauthorized fetchData\", 401);\r\n return;\r\n }\r\n\r\n // Append the new data to the existing data\r\n if (reset) {\r\n setData(newData.results);\r\n setCount(newData.count);\r\n } else {\r\n setData([...data, ...newData.results]);\r\n }\r\n setNext(newData.next);\r\n setPrevious(newData.previous);\r\n } catch (error) {\r\n openToast(\"Error fetching data\", 500);\r\n console.error(\"Error fetching data:\", error);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n};\r\n\r\n/**\r\n * Fetches data from an API with error handling.\r\n * @param session Callback or state setter\r\n * @param api API endpoint\r\n * @param reqOptions Request options\r\n * @param isFunctionComponent Is functional component\r\n * @param setIsLoading (optional) IsLoading state setter (boolean)\r\n * @param setStatus (optional) Status setter (number | null)\r\n * @param setError (optional) Error setter (any)\r\n * @param flag (optional) Handle status errors (boolean)\r\n * @returns Promise with result or error\r\n */\r\n\r\nexport const fetchAPI = async <T>(\r\n session:\r\n | ((data: T) => void)\r\n | { setState: (state: { data?: T; status?: number; error?: any }) => void },\r\n api: string,\r\n reqOptions: RequestOptions,\r\n isFunctionComponent: boolean = false,\r\n setIsLoading?: (((loading: boolean) => void) | null) | null,\r\n setStatus?: ((status: number | null) => void) | null,\r\n setError?: ((error: any) => void) | null,\r\n flag: boolean = false\r\n): Promise<T | Error> => {\r\n try {\r\n const response = await fetch(api, reqOptions);\r\n const status = response.status;\r\n const result = (await response.json()) as T;\r\n\r\n if (isFunctionComponent) {\r\n if ([400, 401, 404, 500].includes(status)) {\r\n setError?.(result);\r\n } else if ([200, 201].includes(status)) {\r\n (session as (data: T) => void)(result);\r\n setError?.(null);\r\n }\r\n setStatus?.(status);\r\n } else {\r\n (session as { setState: any }).setState({ data: result, status });\r\n }\r\n\r\n if (IN_DEV_MODE) {\r\n console.log(\r\n \"Request Options:\",\r\n reqOptions,\r\n \"Response Data:\",\r\n result,\r\n \"Status Code:\",\r\n status\r\n );\r\n }\r\n if (flag) handleStatusError(status);\r\n\r\n return result;\r\n } catch (error) {\r\n if (isFunctionComponent) {\r\n (session as (error: any) => void)(error);\r\n setError?.(error);\r\n setStatus?.(null);\r\n } else {\r\n (session as { setState: any }).setState({ error });\r\n }\r\n if (IN_DEV_MODE)\r\n console.log(\"Request Options:\", reqOptions, \"Error:\", error);\r\n return error as Error;\r\n } finally {\r\n if (setIsLoading) setIsLoading(false);\r\n }\r\n};\r\n\r\n/**\r\n * Handles HTTP status errors with navigation.\r\n * @param status HTTP status code\r\n */\r\nexport const handleStatusError = (status: number): void => {\r\n if (status === 401) forbidden();\r\n else if (status === 404) notFound();\r\n};\r\n\r\n/**\r\n * Toggles form button spinner and disabled state.\r\n * @param form Form element\r\n * @param display Spinner display style\r\n * @param status Disabled status\r\n */\r\nexport const spinBtn = (\r\n form: HTMLFormElement | null,\r\n display: \"none\" | \"inline-block\",\r\n status: boolean\r\n): void => {\r\n if (!form) return;\r\n const button = form.querySelector<HTMLButtonElement>(\"button.submit_bt\");\r\n if (button) {\r\n button.disabled = status;\r\n const spinner = button.querySelector(\".bt-spinner\") as HTMLElement | null;\r\n if (spinner) spinner.style.display = display;\r\n }\r\n form.disabled = status;\r\n};\r\n\r\n/**\r\n * Resends OTP to an email.\r\n * @param email User email\r\n * @returns Promise with response data\r\n */\r\nexport const handleResendOTP = async (email: string): Promise<any> => {\r\n const formData = new FormData();\r\n formData.append(\"email\", email);\r\n const requestOptions = reqOptions(\"POST\", formData);\r\n const response = await fetch(\r\n `${API_HOST_URL}auth/skills/request_new_otp/`,\r\n requestOptions\r\n );\r\n return response.json();\r\n};\r\n"],"names":["IN_DEV_MODE","process","env","NODE_ENV","API_HOST_URL","_process$env$NEXT_PUB","NEXT_PUBLIC_API_HOST","FILE_URL","_process$env$NEXT_PUB2","NEXT_PUBLIC_FILE_URL","VIDEO_URL","_process$env$NEXT_PUB3","NEXT_PUBLIC_VIDEO_URL","CODECS_URL_M3U8","_process$env$NEXT_PUB4","NEXT_PUBLIC_VIDEO_URL_CODECS_M3U8","romansFigure","addUserDomain","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","domain","_process$env$NEXT_PUB5","payload","vercelOptions","wrap","_context","prev","next","name","concat","method","headers","Authorization","NEXT_PUBLIC_VERCEL_AUTH_BEARER_TOKEN","body","JSON","stringify","abrupt","fetch","NEXT_PUBLIC_VERCEL_PROJECT_ID","NEXT_PUBLIC_VERCEL_TEAM_ID","stop","_x","apply","this","arguments","stripHtmlTags","str","replace","stripCommaFromNumber","val","Number","_unused","calculateTotalCredits","courses","reduce","total","_ref2","course","parseInt","credits","toString","calculateAmountAfterDeduction","amount","percentage","detail","findNullOrEmptyKeys","namesArray","obj","filter","key","extractSubDomain","hostname","value","field","includes","_parts","parts","split","length","convertArrayToFormData","array","formData","FormData","forEach","item","index","Object","entries","_ref3","_ref4","_slicedToArray","Array","isArray","append","_typeof","objectURL","then","res","blob","error","console","String","objectIsEmpty","prop","hasOwnProperty","handleInvalid","e","formError","setFormError","target","_toConsumableArray","dataset","errTag","document","getElementById","scrollIntoView","join","calculateAverageRating","ratings","acc","rating","toFixed","convertToFloat","parseFloat","formatNumberWithCommas","number","isNaN","_number$toString$spli","_number$toString$spli2","integer","decimal","formattedInteger","slugifyFileName","fileName","extension","pop","toLowerCase","slice","convertToSlug","normalize","test","Error","TrackViewPort","element","rect","getBoundingClientRect","top","left","bottom","window","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","formatDuration","durationInMinutes","Math","floor","hours","minutes","truncateHtml","markdownText","maxLength","substring","formatDateToWord","date","type","undefined","format","Date","hostUrlEncode","encodeURIComponent","location","href","isValidAlphanumeric","input","isValidEmail","toTitleCase","txt","charAt","toUpperCase","getCookie","cname","_step","ca","cookie","_iterator","_createForOfIteratorHelper","s","n","done","trimmed","trim","startsWith","err","f","removeCookie","setCookie","cvalue","exdays","d","setTime","getTime","toUTCString","printErr","form","querySelector","inputField","style","borderColor","_inputField$parentEle","errorTag","parentElement","_inputField$parentEle2","_inputField$parentEle3","textContent","_inputField$parentEle4","_inputField$parentEle5","span","createElement","classList","add","color","display","parent","nodeName","appendChild","focus","handleError","status","items","registerForm","r_path","_items$user","serverTag","user","username","backgroundColor","pathname","button","innerHTML","link","spinBtn","_ref5","_ref6","getNestedValue","row","accessor","warn","reqOptions","_process$env$NEXT_PUB6","_process$env$NEXT_PUB7","data","token","content_type","channel","auth_sk","sk_header","NEXT_PUBLIC_INSTINCTHUB_SKH_KEY","_defineProperty","NEXT_PUBLIC_INSTINCTHUB_SK_HEADER","NEXT_PUBLIC_INSTINCTHUB_SK_KEY","NEXT_PUBLIC_INSTINCTHUB_AUTH_SECRET","request","redirect","log","fetchData","_ref7","_callee2","page","options","setData","setCount","setNext","setPrevious","setIsLoading","reset","response","newData","_args2","_context2","sent","json","openToast","results","count","previous","t0","finish","_x2","_x3","_x4","_x5","_x6","_x7","_x8","_x9","_x10","fetchAPI","_ref8","_callee3","session","api","isFunctionComponent","setStatus","setError","flag","result","_args3","_context3","setState","handleStatusError","_x11","_x12","_x13","forbidden","notFound","disabled","spinner","handleResendOTP","_ref9","_callee4","email","requestOptions","_context4","_x14"],"mappings":"8YAOaA,EAAgD,gBAAzBC,QAAQC,IAAIC,SACnCC,EAAuDC,QAA3CA,EAAWJ,QAAQC,IAAII,4BAAoBD,IAAAA,EAAAA,EAAI,GAC3DE,EAAmDC,QAA3CA,EAAWP,QAAQC,IAAIO,4BAAoBD,IAAAA,EAAAA,EAAI,GACvDE,EAAqDC,QAA5CA,EAAWV,QAAQC,IAAIU,6BAAqBD,IAAAA,EAAAA,EAAI,GACzDE,EACkCC,QADnBA,EAC1Bb,QAAQC,IAAIa,yCAAiCD,IAAAA,EAAAA,EAAI,GAEtCE,EAAyB,CACpC,IACA,KACA,MACA,KACA,IACA,KACA,MACA,OACA,KACA,KA4CWC,EAAa,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,MAAG,SAAAC,EAAOC,GAAc,IAAAC,EAAAC,EAAAC,EAAA,OAAAN,IAAAO,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAU/C,OATKL,EAA+B,CAAEM,KAAI,GAAAC,OAAKT,EAAM,qBAChDG,EAAoC,CACxCO,OAAQ,OACRC,QAAS,CACPC,cAAaH,UAAAA,OACqCR,QADrCA,EACXvB,QAAQC,IAAIkC,4CAAoCZ,IAAAA,EAAAA,EAAI,KAGxDa,KAAMC,KAAKC,UAAUd,IACtBG,EAAAY,OAAA,SAEMC,MAAKT,uCAAAA,OAC6B/B,QAAQC,IAAIwC,8BAA6B,oBAAAV,OAAmB/B,QAAQC,IAAIyC,4BAC/GjB,IACD,KAAA,EAAA,IAAA,MAAA,OAAAE,EAAAgB,OAAA,GAAAtB,EACF,KAAA,OAhBYL,SAAa4B,GAAA,OAAA3B,EAAA4B,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAuBbC,EAAgB,SAACC,GAC5B,OAAOA,EAAIC,QAAQ,WAAY,GACjC,EAOaC,EAAuB,SAACF,GACnC,IACE,GAAmB,iBAARA,EAAkB,OAAOA,EACpC,IAAMG,EAAMH,EAAIC,QAAQ,KAAM,IAC9B,OAAOG,OAAOD,IAAQ,CACvB,CAAC,MAAAE,GACA,OAAO,CACR,CACH,EAOaC,EAAwB,SAACC,GACpC,OAAOA,EAAQC,QAAO,SAACC,EAAKC,GAAgB,IAAZC,EAAMD,EAANC,OAE9B,OAAOF,GADSL,OAAOQ,SAASD,EAAOE,QAAQC,WAAY,KAAO,EAEnE,GAAE,EACL,EAQaC,EAAgC,SAC3CC,EACAC,GAEA,OAAID,EAAS,GAAKC,EAAa,GAAKA,EAAa,IACxC,CACLD,OAAQ,EACRE,OACE,yFAIC,CAAEF,OAAQA,EADEA,EAASC,EAAc,IAE5C,EAQaE,EAAsB,SACjCC,EACAC,GAEA,OAAOD,EAAWE,QAAO,SAACC,GAAG,OAAiB,MAAZF,EAAIE,IAA6B,KAAbF,EAAIE,KAC5D,EAOaC,EAAmB,SAACC,GAC/B,GAAI3E,EAAa,MAAO,CAAE4E,MAAO,sBAAuBC,MAAO,YAC/D,IAAKF,EAASG,SAAS,qBAAuB9E,EAC5C,MAAO,CAAE4E,MAAOD,EAAUE,MAAO,UAGnC,IAa8CE,EAbxCC,EAAQL,EAASM,MAAM,KAC7B,OAAID,EAAME,OAAS,EACA,eAAbF,EAAM,GACD,CAAEJ,MAAO,SAAUC,MAAO,YAEL,gBAA5BG,EAAMA,EAAME,OAAS,IACpBP,EAASG,SAAS,aAId,CAAEF,MAAOI,EAAM,GAAIH,MAAO,YAFxB,CAAED,MAAOD,EAAUE,MAAO,UAKhB,IAAjBG,EAAME,QAAiC,IAAjBF,EAAME,OAE5BF,EAAM,GAAGF,SAAS,mBACL,gBAAbE,EAAM,IACO,eAAbA,EAAM,GAEC,CAAEJ,MAAO,sBAAuBC,MAAO,YAGtB,QAAxBE,EAACC,EAAMA,EAAME,OAAS,UAAE,IAAAH,GAAvBA,EAAyBD,SAAS,gBAClCH,EAASG,SAAS,aAId,CAAEF,MAAOI,EAAM,GAAIH,MAAO,UAFxB,CAAED,MAAOD,EAAUE,MAAO,UAI9B,IACT,EAOaM,EAAyB,SAACC,GACrC,IAAMC,EAAW,IAAIC,SA2BrB,OA1BAF,EAAMG,SAAQ,SAACC,EAAMC,GACnBC,OAAOC,QAAQH,GAAMD,SAAQ,SAAAK,GAAiB,IAAAC,EAAAC,EAAAF,EAAA,GAAfnB,EAAGoB,EAAA,GAAEjB,EAAKiB,EAAA,GACnCE,MAAMC,QAAQpB,GAChBS,EAASY,OAAM,QAAAjE,OAASyD,EAAKzD,MAAAA,OAAKyC,GAAOnC,KAAKC,UAAUqC,IAC9B,WAAjBsB,EAAOtB,IAAgC,OAAVA,EAC1B,kBAARH,GAA2B,cAAeG,EAC5CnC,MAAOmC,EAAgCuB,WACpCC,MAAK,SAACC,GAAG,OAAKA,EAAIC,MAAM,IACxBF,MAAK,SAACE,GACLjB,EAASY,OAAMjE,QAAAA,OACLyD,EAAK,MAAAzD,OAAKyC,GAClB6B,EACA,qBAEJ,IAAE,OACK,SAACC,GAAK,OACXC,QAAQD,MAAM,6BAA8BA,MAGhDlB,EAASY,OAAM,QAAAjE,OAASyD,EAAKzD,MAAAA,OAAKyC,GAAOnC,KAAKC,UAAUqC,IAG1DS,EAASY,OAAMjE,QAAAA,OAASyD,EAAK,MAAAzD,OAAKyC,GAAOgC,OAAO7B,QAAAA,EAAS,IAE7D,GACF,IACOS,CACT,EAOaqB,EAAgB,SAACnC,GAC5B,IAAK,IAAIoC,KAAQpC,EACf,GAAIA,EAAIqC,eAAeD,GAAO,OAAO,EAEvC,OAAO,CACT,EASaE,EAAgB,SAC3BC,EACAC,EACAC,GAEA,IAAMC,EAASH,EAAEG,OACZF,EAAUjC,SAASmC,EAAOlF,OAC7BiF,KAAYhF,OAAAkF,EAAKH,GAAWE,CAAAA,EAAOE,QAAQpF,MAAQkF,EAAOlF,QAG5D,IAAMqF,EAASC,SAASC,eAAc,MAAAtF,OAAOiF,EAAOlF,OAGpD,OAFIqF,GAAQA,EAAOG,iBAEZ,CAAA,UAAAvF,OAAW+E,EAAUS,KAAK,MAAwC,mCAAA,IAC3E,EAOaC,EAAyB,SAACC,GACrC,OAAKA,EAAQxC,QACDwC,EAAQhE,QAAO,SAACiE,EAAKC,GAAM,OAAKD,EAAMC,CAAM,GAAE,GAC5CF,EAAQxC,QAAQ2C,QAAQ,GAFV,KAG9B,EAOaC,EAAiB,SAAClD,GAC7B,OAAOmD,WAAWnD,EAAMzB,QAAQ,KAAM,MAAQ,CAChD,EAOa6E,EAAyB,SAACC,GACrC,GAAIC,MAAMD,GAAS,MAAO,iBAC1B,IAAAE,EAA2BF,EAAOjE,WAAWiB,MAAM,KAAImD,EAAAtC,EAAAqC,EAAA,GAAhDE,EAAOD,EAAA,GAAEE,EAAOF,EAAA,GACjBG,EAAmBF,EAAQlF,QAAQ,wBAAyB,KAClE,OAAOmF,EAAOtG,GAAAA,OAAMuG,OAAgBvG,OAAIsG,GAAYC,CACtD,EAEaC,EAAkB,SAACC,GAE9B,IAAMzD,EAAkByD,EAASxD,MAAM,KAGjCyD,EAAoB1D,EAAM2D,OAAS,GAmBzC,OAhB8B3D,EAC3BwC,KAAK,KACLrE,QAAQ,cAAe,IACvBA,QAAQ,UAAW,KACnByF,cAGkDzF,QACnD,eACA,IAIiD0F,MAAM,EAAG,IAGvC,IAAMH,EAAUE,aACvC,EAaaE,EAAgB,SAAClE,GAc5B,GAHAA,GAHAA,GAHAA,GAHAA,EAAQA,EAAMmE,UAAU,OAAO5F,QAAQ,mBAAoB,KAG7CyF,eAGAzF,QAAQ,cAAe,MAGvBA,QAAQ,WAAY,KAG7B,gBAAgB6F,KAAKpE,GACxB,MAAM,IAAIqE,MACR,iFAIJ,OAAOrE,CACT,EAOasE,EAAgB,SAACC,GAC5B,IAAKA,EAAS,OAAO,EACrB,IAAMC,EAAOD,EAAQE,wBACrB,OACED,EAAKE,KAAO,GACZF,EAAKG,MAAQ,GACbH,EAAKI,SACFC,OAAOC,aAAerC,SAASsC,gBAAgBC,eAClDR,EAAKS,QAAUJ,OAAOK,YAAczC,SAASsC,gBAAgBI,YAEjE,EAOaC,EAAiB,SAACC,GAC7B,GAA0B,IAAtBA,EAAyB,MAAO,MACpC,GAAIA,EAAoB,GACtB,OAAOC,KAAKC,MAAMF,GAAkBjI,GAAAA,OAC7BkI,KAAKC,MAAMF,GAAkBjI,YAAAA,GAAAA,OAC7BiI,EAAkBpC,QAAQ,GAAY,YAE/C,IAAMuC,EAAQF,KAAKC,MAAMF,EAAoB,IACvCI,EAAUH,KAAKC,MAAMF,EAAoB,IAC/C,OAAmB,IAAZI,EAAa,GAAArI,OACboI,EAAKpI,UAAAA,GAAAA,OACLoI,EAAK,YAAApI,OAAWqI,EAAiB,WAC1C,EAQaC,EAAe,SAC1BC,EACAC,GAEA,OAAOD,EAAarF,OAASsF,KAASxI,OAC/BuI,EAAaE,UAAU,EAAGD,UAC7BD,CACN,EAQaG,EAAmB,SAC9BC,GAEU,IADVC,EAAA5H,UAAAkC,OAAA,QAAA2F,IAAA7H,UAAA,GAAAA,UAAA,GAAe,oBAEf,OAAK2H,EACEG,EAAO,IAAIC,KAAKJ,GAAOC,GADZ,EAEpB,EAMaI,EAAgB,WAC3B,GAAwB,oBAAb3D,SACT,OAAO4D,mBAAmBxB,OAAOyB,SAASC,KAE9C,EAOaC,EAAsB,SAACC,GAClC,OAAOA,aAAK,EAALA,EAAOnG,SAAU,GAAK,iBAAiB8D,KAAKqC,EACrD,EAOaC,EAAe,SAACD,GAC3B,OAAOA,aAAK,EAALA,EAAOnG,SAAU,GAAK,6BAA6B8D,KAAKqC,EACjE,EAOaE,EAAc,SAACrI,GAC1B,MAAmB,iBAARA,EAAyBA,EAC7BA,EAAIC,QACT,UACA,SAACqI,GAAG,OAAKA,EAAIC,OAAO,GAAGC,cAAgBF,EAAI3C,MAAM,GAAGD,gBAExD,EAOa+C,EAAY,SAACC,GACxB,GAAwB,oBAAbvE,SAA0B,OAAO,KAC5C,IAEkBwE,EAFZ9J,EAAI,GAAAC,OAAM4J,EAAQ,KAClBE,EAAKzE,SAAS0E,OAAO9G,MAAM,KAAK+G,EAAAC,EACtBH,GAAE,IAAlB,IAAAE,EAAAE,MAAAL,EAAAG,EAAAG,KAAAC,MAAoB,CAAA,IACZC,EADIR,EAAAjH,MACQ0H,OAClB,GAAID,EAAQE,WAAWxK,GAAO,OAAOsK,EAAQ5B,UAAU1I,EAAKmD,OAC7D,CAAA,CAAA,MAAAsH,GAAAR,EAAAlF,EAAA0F,EAAA,CAAA,QAAAR,EAAAS,GAAA,CACD,OAAO,IACT,EAMaC,EAAe,SAACd,GACH,oBAAbvE,WACTA,SAAS0E,OAAM,GAAA/J,OAAM4J,EAAwD,qDAEjF,EAQae,EAAY,SACvBf,EACAgB,EACAC,GAEA,GAAwB,oBAAbxF,SAA0B,CACnC,IAAMyF,EAAI,IAAI/B,KACd+B,EAAEC,QAAQD,EAAEE,UAAqB,GAATH,EAAc,GAAK,GAAK,KAChDxF,SAAS0E,OAAM,GAAA/J,OAAM4J,OAAK5J,OAAI4K,EAAM,aAAA5K,OAAY8K,EAAEG,cAAsB,UACzE,CACH,EAQaC,EAAW,SAACzI,EAAaG,EAAea,GACnD,IAAM0H,EAAO9F,SAAS+F,cAAc,YACpC,GAAKD,EAAL,CAEA,IAAME,EAAaF,EAAKC,wBAAapL,OAA6ByC,EAAG,OACrE,GAAK4I,EAAL,CAEAA,EAAWC,MAAMC,YAAc,qBAC/B,IAEiCC,EAF7BC,EAA+B,KAEnC,GAAwB,UAApBJ,EAAWzC,KACb6C,GAC0BD,QAAxBA,EAAAH,EAAWK,qBAAaF,IAAAA,GAAe,QAAfA,EAAxBA,EAA0BE,qBAAa,IAAAF,GAAeA,QAAfA,EAAvCA,EAAyCE,qBAAzCF,IAAsDA,OAAtDA,EAAAA,EAAwDJ,cACtD,YACG,UACF,GAAwB,SAApBC,EAAWzC,KAAiB,CAAA,IAAA+C,EACrCF,GAC0B,QAAxBE,EAAAN,EAAWK,qBAAa,IAAAC,GAAeA,QAAfA,EAAxBA,EAA0BD,qBAA1BC,IAAuCA,OAAvCA,EAAAA,EAAyCP,cAAc,YAAa,IACvE,KAAM,CAAA,IAAAQ,EACLH,GAAmC,QAAxBG,EAAAP,EAAWK,qBAAa,IAAAE,OAAA,EAAxBA,EAA0BR,cAAc,YAAa,IACjE,CAED,GAAIK,EACFA,EAASI,YAAcjJ,MAClB,CAAA,IAAAkJ,EAAAC,EACCC,EAAO3G,SAAS4G,cAAc,QACpCD,EAAKE,UAAUC,IAAI,SACnBH,EAAKH,YAAcjJ,EACnBoJ,EAAKV,MAAMc,MAAQ,qBACnBJ,EAAKV,MAAMe,QAAU,eAErB,IAAMC,EACgB,UAApBjB,EAAWzC,KACiBkD,QADDA,EACvBT,EAAWK,qBAAaI,IAAAA,GAAeA,QAAfA,EAAxBA,EAA0BJ,qBAA1BI,IAAuCA,OAAvCA,EAAAA,EAAyCJ,cACrB,SAApBL,EAAWzC,MAA2C,WAAxByC,EAAWkB,SACzClB,EAAWK,cACa,QADAK,EACxBV,EAAWK,qBAAa,IAAAK,OAAA,EAAxBA,EAA0BL,cAChCY,SAAAA,EAAQE,YAAYR,EACrB,CAEa,IAAVvI,GAAa4H,EAAWoB,OAnCX,CAHN,CAuCb,EASaC,EAAc,SACzBC,EACAC,EACAC,EACAC,GAEA,IAGoBC,EAHdC,EAAY3H,SAAS+F,cAAc,eACzC,GAAK4B,EAEL,GAAe,MAAXL,EACF,GAAwB,wCAApBI,EAAAH,EAAMK,YAAI,IAAAF,OAAA,EAAVA,EAAa,KAAuCH,EAAMM,SAAU,CAKtE,GAJAF,EAAU1B,MAAMe,QAAU,QAC1BW,EAAU1B,MAAM6B,gBAAkB,kBAClCH,EAAU5B,cAAc,MAAOS,YAC7B,gCAEA,CAAC,oBAAqB,sBAAsB/I,SAC1CuC,SAAS6D,SAASkE,UAEpB,CACA,IAAMC,EAASL,EAAU5B,cAAc,iBACnCiC,IAAQA,EAAOC,UAAY,mBAC/B,IAAMC,EAAOP,EAAU5B,cAAc,KACjCmC,IAAMA,EAAKpE,KAAO,SACvB,CACDqE,GAAQX,EAAc,QAAQ,GAC9BpF,OAAOyB,SAASC,KAAO,UACxB,MACCqE,GAAQX,EAAc,QAAQ,GAC9BnJ,OAAOC,QAAQiJ,GAAOrJ,SAAQ,SAAAkK,EAAehK,GAAK,IAAAiK,EAAA5J,EAAA2J,EAAA,GAAlBhL,EAAGiL,EAAA,GAAE9K,EAAK8K,EAAA,GAAA,OACxCxC,EAASzI,EAAKG,EAAM,GAAIa,MAE1BuJ,EAAU1B,MAAMe,QAAU,WAEnB,CAAC,IAAK,IAAK,KAAKvJ,SAAS6J,IAAWG,EAC7CrF,OAAOyB,SAASC,KAAO2D,EACH,MAAXH,IACTK,EAAU1B,MAAMe,QAAU,QAC1BW,EAAU5B,cAAc,KAAMkC,UAAY,GAC1CN,EAAU5B,cAAc,MAAOS,YACL,iBAAjBe,EAAMxK,OAAsBwK,EAAMxK,OAAS,eACpDoL,GAAQX,EAAc,QAAQ,GAC9BpF,OAAOyB,SAASC,KAAO,WAE3B,EAQgB,SAAAwE,EAAeC,EAAUC,GACvC,IACE,OAAOA,EACJ5K,MAAM,KACNvB,QACC,SAACa,EAAKE,GAAG,OAAMF,QAAoBsG,IAAbtG,EAAIE,GAAqBF,EAAIE,GAAO,EAAG,GAC7DmL,EAEL,CAAC,MAAOrJ,GAEP,OADAC,QAAQsJ,KAAI9N,mBAAAA,OAAoB6N,EAAQ,KAAKtJ,GACtC,EACR,CACH,KAgBawJ,EAAa,SACxB9N,GAMkB,IAAA+N,EAWLC,EAhBbC,EAAmClN,UAAAkC,OAAA,QAAA2F,IAAA7H,UAAA,GAAAA,UAAA,GAAA,KACnCmN,EAAAnN,UAAAkC,OAAA,QAAA2F,IAAA7H,UAAA,GAAAA,UAAA,GAAuB,KACvBoN,EAAApN,UAAAkC,OAAA,QAAA2F,IAAA7H,UAAA,IAAAA,UAAA,GACAqN,EAAArN,UAAAkC,OAAA,QAAA2F,IAAA7H,UAAA,GAAAA,UAAA,GAAyB,KACzBsN,EAAAtN,UAAAkC,OAAA,QAAA2F,IAAA7H,UAAA,IAAAA,UAAA,GAEMuN,EAAYtQ,QAAQC,IAAIsQ,iCAAmC,GAC3DtO,EAAOuO,KACVF,EAAyDP,QAAhDA,EAAG/P,QAAQC,IAAIwQ,6CAAiCV,EAAAA,EAAI,KAG5DG,IAAOjO,EAAuB,cAACF,UAAAA,OAAamO,IAC5CE,IAASnO,EAAQ,cAAgBmO,GAChB,SAAjBD,IAAyBlO,EAAQ,gBAAkB,oBAClC,cAAjBkO,IACFlO,EAAQ,gBAAkB,uBACxBoO,KAEFpO,EADejC,QAAQC,IAAIyQ,gCAAkC,IACIV,QAAlDA,EAAGhQ,QAAQC,IAAI0Q,2CAAmCX,IAAAA,EAAAA,EAAI,IAGvE,IAAMY,EAA0B,CAAE5O,OAAAA,EAAQC,QAAAA,EAAS4O,SAAU,UAK7D,OAJUD,EAAc,KAApBX,GACmB,KAEnBlQ,GAAawG,QAAQuK,IAAIF,GACtBA,CACT,EAuBaG,EAAS,WAAA,IAAAC,EAAA9P,EAAAC,IAAAC,MAAG,SAAA6P,EACvBC,EACAhB,EACAiB,EACAlB,EACAmB,EACAC,EACAC,EACAC,EACAC,GAA2D,IAAAC,EAAAC,EAAAC,EAAAC,EAAA7O,UAAA,OAAA5B,IAAAO,MAAA,SAAAmQ,GAAA,cAAAA,EAAAjQ,KAAAiQ,EAAAhQ,MAAA,KAAA,EAC9C,GAAb4P,EAAKG,EAAA3M,OAAA,QAAA2F,IAAAgH,EAAA,IAAAA,EAAA,GAGA1B,EAAK,CAAA2B,EAAAhQ,KAAA,EAAA,KAAA,CAAA,OAAAgQ,EAAAtP,OAAA,UAAA,KAAA,EAAA,OAAAsP,EAAAjQ,KAAA,EAAAiQ,EAAAhQ,KAAA,EAIeW,MAAM0O,EAAMC,GAAQ,KAAA,EAA7B,OAARO,EAAQG,EAAAC,KAAAD,EAAAhQ,KAAA,EACa6P,EAASK,OAAM,KAAA,EAA7B,GAAPJ,EAAOE,EAAAC,KACW,MAApBJ,EAAShD,OAAc,CAAAmD,EAAAhQ,KAAA,GAAA,KAAA,CACgB,OAAzCmQ,EAAU,yBAA0B,KAAKH,EAAAtP,OAAA,UAAA,KAAA,GAKvCkP,GACFL,EAAQO,EAAQM,SAChBZ,EAASM,EAAQO,QAEjBd,EAAOrP,GAAAA,OAAAkF,EAAKgJ,GAAIhJ,EAAK0K,EAAQM,WAE/BX,EAAQK,EAAQ9P,MAChB0P,EAAYI,EAAQQ,UAAUN,EAAAhQ,KAAA,GAAA,MAAA,KAAA,GAAAgQ,EAAAjQ,KAAA,GAAAiQ,EAAAO,GAAAP,EAAA,MAAA,GAE9BG,EAAU,sBAAuB,KACjCzL,QAAQD,MAAM,uBAAsBuL,EAAAO,IAAS,KAAA,GAEzB,OAFyBP,EAAAjQ,KAAA,GAE7C4P,GAAa,GAAOK,EAAAQ,OAAA,IAAA,KAAA,GAAA,IAAA,MAAA,OAAAR,EAAAlP,OAAA,GAAAsO,EAAA,KAAA,CAAA,CAAA,EAAA,GAAA,GAAA,KAEvB,KAAA,OAAA,SAvCqBqB,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAA,OAAA9B,EAAAnO,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAsDTgQ,EAAQ,WAAA,IAAAC,EAAA9R,EAAAC,IAAAC,MAAG,SAAA6R,EACtBC,EAGAC,EACArD,GAA0B,IAAAsD,EAAA5B,EAAA6B,EAAAC,EAAAC,EAAA7B,EAAAhD,EAAA8E,EAAAC,EAAA1Q,UAAA,OAAA5B,IAAAO,MAAA,SAAAgS,GAAA,cAAAA,EAAA9R,KAAA8R,EAAA7R,MAAA,KAAA,EAKL,OAJrBuR,kCACA5B,EAA2DiC,EAAAxO,OAAAwO,EAAAA,UAAA7I,EAC3DyI,EAAoDI,EAAAxO,OAAAwO,EAAAA,UAAA7I,EACpD0I,EAAwCG,EAAAxO,OAAAwO,EAAAA,UAAA7I,EACxC2I,EAAAE,EAAAxO,OAAA,QAAA2F,IAAA6I,EAAA,IAAAA,EAAA,GAAqBC,EAAA9R,KAAA,EAAA8R,EAAA7R,KAAA,EAGIW,MAAM2Q,EAAKrD,GAAW,KAAA,EACf,OADxB4B,EAAQgC,EAAA5B,KACRpD,EAASgD,EAAShD,OAAMgF,EAAA7R,KAAA,GACR6P,EAASK,OAAM,KAAA,GAwBD,OAxB9ByB,EAAME,EAAA5B,KAERsB,GACE,CAAC,IAAK,IAAK,IAAK,KAAKvO,SAAS6J,GAChC4E,SAAAA,EAAWE,GACF,CAAC,IAAK,KAAK3O,SAAS6J,KAC5BwE,EAA8BM,GAC/BF,SAAAA,EAAW,OAEbD,SAAAA,EAAY3E,IAEXwE,EAA8BS,SAAS,CAAE1D,KAAMuD,EAAQ9E,OAAAA,IAGtD3O,GACFwG,QAAQuK,IACN,mBACAhB,EACA,iBACA0D,EACA,eACA9E,GAGA6E,GAAMK,EAAkBlF,GAAQgF,EAAAnR,OAAA,SAE7BiR,GAAM,KAAA,GAUkD,OAVlDE,EAAA9R,KAAA,GAAA8R,EAAAtB,GAAAsB,EAAA,MAAA,GAETN,GACDF,EAAgCQ,EAAAtB,IACjCkB,SAAAA,EAAQI,EAAAtB,IACRiB,SAAAA,EAAY,OAEXH,EAA8BS,SAAS,CAAErN,MAAKoN,EAAAtB,KAE7CrS,GACFwG,QAAQuK,IAAI,mBAAoBhB,EAAY,SAAQ4D,EAAAtB,IAASsB,EAAAnR,OAAAmR,SAAAA,EAAAtB,IAAA,KAAA,GAGzB,OAHyBsB,EAAA9R,KAAA,GAG3D4P,GAAcA,GAAa,GAAOkC,EAAArB,OAAA,IAAA,KAAA,GAAA,IAAA,MAAA,OAAAqB,EAAA/Q,OAAA,GAAAsQ,EAAA,KAAA,CAAA,CAAA,EAAA,GAAA,GAAA,KAEzC,KAAA,OAAA,SAxDoBY,EAAAC,EAAAC,GAAA,OAAAf,EAAAnQ,MAAAC,KAAAC,UAAA,CAAA,CAAA,GA8DR6Q,EAAoB,SAAClF,GACjB,MAAXA,EAAgBsF,IACA,MAAXtF,GAAgBuF,GAC3B,EAQa1E,GAAU,SACrBrC,EACAkB,EACAM,GAEA,GAAKxB,EAAL,CACA,IAAMkC,EAASlC,EAAKC,cAAiC,oBACrD,GAAIiC,EAAQ,CACVA,EAAO8E,SAAWxF,EAClB,IAAMyF,EAAU/E,EAAOjC,cAAc,eACjCgH,IAASA,EAAQ9G,MAAMe,QAAUA,EACtC,CACDlB,EAAKgH,SAAWxF,CAPL,CAQb,EAOa0F,GAAe,WAAA,IAAAC,EAAAnT,EAAAC,IAAAC,MAAG,SAAAkT,EAAOC,GAAa,IAAAnP,EAAAoP,EAAA9C,EAAA,OAAAvQ,IAAAO,MAAA,SAAA+S,GAAA,cAAAA,EAAA7S,KAAA6S,EAAA5S,MAAA,KAAA,EAGE,OAF7CuD,EAAW,IAAIC,UACZW,OAAO,QAASuO,GACnBC,EAAiB1E,EAAW,OAAQ1K,GAASqP,EAAA5S,KAAA,EAC5BW,MAAKT,GAAAA,OACvB5B,EAAY,gCACfqU,GACD,KAAA,EAHa,OAAR9C,EAAQ+C,EAAA3C,KAAA2C,EAAAlS,OAAA,SAIPmP,EAASK,QAAM,KAAA,EAAA,IAAA,MAAA,OAAA0C,EAAA9R,OAAA,GAAA2R,EACvB,KAAA,OATYF,SAAeM,GAAA,OAAAL,EAAAxR,MAAAC,KAAAC,UAAA,CAAA,CAAA"}
@@ -1,2 +1,2 @@
1
- export{login,logout,signup}from"./auth/actions.js";export{getChannel,getData}from"./auth/dbRequestst.js";export{INSTRUCTOR_TYPE,ROLE_GROUPING,adminAccessValidation}from"./roles.js";export{AllCoursesdataList,COMMENTS_BY,DataList,accounts,dataList,pending,projectStartHistory,statesNigeria}from"./json/accounts.js";export{unsplashDefaultObject}from"./json/unsplashDefaultObject.js";export{API_HOST_URL,CODECS_URL_M3U8,FILE_URL,IN_DEV_MODE,TrackViewPort,VIDEO_URL,addUserDomain,calculateAmountAfterDeduction,calculateAverageRating,calculateTotalCredits,convertArrayToFormData,convertToFloat,convertToSlug,extractSubDomain,fetchAPI,fetchData,findNullOrEmptyKeys,formatDateToWord,formatDuration,formatNumberWithCommas,getCookie,getNestedValue,handleError,handleInvalid,handleResendOTP,handleStatusError,hostUrlEncode,isValidAlphanumeric,isValidEmail,objectIsEmpty,printErr,removeCookie,reqOptions,romansFigure,setCookie,slugifyFileName,spinBtn,stripCommaFromNumber,stripHtmlTags,toTitleCase,truncateHtml}from"./helpFunction.js";export{getUserEmailInputModal,openConfirmModal,openToast}from"./modals/modals.js";export{formatTime}from"./format.js";export{ADMIN_PERMISSION,APPLICATION_FEE_TYPE_OPTIONS,CODE_LANGUAGES,COMPANY_SIZES_CHOICES,CONTENT_TYPE_OPTIONS,COURSE_REWARD_OPTIONS,CREDENTIALS,CURRENCY_SYMBOL,DURATION_FILTERS,INDUSTRIES,KEYWORD_DESCRIPTION,NEXT_AUTH_SESSION_DATA_DUMMY,NIGERIA_BANKS,PAYMENT_PROCESSING_OPTIONS,PRIVACY,PROGRAM_LEVELS,REGISTRAR_PERMISSION,SCOREBOARD_DURATION,SKILLS_LEVELS,STUDENT_STATUS,SUBSCRIPTION_OPTION,SUPER_PERMISSION,TRUE_FALSE,VIDEO_PLAYER_OPTIONS,YES_NO,gaugeData}from"./utils.js";export{paystackHook,profile_goggle_provider}from"./oauth_json.js";export{chargeAuthorization,handlePaymentSubmit,payWithPaystack,paystackDataConfig}from"./paystack.js";export{headerKeyPermission,headerUsernamePermission}from"./permissions.js";export{calculatePercentageChange,createTimeSeriesTemplate,formatChartValue,formatDateForChart,generateChartColors,groupAndAggregateData,transformChartData}from"./charts.js";export{openConfirmDelete}from"./modals/openConfirmDelete.js";var t="/assets/logo/instincthub-logo-color.png",o="/assets/logo/instincthub-logo-white.png",e="/assets/logo/instincthub-logo-black.png",a="/assets/logo/instincthub-logo-thumbnail.png";export{t as instinctHubLogoUrl,e as instinctHubLogoUrlBlack,o as instinctHubLogoUrlWhite,a as instinctHubThumbnailLogo};
1
+ export{getChannel,getData}from"./auth/dbRequestst.js";export{INSTRUCTOR_TYPE,ROLE_GROUPING,adminAccessValidation}from"./roles.js";export{AllCoursesdataList,COMMENTS_BY,DataList,accounts,dataList,pending,projectStartHistory,statesNigeria}from"./json/accounts.js";export{unsplashDefaultObject}from"./json/unsplashDefaultObject.js";export{default as createSubscription}from"./createSubscription.js";export{default as elementIsVisibleInViewport}from"./elementIsVisibleInViewport.js";export{default as handleFormErrors}from"./formError.js";export{default as fileToBase64}from"./fileToBase64.js";export{default as getPriceObjects}from"./getPriceObjects.js";export{default as convertArrayToObject}from"./convertArrayToObject.js";export{formatTime}from"./format.js";export{API_HOST_URL,CODECS_URL_M3U8,FILE_URL,IN_DEV_MODE,TrackViewPort,VIDEO_URL,addUserDomain,calculateAmountAfterDeduction,calculateAverageRating,calculateTotalCredits,convertArrayToFormData,convertToFloat,convertToSlug,extractSubDomain,fetchAPI,fetchData,findNullOrEmptyKeys,formatDateToWord,formatDuration,formatNumberWithCommas,getCookie,getNestedValue,handleError,handleInvalid,handleResendOTP,handleStatusError,hostUrlEncode,isValidAlphanumeric,isValidEmail,objectIsEmpty,printErr,removeCookie,reqOptions,romansFigure,setCookie,slugifyFileName,spinBtn,stripCommaFromNumber,stripHtmlTags,toTitleCase,truncateHtml}from"./helpFunction.js";export{paystackHook,profile_goggle_provider}from"./oauth_json.js";export{chargeAuthorization,handlePaymentSubmit,payWithPaystack,paystackDataConfig}from"./paystack.js";export{findPermissions,headerKeyPermission,headerUsernamePermission}from"./permissions.js";export{ADMIN_PERMISSION,APPLICATION_FEE_TYPE_OPTIONS,CODE_LANGUAGES,COMPANY_SIZES_CHOICES,CONTENT_TYPE_OPTIONS,COURSE_REWARD_OPTIONS,CREDENTIALS,CURRENCY_SYMBOL,DURATION_FILTERS,INDUSTRIES,KEYWORD_DESCRIPTION,NEXT_AUTH_SESSION_DATA_DUMMY,NIGERIA_BANKS,PAYMENT_PROCESSING_OPTIONS,PRIVACY,PROGRAM_LEVELS,REGISTRAR_PERMISSION,SCOREBOARD_DURATION,SKILLS_LEVELS,STUDENT_STATUS,SUBSCRIPTION_OPTION,SUPER_PERMISSION,TRUE_FALSE,VIDEO_PLAYER_OPTIONS,YES_NO,gaugeData}from"./utils.js";export{calculatePercentageChange,createTimeSeriesTemplate,formatChartValue,formatDateForChart,generateChartColors,groupAndAggregateData,transformChartData}from"./charts.js";export{getUserEmailInputModal,openConfirmModal,openToast}from"./modals/modals.js";export{openConfirmDelete}from"./modals/openConfirmDelete.js";var e="/assets/logo/instincthub-logo-color.png",t="/assets/logo/instincthub-logo-white.png",o="/assets/logo/instincthub-logo-black.png",a="/assets/logo/instincthub-logo-thumbnail.png";export{e as instinctHubLogoUrl,o as instinctHubLogoUrlBlack,t as instinctHubLogoUrlWhite,a as instinctHubThumbnailLogo};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/lib/index.ts"],"sourcesContent":["// src/components/lib/index.ts\r\n\r\nexport * from \"./auth/actions\";\r\nexport * from \"./auth/dbRequestst\";\r\nexport * from \"./roles\";\r\n\r\n// JSON exports\r\nexport * from \"./json/accounts\";\r\nexport * from \"./json/countryNigeria\";\r\nexport * from \"./json/countryObjects\";\r\nexport * from \"./json/educationLevels\";\r\nexport * from \"./json/unsplashDefaultObject\";\r\n\r\n// Utility functions\r\nexport * from \"./createSubscription\";\r\nexport * from \"./elementIsVisibleInViewport\";\r\nexport * from \"./fileToBase64\";\r\nexport * from \"./format\";\r\nexport * from \"./formError\";\r\nexport * from \"./getPriceObjects\";\r\nexport * from \"./helpFunction\";\r\nexport * from \"./loadScript\";\r\nexport * from \"./oauth_json\";\r\nexport * from \"./paystack\";\r\nexport * from \"./permissions\";\r\nexport * from \"./utils\";\r\n\r\n// Charts\r\nexport * from \"./charts\";\r\n\r\n// Modals\r\nexport * from \"./modals/modals\";\r\nexport * from \"./modals/openConfirmDelete\";\r\n\r\n\r\n// Logo\r\nexport const instinctHubLogoUrl = \"/assets/logo/instincthub-logo-color.png\";\r\nexport const instinctHubLogoUrlWhite = \"/assets/logo/instincthub-logo-white.png\";\r\nexport const instinctHubLogoUrlBlack = \"/assets/logo/instincthub-logo-black.png\";\r\nexport const instinctHubThumbnailLogo = \"/assets/logo/instincthub-logo-thumbnail.png\";\r\n"],"names":["instinctHubLogoUrl","instinctHubLogoUrlWhite","instinctHubLogoUrlBlack","instinctHubThumbnailLogo"],"mappings":"6iEAoCO,IAAMA,EAAqB,0CACrBC,EAA0B,0CAC1BC,EAA0B,0CAC1BC,EAA2B"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/lib/index.ts"],"sourcesContent":["// src/components/lib/index.ts\r\n\r\nexport * from \"./auth/dbRequestst\";\r\nexport * from \"./roles\";\r\n\r\n// JSON exports\r\nexport * from \"./json/accounts\";\r\nexport * from \"./json/countryNigeria\";\r\nexport * from \"./json/countryObjects\";\r\nexport * from \"./json/educationLevels\";\r\nexport * from \"./json/unsplashDefaultObject\";\r\n\r\n// Utility functions\r\nexport { default as createSubscription } from \"./createSubscription\";\r\nexport { default as elementIsVisibleInViewport } from \"./elementIsVisibleInViewport\";\r\nexport { default as handleFormErrors } from \"./formError\";\r\nexport { default as fileToBase64 } from \"./fileToBase64\";\r\nexport { default as getPriceObjects } from \"./getPriceObjects\";\r\nexport {default as convertArrayToObject} from \"./convertArrayToObject\";\r\nexport * from \"./format\";\r\nexport * from \"./helpFunction\";\r\nexport * from \"./loadScript\";\r\nexport * from \"./oauth_json\";\r\nexport * from \"./paystack\";\r\nexport * from \"./permissions\";\r\nexport * from \"./utils\";\r\n\r\n// Charts\r\nexport * from \"./charts\";\r\n\r\n// Modals\r\nexport * from \"./modals/modals\";\r\nexport * from \"./modals/openConfirmDelete\";\r\n\r\n// Logo\r\nexport const instinctHubLogoUrl = \"/assets/logo/instincthub-logo-color.png\";\r\nexport const instinctHubLogoUrlWhite =\r\n \"/assets/logo/instincthub-logo-white.png\";\r\nexport const instinctHubLogoUrlBlack =\r\n \"/assets/logo/instincthub-logo-black.png\";\r\nexport const instinctHubThumbnailLogo =\r\n \"/assets/logo/instincthub-logo-thumbnail.png\";\r\n"],"names":["instinctHubLogoUrl","instinctHubLogoUrlWhite","instinctHubLogoUrlBlack","instinctHubThumbnailLogo"],"mappings":"m5EAmCO,IAAMA,EAAqB,0CACrBC,EACX,0CACWC,EACX,0CACWC,EACX"}
@@ -1,2 +1,2 @@
1
- var n=function(n){if(!n||n.length<3)return!1;return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n)},e=function(n){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new Promise((function(t){var o=document.getElementById("confirmModal");o||((o=document.createElement("div")).id="confirmModal");var i='\n <section id="myModal" class="modal">\n <div class="modal-content">\n <span class="close" onclick="window.handleCancel()">×</span>\n <p class="'.concat(e?"something_bad_flagged":"something_bad",'">\n ').concat(e?"Unexpected things will happen if you don’t read this!":"You are about to submit!","\n </p>\n <p>").concat(n||"Carefully read the instructions before making a decision. Ready? Hit the continue button!",'</p>\n <div class="mt-4">\n <button type="button" class="danger-btn d-inline-block" onclick="window.handleCancel()">Cancel</button>\n <button type="button" class="important-btn confirm-btn ihub-bg-dark-cyan" onclick="window.handleConfirm()">Ok</button>\n </div>\n </div>\n </section>\n ');o.innerHTML=i,document.body.appendChild(o);var a=function(){var n;null===(n=o)||void 0===n||n.remove()};window.handleCancel=function(){a(),t(!1),console.log("")},window.handleConfirm=function(){a(),t(!0)},o.addEventListener("click",(function(n){var e=n.target;"myModal"!==e.id&&"confirmModal"!==e.id||a()}))}))},t=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:200,t=200===e||201===e?"Awesome! The update was made.":500===e?"Sorry, the server can't process your request":"Hmmm..., Something went wrong. Try again",o=200===e||201===e?'<svg viewBox="0 0 24 24" style="color: var(--ViridianGreen); width:24px; height:24px;"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></svg>':'<svg viewBox="0 0 24 24" style="color: var(--Danger); width:24px; height:24px;"><path fill="currentColor" d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/></svg>',i=document.getElementById("openToast");i||((i=document.createElement("div")).id="openToast");var a='\n <div class="toast-wrapper">\n <div class="slide-in-top">\n <div class="align-text">\n <div class="valid_btn">\n '.concat(o,'\n <p class="').concat(200===e||201===e?"isDone":"isError",'">\n ').concat(n||t,'\n </p>\n </div>\n </div>\n <svg width="800px" height="800px" viewBox="-0.5 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg" \n class="close-btn" onclick="window.cleanupToast()">\n <path d="M3 21.32L21 3.32001" stroke="var(--Gunmetal)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>\n <path d="M3 3.32001L21 21.32" stroke="var(--Gunmetal)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n </div>\n </div>\n ');i.innerHTML=a,document.body.appendChild(i),window.cleanupToast=function(){var n;null===(n=i)||void 0===n||n.remove()},setTimeout((function(){window.cleanupToast()}),1e4)},o=function(e){return new Promise((function(o){var i,a=document.getElementById("confirmModal");a||((a=document.createElement("div")).id="confirmModal");var d='\n <section id="myModal" class="modal">\n <div class="modal-content">\n <svg width="800px" height="800px" viewBox="-0.5 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg" \n class="ih_get_user_email_modal_close_btn" onclick="window.handleCleanUpInput()">\n <path d="M3 21.32L21 3.32001" stroke="var(--Gunmetal)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>\n <path d="M3 3.32001L21 21.32" stroke="var(--Gunmetal)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n <h4>Enrol for '.concat(e,'</h4>\n <p>Enter a valid Email Address</p>\n <input type="email" name="email" id="userInput" oninput="window.handleInput(this)" />\n <div class="action_btn">\n <button type="button" disabled id="proceedBtn" class="delete_btn important-btn" onclick="window.handleConfirm()">Proceed</button>\n </div>\n </div>\n </section>\n ');a.innerHTML=d,document.body.appendChild(a);var l=document.getElementById("proceedBtn");window.handleInput=function(e){n(e.value)?(l&&(l.disabled=!1),i=e.value):(l&&(l.disabled=!0),i=void 0)};var r=function(){var n;null===(n=a)||void 0===n||n.remove()};window.handleConfirm=function(){n(i)?(r(),o(i)):t("You need to enter a valid email!",400)},window.handleCleanUpInput=function(){r(),o(void 0)}}))};export{o as getUserEmailInputModal,e as openConfirmModal,t as openToast};
1
+ var n=function(n){if(!n||n.length<3)return!1;return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n)},e=function(n){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new Promise((function(t){var o=document.getElementById("confirmModal");o||((o=document.createElement("div")).id="confirmModal");var i='\n <section id="myModal" class="modal">\n <div class="modal-content">\n <span class="close" onclick="window.handleCancel()">×</span>\n <p class="'.concat(e?"something_bad_flagged":"something_bad",'">\n ').concat(e?"Unexpected things will happen if you don’t read this!":"You are about to submit!","\n </p>\n <p>").concat(n||"Carefully read the instructions before making a decision. Ready? Hit the continue button!",'</p>\n <div class="mt-4">\n <button type="button" class="danger-btn d-inline-block" onclick="window.handleCancel()">Cancel</button>\n <button type="button" class="important-btn confirm-btn ihub-bg-dark-cyan" onclick="window.handleConfirm()">Ok</button>\n </div>\n </div>\n </section>\n ');o.innerHTML=i,document.body.appendChild(o);var a=function(){var n;null===(n=o)||void 0===n||n.remove()};window.handleCancel=function(){a(),t(!1),console.log("")},window.handleConfirm=function(){a(),t(!0)},o.addEventListener("click",(function(n){var e=n.target;"myModal"!==e.id&&"confirmModal"!==e.id||a()}))}))},t=function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:200,t=200===e||201===e?"Awesome! The update was made.":500===e?"Sorry, the server can't process your request":"Hmmm..., Something went wrong. Try again",o=200===e||201===e?'<svg viewBox="0 0 24 24" style="color: var(--ViridianGreen); width:24px; height:24px;"><path fill="currentColor" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></svg>':'<svg viewBox="0 0 24 24" style="color: var(--Danger); width:24px; height:24px;"><path fill="currentColor" d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/></svg>',i=document.getElementById("openToast");i||((i=document.createElement("div")).id="openToast");var a='\n <div class="toast-wrapper">\n <div class="slide-in-top">\n <div class="align-text">\n <div class="valid_btn">\n '.concat(o,'\n <p class="').concat(200===e||201===e?"isDone":"isError",'">\n ').concat(n||t,'\n </p>\n </div>\n </div>\n <svg width="800px" height="800px" viewBox="-0.5 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg" \n class="close-btn" onclick="window.cleanupToast()">\n <path d="M3 21.32L21 3.32001" stroke="var(--Gunmetal)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>\n <path d="M3 3.32001L21 21.32" stroke="var(--Gunmetal)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n </div>\n </div>\n ');i.innerHTML=a,document.body.appendChild(i),window.cleanupToast=function(){var n;null===(n=i)||void 0===n||n.remove()},setTimeout((function(){window.cleanupToast()}),1e4)},o=function(e){return new Promise((function(o){var i,a=document.getElementById("confirmModal");a||((a=document.createElement("div")).id="confirmModal");var d='\n <section id="myModal" class="modal">\n <div class="modal-content">\n <svg width="800px" height="800px" viewBox="-0.5 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg" \n class="ih_get_user_email_modal_close_btn" onclick="window.handleCleanUpInput()">\n <path d="M3 21.32L21 3.32001" stroke="var(--Gunmetal)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>\n <path d="M3 3.32001L21 21.32" stroke="var(--Gunmetal)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n <h4>Enrol for '.concat(e,'</h4>\n <p>Enter a valid Email Address</p>\n <input type="email" name="email" id="userInput" oninput="window.handleInput(this)" />\n <div class="action_btn">\n <button type="button" disabled id="proceedBtn" class="delete_btn important-btn" onclick="window.handleConfirm()">Proceed</button>\n </div>\n </div>\n </section>\n ');a.innerHTML=d,document.body.appendChild(a);var l=document.getElementById("proceedBtn");window.handleInput=function(e){n(e.value)?(l&&(l.disabled=!1),i=e.value):(l&&(l.disabled=!0),i=void 0)};var r=function(){var n;null===(n=a)||void 0===n||n.remove()};window.handleConfirm=function(){n(i)?(r(),o(i)):t("You need to enter a valid email!",400)},window.handleCleanUpInput=function(){r(),o(void 0)}}))};export{o as getUserEmailInputModal,e as openConfirmModal,t as openToast};
2
2
  //# sourceMappingURL=modals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modals.js","sources":["../../../../../src/components/lib/modals/modals.ts"],"sourcesContent":["import { reqOptions } from \"../helpFunction\";\r\n\r\n// Type for status codes\r\ntype StatusCode = 200 | 201 | 400 | 500 | number;\r\n\r\n// Utility function to validate email\r\nconst isValidEmail = (input: string | undefined): boolean => {\r\n if (!input || input.length < 3) {\r\n return false;\r\n }\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(input);\r\n};\r\n\r\n// Declare global window interface extensions for event handlers\r\ndeclare global {\r\n interface Window {\r\n handleCancel: () => void;\r\n handleConfirm: () => void;\r\n cleanupToast: () => void;\r\n handleInput: (e: HTMLInputElement) => void;\r\n handleCleanUpInput: () => void;\r\n }\r\n}\r\n\r\n// Open a confirmation modal\r\nexport const openConfirmModal = (\r\n message: string,\r\n flag: boolean = false\r\n): Promise<boolean> => {\r\n return new Promise((resolve) => {\r\n let modalContainer = document.getElementById(\r\n \"confirmModal\"\r\n ) as HTMLDivElement | null;\r\n if (!modalContainer) {\r\n modalContainer = document.createElement(\"div\");\r\n modalContainer.id = \"confirmModal\";\r\n }\r\n\r\n const modalContent = `\r\n <section id=\"myModal\" class=\"modal\">\r\n <div class=\"modal-content\">\r\n <span class=\"close\" onclick=\"window.handleCancel()\">×</span>\r\n <p class=\"${flag ? \"something_bad_flagged\" : \"something_bad\"}\">\r\n ${\r\n flag\r\n ? \"Unexpected things will happen if you don’t read this!\"\r\n : \"You are about to submit!\"\r\n }\r\n </p>\r\n <p>${\r\n message ||\r\n \"Carefully read the instructions before making a decision. Ready? Hit the continue button!\"\r\n }</p>\r\n <div class=\"mt-4\">\r\n <button type=\"button\" class=\"danger-btn d-inline-block\" onclick=\"window.handleCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"important-btn confirm-btn ihub-bg-dark-cyan\" onclick=\"window.handleConfirm()\">Ok</button>\r\n </div>\r\n </div>\r\n </section>\r\n `;\r\n\r\n modalContainer.innerHTML = modalContent;\r\n document.body.appendChild(modalContainer);\r\n\r\n const cleanup = () => {\r\n modalContainer?.remove();\r\n };\r\n\r\n window.handleCancel = () => {\r\n cleanup();\r\n resolve(false);\r\n console.log(\"\");\r\n };\r\n\r\n window.handleConfirm = () => {\r\n cleanup();\r\n resolve(true);\r\n };\r\n\r\n modalContainer.addEventListener(\"click\", (e: MouseEvent) => {\r\n const target = e.target as HTMLElement;\r\n if (target.id === \"myModal\" || target.id === \"confirmModal\") {\r\n cleanup();\r\n }\r\n });\r\n });\r\n};\r\n\r\n// Open a toast notification\r\nexport const openToast = (\r\n message: string = \"\",\r\n status: StatusCode = 200\r\n): void => {\r\n const msg =\r\n status === 200 || status === 201\r\n ? \"Awesome! The update was made.\"\r\n : status === 500\r\n ? \"Sorry, the server can't process your request\"\r\n : \"Hmmm..., Something went wrong. Try again\";\r\n\r\n const iconSvg =\r\n status === 200 || status === 201\r\n ? '<svg viewBox=\"0 0 24 24\" style=\"color: var(--ViridianGreen); width:24px; height:24px;\"><path fill=\"currentColor\" d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>'\r\n : '<svg viewBox=\"0 0 24 24\" style=\"color: var(--Danger); width:24px; height:24px;\"><path fill=\"currentColor\" d=\"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z\"/></svg>';\r\n\r\n let modalContainer = document.getElementById(\r\n \"openToast\"\r\n ) as HTMLDivElement | null;\r\n if (!modalContainer) {\r\n modalContainer = document.createElement(\"div\");\r\n modalContainer.id = \"openToast\";\r\n }\r\n\r\n const modalContent = `\r\n <div class=\"toast-wrapper\">\r\n <div class=\"slide-in-top\">\r\n <div class=\"align-text\">\r\n <div class=\"valid_btn\">\r\n ${iconSvg}\r\n <p class=\"${\r\n status === 200 || status === 201 ? \"isDone\" : \"isError\"\r\n }\">\r\n ${message || msg}\r\n </p>\r\n </div>\r\n </div>\r\n <svg width=\"800px\" height=\"800px\" viewBox=\"-0.5 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" \r\n class=\"close-btn\" onclick=\"window.cleanupToast()\">\r\n <path d=\"M3 21.32L21 3.32001\" stroke=\"var(--Gunmetal)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M3 3.32001L21 21.32\" stroke=\"var(--Gunmetal)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n `;\r\n\r\n modalContainer.innerHTML = modalContent;\r\n document.body.appendChild(modalContainer);\r\n\r\n window.cleanupToast = () => {\r\n modalContainer?.remove();\r\n };\r\n\r\n setTimeout(() => {\r\n window.cleanupToast();\r\n }, 10000);\r\n};\r\n\r\n// Open a modal to get user email input\r\nexport const getUserEmailInputModal = (\r\n title: string\r\n): Promise<string | undefined> => {\r\n return new Promise((resolve) => {\r\n let modalContainer = document.getElementById(\r\n \"confirmModal\"\r\n ) as HTMLDivElement | null;\r\n if (!modalContainer) {\r\n modalContainer = document.createElement(\"div\");\r\n modalContainer.id = \"confirmModal\";\r\n }\r\n let emailValue: string | undefined;\r\n\r\n const modalContent = `\r\n <section id=\"myModal\" class=\"modal\">\r\n <div class=\"modal-content\">\r\n <svg width=\"800px\" height=\"800px\" viewBox=\"-0.5 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" \r\n class=\"ih_get_user_email_modal_close_btn\" onclick=\"window.handleCleanUpInput()\">\r\n <path d=\"M3 21.32L21 3.32001\" stroke=\"var(--Gunmetal)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M3 3.32001L21 21.32\" stroke=\"var(--Gunmetal)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <h4>Enrol for ${title}</h4>\r\n <p>Enter a valid Email Address</p>\r\n <input type=\"email\" name=\"email\" id=\"userInput\" oninput=\"window.handleInput(this)\" />\r\n <div class=\"action_btn\">\r\n <button type=\"button\" disabled id=\"proceedBtn\" class=\"delete_btn important-btn\" onclick=\"window.handleConfirm()\">Proceed</button>\r\n </div>\r\n </div>\r\n </section>\r\n `;\r\n\r\n modalContainer.innerHTML = modalContent;\r\n document.body.appendChild(modalContainer);\r\n\r\n const proceedBtn = document.getElementById(\r\n \"proceedBtn\"\r\n ) as HTMLButtonElement | null;\r\n\r\n window.handleInput = (e: HTMLInputElement) => {\r\n if (isValidEmail(e.value)) {\r\n if (proceedBtn) proceedBtn.disabled = false;\r\n emailValue = e.value;\r\n } else {\r\n if (proceedBtn) proceedBtn.disabled = true;\r\n emailValue = undefined;\r\n }\r\n };\r\n\r\n const cleanup = () => {\r\n modalContainer?.remove();\r\n };\r\n\r\n window.handleConfirm = () => {\r\n if (isValidEmail(emailValue)) {\r\n cleanup();\r\n resolve(emailValue);\r\n } else {\r\n openToast(\"You need to enter a valid email!\", 400);\r\n }\r\n };\r\n\r\n window.handleCleanUpInput = () => {\r\n cleanup();\r\n resolve(undefined);\r\n };\r\n });\r\n};\r\n"],"names":["isValidEmail","input","length","test","openConfirmModal","message","flag","arguments","undefined","Promise","resolve","modalContainer","document","getElementById","createElement","id","modalContent","concat","innerHTML","body","appendChild","cleanup","_modalContainer","remove","window","handleCancel","console","log","handleConfirm","addEventListener","e","target","openToast","status","msg","iconSvg","cleanupToast","_modalContainer2","setTimeout","getUserEmailInputModal","title","emailValue","proceedBtn","handleInput","value","disabled","_modalContainer3","handleCleanUpInput"],"mappings":"AAMA,IAAMA,EAAe,SAACC,GACpB,IAAKA,GAASA,EAAMC,OAAS,EAC3B,OAAO,EAGT,MADmB,6BACDC,KAAKF,EACzB,EAcaG,EAAmB,SAC9BC,GAEoB,IADpBC,EAAAC,UAAAL,OAAA,QAAAM,IAAAD,UAAA,IAAAA,UAAA,GAEA,OAAO,IAAIE,SAAQ,SAACC,GAClB,IAAIC,EAAiBC,SAASC,eAC5B,gBAEGF,KACHA,EAAiBC,SAASE,cAAc,QACzBC,GAAK,gBAGtB,IAAMC,oLAAYC,OAIAX,EAAO,wBAA0B,gBAAeW,oBAAAA,OAExDX,EACI,wDACA,2BACN,mCAAAW,OAGAZ,GACA,4FAQP,yVAEDM,EAAeO,UAAYF,EAC3BJ,SAASO,KAAKC,YAAYT,GAE1B,IAAMU,EAAU,WAAK,IAAAC,EACLA,QAAdA,EAAAX,aAAcW,GAAdA,EAAgBC,UAGlBC,OAAOC,aAAe,WACpBJ,IACAX,GAAQ,GACRgB,QAAQC,IAAI,KAGdH,OAAOI,cAAgB,WACrBP,IACAX,GAAQ,IAGVC,EAAekB,iBAAiB,SAAS,SAACC,GACxC,IAAMC,EAASD,EAAEC,OACC,YAAdA,EAAOhB,IAAkC,iBAAdgB,EAAOhB,IACpCM,GAEJ,GACF,GACF,EAGaW,EAAY,WAGf,IAFR3B,EAAkBE,UAAAL,OAAA,QAAAM,IAAAD,UAAA,GAAAA,UAAA,GAAA,GAClB0B,EAAA1B,UAAAL,OAAA,QAAAM,IAAAD,UAAA,GAAAA,UAAA,GAAqB,IAEf2B,EACO,MAAXD,GAA6B,MAAXA,EACd,gCACW,MAAXA,EACA,+CACA,2CAEAE,EACO,MAAXF,GAA6B,MAAXA,EACd,qPACA,wSAEFtB,EAAiBC,SAASC,eAC5B,aAEGF,KACHA,EAAiBC,SAASE,cAAc,QACzBC,GAAK,aAGtB,IAAMC,EAAYC,yJAAAA,OAKNkB,8BAAOlB,OAEI,MAAXgB,GAA6B,MAAXA,EAAiB,SAAW,UAChDhB,sBAAAA,OACIZ,GAAW6B,EAWxB,kiBAEDvB,EAAeO,UAAYF,EAC3BJ,SAASO,KAAKC,YAAYT,GAE1Ba,OAAOY,aAAe,WAAK,IAAAC,EACXA,QAAdA,EAAA1B,aAAc0B,GAAdA,EAAgBd,UAGlBe,YAAW,WACTd,OAAOY,cACR,GAAE,IACL,EAGaG,EAAyB,SACpCC,GAEA,OAAO,IAAI/B,SAAQ,SAACC,GAClB,IAOI+B,EAPA9B,EAAiBC,SAASC,eAC5B,gBAEGF,KACHA,EAAiBC,SAASE,cAAc,QACzBC,GAAK,gBAItB,IAAMC,EAAY,kmBAAAC,OAQIuB,EAQrB,qYAED7B,EAAeO,UAAYF,EAC3BJ,SAASO,KAAKC,YAAYT,GAE1B,IAAM+B,EAAa9B,SAASC,eAC1B,cAGFW,OAAOmB,YAAc,SAACb,GAChB9B,EAAa8B,EAAEc,QACbF,IAAYA,EAAWG,UAAW,GACtCJ,EAAaX,EAAEc,QAEXF,IAAYA,EAAWG,UAAW,GACtCJ,OAAajC,IAIjB,IAAMa,EAAU,WAAK,IAAAyB,EACLA,QAAdA,EAAAnC,aAAcmC,GAAdA,EAAgBvB,UAGlBC,OAAOI,cAAgB,WACjB5B,EAAayC,IACfpB,IACAX,EAAQ+B,IAERT,EAAU,mCAAoC,MAIlDR,OAAOuB,mBAAqB,WAC1B1B,IACAX,OAAQF,GAEZ,GACF"}
1
+ {"version":3,"file":"modals.js","sources":["../../../../../src/components/lib/modals/modals.ts"],"sourcesContent":["import React from \"react\";\r\n\r\n// Type for status codes\r\ntype StatusCode = 200 | 201 | 400 | 500 | number;\r\n\r\n// Utility function to validate email\r\nconst isValidEmail = (input: string | undefined): boolean => {\r\n if (!input || input.length < 3) {\r\n return false;\r\n }\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(input);\r\n};\r\n\r\n// Declare global window interface extensions for event handlers\r\ndeclare global {\r\n interface Window {\r\n handleCancel: () => void;\r\n handleConfirm: () => void;\r\n cleanupToast: () => void;\r\n handleInput: (e: HTMLInputElement) => void;\r\n handleCleanUpInput: () => void;\r\n }\r\n}\r\n\r\n// Open a confirmation modal\r\nexport const openConfirmModal = (\r\n message: string,\r\n flag: boolean = false\r\n): Promise<boolean> => {\r\n return new Promise((resolve) => {\r\n let modalContainer = document.getElementById(\r\n \"confirmModal\"\r\n ) as HTMLDivElement | null;\r\n if (!modalContainer) {\r\n modalContainer = document.createElement(\"div\");\r\n modalContainer.id = \"confirmModal\";\r\n }\r\n\r\n const modalContent = `\r\n <section id=\"myModal\" class=\"modal\">\r\n <div class=\"modal-content\">\r\n <span class=\"close\" onclick=\"window.handleCancel()\">×</span>\r\n <p class=\"${flag ? \"something_bad_flagged\" : \"something_bad\"}\">\r\n ${\r\n flag\r\n ? \"Unexpected things will happen if you don’t read this!\"\r\n : \"You are about to submit!\"\r\n }\r\n </p>\r\n <p>${\r\n message ||\r\n \"Carefully read the instructions before making a decision. Ready? Hit the continue button!\"\r\n }</p>\r\n <div class=\"mt-4\">\r\n <button type=\"button\" class=\"danger-btn d-inline-block\" onclick=\"window.handleCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"important-btn confirm-btn ihub-bg-dark-cyan\" onclick=\"window.handleConfirm()\">Ok</button>\r\n </div>\r\n </div>\r\n </section>\r\n `;\r\n\r\n modalContainer.innerHTML = modalContent;\r\n document.body.appendChild(modalContainer);\r\n\r\n const cleanup = () => {\r\n modalContainer?.remove();\r\n };\r\n\r\n window.handleCancel = () => {\r\n cleanup();\r\n resolve(false);\r\n console.log(\"\");\r\n };\r\n\r\n window.handleConfirm = () => {\r\n cleanup();\r\n resolve(true);\r\n };\r\n\r\n modalContainer.addEventListener(\"click\", (e: MouseEvent) => {\r\n const target = e.target as HTMLElement;\r\n if (target.id === \"myModal\" || target.id === \"confirmModal\") {\r\n cleanup();\r\n }\r\n });\r\n });\r\n};\r\n\r\n// Open a toast notification\r\nexport const openToast = (\r\n message?: React.ReactDOM | string,\r\n status: StatusCode = 200\r\n): void => {\r\n const msg =\r\n status === 200 || status === 201\r\n ? \"Awesome! The update was made.\"\r\n : status === 500\r\n ? \"Sorry, the server can't process your request\"\r\n : \"Hmmm..., Something went wrong. Try again\";\r\n\r\n const iconSvg =\r\n status === 200 || status === 201\r\n ? '<svg viewBox=\"0 0 24 24\" style=\"color: var(--ViridianGreen); width:24px; height:24px;\"><path fill=\"currentColor\" d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>'\r\n : '<svg viewBox=\"0 0 24 24\" style=\"color: var(--Danger); width:24px; height:24px;\"><path fill=\"currentColor\" d=\"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z\"/></svg>';\r\n\r\n let modalContainer = document.getElementById(\r\n \"openToast\"\r\n ) as HTMLDivElement | null;\r\n if (!modalContainer) {\r\n modalContainer = document.createElement(\"div\");\r\n modalContainer.id = \"openToast\";\r\n }\r\n\r\n const modalContent = `\r\n <div class=\"toast-wrapper\">\r\n <div class=\"slide-in-top\">\r\n <div class=\"align-text\">\r\n <div class=\"valid_btn\">\r\n ${iconSvg}\r\n <p class=\"${\r\n status === 200 || status === 201 ? \"isDone\" : \"isError\"\r\n }\">\r\n ${message || msg}\r\n </p>\r\n </div>\r\n </div>\r\n <svg width=\"800px\" height=\"800px\" viewBox=\"-0.5 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" \r\n class=\"close-btn\" onclick=\"window.cleanupToast()\">\r\n <path d=\"M3 21.32L21 3.32001\" stroke=\"var(--Gunmetal)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M3 3.32001L21 21.32\" stroke=\"var(--Gunmetal)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n `;\r\n\r\n modalContainer.innerHTML = modalContent;\r\n document.body.appendChild(modalContainer);\r\n\r\n window.cleanupToast = () => {\r\n modalContainer?.remove();\r\n };\r\n\r\n setTimeout(() => {\r\n window.cleanupToast();\r\n }, 10000);\r\n};\r\n\r\n// Open a modal to get user email input\r\nexport const getUserEmailInputModal = (\r\n title: string\r\n): Promise<string | undefined> => {\r\n return new Promise((resolve) => {\r\n let modalContainer = document.getElementById(\r\n \"confirmModal\"\r\n ) as HTMLDivElement | null;\r\n if (!modalContainer) {\r\n modalContainer = document.createElement(\"div\");\r\n modalContainer.id = \"confirmModal\";\r\n }\r\n let emailValue: string | undefined;\r\n\r\n const modalContent = `\r\n <section id=\"myModal\" class=\"modal\">\r\n <div class=\"modal-content\">\r\n <svg width=\"800px\" height=\"800px\" viewBox=\"-0.5 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" \r\n class=\"ih_get_user_email_modal_close_btn\" onclick=\"window.handleCleanUpInput()\">\r\n <path d=\"M3 21.32L21 3.32001\" stroke=\"var(--Gunmetal)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n <path d=\"M3 3.32001L21 21.32\" stroke=\"var(--Gunmetal)\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <h4>Enrol for ${title}</h4>\r\n <p>Enter a valid Email Address</p>\r\n <input type=\"email\" name=\"email\" id=\"userInput\" oninput=\"window.handleInput(this)\" />\r\n <div class=\"action_btn\">\r\n <button type=\"button\" disabled id=\"proceedBtn\" class=\"delete_btn important-btn\" onclick=\"window.handleConfirm()\">Proceed</button>\r\n </div>\r\n </div>\r\n </section>\r\n `;\r\n\r\n modalContainer.innerHTML = modalContent;\r\n document.body.appendChild(modalContainer);\r\n\r\n const proceedBtn = document.getElementById(\r\n \"proceedBtn\"\r\n ) as HTMLButtonElement | null;\r\n\r\n window.handleInput = (e: HTMLInputElement) => {\r\n if (isValidEmail(e.value)) {\r\n if (proceedBtn) proceedBtn.disabled = false;\r\n emailValue = e.value;\r\n } else {\r\n if (proceedBtn) proceedBtn.disabled = true;\r\n emailValue = undefined;\r\n }\r\n };\r\n\r\n const cleanup = () => {\r\n modalContainer?.remove();\r\n };\r\n\r\n window.handleConfirm = () => {\r\n if (isValidEmail(emailValue)) {\r\n cleanup();\r\n resolve(emailValue);\r\n } else {\r\n openToast(\"You need to enter a valid email!\", 400);\r\n }\r\n };\r\n\r\n window.handleCleanUpInput = () => {\r\n cleanup();\r\n resolve(undefined);\r\n };\r\n });\r\n};\r\n"],"names":["isValidEmail","input","length","test","openConfirmModal","message","flag","arguments","undefined","Promise","resolve","modalContainer","document","getElementById","createElement","id","modalContent","concat","innerHTML","body","appendChild","cleanup","_modalContainer","remove","window","handleCancel","console","log","handleConfirm","addEventListener","e","target","openToast","status","msg","iconSvg","cleanupToast","_modalContainer2","setTimeout","getUserEmailInputModal","title","emailValue","proceedBtn","handleInput","value","disabled","_modalContainer3","handleCleanUpInput"],"mappings":"AAMA,IAAMA,EAAe,SAACC,GACpB,IAAKA,GAASA,EAAMC,OAAS,EAC3B,OAAO,EAGT,MADmB,6BACDC,KAAKF,EACzB,EAcaG,EAAmB,SAC9BC,GAEoB,IADpBC,EAAAC,UAAAL,OAAA,QAAAM,IAAAD,UAAA,IAAAA,UAAA,GAEA,OAAO,IAAIE,SAAQ,SAACC,GAClB,IAAIC,EAAiBC,SAASC,eAC5B,gBAEGF,KACHA,EAAiBC,SAASE,cAAc,QACzBC,GAAK,gBAGtB,IAAMC,oLAAYC,OAIAX,EAAO,wBAA0B,gBAAeW,oBAAAA,OAExDX,EACI,wDACA,2BACN,mCAAAW,OAGAZ,GACA,4FAQP,yVAEDM,EAAeO,UAAYF,EAC3BJ,SAASO,KAAKC,YAAYT,GAE1B,IAAMU,EAAU,WAAK,IAAAC,EACLA,QAAdA,EAAAX,aAAcW,GAAdA,EAAgBC,UAGlBC,OAAOC,aAAe,WACpBJ,IACAX,GAAQ,GACRgB,QAAQC,IAAI,KAGdH,OAAOI,cAAgB,WACrBP,IACAX,GAAQ,IAGVC,EAAekB,iBAAiB,SAAS,SAACC,GACxC,IAAMC,EAASD,EAAEC,OACC,YAAdA,EAAOhB,IAAkC,iBAAdgB,EAAOhB,IACpCM,GAEJ,GACF,GACF,EAGaW,EAAY,SACvB3B,GAEQ,IADR4B,EAAA1B,UAAAL,OAAA,QAAAM,IAAAD,UAAA,GAAAA,UAAA,GAAqB,IAEf2B,EACO,MAAXD,GAA6B,MAAXA,EACd,gCACW,MAAXA,EACA,+CACA,2CAEAE,EACO,MAAXF,GAA6B,MAAXA,EACd,qPACA,wSAEFtB,EAAiBC,SAASC,eAC5B,aAEGF,KACHA,EAAiBC,SAASE,cAAc,QACzBC,GAAK,aAGtB,IAAMC,EAAYC,yJAAAA,OAKNkB,8BAAOlB,OAEI,MAAXgB,GAA6B,MAAXA,EAAiB,SAAW,UAChDhB,sBAAAA,OACIZ,GAAW6B,EAWxB,kiBAEDvB,EAAeO,UAAYF,EAC3BJ,SAASO,KAAKC,YAAYT,GAE1Ba,OAAOY,aAAe,WAAK,IAAAC,EACXA,QAAdA,EAAA1B,aAAc0B,GAAdA,EAAgBd,UAGlBe,YAAW,WACTd,OAAOY,cACR,GAAE,IACL,EAGaG,EAAyB,SACpCC,GAEA,OAAO,IAAI/B,SAAQ,SAACC,GAClB,IAOI+B,EAPA9B,EAAiBC,SAASC,eAC5B,gBAEGF,KACHA,EAAiBC,SAASE,cAAc,QACzBC,GAAK,gBAItB,IAAMC,EAAY,kmBAAAC,OAQIuB,EAQrB,qYAED7B,EAAeO,UAAYF,EAC3BJ,SAASO,KAAKC,YAAYT,GAE1B,IAAM+B,EAAa9B,SAASC,eAC1B,cAGFW,OAAOmB,YAAc,SAACb,GAChB9B,EAAa8B,EAAEc,QACbF,IAAYA,EAAWG,UAAW,GACtCJ,EAAaX,EAAEc,QAEXF,IAAYA,EAAWG,UAAW,GACtCJ,OAAajC,IAIjB,IAAMa,EAAU,WAAK,IAAAyB,EACLA,QAAdA,EAAAnC,aAAcmC,GAAdA,EAAgBvB,UAGlBC,OAAOI,cAAgB,WACjB5B,EAAayC,IACfpB,IACAX,EAAQ+B,IAERT,EAAU,mCAAoC,MAIlDR,OAAOuB,mBAAqB,WAC1B1B,IACAX,OAAQF,GAEZ,GACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"paystack.js","sources":["../../../../src/components/lib/paystack.ts"],"sourcesContent":["import {\r\n API_HOST_URL,\r\n calculateAmountAfterDeduction,\r\n reqOptions,\r\n setCookie,\r\n} from \"./helpFunction\";\r\nimport {\r\n getUserEmailInputModal,\r\n openConfirmModal,\r\n openToast,\r\n} from \"./modals/modals\";\r\nimport {\r\n PaystackConfigObjectType,\r\n PaystackConfigType,\r\n PaystackResponseType,\r\n PaymentContextType,\r\n} from \"@/types\";\r\n\r\n/**\r\n * Context for processing payments\r\n * @property {Event | null} [e] - The event object that triggered the payment\r\n * @property {Object} objects - Details about the item being purchased\r\n * @property {string} objects.title - Title of the item\r\n * @property {string | number | null} [objects.object_type] - Model ID of the object being purchased\r\n * @property {string | number | null} [objects.object_id] - Object ID of the object being purchased\r\n * @property {PaystackConfigObjectType} configObj - Configuration for PayStack\r\n * @property {PaymentMethodType} [paymentMethod] - Saved payment method if available\r\n * @property {Function} setStatus - Function to update UI status during payment process\r\n * @property {Function} handleDBAction - Callback for processing successful payments\r\n * @property {boolean} [defaultConfirm] - Whether to show a confirmation dialog\r\n * @property {string} label - Label for the payment (usually item title)\r\n * @property {string} [coupon] - Coupon code if applicable\r\n * @property {string} [defaultMsg] - Custom confirmation message\r\n * @property {number} [gatwayCharges] - Payment gateway charges percentage\r\n */\r\n\r\n/**\r\n * Configures the Paystack payment data for processing\r\n * @param obj - Object containing payment details\r\n * @returns PaystackConfig - Configured payment data\r\n */\r\nexport const paystackDataConfig = (\r\n obj: PaystackConfigObjectType\r\n): PaystackConfigType => ({\r\n authorization_code: obj.authorization_code,\r\n reference: new Date().getTime().toString(),\r\n email: obj.email,\r\n first_name: obj.first_name,\r\n last_name: obj.last_name,\r\n amount: obj.amount * 100, // Amount is in the country's lowest currency. E.g Kobo, so 20000 kobo = N200\r\n currency: obj.currency || \"NGN\",\r\n publicKey: process.env.NEXT_PUBLIC_PAYSTACK_SECRET_KEY,\r\n key: process.env.NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY,\r\n callback_url: window.location.href,\r\n metadata: obj.metadata,\r\n});\r\n\r\n/**\r\n * Charges a customer using an existing authorization\r\n * @param data - Payment configuration data\r\n * @returns Promise with transaction data\r\n */\r\nexport const chargeAuthorization = async (\r\n data: PaystackConfigType\r\n): Promise<any> => {\r\n // This function tries to charge user with existing card\r\n const url = \"https://api.paystack.co/transaction/charge_authorization\";\r\n const options = {\r\n method: \"POST\",\r\n body: JSON.stringify(data),\r\n headers: {\r\n Authorization: `Bearer ${process.env.NEXT_PUBLIC_PAYSTACK_SECRET_KEY}`,\r\n \"Content-Type\": \"application/json\",\r\n },\r\n };\r\n\r\n try {\r\n const req = await fetch(url, options);\r\n const res = await req.json();\r\n\r\n if (res.data?.status === \"success\") {\r\n openToast(`Payment was successful with reference: ${res.data.reference}`);\r\n } else {\r\n openToast(`Payment failed with reference: ${res.data.reference}`, 400);\r\n }\r\n\r\n return res.data;\r\n } catch (error) {\r\n openToast(\"Payment processing error occurred\", 400);\r\n console.error(\"Payment authorization error:\", error);\r\n return { status: \"failed\", error };\r\n }\r\n};\r\n\r\n/**\r\n * Initiates payment with Paystack popup\r\n * @param config - Payment configuration\r\n * @returns Promise with payment response\r\n */\r\nexport const payWithPaystack = (\r\n config: PaystackConfigType\r\n): Promise<PaystackResponseType> => {\r\n return new Promise(async (resolve) => {\r\n try {\r\n // Ensure PaystackPop is available\r\n if (!window.PaystackPop) {\r\n throw new Error(\"Paystack script not loaded\");\r\n }\r\n\r\n let handler = await window.PaystackPop.setup({\r\n ...config,\r\n callback: (response: PaystackResponseType) => {\r\n // This happens after the payment is completed successfully\r\n openToast(\"Payment complete! Reference: \" + response.reference);\r\n resolve(response);\r\n },\r\n onClose: () => {\r\n openToast(\"Transaction was not completed, window closed.\", 400);\r\n resolve({\r\n status: \"cancelled\",\r\n cancelled: true,\r\n reference: config.reference,\r\n });\r\n },\r\n });\r\n handler.openIframe();\r\n } catch (error) {\r\n console.error(\"Paystack initialization error:\", error);\r\n openToast(\"Payment could not be initiated\", 400);\r\n resolve({\r\n status: \"failed\",\r\n cancelled: true,\r\n reference: config.reference,\r\n error,\r\n });\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * Handles the complete payment submission process\r\n * @example\r\n * ```ts\r\n * handlePaymentSubmit({\r\n * openConfirm: true,\r\n * defaultConfirm: true,\r\n * defaultMsg: \"Are you sure you want to enroll for this course?\",\r\n * label: \"Course Name\",\r\n * objects: {\r\n * object_id: \"123\",\r\n * object_type: \"course\",\r\n * },\r\n * configObj: {\r\n * email: \"user@example.com\",\r\n * amount: 1000,\r\n * currency: \"NGN\",\r\n * authorization_code: \"1234567890\",\r\n * first_name: \"John\",\r\n * last_name: \"Doe\",\r\n * email: \"user@example.com\",\r\n * },\r\n * coupon: \"1234567890\",\r\n * gatwayCharges: 10,\r\n * paymentMethod: {\r\n * authorization: {\r\n * card_type: \"MasterCard\",\r\n * last4: \"1234\",\r\n * },\r\n * },\r\n * handleDBAction: (data: any) => {\r\n * console.log(data);\r\n * },\r\n * setStatus: (status: number) => {\r\n * console.log(status);\r\n * },\r\n * e: Event,\r\n * });\r\n * ```\r\n * @param contexts - Payment context information\r\n * @context This function orchestrates the entire payment flow from confirmation to processing\r\n */\r\nexport async function handlePaymentSubmit(\r\n contexts: PaymentContextType\r\n): Promise<void> {\r\n if (contexts.e) contexts.e.preventDefault();\r\n\r\n if (contexts.openConfirm && contexts.defaultConfirm) {\r\n let msg = `By clicking okay, you are enrolling for ${contexts.label} with id ${contexts.objects.object_id}.`;\r\n const confirm = await openConfirmModal(contexts.defaultMsg || msg);\r\n if (!confirm) return;\r\n }\r\n\r\n const makePayment = async (): Promise<void> => {\r\n contexts.setStatus(0);\r\n\r\n // Check if contexts.coupon is valid\r\n let discount: number | undefined;\r\n let mewConfigObj: PaystackConfigObjectType;\r\n\r\n if (contexts.coupon) {\r\n const handle = contexts.configObj.metadata?.channel_username;\r\n const couponObj = JSON.stringify({\r\n code: contexts.coupon,\r\n email: contexts.configObj.email,\r\n content_type: contexts.configObj.content_type,\r\n object_id: contexts.configObj.object_id,\r\n });\r\n\r\n const requestOptions = reqOptions(\"POST\", couponObj, null, \"json\");\r\n const url = `${API_HOST_URL}coupons/${handle}/validate-coupon/`;\r\n\r\n try {\r\n const dataset = await fetch(url, requestOptions);\r\n const res = await dataset.json();\r\n\r\n discount = res.discount || 0;\r\n if (res.detail) {\r\n openToast(res.detail, 400);\r\n } else if (res.id) {\r\n openToast(`${discount}% token was applied.`);\r\n }\r\n } catch (error) {\r\n console.error(\"Coupon validation error:\", error);\r\n openToast(\"Could not validate coupon\", 400);\r\n }\r\n }\r\n\r\n // Remove the discount from actual amount\r\n if (discount) {\r\n if (discount === 100) {\r\n contexts.handleDBAction({ reference: `COUPON__${contexts.coupon}` });\r\n contexts.setStatus(1);\r\n return;\r\n }\r\n\r\n const amount = calculateAmountAfterDeduction(\r\n contexts.configObj.amount,\r\n discount\r\n );\r\n\r\n openToast(amount.detail, 400);\r\n mewConfigObj = {\r\n ...contexts.configObj,\r\n ...amount,\r\n };\r\n } else {\r\n mewConfigObj = contexts.configObj;\r\n }\r\n\r\n // Add paystack charges\r\n if (contexts.gatwayCharges) {\r\n const fee = contexts.gatwayCharges / 100;\r\n // Calculate the amount to charge so that after the fee deduction, it matches the intended amount\r\n const totalAmount = mewConfigObj.amount / (1 - fee);\r\n // Returns the amount rounded to 2 decimal places\r\n const decimalAmount = parseFloat(totalAmount.toFixed(2));\r\n\r\n // Local transactions fees are capped at ₦2000, meaning that's the absolute maximum you'll ever pay in fees per transaction\r\n const localCharges = decimalAmount - mewConfigObj.amount;\r\n\r\n // Only charge 2k if charges exceed threshold\r\n const noMoreThan2k =\r\n localCharges > 2000 ? mewConfigObj.amount + 2000 : decimalAmount;\r\n\r\n mewConfigObj.amount = noMoreThan2k;\r\n }\r\n\r\n const dataset = paystackDataConfig(mewConfigObj);\r\n\r\n if (mewConfigObj.amount) {\r\n if (mewConfigObj.authorization_code && contexts.paymentMethod) {\r\n // Ask if user wants to use existing payment method\r\n const msg = `Would you prefer we charge your existing ${contexts.paymentMethod.authorization.card_type} card that ends with ${contexts.paymentMethod.last4}?`;\r\n const confirm = await openConfirmModal(msg, true);\r\n\r\n if (confirm) {\r\n // Charge user with existing card\r\n const res = await chargeAuthorization(dataset);\r\n contexts.handleDBAction(res);\r\n } else {\r\n // Request for user card details\r\n const payActivate = await payWithPaystack(dataset);\r\n\r\n contexts.handleDBAction(payActivate);\r\n }\r\n } else {\r\n // Request for user card details if payment method doesn't exist\r\n console.log(\"Pay with paystack: \");\r\n const payActivate = await payWithPaystack(dataset);\r\n contexts.handleDBAction(payActivate);\r\n }\r\n } else {\r\n // If cohort is free, don't request for payment\r\n contexts.handleDBAction();\r\n }\r\n\r\n contexts.setStatus(1);\r\n };\r\n\r\n // Get user email input if doesn't exist\r\n const checkEmailInConfig = async (): Promise<void> => {\r\n if (!contexts.configObj.email) {\r\n const emailValue = await getUserEmailInputModal(contexts.label);\r\n if (emailValue) {\r\n contexts.configObj.email = emailValue;\r\n setCookie(\"email\", emailValue, 2); // store for signup use\r\n makePayment();\r\n } else {\r\n openToast(\"You need to enter a valid email!\", 400);\r\n await checkEmailInConfig();\r\n }\r\n } else {\r\n setCookie(\"email\", contexts.configObj.email, 2); // store for signup use\r\n makePayment();\r\n }\r\n };\r\n\r\n checkEmailInConfig();\r\n}\r\n\r\n// Add PaystackPop to Window interface\r\ndeclare global {\r\n interface Window {\r\n PaystackPop: {\r\n setup: (config: any) => { openIframe: () => void };\r\n };\r\n }\r\n}\r\n"],"names":["paystackDataConfig","obj","authorization_code","reference","Date","getTime","toString","email","first_name","last_name","amount","currency","publicKey","process","env","NEXT_PUBLIC_PAYSTACK_SECRET_KEY","key","NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY","callback_url","window","location","href","metadata","chargeAuthorization","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","data","options","_res$data","req","res","wrap","_context","prev","next","method","body","JSON","stringify","headers","Authorization","concat","fetch","sent","json","status","openToast","abrupt","t0","console","error","stop","_x","apply","this","arguments","payWithPaystack","config","Promise","_ref2","_callee2","resolve","_context2","PaystackPop","Error","setup","_objectSpread","callback","response","onClose","cancelled","openIframe","_x2","handlePaymentSubmit","_x3","_handlePaymentSubmit","_callee5","contexts","msg","makePayment","_checkEmailInConfig","_context5","e","preventDefault","openConfirm","defaultConfirm","label","objects","object_id","openConfirmModal","defaultMsg","_ref3","_callee3","discount","mewConfigObj","_contexts$configObj$m","handle","couponObj","requestOptions","url","_dataset","fee","totalAmount","decimalAmount","localCharges","noMoreThan2k","dataset","_msg","_res","payActivate","_payActivate","_context3","setStatus","coupon","configObj","channel_username","code","content_type","reqOptions","API_HOST_URL","detail","id","handleDBAction","calculateAmountAfterDeduction","gatwayCharges","parseFloat","toFixed","paymentMethod","authorization","card_type","last4","log","checkEmailInConfig","_ref4","_callee4","emailValue","_context4","getUserEmailInputModal","setCookie"],"mappings":"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"}
1
+ {"version":3,"file":"paystack.js","sources":["../../../../src/components/lib/paystack.ts"],"sourcesContent":["import {\r\n API_HOST_URL,\r\n calculateAmountAfterDeduction,\r\n reqOptions,\r\n setCookie,\r\n} from \"./helpFunction\";\r\nimport {\r\n getUserEmailInputModal,\r\n openConfirmModal,\r\n openToast,\r\n} from \"./modals/modals\";\r\nimport {\r\n PaystackConfigObjectType,\r\n PaystackConfigType,\r\n PaystackResponseType,\r\n PaymentContextType,\r\n} from \"@/types\";\r\n\r\n/**\r\n * Context for processing payments\r\n * @property {Event | null} [e] - The event object that triggered the payment\r\n * @property {Object} objects - Details about the item being purchased\r\n * @property {string} objects.title - Title of the item\r\n * @property {string | number | null} [objects.object_type] - Model ID of the object being purchased\r\n * @property {string | number | null} [objects.object_id] - Object ID of the object being purchased\r\n * @property {PaystackConfigObjectType} configObj - Configuration for PayStack\r\n * @property {PaymentMethodType} [paymentMethod] - Saved payment method if available\r\n * @property {Function} setStatus - Function to update UI status during payment process\r\n * @property {Function} handleDBAction - Callback for processing successful payments\r\n * @property {boolean} [defaultConfirm] - Whether to show a confirmation dialog\r\n * @property {string} label - Label for the payment (usually item title)\r\n * @property {string} [coupon] - Coupon code if applicable\r\n * @property {string} [defaultMsg] - Custom confirmation message\r\n * @property {number} [gatwayCharges] - Payment gateway charges percentage\r\n */\r\n\r\n/**\r\n * Configures the Paystack payment data for processing\r\n * @param obj - Object containing payment details\r\n * @returns PaystackConfig - Configured payment data\r\n */\r\nexport const paystackDataConfig = (\r\n obj: PaystackConfigObjectType\r\n): PaystackConfigType => ({\r\n authorization_code: obj.authorization_code,\r\n reference: new Date().getTime().toString(),\r\n email: obj.email,\r\n first_name: obj.first_name,\r\n last_name: obj.last_name,\r\n amount: obj.amount * 100, // Amount is in the country's lowest currency. E.g Kobo, so 20000 kobo = N200\r\n currency: obj.currency || \"NGN\",\r\n publicKey: process.env.NEXT_PUBLIC_PAYSTACK_SECRET_KEY,\r\n key: process.env.NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY,\r\n callback_url: window.location.href,\r\n metadata: obj.metadata,\r\n});\r\n\r\n/**\r\n * Charges a customer using an existing authorization\r\n * @param data - Payment configuration data\r\n * @returns Promise with transaction data\r\n */\r\nexport const chargeAuthorization = async (\r\n data: PaystackConfigType\r\n): Promise<any> => {\r\n // This function tries to charge user with existing card\r\n const url = \"https://api.paystack.co/transaction/charge_authorization\";\r\n const options = {\r\n method: \"POST\",\r\n body: JSON.stringify(data),\r\n headers: {\r\n Authorization: `Bearer ${process.env.NEXT_PUBLIC_PAYSTACK_SECRET_KEY}`,\r\n \"Content-Type\": \"application/json\",\r\n },\r\n };\r\n\r\n try {\r\n const req = await fetch(url, options);\r\n const res = await req.json();\r\n\r\n if (res.data?.status === \"success\") {\r\n openToast(`Payment was successful with reference: ${res.data.reference}`);\r\n } else {\r\n openToast(`Payment failed with reference: ${res.data.reference}`, 400);\r\n }\r\n\r\n return res.data;\r\n } catch (error) {\r\n openToast(\"Payment processing error occurred\", 400);\r\n console.error(\"Payment authorization error:\", error);\r\n return { status: \"failed\", error };\r\n }\r\n};\r\n\r\n/**\r\n * Initiates payment with Paystack popup\r\n * @param config - Payment configuration\r\n * @returns Promise with payment response\r\n */\r\nexport const payWithPaystack = (\r\n config: PaystackConfigType\r\n): Promise<PaystackResponseType> => {\r\n return new Promise(async (resolve) => {\r\n try {\r\n // Ensure PaystackPop is available\r\n if (!window.PaystackPop) {\r\n throw new Error(\"Paystack script not loaded\");\r\n }\r\n\r\n let handler = await window.PaystackPop.setup({\r\n ...config,\r\n callback: (response: PaystackResponseType) => {\r\n // This happens after the payment is completed successfully\r\n openToast(\"Payment complete! Reference: \" + response.reference);\r\n resolve(response);\r\n },\r\n onClose: () => {\r\n openToast(\"Transaction was not completed, window closed.\", 400);\r\n resolve({\r\n status: \"cancelled\",\r\n cancelled: true,\r\n reference: config.reference,\r\n } as PaystackResponseType);\r\n },\r\n });\r\n handler.openIframe();\r\n } catch (error) {\r\n console.error(\"Paystack initialization error:\", error);\r\n openToast(\"Payment could not be initiated\", 400);\r\n resolve({\r\n status: \"failed\",\r\n cancelled: true,\r\n reference: config.reference,\r\n error,\r\n } as PaystackResponseType);\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * Handles the complete payment submission process\r\n * @example\r\n * ```ts\r\n * handlePaymentSubmit({\r\n * openConfirm: true,\r\n * defaultConfirm: true,\r\n * defaultMsg: \"Are you sure you want to enroll for this course?\",\r\n * label: \"Course Name\",\r\n * objects: {\r\n * object_id: \"123\",\r\n * object_type: \"course\",\r\n * },\r\n * configObj: {\r\n * email: \"user@example.com\",\r\n * amount: 1000,\r\n * currency: \"NGN\",\r\n * authorization_code: \"1234567890\",\r\n * first_name: \"John\",\r\n * last_name: \"Doe\",\r\n * email: \"user@example.com\",\r\n * },\r\n * coupon: \"1234567890\",\r\n * gatwayCharges: 10,\r\n * paymentMethod: {\r\n * authorization: {\r\n * card_type: \"MasterCard\",\r\n * last4: \"1234\",\r\n * },\r\n * },\r\n * handleDBAction: (data: any) => {\r\n * console.log(data);\r\n * },\r\n * setStatus: (status: number) => {\r\n * console.log(status);\r\n * },\r\n * e: Event,\r\n * });\r\n * ```\r\n * @param contexts - Payment context information\r\n * @context This function orchestrates the entire payment flow from confirmation to processing\r\n */\r\nexport async function handlePaymentSubmit(\r\n contexts: PaymentContextType\r\n): Promise<void> {\r\n if (contexts.e) contexts.e.preventDefault();\r\n\r\n if (contexts.openConfirm && contexts.defaultConfirm) {\r\n let msg = `By clicking okay, you are enrolling for ${contexts.label} with id ${contexts.objects.object_id}.`;\r\n const confirm = await openConfirmModal(contexts.defaultMsg || msg);\r\n if (!confirm) return;\r\n }\r\n\r\n const makePayment = async (): Promise<void> => {\r\n contexts.setStatus(0);\r\n\r\n // Check if contexts.coupon is valid\r\n let discount: number | undefined;\r\n let mewConfigObj: PaystackConfigObjectType;\r\n\r\n if (contexts.coupon) {\r\n const handle = contexts.configObj.metadata?.channel_username;\r\n const couponObj = JSON.stringify({\r\n code: contexts.coupon,\r\n email: contexts.configObj.email,\r\n content_type: contexts.configObj.content_type,\r\n object_id: contexts.configObj.object_id,\r\n });\r\n\r\n const requestOptions = reqOptions(\"POST\", couponObj, null, \"json\");\r\n const url = `${API_HOST_URL}coupons/${handle}/validate-coupon/`;\r\n\r\n try {\r\n const dataset = await fetch(url, requestOptions);\r\n const res = await dataset.json();\r\n\r\n discount = res.discount || 0;\r\n if (res.detail) {\r\n openToast(res.detail, 400);\r\n } else if (res.id) {\r\n openToast(`${discount}% token was applied.`);\r\n }\r\n } catch (error) {\r\n console.error(\"Coupon validation error:\", error);\r\n openToast(\"Could not validate coupon\", 400);\r\n }\r\n }\r\n\r\n // Remove the discount from actual amount\r\n if (discount) {\r\n if (discount === 100) {\r\n contexts.handleDBAction({ reference: `COUPON__${contexts.coupon}` });\r\n contexts.setStatus(1);\r\n return;\r\n }\r\n\r\n const amount = calculateAmountAfterDeduction(\r\n contexts.configObj.amount,\r\n discount\r\n );\r\n\r\n openToast(amount.detail, 400);\r\n mewConfigObj = {\r\n ...contexts.configObj,\r\n ...amount,\r\n };\r\n } else {\r\n mewConfigObj = contexts.configObj;\r\n }\r\n\r\n // Add paystack charges\r\n if (contexts.gatwayCharges) {\r\n const fee = contexts.gatwayCharges / 100;\r\n // Calculate the amount to charge so that after the fee deduction, it matches the intended amount\r\n const totalAmount = mewConfigObj.amount / (1 - fee);\r\n // Returns the amount rounded to 2 decimal places\r\n const decimalAmount = parseFloat(totalAmount.toFixed(2));\r\n\r\n // Local transactions fees are capped at ₦2000, meaning that's the absolute maximum you'll ever pay in fees per transaction\r\n const localCharges = decimalAmount - mewConfigObj.amount;\r\n\r\n // Only charge 2k if charges exceed threshold\r\n const noMoreThan2k =\r\n localCharges > 2000 ? mewConfigObj.amount + 2000 : decimalAmount;\r\n\r\n mewConfigObj.amount = noMoreThan2k;\r\n }\r\n\r\n const dataset = paystackDataConfig(mewConfigObj);\r\n\r\n if (mewConfigObj.amount) {\r\n if (mewConfigObj.authorization_code && contexts.paymentMethod) {\r\n // Ask if user wants to use existing payment method\r\n const msg = `Would you prefer we charge your existing ${contexts.paymentMethod.authorization.card_type} card that ends with ${contexts.paymentMethod.last4}?`;\r\n const confirm = await openConfirmModal(msg, true);\r\n\r\n if (confirm) {\r\n // Charge user with existing card\r\n const res = await chargeAuthorization(dataset);\r\n contexts.handleDBAction(res);\r\n } else {\r\n // Request for user card details\r\n const payActivate = await payWithPaystack(dataset);\r\n\r\n contexts.handleDBAction(payActivate);\r\n }\r\n } else {\r\n // Request for user card details if payment method doesn't exist\r\n console.log(\"Pay with paystack: \");\r\n const payActivate = await payWithPaystack(dataset);\r\n contexts.handleDBAction(payActivate);\r\n }\r\n } else {\r\n // If cohort is free, don't request for payment\r\n contexts.handleDBAction();\r\n }\r\n\r\n contexts.setStatus(1);\r\n };\r\n\r\n // Get user email input if doesn't exist\r\n const checkEmailInConfig = async (): Promise<void> => {\r\n if (!contexts.configObj.email) {\r\n const emailValue = await getUserEmailInputModal(contexts.label);\r\n if (emailValue) {\r\n contexts.configObj.email = emailValue;\r\n setCookie(\"email\", emailValue, 2); // store for signup use\r\n makePayment();\r\n } else {\r\n openToast(\"You need to enter a valid email!\", 400);\r\n await checkEmailInConfig();\r\n }\r\n } else {\r\n setCookie(\"email\", contexts.configObj.email, 2); // store for signup use\r\n makePayment();\r\n }\r\n };\r\n\r\n checkEmailInConfig();\r\n}\r\n\r\n// Add PaystackPop to Window interface\r\ndeclare global {\r\n interface Window {\r\n PaystackPop: {\r\n setup: (config: any) => { openIframe: () => void };\r\n };\r\n }\r\n}\r\n"],"names":["paystackDataConfig","obj","authorization_code","reference","Date","getTime","toString","email","first_name","last_name","amount","currency","publicKey","process","env","NEXT_PUBLIC_PAYSTACK_SECRET_KEY","key","NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY","callback_url","window","location","href","metadata","chargeAuthorization","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","data","options","_res$data","req","res","wrap","_context","prev","next","method","body","JSON","stringify","headers","Authorization","concat","fetch","sent","json","status","openToast","abrupt","t0","console","error","stop","_x","apply","this","arguments","payWithPaystack","config","Promise","_ref2","_callee2","resolve","_context2","PaystackPop","Error","setup","_objectSpread","callback","response","onClose","cancelled","openIframe","_x2","handlePaymentSubmit","_x3","_handlePaymentSubmit","_callee5","contexts","msg","makePayment","_checkEmailInConfig","_context5","e","preventDefault","openConfirm","defaultConfirm","label","objects","object_id","openConfirmModal","defaultMsg","_ref3","_callee3","discount","mewConfigObj","_contexts$configObj$m","handle","couponObj","requestOptions","url","_dataset","fee","totalAmount","decimalAmount","localCharges","noMoreThan2k","dataset","_msg","_res","payActivate","_payActivate","_context3","setStatus","coupon","configObj","channel_username","code","content_type","reqOptions","API_HOST_URL","detail","id","handleDBAction","calculateAmountAfterDeduction","gatwayCharges","parseFloat","toFixed","paymentMethod","authorization","card_type","last4","log","checkEmailInConfig","_ref4","_callee4","emailValue","_context4","getUserEmailInputModal","setCookie"],"mappings":"qVAyCaA,EAAqB,SAChCC,GAA6B,MACL,CACxBC,mBAAoBD,EAAIC,mBACxBC,WAAW,IAAIC,MAAOC,UAAUC,WAChCC,MAAON,EAAIM,MACXC,WAAYP,EAAIO,WAChBC,UAAWR,EAAIQ,UACfC,OAAqB,IAAbT,EAAIS,OACZC,SAAUV,EAAIU,UAAY,MAC1BC,UAAWC,QAAQC,IAAIC,gCACvBC,IAAKH,QAAQC,IAAIG,gCACjBC,aAAcC,OAAOC,SAASC,KAC9BC,SAAUrB,EAAIqB,SACf,EAOYC,EAAmB,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,MAAG,SAAAC,EACjCC,GAAwB,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAP,IAAAQ,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAWvB,OAPKP,EAAU,CACdQ,OAAQ,OACRC,KAAMC,KAAKC,UAAUZ,GACrBa,QAAS,CACPC,cAAa,UAAAC,OAAY/B,QAAQC,IAAIC,iCACrC,eAAgB,qBAEnBoB,EAAAC,KAAA,EAAAD,EAAAE,KAAA,EAGmBQ,MAXR,2DAWmBf,GAAQ,KAAA,EAA5B,OAAHE,EAAGG,EAAAW,KAAAX,EAAAE,KAAA,EACSL,EAAIe,OAAM,KAAA,EAM3B,OANKd,EAAGE,EAAAW,KAEgB,aAAb,QAARf,EAAAE,EAAIJ,YAAI,IAAAE,OAAA,EAARA,EAAUiB,QACZC,EAAS,0CAAAL,OAA2CX,EAAIJ,KAAK1B,YAE7D8C,EAAS,kCAAAL,OAAmCX,EAAIJ,KAAK1B,WAAa,KACnEgC,EAAAe,OAEMjB,SAAAA,EAAIJ,MAAI,KAAA,GAGsC,OAHtCM,EAAAC,KAAA,GAAAD,EAAAgB,GAAAhB,EAAA,MAAA,GAEfc,EAAU,oCAAqC,KAC/CG,QAAQC,MAAM,+BAA8BlB,EAAAgB,IAAShB,EAAAe,OAC9C,SAAA,CAAEF,OAAQ,SAAUK,MAAKlB,EAAAgB,KAAE,KAAA,GAAA,IAAA,MAAA,OAAAhB,EAAAmB,OAAA,GAAA1B,EAAA,KAAA,CAAA,CAAA,EAAA,KAErC,KAAA,OA9BYL,SAAmBgC,GAAA,OAAA/B,EAAAgC,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAqCnBC,EAAkB,SAC7BC,GAEA,OAAO,IAAIC,QAAO,WAAA,IAAAC,EAAArC,EAAAC,IAAAC,MAAC,SAAAoC,EAAOC,GAAO,OAAAtC,IAAAQ,MAAA,SAAA+B,GAAA,cAAAA,EAAA7B,KAAA6B,EAAA5B,MAAA,KAAA,EAAA,GAAA4B,EAAA7B,KAAA,EAGxBjB,OAAO+C,YAAW,CAAAD,EAAA5B,KAAA,EAAA,KAAA,CAAA,MACf,IAAI8B,MAAM,8BAA6B,KAAA,EAAA,OAAAF,EAAA5B,KAAA,EAG3BlB,OAAO+C,YAAYE,MAAKC,EAAAA,EAAA,CAAA,EACvCT,GAAM,GAAA,CACTU,SAAU,SAACC,GAETtB,EAAU,gCAAkCsB,EAASpE,WACrD6D,EAAQO,EACT,EACDC,QAAS,WACPvB,EAAU,gDAAiD,KAC3De,EAAQ,CACNhB,OAAQ,YACRyB,WAAW,EACXtE,UAAWyD,EAAOzD,WAEtB,KACA,KAAA,EAfS8D,EAAAnB,KAgBH4B,aAAaT,EAAA5B,KAAA,GAAA,MAAA,KAAA,EAAA4B,EAAA7B,KAAA,EAAA6B,EAAAd,GAAAc,EAAA,MAAA,GAErBb,QAAQC,MAAM,iCAAgCY,EAAAd,IAC9CF,EAAU,iCAAkC,KAC5Ce,EAAQ,CACNhB,OAAQ,SACRyB,WAAW,EACXtE,UAAWyD,EAAOzD,UAClBkD,MAAKY,EAAAd,KACoB,KAAA,GAAA,IAAA,MAAA,OAAAc,EAAAX,OAAA,GAAAS,EAAA,KAAA,CAAA,CAAA,EAAA,IAE9B,KAAA,OAAA,SAAAY,GAAA,OAAAb,EAAAN,MAAAC,KAAAC,UAAA,CAAC,CAlCgB,GAmCpB,EA4CsBkB,SAAAA,EAAmBC,GAAA,OAAAC,EAAAtB,MAAAC,KAAAC,UAAA,CAyIxC,SAAAoB,IAAA,OAAAA,EAAArD,EAAAC,IAAAC,MAzIM,SAAAoD,EACLC,GAA4B,IAAAC,EAAAC,EAAAC,EAAA,OAAAzD,IAAAQ,MAAA,SAAAkD,GAAA,cAAAA,EAAAhD,KAAAgD,EAAA/C,MAAA,KAAA,EAEgB,GAAxC2C,EAASK,GAAGL,EAASK,EAAEC,kBAEvBN,EAASO,cAAeP,EAASQ,eAAc,CAAAJ,EAAA/C,KAAA,EAAA,KAAA,CACwD,OAArG4C,EAAGrC,2CAAAA,OAA8CoC,EAASS,MAAK7C,aAAAA,OAAYoC,EAASU,QAAQC,UAAS,KAAAP,EAAA/C,KAAA,EACnFuD,EAAiBZ,EAASa,YAAcZ,GAAI,KAAA,EAArD,GAAAG,EAAAtC,KACD,CAAAsC,EAAA/C,KAAA,EAAA,KAAA,CAAA,OAAA+C,EAAAlC,OAAA,UAAA,KAAA,EAGRgC,EAAW,WAAA,IAAAY,EAAArE,EAAAC,IAAAC,MAAG,SAAAoE,IAAA,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAtE,EAAAvB,EAAA8F,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAAvF,IAAAQ,MAAA,SAAAgF,GAAA,cAAAA,EAAA9E,KAAA8E,EAAA7E,MAAA,KAAA,EAGlB,GAFA2C,EAASmC,UAAU,IAMfnC,EAASoC,OAAM,CAAAF,EAAA7E,KAAA,GAAA,KAAA,CAU2B,OATtC8D,EAAoCD,QAA9BA,EAAGlB,EAASqC,UAAU/F,gBAAnB4E,IAA2BA,OAA3BA,EAAAA,EAA6BoB,iBACtClB,EAAY5D,KAAKC,UAAU,CAC/B8E,KAAMvC,EAASoC,OACf7G,MAAOyE,EAASqC,UAAU9G,MAC1BiH,aAAcxC,EAASqC,UAAUG,aACjC7B,UAAWX,EAASqC,UAAU1B,YAG1BU,EAAiBoB,EAAW,OAAQrB,EAAW,KAAM,QACrDE,KAAG1D,OAAM8E,EAAY9E,YAAAA,OAAWuD,EAAM,qBAAAe,EAAA9E,KAAA,EAAA8E,EAAA7E,KAAA,EAGpBQ,MAAMyD,EAAKD,GAAe,KAAA,EAAnC,OAAPQ,EAAOK,EAAApE,KAAAoE,EAAA7E,KAAA,GACKwE,EAAQ9D,OAAM,KAAA,GAA1Bd,EAAGiF,EAAApE,KAETkD,EAAW/D,EAAI+D,UAAY,EACvB/D,EAAI0F,OACN1E,EAAUhB,EAAI0F,OAAQ,KACb1F,EAAI2F,IACb3E,EAASL,GAAAA,OAAIoD,2BACdkB,EAAA7E,KAAA,GAAA,MAAA,KAAA,GAAA6E,EAAA9E,KAAA,GAAA8E,EAAA/D,GAAA+D,EAAA,MAAA,GAED9D,QAAQC,MAAM,2BAA0B6D,EAAA/D,IACxCF,EAAU,4BAA6B,KAAK,KAAA,GAAA,IAK5C+C,EAAQ,CAAAkB,EAAA7E,KAAA,GAAA,KAAA,CAAA,GACO,MAAb2D,EAAgB,CAAAkB,EAAA7E,KAAA,GAAA,KAAA,CAEI,OADtB2C,EAAS6C,eAAe,CAAE1H,UAASyC,WAAAA,OAAaoC,EAASoC,UACzDpC,EAASmC,UAAU,GAAGD,EAAAhE,OAAA,UAAA,KAAA,GAIlBxC,EAASoH,EACb9C,EAASqC,UAAU3G,OACnBsF,GAGF/C,EAAUvC,EAAOiH,OAAQ,KACzB1B,EAAY5B,EAAAA,EAAA,CAAA,EACPW,EAASqC,WACT3G,GACHwG,EAAA7E,KAAA,GAAA,MAAA,KAAA,GAEF4D,EAAejB,EAASqC,UAAU,KAAA,GAqBY,GAjB5CrC,EAAS+C,gBACLvB,EAAMxB,EAAS+C,cAAgB,IAE/BtB,EAAcR,EAAavF,QAAU,EAAI8F,GAEzCE,EAAgBsB,WAAWvB,EAAYwB,QAAQ,IAG/CtB,EAAeD,EAAgBT,EAAavF,OAG5CkG,EACJD,EAAe,IAAOV,EAAavF,OAAS,IAAOgG,EAErDT,EAAavF,OAASkG,GAGlBC,EAAU7G,EAAmBiG,IAE/BA,EAAavF,OAAM,CAAAwG,EAAA7E,KAAA,GAAA,KAAA,CAAA,IACjB4D,EAAa/F,qBAAsB8E,EAASkD,cAAa,CAAAhB,EAAA7E,KAAA,GAAA,KAAA,CAE+F,OAApJ4C,8CAAGrC,OAA+CoC,EAASkD,cAAcC,cAAcC,mCAASxF,OAAwBoC,EAASkD,cAAcG,MAAK,KAAAnB,EAAA7E,KAAA,GACpIuD,EAAiBX,GAAK,GAAK,KAAA,GAApC,IAAAiC,EAAApE,KAEF,CAAAoE,EAAA7E,KAAA,GAAA,KAAA,CAAA,OAAA6E,EAAA7E,KAAA,GAESd,EAAoBsF,GAAQ,KAAA,GAAxC5E,EAAGiF,EAAApE,KACTkC,EAAS6C,eAAe5F,GAAKiF,EAAA7E,KAAA,GAAA,MAAA,KAAA,GAAA,OAAA6E,EAAA7E,KAAA,GAGHsB,EAAgBkD,GAAQ,KAAA,GAA5CG,EAAWE,EAAApE,KAEjBkC,EAAS6C,eAAeb,GAAa,KAAA,GAAAE,EAAA7E,KAAA,GAAA,MAAA,KAAA,GAIJ,OAAnCe,QAAQkF,IAAI,uBAAuBpB,EAAA7E,KAAA,GACTsB,EAAgBkD,GAAQ,KAAA,GAA5CG,EAAWE,EAAApE,KACjBkC,EAAS6C,eAAeb,GAAa,KAAA,GAAAE,EAAA7E,KAAA,GAAA,MAAA,KAAA,GAIvC2C,EAAS6C,iBAAiB,KAAA,GAG5B7C,EAASmC,UAAU,GAAG,KAAA,GAAA,IAAA,MAAA,OAAAD,EAAA5D,OAAA,GAAAyC,EAAA,KAAA,CAAA,CAAA,EAAA,KACvB,KAAA,OAAA,WAzGgB,OAAAD,EAAAtC,MAAAC,KAAAC,UAAA,EAAA,GA4GX6E,EAAkB,WAAA,IAAAC,EAAA/G,EAAAC,IAAAC,MAAG,SAAA8G,IAAA,IAAAC,EAAA,OAAAhH,IAAAQ,MAAA,SAAAyG,GAAA,cAAAA,EAAAvG,KAAAuG,EAAAtG,MAAA,KAAA,EAAA,GACpB2C,EAASqC,UAAU9G,MAAK,CAAAoI,EAAAtG,KAAA,GAAA,KAAA,CAAA,OAAAsG,EAAAtG,KAAA,EACFuG,EAAuB5D,EAASS,OAAM,KAAA,EAA/C,KAAViD,EAAUC,EAAA7F,MACF,CAAA6F,EAAAtG,KAAA,GAAA,KAAA,CACZ2C,EAASqC,UAAU9G,MAAQmI,EAC3BG,EAAU,QAASH,EAAY,GAC/BxD,IAAcyD,EAAAtG,KAAA,GAAA,MAAA,KAAA,GAEqC,OAAnDY,EAAU,mCAAoC,KAAK0F,EAAAtG,KAAA,GAC7CkG,IAAoB,KAAA,GAAAI,EAAAtG,KAAA,GAAA,MAAA,KAAA,GAG5BwG,EAAU,QAAS7D,EAASqC,UAAU9G,MAAO,GAC7C2E,IAAc,KAAA,GAAA,IAAA,MAAA,OAAAyD,EAAArF,OAAA,GAAAmF,EAEjB,KAAA,OAAA,WAfuB,OAAAD,EAAAhF,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAiBxB6E,IAAqB,KAAA,GAAA,IAAA,MAAA,OAAAnD,EAAA9B,OAAA,GAAAyB,EACtB,KAAAD,EAAAtB,MAAAC,KAAAC,UAAA"}
@@ -1,2 +1,2 @@
1
- import{asyncToGenerator as r,regeneratorRuntime as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";var n=function(){var n=r(e().mark((function r(n,t){var u,a,s;return e().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(a=t.headers["x-instincthub-next-header"],s=t.headers.username,(null==n||null===(u=n.user)||void 0===u||null===(u=u.name)||void 0===u?void 0:u.username)===s&&a===process.env.NEXT_PUBLIC_X_INSTINCTHUB_NEXT_HEADER){r.next=4;break}return r.abrupt("return",!1);case 4:return r.abrupt("return",!0);case 5:case"end":return r.stop()}}),r)})));return function(r,e){return n.apply(this,arguments)}}(),t=function(){var n=r(e().mark((function r(n){return e().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(n.headers["x-instincthub-next-header"]===process.env.NEXT_PUBLIC_X_INSTINCTHUB_NEXT_HEADER){r.next=3;break}return r.abrupt("return",!1);case 3:return r.abrupt("return",!0);case 4:case"end":return r.stop()}}),r)})));return function(r){return n.apply(this,arguments)}}();export{t as headerKeyPermission,n as headerUsernamePermission};
1
+ import{asyncToGenerator as r,regeneratorRuntime as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";var n=function(){var n=r(e().mark((function r(n,t){var u,a,s;return e().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(a=t.headers["x-instincthub-next-header"],s=t.headers.username,(null==n||null===(u=n.user)||void 0===u||null===(u=u.name)||void 0===u?void 0:u.username)===s&&a===process.env.NEXT_PUBLIC_X_INSTINCTHUB_NEXT_HEADER){r.next=4;break}return r.abrupt("return",!1);case 4:return r.abrupt("return",!0);case 5:case"end":return r.stop()}}),r)})));return function(r,e){return n.apply(this,arguments)}}(),t=function(){var n=r(e().mark((function r(n){return e().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(n.headers["x-instincthub-next-header"]===process.env.NEXT_PUBLIC_X_INSTINCTHUB_NEXT_HEADER){r.next=3;break}return r.abrupt("return",!1);case 3:return r.abrupt("return",!0);case 4:case"end":return r.stop()}}),r)})));return function(r){return n.apply(this,arguments)}}(),u=function(r,e){return r.find((function(r){return e}))};export{u as findPermissions,t as headerKeyPermission,n as headerUsernamePermission};
2
2
  //# sourceMappingURL=permissions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sources":["../../../../src/components/lib/permissions.ts"],"sourcesContent":["import { NextApiRequest } from 'next';\r\n\r\ninterface Session {\r\n user: {\r\n name: {\r\n username: string;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Validates if the request has valid username and custom header\r\n * @param session - User session from NextAuth\r\n * @param req - Next.js API request object\r\n * @returns Promise<boolean> - True if the request has valid permissions\r\n */\r\nexport const headerUsernamePermission = async (\r\n session: Session | null,\r\n req: NextApiRequest\r\n): Promise<boolean> => {\r\n const customHeader = req.headers[\"x-instincthub-next-header\"] as string;\r\n const headerUsername = req.headers[\"username\"] as string;\r\n\r\n // Fixed logic error in the original code (negation was incorrectly applied)\r\n if (\r\n session?.user?.name?.username !== headerUsername ||\r\n customHeader !== process.env.NEXT_PUBLIC_X_INSTINCTHUB_NEXT_HEADER\r\n ) {\r\n return false;\r\n }\r\n \r\n return true;\r\n};\r\n\r\n/**\r\n * Validates if the request has a valid custom header\r\n * @param req - Next.js API request object\r\n * @returns Promise<boolean> - True if the request has a valid header\r\n */\r\nexport const headerKeyPermission = async (\r\n req: NextApiRequest\r\n): Promise<boolean> => {\r\n const customHeader = req.headers[\"x-instincthub-next-header\"] as string;\r\n\r\n if (customHeader !== process.env.NEXT_PUBLIC_X_INSTINCTHUB_NEXT_HEADER) {\r\n return false;\r\n }\r\n \r\n return true;\r\n};"],"names":["headerUsernamePermission","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","session","req","_session$user","customHeader","headerUsername","wrap","_context","prev","next","headers","user","name","username","process","env","NEXT_PUBLIC_X_INSTINCTHUB_NEXT_HEADER","abrupt","stop","_x","_x2","apply","this","arguments","headerKeyPermission","_ref2","_callee2","_context2","_x3"],"mappings":"8GAgBaA,EAAwB,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,MAAG,SAAAC,EACtCC,EACAC,GAAmB,IAAAC,EAAAC,EAAAC,EAAA,OAAAP,IAAAQ,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAKnB,GAHML,EAAeF,EAAIQ,QAAQ,6BAC3BL,EAAiBH,EAAIQ,QAAkB,UAI3CT,SAAa,QAANE,EAAPF,EAASU,YAAI,IAAAR,GAAMA,QAANA,EAAbA,EAAeS,YAAfT,IAAmBA,OAAnBA,EAAAA,EAAqBU,YAAaR,GAClCD,IAAiBU,QAAQC,IAAIC,sCAAqC,CAAAT,EAAAE,KAAA,EAAA,KAAA,CAAA,OAAAF,EAAAU,OAAA,UAE3D,GAAK,KAAA,EAAA,OAAAV,EAAAU,OAAA,UAGP,GAAI,KAAA,EAAA,IAAA,MAAA,OAAAV,EAAAW,OAAA,GAAAlB,EACZ,KAAA,OAAA,SAhBoCmB,EAAAC,GAAA,OAAAxB,EAAAyB,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAuBxBC,EAAmB,WAAA,IAAAC,EAAA5B,EAAAC,IAAAC,MAAG,SAAA2B,EACjCxB,GAAmB,OAAAJ,IAAAQ,MAAA,SAAAqB,GAAA,cAAAA,EAAAnB,KAAAmB,EAAAlB,MAAA,KAAA,EAEoD,GAAlDP,EAAIQ,QAAQ,+BAEZI,QAAQC,IAAIC,sCAAqC,CAAAW,EAAAlB,KAAA,EAAA,KAAA,CAAA,OAAAkB,EAAAV,OAAA,UAC7D,GAAK,KAAA,EAAA,OAAAU,EAAAV,OAAA,UAGP,GAAI,KAAA,EAAA,IAAA,MAAA,OAAAU,EAAAT,OAAA,GAAAQ,EACZ,KAAA,OAVYF,SAAmBI,GAAA,OAAAH,EAAAJ,MAAAC,KAAAC,UAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"permissions.js","sources":["../../../../src/components/lib/permissions.ts"],"sourcesContent":["import { NextApiRequest } from \"next\";\r\n\r\ninterface Session {\r\n user: {\r\n name: {\r\n username: string;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Validates if the request has valid username and custom header\r\n * @param session - User session from NextAuth\r\n * @param req - Next.js API request object\r\n * @returns Promise<boolean> - True if the request has valid permissions\r\n */\r\nexport const headerUsernamePermission = async (\r\n session: Session | null,\r\n req: NextApiRequest\r\n): Promise<boolean> => {\r\n const customHeader = req.headers[\"x-instincthub-next-header\"] as string;\r\n const headerUsername = req.headers[\"username\"] as string;\r\n\r\n // Fixed logic error in the original code (negation was incorrectly applied)\r\n if (\r\n session?.user?.name?.username !== headerUsername ||\r\n customHeader !== process.env.NEXT_PUBLIC_X_INSTINCTHUB_NEXT_HEADER\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * Validates if the request has a valid custom header\r\n * @param req - Next.js API request object\r\n * @returns Promise<boolean> - True if the request has a valid header\r\n */\r\nexport const headerKeyPermission = async (\r\n req: NextApiRequest\r\n): Promise<boolean> => {\r\n const customHeader = req.headers[\"x-instincthub-next-header\"] as string;\r\n\r\n if (customHeader !== process.env.NEXT_PUBLIC_X_INSTINCTHUB_NEXT_HEADER) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * Finds a permission in an array of permissions\r\n * @example\r\n * ```ts\r\n * findPermissions(REGISTRAR_PERMISSION, instructorType)\r\n * ```\r\n * @param permission - Array of permissions\r\n * @param option - Permission to find\r\n * @returns string | undefined - Permission if found, undefined if not found\r\n */\r\nexport const findPermissions = (\r\n permission: string[],\r\n option: string\r\n): string | undefined => {\r\n // Get array of permissions and user option and check if exist.\r\n return permission.find((i) => (i = option));\r\n};\r\n"],"names":["headerUsernamePermission","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","session","req","_session$user","customHeader","headerUsername","wrap","_context","prev","next","headers","user","name","username","process","env","NEXT_PUBLIC_X_INSTINCTHUB_NEXT_HEADER","abrupt","stop","_x","_x2","apply","this","arguments","headerKeyPermission","_ref2","_callee2","_context2","_x3","findPermissions","permission","option","find","i"],"mappings":"8GAgBaA,EAAwB,WAAA,IAAAC,EAAAC,EAAAC,IAAAC,MAAG,SAAAC,EACtCC,EACAC,GAAmB,IAAAC,EAAAC,EAAAC,EAAA,OAAAP,IAAAQ,MAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAKnB,GAHML,EAAeF,EAAIQ,QAAQ,6BAC3BL,EAAiBH,EAAIQ,QAAkB,UAI3CT,SAAa,QAANE,EAAPF,EAASU,YAAI,IAAAR,GAAMA,QAANA,EAAbA,EAAeS,YAAfT,IAAmBA,OAAnBA,EAAAA,EAAqBU,YAAaR,GAClCD,IAAiBU,QAAQC,IAAIC,sCAAqC,CAAAT,EAAAE,KAAA,EAAA,KAAA,CAAA,OAAAF,EAAAU,OAAA,UAE3D,GAAK,KAAA,EAAA,OAAAV,EAAAU,OAAA,UAGP,GAAI,KAAA,EAAA,IAAA,MAAA,OAAAV,EAAAW,OAAA,GAAAlB,EACZ,KAAA,OAAA,SAhBoCmB,EAAAC,GAAA,OAAAxB,EAAAyB,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAuBxBC,EAAmB,WAAA,IAAAC,EAAA5B,EAAAC,IAAAC,MAAG,SAAA2B,EACjCxB,GAAmB,OAAAJ,IAAAQ,MAAA,SAAAqB,GAAA,cAAAA,EAAAnB,KAAAmB,EAAAlB,MAAA,KAAA,EAEoD,GAAlDP,EAAIQ,QAAQ,+BAEZI,QAAQC,IAAIC,sCAAqC,CAAAW,EAAAlB,KAAA,EAAA,KAAA,CAAA,OAAAkB,EAAAV,OAAA,UAC7D,GAAK,KAAA,EAAA,OAAAU,EAAAV,OAAA,UAGP,GAAI,KAAA,EAAA,IAAA,MAAA,OAAAU,EAAAT,OAAA,GAAAQ,EACZ,KAAA,OAVYF,SAAmBI,GAAA,OAAAH,EAAAJ,MAAAC,KAAAC,UAAA,CAAA,CAAA,GAsBnBM,EAAkB,SAC7BC,EACAC,GAGA,OAAOD,EAAWE,MAAK,SAACC,GAAC,OAAUF,CAAM,GAC3C"}
@@ -1,2 +1,2 @@
1
- export{makeReduxStore,reduxStore,useDispatch,useSelector}from"./store.js";export{courseFilterSubject}from"./slices/courseSlice/courseFilterSubject.js";export{courseFilterLevel}from"./slices/courseSlice/courseFilterLevel.js";export{courseFilterDuration}from"./slices/courseSlice/courseFilterDuration.js";export{courseSearch}from"./slices/courseSlice/courseSearch.js";export{stepQuestions}from"./slices/courseSlice/stepQuestions.js";export{stepContent}from"./slices/courseSlice/stepContent.js";export{videoTimestamp}from"./slices/courseSlice/videoTimestamp.js";export{videoTimestampObject}from"./slices/courseSlice/videoTimestampObject.js";export{courseModules}from"./slices/courseSlice/courseModules.js";export{courseOverview}from"./slices/courseSlice/courseOverview.js";export{selectCourseDetails,selectCourseFilterDuration,selectCourseFilterLevel,selectCourseFilterSubject,selectCourseModules,selectCourseOverview,selectCourseSearch,selectStepContent,selectStepQuestions,selectVideoTimestamp,selectVideoTimestampObject}from"./slices/courseSlice/selectors.js";export{appToggle}from"./slices/navigationSlice/appToggle.js";export{toggleCreateCourse}from"./slices/navigationSlice/toggleCreateCourse.js";export{toggleCreateCohort}from"./slices/navigationSlice/toggleCreateCohort.js";export{statusMessageState}from"./slices/navigationSlice/statusMessageState.js";export{confirmDelete}from"./slices/navigationSlice/confirmDelete.js";export{selectAppToggle,selectConfirmDelete,selectIPAdress,selectStatusMessageState,selectToggleCreateCohort,selectToggleCreateCourse,selectToggleCreateTrack}from"./slices/navigationSlice/selectors.js";export{IPAdress}from"./slices/navigationSlice/IPAdress.js";export{activeChannel}from"./slices/channelSlice/activeChannel.js";export{channelDetails}from"./slices/channelSlice/channelDetails.js";export{instructorChannelList}from"./slices/channelSlice/instructorChannelList.js";export{channelHandle}from"./slices/channelSlice/channelHandle.js";export{selectActiveChannel,selectChannelDetails,selectChannelHandle,selectInstructorChannelList}from"./slices/channelSlice/selectors.js";
1
+ export{makeReduxStore,reduxStore,useDispatch,useSelector}from"./store.js";export{courseFilterSubject}from"./slices/courseSlice/courseFilterSubject.js";export{courseFilterLevel}from"./slices/courseSlice/courseFilterLevel.js";export{courseFilterDuration}from"./slices/courseSlice/courseFilterDuration.js";export{courseSearch}from"./slices/courseSlice/courseSearch.js";export{stepQuestions}from"./slices/courseSlice/stepQuestions.js";export{stepContent}from"./slices/courseSlice/stepContent.js";export{videoTimestamp}from"./slices/courseSlice/videoTimestamp.js";export{videoTimestampObject}from"./slices/courseSlice/videoTimestampObject.js";export{courseModules}from"./slices/courseSlice/courseModules.js";export{courseOverview}from"./slices/courseSlice/courseOverview.js";export{selectCourseDetails,selectCourseFilterDuration,selectCourseFilterLevel,selectCourseFilterSubject,selectCourseModules,selectCourseOverview,selectCourseSearch,selectStepContent,selectStepQuestions,selectVideoTimestamp,selectVideoTimestampObject}from"./slices/courseSlice/selectors.js";export{appToggle}from"./slices/navigationSlice/appToggle.js";export{toggleCreateCourse}from"./slices/navigationSlice/toggleCreateCourse.js";export{toggleCreateCohort}from"./slices/navigationSlice/toggleCreateCohort.js";export{statusMessageState}from"./slices/navigationSlice/statusMessageState.js";export{confirmDelete}from"./slices/navigationSlice/confirmDelete.js";export{selectAppToggle,selectConfirmDelete,selectIPAdress,selectStatusMessageState,selectToggleCreateCohort,selectToggleCreateCourse,selectToggleCreateTrack}from"./slices/navigationSlice/selectors.js";export{IPAdress}from"./slices/navigationSlice/IPAdress.js";export{activeChannel}from"./slices/channelSlice/activeChannel.js";export{channelDetails}from"./slices/channelSlice/channelDetails.js";export{instructorChannelList}from"./slices/channelSlice/instructorChannelList.js";export{channelHandle}from"./slices/channelSlice/channelHandle.js";export{selectActiveChannel,selectChannelDetails,selectChannelHandle,selectInstructorChannelList}from"./slices/channelSlice/selectors.js";export{clearObject,objectSlice,setObject,updateObject}from"./slices/generics/objectSlice.js";export{addToArray,arraySlice,clearArray,removeFromArray,setArray,updateInArray}from"./slices/generics/arraySlice.js";export{selectCallbackUrl}from"./slices/authSlice/selectors.js";export{selectArraySlice,selectObjectSlice}from"./slices/generics/selectors.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import{courseFilterSubject as e}from"./slices/courseSlice/courseFilterSubject.js";import{courseFilterLevel as r}from"./slices/courseSlice/courseFilterLevel.js";import{courseFilterDuration as s}from"./slices/courseSlice/courseFilterDuration.js";import{courseSearch as c}from"./slices/courseSlice/courseSearch.js";import{stepQuestions as i}from"./slices/courseSlice/stepQuestions.js";import{stepContent as o}from"./slices/courseSlice/stepContent.js";import{videoTimestamp as l}from"./slices/courseSlice/videoTimestamp.js";import{videoTimestampObject as t}from"./slices/courseSlice/videoTimestampObject.js";import{courseModules as a}from"./slices/courseSlice/courseModules.js";import{courseOverview as u}from"./slices/courseSlice/courseOverview.js";import{appToggle as m}from"./slices/navigationSlice/appToggle.js";import{toggleCreateCourse as n}from"./slices/navigationSlice/toggleCreateCourse.js";import{toggleCreateCohort as p}from"./slices/navigationSlice/toggleCreateCohort.js";import{statusMessageState as d}from"./slices/navigationSlice/statusMessageState.js";import{confirmDelete as S}from"./slices/navigationSlice/confirmDelete.js";import{IPAdress as j}from"./slices/navigationSlice/IPAdress.js";import{activeChannel as f}from"./slices/channelSlice/activeChannel.js";import{channelDetails as g}from"./slices/channelSlice/channelDetails.js";import{instructorChannelList as v}from"./slices/channelSlice/instructorChannelList.js";import{channelHandle as h}from"./slices/channelSlice/channelHandle.js";import{channelCallbackUrl as C}from"./slices/authSlice/channelCallbackUrl.js";import{courseDetails as D}from"./slices/courseSlice/courseDetails.js";var b={subjects:e.reducer,levels:r.reducer,durations:s.reducer,courseSearch:c.reducer,callbackUrl:C.reducer,stepQuestions:i.reducer,stepContent:o.reducer,courseDetails:D.reducer,videoTimestamp:l.reducer,videoTimestampObject:t.reducer,appToggle:m.reducer,toggleCreateCourse:n.reducer,statusMessageState:d.reducer,courseOverview:u.reducer,confirmDelete:S.reducer,IPAdress:j.reducer,courseModules:a.reducer,activeChannel:f.reducer,toggleCreateCohort:p.reducer,channelDetails:g.reducer,instructorChannelList:v.reducer,channelHandle:h.reducer};export{b as reducer};
1
+ import{courseFilterSubject as e}from"./slices/courseSlice/courseFilterSubject.js";import{courseFilterLevel as r}from"./slices/courseSlice/courseFilterLevel.js";import{courseFilterDuration as s}from"./slices/courseSlice/courseFilterDuration.js";import{courseSearch as c}from"./slices/courseSlice/courseSearch.js";import{stepQuestions as i}from"./slices/courseSlice/stepQuestions.js";import{stepContent as o}from"./slices/courseSlice/stepContent.js";import{videoTimestamp as l}from"./slices/courseSlice/videoTimestamp.js";import{videoTimestampObject as t}from"./slices/courseSlice/videoTimestampObject.js";import{courseModules as a}from"./slices/courseSlice/courseModules.js";import{courseOverview as u}from"./slices/courseSlice/courseOverview.js";import{appToggle as m}from"./slices/navigationSlice/appToggle.js";import{toggleCreateCourse as n}from"./slices/navigationSlice/toggleCreateCourse.js";import{toggleCreateCohort as p}from"./slices/navigationSlice/toggleCreateCohort.js";import{statusMessageState as d}from"./slices/navigationSlice/statusMessageState.js";import{confirmDelete as S}from"./slices/navigationSlice/confirmDelete.js";import{IPAdress as j}from"./slices/navigationSlice/IPAdress.js";import{activeChannel as f}from"./slices/channelSlice/activeChannel.js";import{channelDetails as g}from"./slices/channelSlice/channelDetails.js";import{instructorChannelList as v}from"./slices/channelSlice/instructorChannelList.js";import{channelHandle as h}from"./slices/channelSlice/channelHandle.js";import{objectSlice as C}from"./slices/generics/objectSlice.js";import{arraySlice as b}from"./slices/generics/arraySlice.js";import{channelCallbackUrl as D}from"./slices/authSlice/channelCallbackUrl.js";import{courseDetails as T}from"./slices/courseSlice/courseDetails.js";var M={objectSlice:C.reducer,arraySlice:b.reducer,subjects:e.reducer,levels:r.reducer,durations:s.reducer,courseSearch:c.reducer,callbackUrl:D.reducer,stepQuestions:i.reducer,stepContent:o.reducer,courseDetails:T.reducer,videoTimestamp:l.reducer,videoTimestampObject:t.reducer,appToggle:m.reducer,toggleCreateCourse:n.reducer,statusMessageState:d.reducer,courseOverview:u.reducer,confirmDelete:S.reducer,IPAdress:j.reducer,courseModules:a.reducer,activeChannel:f.reducer,toggleCreateCohort:p.reducer,channelDetails:g.reducer,instructorChannelList:v.reducer,channelHandle:h.reducer};export{M as reducer};
2
2
  //# sourceMappingURL=rootReducer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rootReducer.js","sources":["../../../../../src/components/lib/redux/rootReducer.ts"],"sourcesContent":["/* Instruments */\r\nimport {\r\n\tcourseFilterSubject,\r\n\tcourseFilterLevel,\r\n\tcourseFilterDuration,\r\n\tcourseSearch,\r\n\tstepQuestions,\r\n\tstepContent,\r\n\tvideoTimestamp,\r\n\tvideoTimestampObject,\r\n\tappToggle,\r\n\ttoggleCreateCourse,\r\n\tcourseModules,\r\n\tactiveChannel,\r\n\ttoggleCreateCohort,\r\n\tcourseOverview,\r\n\tstatusMessageState,\r\n\tchannelDetails,\r\n\tinstructorChannelList,\r\n\tchannelHandle,\r\n\tconfirmDelete,\r\n\tIPAdress,\r\n} from \"./slices\";\r\nimport { channelCallbackUrl } from \"./slices/authSlice\";\r\nimport { courseDetails } from \"./slices/courseSlice/courseDetails\";\r\n\r\nexport const reducer = {\r\n\tsubjects: courseFilterSubject.reducer,\r\n\tlevels: courseFilterLevel.reducer,\r\n\tdurations: courseFilterDuration.reducer,\r\n\tcourseSearch: courseSearch.reducer,\r\n\tcallbackUrl: channelCallbackUrl.reducer,\r\n\tstepQuestions: stepQuestions.reducer,\r\n\tstepContent: stepContent.reducer,\r\n\tcourseDetails: courseDetails.reducer,\r\n\tvideoTimestamp: videoTimestamp.reducer,\r\n\tvideoTimestampObject: videoTimestampObject.reducer,\r\n\r\n\t// navigation\r\n\tappToggle: appToggle.reducer,\r\n\ttoggleCreateCourse: toggleCreateCourse.reducer,\r\n\tstatusMessageState: statusMessageState.reducer,\r\n\tcourseOverview: courseOverview.reducer,\r\n\tconfirmDelete: confirmDelete.reducer,\r\n\tIPAdress: IPAdress.reducer,\r\n\r\n\tcourseModules: courseModules.reducer,\r\n\tactiveChannel: activeChannel.reducer,\r\n\r\n\t// cohorts\r\n\ttoggleCreateCohort: toggleCreateCohort.reducer,\r\n\r\n\t// Channel\r\n\tchannelDetails: channelDetails.reducer,\r\n\tinstructorChannelList: instructorChannelList.reducer,\r\n\tchannelHandle: channelHandle.reducer,\r\n};\r\n"],"names":["reducer","subjects","courseFilterSubject","levels","courseFilterLevel","durations","courseFilterDuration","courseSearch","callbackUrl","channelCallbackUrl","stepQuestions","stepContent","courseDetails","videoTimestamp","videoTimestampObject","appToggle","toggleCreateCourse","statusMessageState","courseOverview","confirmDelete","IPAdress","courseModules","activeChannel","toggleCreateCohort","channelDetails","instructorChannelList","channelHandle"],"mappings":"onDA0BO,IAAMA,EAAU,CACtBC,SAAUC,EAAoBF,QAC9BG,OAAQC,EAAkBJ,QAC1BK,UAAWC,EAAqBN,QAChCO,aAAcA,EAAaP,QAC3BQ,YAAaC,EAAmBT,QAChCU,cAAeA,EAAcV,QAC7BW,YAAaA,EAAYX,QACzBY,cAAeA,EAAcZ,QAC7Ba,eAAgBA,EAAeb,QAC/Bc,qBAAsBA,EAAqBd,QAG3Ce,UAAWA,EAAUf,QACrBgB,mBAAoBA,EAAmBhB,QACvCiB,mBAAoBA,EAAmBjB,QACvCkB,eAAgBA,EAAelB,QAC/BmB,cAAeA,EAAcnB,QAC7BoB,SAAUA,EAASpB,QAEnBqB,cAAeA,EAAcrB,QAC7BsB,cAAeA,EAActB,QAG7BuB,mBAAoBA,EAAmBvB,QAGvCwB,eAAgBA,EAAexB,QAC/ByB,sBAAuBA,EAAsBzB,QAC7C0B,cAAeA,EAAc1B"}
1
+ {"version":3,"file":"rootReducer.js","sources":["../../../../../src/components/lib/redux/rootReducer.ts"],"sourcesContent":["/* Instruments */\r\nimport {\r\n courseFilterSubject,\r\n courseFilterLevel,\r\n courseFilterDuration,\r\n courseSearch,\r\n stepQuestions,\r\n stepContent,\r\n videoTimestamp,\r\n videoTimestampObject,\r\n appToggle,\r\n toggleCreateCourse,\r\n courseModules,\r\n activeChannel,\r\n toggleCreateCohort,\r\n courseOverview,\r\n statusMessageState,\r\n channelDetails,\r\n instructorChannelList,\r\n channelHandle,\r\n confirmDelete,\r\n IPAdress,\r\n objectSlice,\r\n arraySlice,\r\n} from \"./slices\";\r\nimport { channelCallbackUrl } from \"./slices/authSlice\";\r\nimport { courseDetails } from \"./slices/courseSlice/courseDetails\";\r\n\r\nexport const reducer = {\r\n objectSlice: objectSlice.reducer,\r\n arraySlice: arraySlice.reducer,\r\n\r\n // course\r\n subjects: courseFilterSubject.reducer,\r\n levels: courseFilterLevel.reducer,\r\n durations: courseFilterDuration.reducer,\r\n courseSearch: courseSearch.reducer,\r\n callbackUrl: channelCallbackUrl.reducer,\r\n stepQuestions: stepQuestions.reducer,\r\n stepContent: stepContent.reducer,\r\n courseDetails: courseDetails.reducer,\r\n videoTimestamp: videoTimestamp.reducer,\r\n videoTimestampObject: videoTimestampObject.reducer,\r\n\r\n // navigation\r\n appToggle: appToggle.reducer,\r\n toggleCreateCourse: toggleCreateCourse.reducer,\r\n statusMessageState: statusMessageState.reducer,\r\n courseOverview: courseOverview.reducer,\r\n confirmDelete: confirmDelete.reducer,\r\n IPAdress: IPAdress.reducer,\r\n\r\n courseModules: courseModules.reducer,\r\n activeChannel: activeChannel.reducer,\r\n\r\n // cohorts\r\n toggleCreateCohort: toggleCreateCohort.reducer,\r\n\r\n // Channel\r\n channelDetails: channelDetails.reducer,\r\n instructorChannelList: instructorChannelList.reducer,\r\n channelHandle: channelHandle.reducer,\r\n};\r\n"],"names":["reducer","objectSlice","arraySlice","subjects","courseFilterSubject","levels","courseFilterLevel","durations","courseFilterDuration","courseSearch","callbackUrl","channelCallbackUrl","stepQuestions","stepContent","courseDetails","videoTimestamp","videoTimestampObject","appToggle","toggleCreateCourse","statusMessageState","courseOverview","confirmDelete","IPAdress","courseModules","activeChannel","toggleCreateCohort","channelDetails","instructorChannelList","channelHandle"],"mappings":"gvDA4BO,IAAMA,EAAU,CACrBC,YAAaA,EAAYD,QACzBE,WAAYA,EAAWF,QAGvBG,SAAUC,EAAoBJ,QAC9BK,OAAQC,EAAkBN,QAC1BO,UAAWC,EAAqBR,QAChCS,aAAcA,EAAaT,QAC3BU,YAAaC,EAAmBX,QAChCY,cAAeA,EAAcZ,QAC7Ba,YAAaA,EAAYb,QACzBc,cAAeA,EAAcd,QAC7Be,eAAgBA,EAAef,QAC/BgB,qBAAsBA,EAAqBhB,QAG3CiB,UAAWA,EAAUjB,QACrBkB,mBAAoBA,EAAmBlB,QACvCmB,mBAAoBA,EAAmBnB,QACvCoB,eAAgBA,EAAepB,QAC/BqB,cAAeA,EAAcrB,QAC7BsB,SAAUA,EAAStB,QAEnBuB,cAAeA,EAAcvB,QAC7BwB,cAAeA,EAAcxB,QAG7ByB,mBAAoBA,EAAmBzB,QAGvC0B,eAAgBA,EAAe1B,QAC/B2B,sBAAuBA,EAAsB3B,QAC7C4B,cAAeA,EAAc5B"}
@@ -0,0 +1,2 @@
1
+ var r=function(r){return r.callbackUrl.value};export{r as selectCallbackUrl};
2
+ //# sourceMappingURL=selectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.js","sources":["../../../../../../../src/components/lib/redux/slices/authSlice/selectors.ts"],"sourcesContent":["/* Instruments */\r\n\r\nimport { ReduxState } from \"../../store\";\r\n\r\nexport const selectCallbackUrl = (state: ReduxState) => state.callbackUrl.value;\r\n"],"names":["selectCallbackUrl","state","callbackUrl","value"],"mappings":"IAIaA,EAAoB,SAACC,GAAiB,OAAKA,EAAMC,YAAYC,KAAK"}
@@ -0,0 +1,2 @@
1
+ import{createSlice as a}from"@reduxjs/toolkit";var r=a({name:"array",initialState:{value:[],status:"idle"},reducers:{setArray:function(a,r){a.value=r.payload},addToArray:function(a,r){a.value.push(r.payload)},removeFromArray:function(a,r){a.value.splice(r.payload,1)},clearArray:function(a){a.value=[]},updateInArray:function(a,r){var e=r.payload,o=e.index,t=e.value;o>=0&&o<a.value.length&&(a.value[o]=t)}}}),e=r.actions,o=e.setArray,t=e.addToArray,l=e.removeFromArray,u=e.clearArray,n=e.updateInArray;export{t as addToArray,r as arraySlice,u as clearArray,l as removeFromArray,o as setArray,n as updateInArray};
2
+ //# sourceMappingURL=arraySlice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arraySlice.js","sources":["../../../../../../../src/components/lib/redux/slices/generics/arraySlice.ts"],"sourcesContent":["import { createSlice, type PayloadAction } from \"@reduxjs/toolkit\";\r\n\r\ninterface ArrayState<T = any> {\r\n value: T[];\r\n status: \"idle\" | \"loading\" | \"failed\";\r\n}\r\n\r\nconst initialState: ArrayState = {\r\n value: [],\r\n status: \"idle\",\r\n};\r\n\r\nexport const arraySlice = createSlice({\r\n name: \"array\",\r\n initialState,\r\n reducers: {\r\n setArray(state, action: PayloadAction<any[]>) {\r\n state.value = action.payload;\r\n },\r\n addToArray(state, action: PayloadAction<any>) {\r\n state.value.push(action.payload);\r\n },\r\n removeFromArray(state, action: PayloadAction<number>) {\r\n state.value.splice(action.payload, 1);\r\n },\r\n clearArray(state) {\r\n state.value = [];\r\n },\r\n updateInArray(state, action: PayloadAction<{ index: number; value: any }>) {\r\n const { index, value } = action.payload;\r\n if (index >= 0 && index < state.value.length) {\r\n state.value[index] = value;\r\n }\r\n },\r\n },\r\n});\r\n\r\nexport const {\r\n setArray,\r\n addToArray,\r\n removeFromArray,\r\n clearArray,\r\n updateInArray,\r\n} = arraySlice.actions;\r\n\r\nexport type { ArrayState };\r\n"],"names":["arraySlice","createSlice","name","initialState","value","status","reducers","setArray","state","action","payload","addToArray","push","removeFromArray","splice","clearArray","updateInArray","_action$payload","index","length","_arraySlice$actions","actions"],"mappings":"+CAOA,IAKaA,EAAaC,EAAY,CACpCC,KAAM,QACNC,aAP+B,CAC/BC,MAAO,GACPC,OAAQ,QAMRC,SAAU,CACRC,kBAASC,EAAOC,GACdD,EAAMJ,MAAQK,EAAOC,OACtB,EACDC,oBAAWH,EAAOC,GAChBD,EAAMJ,MAAMQ,KAAKH,EAAOC,QACzB,EACDG,yBAAgBL,EAAOC,GACrBD,EAAMJ,MAAMU,OAAOL,EAAOC,QAAS,EACpC,EACDK,WAAAA,SAAWP,GACTA,EAAMJ,MAAQ,EACf,EACDY,uBAAcR,EAAOC,GACnB,IAAAQ,EAAyBR,EAAOC,QAAxBQ,EAAKD,EAALC,MAAOd,EAAKa,EAALb,MACXc,GAAS,GAAKA,EAAQV,EAAMJ,MAAMe,SACpCX,EAAMJ,MAAMc,GAASd,EAEzB,KAIGgB,EAMHpB,EAAWqB,QALbd,EAAQa,EAARb,SACAI,EAAUS,EAAVT,WACAE,EAAeO,EAAfP,gBACAE,EAAUK,EAAVL,WACAC,EAAaI,EAAbJ"}