@eztrak/shared 0.16.6 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createBaseQueryWithRetry,
3
3
  transformPermissions
4
- } from "./chunk-WZVYTP6G.mjs";
4
+ } from "./chunk-LS7AI4ER.mjs";
5
5
  import {
6
6
  useGridHeight,
7
7
  usePaginationUrlSync
@@ -36,8 +36,9 @@ import {
36
36
  TooltipText,
37
37
  dropdownStyles,
38
38
  resolveActions
39
- } from "./chunk-SS3J2WBE.mjs";
39
+ } from "./chunk-4ASJWHN3.mjs";
40
40
  import {
41
+ DEFAULT_CONFIRM_ICONS,
41
42
  USER_STATE_STORAGE_KEY,
42
43
  capitalizeText,
43
44
  checkIfExistsInArray,
@@ -78,7 +79,7 @@ import {
78
79
  toLowerCaseText,
79
80
  truncateFileName,
80
81
  truncateText
81
- } from "./chunk-EIX5CUQF.mjs";
82
+ } from "./chunk-QOYMQFOB.mjs";
82
83
  export {
83
84
  ActionMenuItem,
84
85
  Breadcrumbs,
@@ -87,6 +88,7 @@ export {
87
88
  CardSkeleton,
88
89
  CustomCellEditor,
89
90
  CustomPagination,
91
+ DEFAULT_CONFIRM_ICONS,
90
92
  DropdownFilter,
91
93
  EztrakTabs,
92
94
  Header,
@@ -1,6 +1,7 @@
1
1
  import clsx from 'clsx';
2
- export { C as ConfirmationAlertOptions, E as ErrorClassification, a as ErrorSuggestedAction, H as HandleApiErrorOptions, R as RtkQueryError, c as classifyError, b as confirmationAlert, f as formatValidationErrorsHtml, h as handleApiError, i as isRetryableError } from '../handleApiError-CwVIJOqO.mjs';
2
+ export { C as ConfirmationAlertOptions, a as ConfirmationAlertVariant, D as DEFAULT_CONFIRM_ICONS, E as ErrorClassification, b as ErrorSuggestedAction, H as HandleApiErrorOptions, R as RtkQueryError, c as classifyError, d as confirmationAlert, f as formatValidationErrorsHtml, h as handleApiError, i as isRetryableError } from '../handleApiError-BIAaN76q.mjs';
3
3
  import { BaseQueryFn } from '@reduxjs/toolkit/query';
4
+ import 'sweetalert2';
4
5
 
5
6
  declare function cn(...inputs: Parameters<typeof clsx>): string;
6
7
 
@@ -1,6 +1,7 @@
1
1
  import clsx from 'clsx';
2
- export { C as ConfirmationAlertOptions, E as ErrorClassification, a as ErrorSuggestedAction, H as HandleApiErrorOptions, R as RtkQueryError, c as classifyError, b as confirmationAlert, f as formatValidationErrorsHtml, h as handleApiError, i as isRetryableError } from '../handleApiError-CwVIJOqO.js';
2
+ export { C as ConfirmationAlertOptions, a as ConfirmationAlertVariant, D as DEFAULT_CONFIRM_ICONS, E as ErrorClassification, b as ErrorSuggestedAction, H as HandleApiErrorOptions, R as RtkQueryError, c as classifyError, d as confirmationAlert, f as formatValidationErrorsHtml, h as handleApiError, i as isRetryableError } from '../handleApiError-BIAaN76q.js';
3
3
  import { BaseQueryFn } from '@reduxjs/toolkit/query';
4
+ import 'sweetalert2';
4
5
 
5
6
  declare function cn(...inputs: Parameters<typeof clsx>): string;
6
7
 
@@ -30,6 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/utils/index.ts
31
31
  var utils_exports = {};
32
32
  __export(utils_exports, {
33
+ DEFAULT_CONFIRM_ICONS: () => DEFAULT_CONFIRM_ICONS,
33
34
  USER_STATE_STORAGE_KEY: () => USER_STATE_STORAGE_KEY,
34
35
  capitalizeText: () => capitalizeText,
35
36
  checkIfExistsInArray: () => checkIfExistsInArray,
@@ -441,7 +442,144 @@ function handleApiError(error, { showAlert = false, fallbackMessage } = {}) {
441
442
  import_react_hot_toast.default.error(message);
442
443
  }
443
444
  var BRAND_ORANGE = "#FF7335";
444
- var CANCEL_RED = "#ff0000";
445
+ var DANGER_RED = "#DC2626";
446
+ var DANGER_ICON_BG = "#FEE2E2";
447
+ var CANCEL_BG = "#ffffff";
448
+ var CANCEL_TEXT = "#374151";
449
+ var CONFIRM_STYLE_ID = "eztrak-confirm-alert-styles";
450
+ function cssSize(value, fallback) {
451
+ if (value === void 0) return fallback;
452
+ return typeof value === "number" ? `${value}px` : value;
453
+ }
454
+ var DEFAULT_CONFIRM_ICONS = {
455
+ warning: `
456
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
457
+ <path d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z" />
458
+ </svg>
459
+ `.trim()
460
+ };
461
+ var VARIANT_DEFAULTS = {
462
+ brand: {
463
+ confirmButtonText: "Yes",
464
+ confirmButtonColor: BRAND_ORANGE,
465
+ confirmButtonTextColor: "#ffffff",
466
+ cancelButtonColor: CANCEL_BG,
467
+ cancelButtonTextColor: CANCEL_TEXT,
468
+ iconColor: BRAND_ORANGE,
469
+ iconBgColor: "#FFEDD5",
470
+ iconHtml: DEFAULT_CONFIRM_ICONS.warning,
471
+ icon: "warning"
472
+ },
473
+ danger: {
474
+ title: "Delete this item",
475
+ confirmButtonText: "Yes, delete it!",
476
+ confirmButtonColor: DANGER_RED,
477
+ confirmButtonTextColor: "#ffffff",
478
+ cancelButtonColor: CANCEL_BG,
479
+ cancelButtonTextColor: CANCEL_TEXT,
480
+ iconColor: DANGER_RED,
481
+ iconBgColor: DANGER_ICON_BG,
482
+ iconHtml: DEFAULT_CONFIRM_ICONS.warning,
483
+ icon: "warning",
484
+ showLoaderOnConfirm: true
485
+ }
486
+ };
487
+ function ensureConfirmAlertStyles() {
488
+ if (typeof document === "undefined") return;
489
+ if (document.getElementById(CONFIRM_STYLE_ID)) return;
490
+ const style = document.createElement("style");
491
+ style.id = CONFIRM_STYLE_ID;
492
+ style.textContent = `
493
+ .ez-confirm-popup {
494
+ border-radius: var(--ez-confirm-radius, 1rem) !important;
495
+ padding: 1.5rem !important;
496
+ max-width: 24rem !important;
497
+ width: var(--ez-confirm-width, 100%) !important;
498
+ box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25) !important;
499
+ }
500
+ .ez-confirm-title {
501
+ font-size: 1.125rem !important;
502
+ font-weight: 600 !important;
503
+ color: #111827 !important;
504
+ margin: 0 0 0.25rem !important;
505
+ padding: 0 !important;
506
+ }
507
+ .ez-confirm-html {
508
+ font-size: 0.875rem !important;
509
+ color: #6b7280 !important;
510
+ margin: 0 0 1.5rem !important;
511
+ }
512
+ .ez-confirm-icon {
513
+ border: none !important;
514
+ background: var(--ez-confirm-icon-bg, #fee2e2) !important;
515
+ color: var(--ez-confirm-icon-color, #dc2626) !important;
516
+ width: 3rem !important;
517
+ height: 3rem !important;
518
+ margin: 0 auto 1rem !important;
519
+ border-radius: 9999px !important;
520
+ }
521
+ .ez-confirm-icon .swal2-icon-content {
522
+ font-size: inherit !important;
523
+ display: flex !important;
524
+ align-items: center !important;
525
+ justify-content: center !important;
526
+ color: inherit !important;
527
+ }
528
+ .ez-confirm-actions {
529
+ width: 100% !important;
530
+ margin: 0 !important;
531
+ gap: 0.75rem !important;
532
+ }
533
+ .ez-confirm-confirm,
534
+ .ez-confirm-cancel {
535
+ flex: 1 1 0 !important;
536
+ margin: 0 !important;
537
+ border-radius: var(--ez-confirm-btn-radius, 0.5rem) !important;
538
+ font-size: 0.875rem !important;
539
+ font-weight: 500 !important;
540
+ padding: 0.625rem 1rem !important;
541
+ box-shadow: none !important;
542
+ }
543
+ .ez-confirm-confirm {
544
+ background: var(--ez-confirm-confirm-bg, #ff7335) !important;
545
+ color: var(--ez-confirm-confirm-fg, #fff) !important;
546
+ border: none !important;
547
+ }
548
+ .ez-confirm-confirm:hover {
549
+ filter: brightness(0.95);
550
+ }
551
+ .ez-confirm-cancel {
552
+ background: var(--ez-confirm-cancel-bg, #fff) !important;
553
+ color: var(--ez-confirm-cancel-fg, #374151) !important;
554
+ border: 1px solid #d1d5db !important;
555
+ }
556
+ .ez-confirm-cancel:hover {
557
+ background: #f9fafb !important;
558
+ }
559
+ .ez-confirm-popup .swal2-input {
560
+ margin-top: var(--ez-confirm-input-mt, 0) !important;
561
+ margin-right: var(--ez-confirm-input-mr, 0) !important;
562
+ margin-bottom: var(--ez-confirm-input-mb, 1.25rem) !important;
563
+ margin-left: var(--ez-confirm-input-ml, 0) !important;
564
+ }
565
+ `;
566
+ document.head.appendChild(style);
567
+ }
568
+ function pick(explicit, fromVariant, fallback) {
569
+ if (explicit !== void 0) return explicit;
570
+ if (fromVariant !== void 0) return fromVariant;
571
+ return fallback;
572
+ }
573
+ function mergeCustomClass(base, extra) {
574
+ if (!extra || typeof extra !== "object") return base;
575
+ const merged = { ...base };
576
+ for (const [key, value] of Object.entries(extra)) {
577
+ if (typeof value === "string" && value) {
578
+ merged[key] = merged[key] ? `${merged[key]} ${value}` : value;
579
+ }
580
+ }
581
+ return merged;
582
+ }
445
583
  function getConfirmErrorMessage(error) {
446
584
  if (error && typeof error === "object") {
447
585
  const err = error;
@@ -450,23 +588,63 @@ function getConfirmErrorMessage(error) {
450
588
  return "Something went wrong. Please try again.";
451
589
  }
452
590
  function confirmationAlert(onConfirm, options = {}) {
453
- const {
454
- title = options.inputExpectedValue ? "Confirmation Required" : "Are you sure?",
455
- text,
456
- html,
457
- icon = "warning",
458
- confirmButtonText = "Yes",
459
- cancelButtonText = "Cancel",
460
- confirmButtonColor = BRAND_ORANGE,
461
- cancelButtonColor = CANCEL_RED,
462
- showLoaderOnConfirm = false,
463
- inputExpectedValue,
464
- inputPlaceholder = "Type confirmation text to proceed",
465
- reverseButtons,
466
- focusCancel,
467
- zIndex
468
- } = options;
591
+ ensureConfirmAlertStyles();
592
+ const variant = options.variant ?? "brand";
593
+ const vd = VARIANT_DEFAULTS[variant];
594
+ const inputExpectedValue = options.inputExpectedValue;
469
595
  const hasInput = Boolean(inputExpectedValue);
596
+ const title = pick(
597
+ options.title,
598
+ vd.title,
599
+ hasInput ? "Confirmation Required" : "Delete this item"
600
+ );
601
+ const text = options.text;
602
+ const html = options.html ?? options.children;
603
+ const icon = pick(options.icon, vd.icon, "warning");
604
+ const iconHtml = pick(options.iconHtml, vd.iconHtml, void 0);
605
+ const iconColor = pick(options.iconColor, vd.iconColor, BRAND_ORANGE);
606
+ const iconBgColor = pick(options.iconBgColor, vd.iconBgColor, "#FFEDD5");
607
+ const showIcon = options.showIcon !== false;
608
+ const confirmButtonText = pick(options.confirmButtonText, vd.confirmButtonText, "Yes");
609
+ const cancelButtonText = options.cancelButtonText ?? "Cancel";
610
+ const confirmButtonColor = pick(
611
+ options.confirmButtonColor,
612
+ vd.confirmButtonColor,
613
+ BRAND_ORANGE
614
+ );
615
+ const cancelButtonColor = pick(
616
+ options.cancelButtonColor,
617
+ vd.cancelButtonColor,
618
+ CANCEL_BG
619
+ );
620
+ const confirmButtonTextColor = pick(
621
+ options.confirmButtonTextColor,
622
+ vd.confirmButtonTextColor,
623
+ "#ffffff"
624
+ );
625
+ const cancelButtonTextColor = pick(
626
+ options.cancelButtonTextColor,
627
+ vd.cancelButtonTextColor,
628
+ CANCEL_TEXT
629
+ );
630
+ const showCancelButton = options.showCancelButton !== false;
631
+ const showLoaderOnConfirm = pick(
632
+ options.showLoaderOnConfirm,
633
+ vd.showLoaderOnConfirm,
634
+ false
635
+ );
636
+ const inputPlaceholder = options.inputPlaceholder ?? "Type confirmation text to proceed";
637
+ const reverseButtons = options.reverseButtons ?? false;
638
+ const focusCancel = options.focusCancel;
639
+ const zIndex = options.zIndex;
640
+ const width = options.width;
641
+ const borderRadius = cssSize(options.borderRadius, "1rem");
642
+ const buttonBorderRadius = cssSize(options.buttonBorderRadius, "0.5rem");
643
+ const inputMarginTop = cssSize(options.inputMarginTop, "0");
644
+ const inputMarginRight = cssSize(options.inputMarginRight, "0");
645
+ const inputMarginBottom = cssSize(options.inputMarginBottom, "1.25rem");
646
+ const inputMarginLeft = cssSize(options.inputMarginLeft, "0");
647
+ const onCancel = options.onCancel;
470
648
  const useLoader = showLoaderOnConfirm || hasInput;
471
649
  const inputHtml = html ?? (hasInput ? `
472
650
  ${text ? `<p style="margin-bottom: 15px;">${text}</p>` : ""}
@@ -474,24 +652,60 @@ function confirmationAlert(onConfirm, options = {}) {
474
652
  Please type "<span style="color: ${BRAND_ORANGE}; font-weight: bold;">${inputExpectedValue}</span>" to confirm:
475
653
  </p>
476
654
  ` : void 0);
655
+ const baseCustomClass = {
656
+ popup: "ez-confirm-popup",
657
+ title: "ez-confirm-title",
658
+ htmlContainer: "ez-confirm-html",
659
+ actions: "ez-confirm-actions",
660
+ confirmButton: "ez-confirm-confirm",
661
+ cancelButton: "ez-confirm-cancel",
662
+ icon: "ez-confirm-icon"
663
+ };
477
664
  const swalOptions = {
478
665
  title,
479
- icon,
480
- showCancelButton: true,
666
+ showCancelButton,
481
667
  confirmButtonText,
482
668
  cancelButtonText,
483
669
  confirmButtonColor,
484
670
  cancelButtonColor,
485
671
  reverseButtons,
486
672
  focusCancel,
673
+ customClass: mergeCustomClass(baseCustomClass, options.customClass),
487
674
  allowOutsideClick: () => !import_sweetalert2.default.isLoading(),
488
675
  allowEscapeKey: () => !import_sweetalert2.default.isLoading(),
489
676
  didOpen: () => {
677
+ const popup = import_sweetalert2.default.getPopup();
678
+ if (popup) {
679
+ popup.style.setProperty("--ez-confirm-confirm-bg", confirmButtonColor);
680
+ popup.style.setProperty("--ez-confirm-confirm-fg", confirmButtonTextColor);
681
+ popup.style.setProperty("--ez-confirm-cancel-bg", cancelButtonColor);
682
+ popup.style.setProperty("--ez-confirm-cancel-fg", cancelButtonTextColor);
683
+ popup.style.setProperty("--ez-confirm-icon-color", iconColor);
684
+ popup.style.setProperty("--ez-confirm-icon-bg", iconBgColor);
685
+ popup.style.setProperty("--ez-confirm-radius", borderRadius);
686
+ popup.style.setProperty("--ez-confirm-btn-radius", buttonBorderRadius);
687
+ popup.style.setProperty("--ez-confirm-input-mt", inputMarginTop);
688
+ popup.style.setProperty("--ez-confirm-input-mr", inputMarginRight);
689
+ popup.style.setProperty("--ez-confirm-input-mb", inputMarginBottom);
690
+ popup.style.setProperty("--ez-confirm-input-ml", inputMarginLeft);
691
+ if (width != null) {
692
+ popup.style.setProperty(
693
+ "--ez-confirm-width",
694
+ typeof width === "number" ? `${width}px` : String(width)
695
+ );
696
+ }
697
+ }
490
698
  if (zIndex == null) return;
491
699
  const container = import_sweetalert2.default.getContainer();
492
700
  if (container) container.style.zIndex = String(zIndex);
493
701
  }
494
702
  };
703
+ if (showIcon) {
704
+ swalOptions.icon = icon;
705
+ if (iconHtml) {
706
+ swalOptions.iconHtml = iconHtml;
707
+ }
708
+ }
495
709
  if (hasInput) {
496
710
  swalOptions.html = inputHtml;
497
711
  swalOptions.input = "text";
@@ -526,6 +740,10 @@ function confirmationAlert(onConfirm, options = {}) {
526
740
  void import_sweetalert2.default.fire(swalOptions).then((result) => {
527
741
  if (result.isConfirmed && !useLoader) {
528
742
  void Promise.resolve(onConfirm());
743
+ return;
744
+ }
745
+ if (result.isDismissed) {
746
+ onCancel?.();
529
747
  }
530
748
  });
531
749
  }
@@ -570,6 +788,7 @@ function createBaseQueryWithRetry(baseQueryWithReauth, {
570
788
  }
571
789
  // Annotate the CommonJS export names for ESM import in node:
572
790
  0 && (module.exports = {
791
+ DEFAULT_CONFIRM_ICONS,
573
792
  USER_STATE_STORAGE_KEY,
574
793
  capitalizeText,
575
794
  checkIfExistsInArray,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/index.ts","../../src/utils/cn.ts","../../src/utils/resetPageParam.ts","../../src/utils/helpers.ts","../../src/utils/localStorage.ts","../../src/utils/permissions.ts","../../src/utils/handleApiError.ts","../../src/utils/createBaseQueryWithRetry.ts"],"sourcesContent":["export { cn } from \"./cn\";\r\nexport { resetPageParam } from \"./resetPageParam\";\r\nexport * from \"./helpers\";\r\nexport * from \"./localStorage\";\r\nexport * from \"./permissions\";\r\nexport {\r\n handleApiError,\r\n formatValidationErrorsHtml,\r\n confirmationAlert,\r\n classifyError,\r\n isRetryableError,\r\n type RtkQueryError,\r\n type HandleApiErrorOptions,\r\n type ConfirmationAlertOptions,\r\n type ErrorClassification,\r\n type ErrorSuggestedAction,\r\n} from \"./handleApiError\";\r\nexport {\r\n createBaseQueryWithRetry,\r\n type CreateBaseQueryWithRetryOptions,\r\n} from \"./createBaseQueryWithRetry\";\r\n","import clsx from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: Parameters<typeof clsx>) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","/**\n * Sends pagination back to the first page after a filter changes the result set.\n *\n * Only touches `pageKey` when it is already present, so filter-only screens that\n * never paginate keep their URL clean. Mutates and returns `params` so it can be\n * chained inside a `setSearchParams((prev) => ...)` updater.\n */\nexport function resetPageParam(\n params: URLSearchParams,\n pageKey = \"page\",\n defaultPage = \"1\",\n) {\n if (params.has(pageKey)) {\n params.set(pageKey, defaultPage);\n }\n return params;\n}\n","export const truncateText = (\r\n text: string | number | null | undefined,\r\n maxLength = 20\r\n): string => {\r\n if (text === null || text === undefined) return \"\";\r\n const value = String(text);\r\n if (value.length <= maxLength) {\r\n return value;\r\n }\r\n return value.slice(0, maxLength - 3) + \"...\";\r\n};\r\n\r\nexport const truncateFileName = (\r\n fileName: string | null | undefined,\r\n maxLength = 20\r\n): string => {\r\n if (!fileName) return \"\";\r\n if (fileName.length <= maxLength) {\r\n return fileName;\r\n }\r\n const extension = fileName.slice(fileName.lastIndexOf(\".\"));\r\n const truncatedName =\r\n fileName.slice(0, maxLength - extension.length - 3) + \"...\";\r\n return truncatedName + extension;\r\n};\r\n\r\nexport function getApiError(apiError: unknown): string {\r\n if (!apiError) return \"An unknown error occurred\";\r\n\r\n if (typeof apiError === \"string\") {\r\n return apiError;\r\n }\r\n\r\n const error = apiError as {\r\n response?: { data?: Record<string, unknown> };\r\n message?: string;\r\n };\r\n\r\n if (error.response?.data) {\r\n const responseData = error.response.data;\r\n\r\n if (typeof responseData === \"string\") {\r\n return responseData;\r\n }\r\n\r\n const errors = responseData.errors;\r\n if (errors && typeof errors === \"object\") {\r\n for (const key in errors) {\r\n const messages = (errors as Record<string, unknown>)[key];\r\n if (Array.isArray(messages) && messages.length > 0) {\r\n return String(messages[0]);\r\n }\r\n }\r\n }\r\n\r\n if (responseData.message) {\r\n return String(responseData.message);\r\n }\r\n\r\n if (responseData.title) {\r\n return String(responseData.title);\r\n }\r\n }\r\n\r\n if (error.message) {\r\n return error.message;\r\n }\r\n\r\n return \"An unknown error occurred\";\r\n}\r\n\r\nexport const normalizeApiListItems = (responseData: unknown): unknown[] => {\r\n if (responseData == null) return [];\r\n if (Array.isArray(responseData)) return responseData;\r\n\r\n const record = responseData as Record<string, unknown>;\r\n const data = record.data;\r\n\r\n if (\r\n data &&\r\n typeof data === \"object\" &&\r\n !Array.isArray(data) &&\r\n Array.isArray((data as { items?: unknown[] }).items)\r\n ) {\r\n return (data as { items: unknown[] }).items;\r\n }\r\n\r\n const returnModel = record.returnModel as { items?: unknown[] } | undefined;\r\n if (Array.isArray(returnModel?.items)) return returnModel.items;\r\n if (Array.isArray(data)) return data;\r\n if (typeof data === \"object\" && data !== null) {\r\n return [data];\r\n }\r\n return [];\r\n};\r\n\r\nexport function capitalizeText(name: string | null | undefined): string {\r\n if (!name) return \"\";\r\n return name\r\n .split(\" \")\r\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n .join(\" \");\r\n}\r\n\r\nexport function toLowerCaseText(text: string | null | undefined): string {\r\n if (!text) return \"\";\r\n return text.toLowerCase();\r\n}\r\n\r\nexport const formatDate = (dateString: string | null | undefined): string => {\r\n if (dateString === null || dateString === undefined) return \"-\";\r\n const date = new Date(dateString);\r\n\r\n if (isNaN(date.getTime())) {\r\n return dateString;\r\n }\r\n\r\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\r\n const day = date.getDate().toString().padStart(2, \"0\");\r\n const year = date.getFullYear().toString().slice(-2);\r\n return `${month}/${day}/${year}`;\r\n};\r\n\r\nexport const isEmpty = (obj: object): boolean => {\r\n return Object.keys(obj).length === 0;\r\n};\r\n\r\nexport const toDateInputValue = (date: string | Date | null | undefined): string => {\r\n if (!date) return \"\";\r\n\r\n let d: Date;\r\n\r\n if (typeof date === \"string\") {\r\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) {\r\n return date;\r\n }\r\n d = new Date(date);\r\n } else {\r\n d = new Date(date);\r\n }\r\n\r\n if (isNaN(d.getTime())) return \"\";\r\n\r\n const localDate = new Date(d.getTime() - d.getTimezoneOffset() * 60000);\r\n const year = localDate.getFullYear();\r\n const month = (localDate.getMonth() + 1).toString().padStart(2, \"0\");\r\n const day = localDate.getDate().toString().padStart(2, \"0\");\r\n\r\n return `${year}-${month}-${day}`;\r\n};\r\n\r\nexport function convertCommaDataToArray(data: string | null | undefined): string[] {\r\n if (!data || data.trim() === \"\") {\r\n return [];\r\n }\r\n return data.split(\",\").map((item) => item.trim());\r\n}\r\n\r\nexport function checkIfExistsInArray<T>(array: T[], searchValue: T): boolean {\r\n return array.includes(searchValue);\r\n}\r\n\r\nexport const currencyFormatter = (value: number | null | undefined): string => {\r\n return value?.toLocaleString(\"en-US\", {\r\n style: \"currency\",\r\n currency: \"USD\",\r\n }) ?? \"\";\r\n};\r\nexport const formatNumber = (number: number | string | null | undefined): string => {\r\n if (isNaN(Number(number)) || number === null || number === undefined) {\r\n return \"0\";\r\n }\r\n\r\n const formattedNumber = Number(number)\r\n .toString()\r\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n\r\n return formattedNumber;\r\n};\r\n\r\nexport const parseCurrencyValueToNumber = (value: unknown): number => {\r\n if (value == null || value === \"\") return 0;\r\n\r\n const raw =\r\n typeof value === \"object\" && value !== null && \"value\" in value\r\n ? (value as { value: unknown }).value\r\n : value;\r\n\r\n const stringValue = raw == null || raw === \"\" ? \"\" : String(raw);\r\n const numericValue = stringValue.replace(/[$,]/g, \"\");\r\n return parseFloat(numericValue) || 0;\r\n};\r\n\r\nexport function flattenTableData<T extends Record<string, unknown>>(\r\n data: T[] | null | undefined,\r\n columns: { field?: string }[] | null | undefined\r\n): T[] {\r\n if (!Array.isArray(data)) return [];\r\n return data.map((row) => {\r\n const flatRow = { ...row };\r\n (columns ?? []).forEach((col) => {\r\n const key = col.field;\r\n if (!key) return;\r\n if (key.includes(\".\")) {\r\n const value = key.split(\".\").reduce<unknown>(\r\n (acc, part) => (acc as Record<string, unknown> | undefined)?.[part],\r\n row\r\n );\r\n (flatRow as Record<string, unknown>)[key] = value ?? \"\";\r\n }\r\n });\r\n return flatRow;\r\n });\r\n}\r\n\r\nexport const getErrorMessages = (error: {\r\n data?: {\r\n errors?: Record<string, string[]>;\r\n title?: string;\r\n error?: { name?: string[] };\r\n };\r\n} | null | undefined): string => {\r\n if (error?.data?.errors) {\r\n return Object.values(error.data.errors).flat().join(\"\\n\");\r\n }\r\n return (\r\n error?.data?.title ??\r\n error?.data?.error?.name?.[0] ??\r\n \"Failed to save\"\r\n );\r\n};\r\n\r\nexport const getFieldsByCategory = <T extends { category?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields?.filter(({ category = \"\" }) => category === key);\r\n};\r\n\r\nexport const getFieldsByName = <T extends { name?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields.filter(({ name = \"\" }) => name === key);\r\n};\r\n\r\nexport const deserializeJson = <T = unknown>(jsonString: string): T | null => {\r\n try {\r\n return JSON.parse(jsonString) as T;\r\n } catch (error) {\r\n console.error(\"Error parsing JSON:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nexport const formatDateTime = (dateString: string | null | undefined): string => {\r\n if (!dateString) return \"Invalid Date\";\r\n const date = new Date(dateString);\r\n if (isNaN(date.getTime())) return \"Invalid Date\";\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: \"numeric\",\r\n month: \"numeric\",\r\n day: \"numeric\",\r\n hour: \"numeric\",\r\n minute: \"numeric\",\r\n hour12: true,\r\n };\r\n return date.toLocaleString(\"en-US\", options);\r\n};\r\n\r\nexport const removeByPropertyValues = <T extends Record<string, unknown>>(\r\n items: T[] = [],\r\n property: keyof T & string,\r\n values: unknown[] = [],\r\n { caseInsensitive = false }: { caseInsensitive?: boolean } = {}\r\n): T[] => {\r\n if (!Array.isArray(items) || !property) return Array.isArray(items) ? items : [];\r\n const normalize = (v: unknown) =>\r\n caseInsensitive && typeof v === \"string\" ? v.toLowerCase() : v;\r\n const valuesArr = Array.isArray(values) ? values : [values];\r\n const toRemove = new Set(valuesArr.map(normalize));\r\n return items.filter((item) => !toRemove.has(normalize(item?.[property])));\r\n};\r\n\r\nexport const getFieldsByInputType = <T extends { inputType?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields.filter(({ inputType = \"\" }) => inputType === key);\r\n};\r\n","export const USER_STATE_STORAGE_KEY = \"authState\";\r\n\r\nfunction getStorage(): Storage | null {\r\n if (typeof window === \"undefined\") return null;\r\n return window.localStorage;\r\n}\r\n\r\nexport function getItem<T>(key: string, fallback: T | null = null): T | null {\r\n try {\r\n const raw = getStorage()?.getItem(key);\r\n if (raw === null || raw === undefined) {\r\n return fallback;\r\n }\r\n return JSON.parse(raw) as T;\r\n } catch {\r\n return fallback;\r\n }\r\n}\r\n\r\nexport function setItem<T>(key: string, value: T): void {\r\n try {\r\n getStorage()?.setItem(key, JSON.stringify(value));\r\n } catch {\r\n // Ignore write errors (quota exceeded, private mode, etc.)\r\n }\r\n}\r\n\r\nexport function removeItem(key: string): void {\r\n try {\r\n getStorage()?.removeItem(key);\r\n } catch {\r\n // Ignore remove errors\r\n }\r\n}\r\n\r\nexport function loadUserState<T = unknown>(\r\n key: string = USER_STATE_STORAGE_KEY\r\n): T | undefined {\r\n const value = getItem<T | undefined>(key, undefined);\r\n return value === null ? undefined : value;\r\n}\r\n\r\nexport function saveUserState<T = unknown>(\r\n state: T,\r\n key: string = USER_STATE_STORAGE_KEY\r\n): void {\r\n setItem(key, state);\r\n}\r\n\r\n/** Task-aligned aliases */\r\nexport const get = getItem;\r\nexport const set = setItem;\r\n\r\n/** Backward-compatible aliases used in federation apps */\r\nexport const getItemFromLocalStorage = getItem;\r\nexport const storeItemInLocalStorage = setItem;\r\nexport const saveItemLocalStorage = setItem;\r\n","export interface PermissionRecord {\r\n moduleName: string;\r\n permission: string;\r\n permissionId: string | number;\r\n}\r\n\r\nexport type TransformedPermissions = Record<\r\n string,\r\n Record<string, string | number>\r\n>;\r\n\r\nexport function transformPermissions(\r\n permissions: PermissionRecord[]\r\n): TransformedPermissions {\r\n return permissions.reduce<TransformedPermissions>((acc, permission) => {\r\n const { moduleName, permission: perm, permissionId } = permission;\r\n\r\n if (!acc[moduleName]) {\r\n acc[moduleName] = {};\r\n }\r\n\r\n acc[moduleName][perm] = permissionId;\r\n\r\n return acc;\r\n }, {});\r\n}\r\n","import toast from \"react-hot-toast\";\r\nimport Swal, { type SweetAlertOptions, type SweetAlertResult } from \"sweetalert2\";\r\n\r\nexport type RtkQueryError = {\r\n status?: number | string;\r\n originalStatus?: number;\r\n data?: {\r\n errors?: Record<string, string[]>;\r\n message?: string;\r\n title?: string;\r\n };\r\n message?: string;\r\n error?: string;\r\n};\r\n\r\nexport interface HandleApiErrorOptions {\r\n showAlert?: boolean;\r\n fallbackMessage?: string;\r\n}\r\n\r\nexport type ErrorSuggestedAction =\r\n | \"retry\"\r\n | \"refresh\"\r\n | \"contact-support\"\r\n | \"none\";\r\n\r\nexport type ErrorClassification = {\r\n isRetryable: boolean;\r\n userMessage: string;\r\n technicalMessage: string;\r\n suggestedAction: ErrorSuggestedAction;\r\n};\r\n\r\n/** Returns true for transient network/server errors that warrant automatic retry. */\r\nexport function isRetryableError(\r\n error: RtkQueryError | null | undefined\r\n): boolean {\r\n if (!error) return false;\r\n\r\n const status = error.status ?? error.originalStatus;\r\n\r\n if (\r\n status === \"FETCH_ERROR\" ||\r\n status === \"TIMEOUT_ERROR\" ||\r\n status === \"PARSING_ERROR\"\r\n ) {\r\n return true;\r\n }\r\n\r\n if (typeof status === \"number\") {\r\n if (status === 502 || status === 503 || status === 504) return true;\r\n if (status >= 500 && status < 600) return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/** Classifies RTK Query errors for user messaging and retry guidance. */\r\nexport function classifyError(\r\n error: RtkQueryError | null | undefined\r\n): ErrorClassification {\r\n if (!error) {\r\n return {\r\n isRetryable: false,\r\n userMessage: \"An error occurred.\",\r\n technicalMessage: \"Unknown error\",\r\n suggestedAction: \"none\",\r\n };\r\n }\r\n\r\n const status = error.status ?? error.originalStatus;\r\n const data = error.data;\r\n\r\n if (\r\n status === \"FETCH_ERROR\" ||\r\n status === \"TIMEOUT_ERROR\" ||\r\n status === \"PARSING_ERROR\"\r\n ) {\r\n return {\r\n isRetryable: true,\r\n userMessage: \"Network error. Please check your connection.\",\r\n technicalMessage: \"Network request failed\",\r\n suggestedAction: \"retry\",\r\n };\r\n }\r\n\r\n if (typeof status === \"number\" && status >= 500 && status < 600) {\r\n return {\r\n isRetryable: true,\r\n userMessage: \"Server is temporarily unavailable. Please try again.\",\r\n technicalMessage: `Server error: ${status}`,\r\n suggestedAction: \"retry\",\r\n };\r\n }\r\n\r\n return {\r\n isRetryable: false,\r\n userMessage:\r\n data?.message ||\r\n data?.title ||\r\n error.error ||\r\n \"An error occurred. Please try again.\",\r\n technicalMessage:\r\n typeof status === \"number\" || typeof status === \"string\"\r\n ? `Client error: ${status}`\r\n : \"Request failed\",\r\n suggestedAction: \"none\",\r\n };\r\n}\r\n\r\nexport function formatValidationErrorsHtml(\r\n errors: Record<string, string[]>\r\n): string {\r\n const items = Object.keys(errors).flatMap((field) =>\r\n (errors[field] || []).map((msg) => `<li>${msg}</li>`)\r\n );\r\n return `\r\n <div style=\"text-align:left\">\r\n <p>Please review and correct the following:</p>\r\n <ul style=\"margin:8px 0 0 16px; list-style:disc;\">\r\n ${items.join(\"\")}\r\n </ul>\r\n </div>\r\n `;\r\n}\r\n\r\nfunction showValidationAlert(html: string): void {\r\n void Swal.fire({\r\n title: \"Validation errors\",\r\n html,\r\n icon: \"error\",\r\n confirmButtonText: \"OK\",\r\n showCancelButton: false,\r\n confirmButtonColor: \"#FF7335\",\r\n });\r\n}\r\n\r\n/** Handles RTK Query errors with built-in toast.error or SweetAlert (when showAlert is true). */\r\nexport function handleApiError(\r\n error: RtkQueryError | null | undefined,\r\n { showAlert = false, fallbackMessage }: HandleApiErrorOptions = {}\r\n): void {\r\n if (!error) return;\r\n\r\n const status = error.status ?? error.originalStatus;\r\n const data = error.data;\r\n\r\n if (status === 200) {\r\n return;\r\n }\r\n\r\n if (data?.errors && typeof data.errors === \"object\") {\r\n const errors = data.errors;\r\n\r\n if (showAlert) {\r\n showValidationAlert(formatValidationErrorsHtml(errors));\r\n } else {\r\n Object.keys(errors).forEach((field) => {\r\n (errors[field] || []).forEach((errorMessage) => {\r\n toast.error(errorMessage);\r\n });\r\n });\r\n }\r\n return;\r\n }\r\n\r\n if (status === 404) {\r\n return;\r\n }\r\n\r\n const message =\r\n fallbackMessage ||\r\n data?.message ||\r\n data?.title ||\r\n error.error ||\r\n error.message ||\r\n \"An error occurred. Please try again.\";\r\n\r\n toast.error(message);\r\n}\r\n\r\nconst BRAND_ORANGE = \"#FF7335\";\r\nconst CANCEL_RED = \"#ff0000\";\r\n\r\nexport interface ConfirmationAlertOptions {\r\n title?: string;\r\n text?: string;\r\n html?: string;\r\n icon?: \"warning\" | \"info\" | \"question\" | \"error\" | \"success\";\r\n confirmButtonText?: string;\r\n cancelButtonText?: string;\r\n confirmButtonColor?: string;\r\n cancelButtonColor?: string;\r\n showLoaderOnConfirm?: boolean;\r\n /** Type exactly — trimmed, case-sensitive. */\r\n inputExpectedValue?: string;\r\n inputPlaceholder?: string;\r\n reverseButtons?: boolean;\r\n focusCancel?: boolean;\r\n zIndex?: number;\r\n}\r\n\r\nfunction getConfirmErrorMessage(error: unknown): string {\r\n if (error && typeof error === \"object\") {\r\n const err = error as {\r\n message?: string;\r\n data?: { message?: string; title?: string };\r\n };\r\n return (\r\n err.data?.message ||\r\n err.data?.title ||\r\n err.message ||\r\n \"Something went wrong. Please try again.\"\r\n );\r\n }\r\n return \"Something went wrong. Please try again.\";\r\n}\r\n\r\nexport function confirmationAlert(\r\n onConfirm: () => void | Promise<void>,\r\n options: ConfirmationAlertOptions = {}\r\n): void {\r\n const {\r\n title = options.inputExpectedValue ? \"Confirmation Required\" : \"Are you sure?\",\r\n text,\r\n html,\r\n icon = \"warning\",\r\n confirmButtonText = \"Yes\",\r\n cancelButtonText = \"Cancel\",\r\n confirmButtonColor = BRAND_ORANGE,\r\n cancelButtonColor = CANCEL_RED,\r\n showLoaderOnConfirm = false,\r\n inputExpectedValue,\r\n inputPlaceholder = \"Type confirmation text to proceed\",\r\n reverseButtons,\r\n focusCancel,\r\n zIndex,\r\n } = options;\r\n\r\n const hasInput = Boolean(inputExpectedValue);\r\n const useLoader = showLoaderOnConfirm || hasInput;\r\n\r\n const inputHtml =\r\n html ??\r\n (hasInput\r\n ? `\r\n ${text ? `<p style=\"margin-bottom: 15px;\">${text}</p>` : \"\"}\r\n <p style=\"margin-bottom: 10px; font-weight: bold; color: #666;\">\r\n Please type \"<span style=\"color: ${BRAND_ORANGE}; font-weight: bold;\">${inputExpectedValue}</span>\" to confirm:\r\n </p>\r\n `\r\n : undefined);\r\n\r\n const swalOptions: SweetAlertOptions = {\r\n title,\r\n icon,\r\n showCancelButton: true,\r\n confirmButtonText,\r\n cancelButtonText,\r\n confirmButtonColor,\r\n cancelButtonColor,\r\n reverseButtons,\r\n focusCancel,\r\n allowOutsideClick: () => !Swal.isLoading(),\r\n allowEscapeKey: () => !Swal.isLoading(),\r\n didOpen: () => {\r\n if (zIndex == null) return;\r\n const container = Swal.getContainer();\r\n if (container) container.style.zIndex = String(zIndex);\r\n },\r\n };\r\n\r\n if (hasInput) {\r\n swalOptions.html = inputHtml;\r\n swalOptions.input = \"text\";\r\n swalOptions.inputPlaceholder = inputPlaceholder;\r\n swalOptions.inputValidator = (value: string) => {\r\n if (!value?.trim()) return \"You need to enter the confirmation text!\";\r\n if (value.trim() !== inputExpectedValue!.trim()) {\r\n return `Please type \"${inputExpectedValue}\" exactly as shown!`;\r\n }\r\n return null;\r\n };\r\n } else if (html) {\r\n swalOptions.html = html;\r\n } else {\r\n swalOptions.text = text;\r\n }\r\n\r\n if (useLoader) {\r\n swalOptions.showLoaderOnConfirm = true;\r\n swalOptions.preConfirm = (inputValue: string) => {\r\n if (hasInput && inputValue?.trim() !== inputExpectedValue!.trim()) {\r\n Swal.showValidationMessage(\r\n `Please type \"${inputExpectedValue}\" exactly as shown!`\r\n );\r\n return false;\r\n }\r\n return Promise.resolve()\r\n .then(() => onConfirm())\r\n .catch((error) => {\r\n Swal.showValidationMessage(getConfirmErrorMessage(error));\r\n throw error;\r\n });\r\n };\r\n }\r\n\r\n void Swal.fire(swalOptions).then((result: SweetAlertResult) => {\r\n if (result.isConfirmed && !useLoader) {\r\n void Promise.resolve(onConfirm());\r\n }\r\n });\r\n}\r\n","import { retry } from \"@reduxjs/toolkit/query\";\r\nimport type { BaseQueryFn } from \"@reduxjs/toolkit/query\";\r\nimport { isRetryableError, type RtkQueryError } from \"./handleApiError\";\r\n\r\nexport type CreateBaseQueryWithRetryOptions = {\r\n maxRetries?: number;\r\n maxBackoffMs?: number;\r\n};\r\n\r\nfunction getRequestMethod(args: unknown): string {\r\n if (typeof args === \"string\") return \"GET\";\r\n if (args && typeof args === \"object\" && \"method\" in args) {\r\n const method = (args as { method?: string }).method;\r\n return (method || \"GET\").toUpperCase();\r\n }\r\n return \"GET\";\r\n}\r\n\r\n/**\r\n * Wraps an authenticated baseQuery with RTK Query retry for GET requests only.\r\n * Retries transient network/server errors with exponential backoff.\r\n */\r\nexport function createBaseQueryWithRetry(\r\n baseQueryWithReauth: BaseQueryFn,\r\n {\r\n maxRetries = 3,\r\n maxBackoffMs = 8000,\r\n }: CreateBaseQueryWithRetryOptions = {}\r\n): BaseQueryFn {\r\n const retryableQuery = retry(\r\n async (args, api, extraOptions) => {\r\n const result = await baseQueryWithReauth(args, api, extraOptions);\r\n\r\n if (result.error && !isRetryableError(result.error as RtkQueryError)) {\r\n retry.fail(result.error);\r\n }\r\n\r\n return result;\r\n },\r\n {\r\n maxRetries,\r\n backoff: (attempt: number) =>\r\n new Promise((resolve) =>\r\n setTimeout(resolve, Math.min(1000 * 2 ** attempt, maxBackoffMs))\r\n ),\r\n }\r\n );\r\n\r\n const baseQueryWithConditionalRetry: BaseQueryFn = async (\r\n args,\r\n api,\r\n extraOptions\r\n ) => {\r\n const method = getRequestMethod(args);\r\n if (method !== \"GET\") {\r\n return baseQueryWithReauth(args, api, extraOptions);\r\n }\r\n return retryableQuery(args, api, extraOptions);\r\n };\r\n\r\n return baseQueryWithConditionalRetry;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAAiB;AACjB,4BAAwB;AAEjB,SAAS,MAAM,QAAiC;AACrD,aAAO,mCAAQ,YAAAA,SAAK,MAAM,CAAC;AAC7B;;;ACEO,SAAS,eACd,QACA,UAAU,QACV,cAAc,KACd;AACA,MAAI,OAAO,IAAI,OAAO,GAAG;AACvB,WAAO,IAAI,SAAS,WAAW;AAAA,EACjC;AACA,SAAO;AACT;;;AChBO,IAAM,eAAe,CAC1B,MACA,YAAY,OACD;AACX,MAAI,SAAS,QAAQ,SAAS,OAAW,QAAO;AAChD,QAAM,QAAQ,OAAO,IAAI;AACzB,MAAI,MAAM,UAAU,WAAW;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI;AACzC;AAEO,IAAM,mBAAmB,CAC9B,UACA,YAAY,OACD;AACX,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,SAAS,UAAU,WAAW;AAChC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,SAAS,MAAM,SAAS,YAAY,GAAG,CAAC;AAC1D,QAAM,gBACJ,SAAS,MAAM,GAAG,YAAY,UAAU,SAAS,CAAC,IAAI;AACxD,SAAO,gBAAgB;AACzB;AAEO,SAAS,YAAY,UAA2B;AACrD,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AAKd,MAAI,MAAM,UAAU,MAAM;AACxB,UAAM,eAAe,MAAM,SAAS;AAEpC,QAAI,OAAO,iBAAiB,UAAU;AACpC,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,aAAa;AAC5B,QAAI,UAAU,OAAO,WAAW,UAAU;AACxC,iBAAW,OAAO,QAAQ;AACxB,cAAM,WAAY,OAAmC,GAAG;AACxD,YAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAClD,iBAAO,OAAO,SAAS,CAAC,CAAC;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,SAAS;AACxB,aAAO,OAAO,aAAa,OAAO;AAAA,IACpC;AAEA,QAAI,aAAa,OAAO;AACtB,aAAO,OAAO,aAAa,KAAK;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,MAAM,SAAS;AACjB,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;AAEO,IAAM,wBAAwB,CAAC,iBAAqC;AACzE,MAAI,gBAAgB,KAAM,QAAO,CAAC;AAClC,MAAI,MAAM,QAAQ,YAAY,EAAG,QAAO;AAExC,QAAM,SAAS;AACf,QAAM,OAAO,OAAO;AAEpB,MACE,QACA,OAAO,SAAS,YAChB,CAAC,MAAM,QAAQ,IAAI,KACnB,MAAM,QAAS,KAA+B,KAAK,GACnD;AACA,WAAQ,KAA8B;AAAA,EACxC;AAEA,QAAM,cAAc,OAAO;AAC3B,MAAI,MAAM,QAAQ,aAAa,KAAK,EAAG,QAAO,YAAY;AAC1D,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO;AAChC,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,WAAO,CAAC,IAAI;AAAA,EACd;AACA,SAAO,CAAC;AACV;AAEO,SAAS,eAAe,MAAyC;AACtE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,GAAG;AACb;AAEO,SAAS,gBAAgB,MAAyC;AACvE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,YAAY;AAC1B;AAEO,IAAM,aAAa,CAAC,eAAkD;AAC3E,MAAI,eAAe,QAAQ,eAAe,OAAW,QAAO;AAC5D,QAAM,OAAO,IAAI,KAAK,UAAU;AAEhC,MAAI,MAAM,KAAK,QAAQ,CAAC,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK,SAAS,IAAI,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG;AAC9D,QAAM,MAAM,KAAK,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,OAAO,KAAK,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE;AACnD,SAAO,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI;AAChC;AAEO,IAAM,UAAU,CAAC,QAAyB;AAC/C,SAAO,OAAO,KAAK,GAAG,EAAE,WAAW;AACrC;AAEO,IAAM,mBAAmB,CAAC,SAAmD;AAClF,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI;AAEJ,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,sBAAsB,KAAK,IAAI,GAAG;AACpC,aAAO;AAAA,IACT;AACA,QAAI,IAAI,KAAK,IAAI;AAAA,EACnB,OAAO;AACL,QAAI,IAAI,KAAK,IAAI;AAAA,EACnB;AAEA,MAAI,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO;AAE/B,QAAM,YAAY,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,kBAAkB,IAAI,GAAK;AACtE,QAAM,OAAO,UAAU,YAAY;AACnC,QAAM,SAAS,UAAU,SAAS,IAAI,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG;AACnE,QAAM,MAAM,UAAU,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAE1D,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAChC;AAEO,SAAS,wBAAwB,MAA2C;AACjF,MAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,IAAI;AAC/B,WAAO,CAAC;AAAA,EACV;AACA,SAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAClD;AAEO,SAAS,qBAAwB,OAAY,aAAyB;AAC3E,SAAO,MAAM,SAAS,WAAW;AACnC;AAEO,IAAM,oBAAoB,CAAC,UAA6C;AAC7E,SAAO,OAAO,eAAe,SAAS;AAAA,IACpC,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC,KAAK;AACR;AACO,IAAM,eAAe,CAAC,WAAuD;AAClF,MAAI,MAAM,OAAO,MAAM,CAAC,KAAK,WAAW,QAAQ,WAAW,QAAW;AACpE,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,OAAO,MAAM,EAClC,SAAS,EACT,QAAQ,yBAAyB,GAAG;AAEvC,SAAO;AACT;AAEO,IAAM,6BAA6B,CAAC,UAA2B;AACpE,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAE1C,QAAM,MACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,WAAW,QACrD,MAA6B,QAC9B;AAEN,QAAM,cAAc,OAAO,QAAQ,QAAQ,KAAK,KAAK,OAAO,GAAG;AAC/D,QAAM,eAAe,YAAY,QAAQ,SAAS,EAAE;AACpD,SAAO,WAAW,YAAY,KAAK;AACrC;AAEO,SAAS,iBACd,MACA,SACK;AACL,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC;AAClC,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,UAAM,UAAU,EAAE,GAAG,IAAI;AACzB,KAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,QAAQ;AAC/B,YAAM,MAAM,IAAI;AAChB,UAAI,CAAC,IAAK;AACV,UAAI,IAAI,SAAS,GAAG,GAAG;AACrB,cAAM,QAAQ,IAAI,MAAM,GAAG,EAAE;AAAA,UAC3B,CAAC,KAAK,SAAU,MAA8C,IAAI;AAAA,UAClE;AAAA,QACF;AACA,QAAC,QAAoC,GAAG,IAAI,SAAS;AAAA,MACvD;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACH;AAEO,IAAM,mBAAmB,CAAC,UAMA;AAC/B,MAAI,OAAO,MAAM,QAAQ;AACvB,WAAO,OAAO,OAAO,MAAM,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI;AAAA,EAC1D;AACA,SACE,OAAO,MAAM,SACb,OAAO,MAAM,OAAO,OAAO,CAAC,KAC5B;AAEJ;AAEO,IAAM,sBAAsB,CACjC,SAAc,CAAC,GACf,QACQ;AACR,SAAO,QAAQ,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,aAAa,GAAG;AAC/D;AAEO,IAAM,kBAAkB,CAC7B,SAAc,CAAC,GACf,QACQ;AACR,SAAO,OAAO,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,SAAS,GAAG;AACtD;AAEO,IAAM,kBAAkB,CAAc,eAAiC;AAC5E,MAAI;AACF,WAAO,KAAK,MAAM,UAAU;AAAA,EAC9B,SAAS,OAAO;AACd,YAAQ,MAAM,uBAAuB,KAAK;AAC1C,WAAO;AAAA,EACT;AACF;AAEO,IAAM,iBAAiB,CAAC,eAAkD;AAC/E,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,OAAO,IAAI,KAAK,UAAU;AAChC,MAAI,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AAClC,QAAM,UAAsC;AAAA,IAC1C,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,SAAO,KAAK,eAAe,SAAS,OAAO;AAC7C;AAEO,IAAM,yBAAyB,CACpC,QAAa,CAAC,GACd,UACA,SAAoB,CAAC,GACrB,EAAE,kBAAkB,MAAM,IAAmC,CAAC,MACtD;AACR,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,SAAU,QAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAC/E,QAAM,YAAY,CAAC,MACjB,mBAAmB,OAAO,MAAM,WAAW,EAAE,YAAY,IAAI;AAC/D,QAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAC1D,QAAM,WAAW,IAAI,IAAI,UAAU,IAAI,SAAS,CAAC;AACjD,SAAO,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,IAAI,UAAU,OAAO,QAAQ,CAAC,CAAC,CAAC;AAC1E;AAEO,IAAM,uBAAuB,CAClC,SAAc,CAAC,GACf,QACQ;AACR,SAAO,OAAO,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,cAAc,GAAG;AAChE;;;ACjSO,IAAM,yBAAyB;AAEtC,SAAS,aAA6B;AACpC,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO,OAAO;AAChB;AAEO,SAAS,QAAW,KAAa,WAAqB,MAAgB;AAC3E,MAAI;AACF,UAAM,MAAM,WAAW,GAAG,QAAQ,GAAG;AACrC,QAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,QAAW,KAAa,OAAgB;AACtD,MAAI;AACF,eAAW,GAAG,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EAClD,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,WAAW,KAAmB;AAC5C,MAAI;AACF,eAAW,GAAG,WAAW,GAAG;AAAA,EAC9B,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,cACd,MAAc,wBACC;AACf,QAAM,QAAQ,QAAuB,KAAK,MAAS;AACnD,SAAO,UAAU,OAAO,SAAY;AACtC;AAEO,SAAS,cACd,OACA,MAAc,wBACR;AACN,UAAQ,KAAK,KAAK;AACpB;AAGO,IAAM,MAAM;AACZ,IAAM,MAAM;AAGZ,IAAM,0BAA0B;AAChC,IAAM,0BAA0B;AAChC,IAAM,uBAAuB;;;AC7C7B,SAAS,qBACd,aACwB;AACxB,SAAO,YAAY,OAA+B,CAAC,KAAK,eAAe;AACrE,UAAM,EAAE,YAAY,YAAY,MAAM,aAAa,IAAI;AAEvD,QAAI,CAAC,IAAI,UAAU,GAAG;AACpB,UAAI,UAAU,IAAI,CAAC;AAAA,IACrB;AAEA,QAAI,UAAU,EAAE,IAAI,IAAI;AAExB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;;;ACzBA,6BAAkB;AAClB,yBAAoE;AAiC7D,SAAS,iBACd,OACS;AACT,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,SAAS,MAAM,UAAU,MAAM;AAErC,MACE,WAAW,iBACX,WAAW,mBACX,WAAW,iBACX;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI,WAAW,OAAO,WAAW,OAAO,WAAW,IAAK,QAAO;AAC/D,QAAI,UAAU,OAAO,SAAS,IAAK,QAAO;AAAA,EAC5C;AAEA,SAAO;AACT;AAGO,SAAS,cACd,OACqB;AACrB,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,aAAa;AAAA,MACb,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,UAAU,MAAM;AACrC,QAAM,OAAO,MAAM;AAEnB,MACE,WAAW,iBACX,WAAW,mBACX,WAAW,iBACX;AACA,WAAO;AAAA,MACL,aAAa;AAAA,MACb,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,YAAY,UAAU,OAAO,SAAS,KAAK;AAC/D,WAAO;AAAA,MACL,aAAa;AAAA,MACb,aAAa;AAAA,MACb,kBAAkB,iBAAiB,MAAM;AAAA,MACzC,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,IACb,aACE,MAAM,WACN,MAAM,SACN,MAAM,SACN;AAAA,IACF,kBACE,OAAO,WAAW,YAAY,OAAO,WAAW,WAC5C,iBAAiB,MAAM,KACvB;AAAA,IACN,iBAAiB;AAAA,EACnB;AACF;AAEO,SAAS,2BACd,QACQ;AACR,QAAM,QAAQ,OAAO,KAAK,MAAM,EAAE;AAAA,IAAQ,CAAC,WACxC,OAAO,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,OAAO,GAAG,OAAO;AAAA,EACtD;AACA,SAAO;AAAA;AAAA;AAAA;AAAA,cAIK,MAAM,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAI5B;AAEA,SAAS,oBAAoB,MAAoB;AAC/C,OAAK,mBAAAC,QAAK,KAAK;AAAA,IACb,OAAO;AAAA,IACP;AAAA,IACA,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,EACtB,CAAC;AACH;AAGO,SAAS,eACd,OACA,EAAE,YAAY,OAAO,gBAAgB,IAA2B,CAAC,GAC3D;AACN,MAAI,CAAC,MAAO;AAEZ,QAAM,SAAS,MAAM,UAAU,MAAM;AACrC,QAAM,OAAO,MAAM;AAEnB,MAAI,WAAW,KAAK;AAClB;AAAA,EACF;AAEA,MAAI,MAAM,UAAU,OAAO,KAAK,WAAW,UAAU;AACnD,UAAM,SAAS,KAAK;AAEpB,QAAI,WAAW;AACb,0BAAoB,2BAA2B,MAAM,CAAC;AAAA,IACxD,OAAO;AACL,aAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,UAAU;AACrC,SAAC,OAAO,KAAK,KAAK,CAAC,GAAG,QAAQ,CAAC,iBAAiB;AAC9C,iCAAAC,QAAM,MAAM,YAAY;AAAA,QAC1B,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAEA,MAAI,WAAW,KAAK;AAClB;AAAA,EACF;AAEA,QAAM,UACJ,mBACA,MAAM,WACN,MAAM,SACN,MAAM,SACP,MAAM,WACL;AAEF,yBAAAA,QAAM,MAAM,OAAO;AACrB;AAEA,IAAM,eAAe;AACrB,IAAM,aAAa;AAoBnB,SAAS,uBAAuB,OAAwB;AACtD,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,MAAM;AAIZ,WACE,IAAI,MAAM,WACV,IAAI,MAAM,SACV,IAAI,WACJ;AAAA,EAEJ;AACA,SAAO;AACT;AAEO,SAAS,kBACd,WACA,UAAoC,CAAC,GAC/B;AACN,QAAM;AAAA,IACJ,QAAQ,QAAQ,qBAAqB,0BAA0B;AAAA,IAC/D;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,WAAW,QAAQ,kBAAkB;AAC3C,QAAM,YAAY,uBAAuB;AAEzC,QAAM,YACJ,SACC,WACG;AAAA,QACA,OAAO,mCAAmC,IAAI,SAAS,EAAE;AAAA;AAAA,2CAEtB,YAAY,yBAAyB,kBAAkB;AAAA;AAAA,QAG1F;AAEN,QAAM,cAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,MAAM,CAAC,mBAAAD,QAAK,UAAU;AAAA,IACzC,gBAAgB,MAAM,CAAC,mBAAAA,QAAK,UAAU;AAAA,IACtC,SAAS,MAAM;AACb,UAAI,UAAU,KAAM;AACpB,YAAM,YAAY,mBAAAA,QAAK,aAAa;AACpC,UAAI,UAAW,WAAU,MAAM,SAAS,OAAO,MAAM;AAAA,IACvD;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,gBAAY,OAAO;AACnB,gBAAY,QAAQ;AACpB,gBAAY,mBAAmB;AAC/B,gBAAY,iBAAiB,CAAC,UAAkB;AAC9C,UAAI,CAAC,OAAO,KAAK,EAAG,QAAO;AAC3B,UAAI,MAAM,KAAK,MAAM,mBAAoB,KAAK,GAAG;AAC/C,eAAO,gBAAgB,kBAAkB;AAAA,MAC3C;AACA,aAAO;AAAA,IACT;AAAA,EACF,WAAW,MAAM;AACf,gBAAY,OAAO;AAAA,EACrB,OAAO;AACL,gBAAY,OAAO;AAAA,EACrB;AAEA,MAAI,WAAW;AACb,gBAAY,sBAAsB;AAClC,gBAAY,aAAa,CAAC,eAAuB;AAC/C,UAAI,YAAY,YAAY,KAAK,MAAM,mBAAoB,KAAK,GAAG;AACjE,2BAAAA,QAAK;AAAA,UACH,gBAAgB,kBAAkB;AAAA,QACpC;AACA,eAAO;AAAA,MACT;AACA,aAAO,QAAQ,QAAQ,EACpB,KAAK,MAAM,UAAU,CAAC,EACtB,MAAM,CAAC,UAAU;AAChB,2BAAAA,QAAK,sBAAsB,uBAAuB,KAAK,CAAC;AACxD,cAAM;AAAA,MACR,CAAC;AAAA,IACL;AAAA,EACF;AAEA,OAAK,mBAAAA,QAAK,KAAK,WAAW,EAAE,KAAK,CAAC,WAA6B;AAC7D,QAAI,OAAO,eAAe,CAAC,WAAW;AACpC,WAAK,QAAQ,QAAQ,UAAU,CAAC;AAAA,IAClC;AAAA,EACF,CAAC;AACH;;;ACxTA,mBAAsB;AAStB,SAAS,iBAAiB,MAAuB;AAC/C,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,QAAQ,OAAO,SAAS,YAAY,YAAY,MAAM;AACxD,UAAM,SAAU,KAA6B;AAC7C,YAAQ,UAAU,OAAO,YAAY;AAAA,EACvC;AACA,SAAO;AACT;AAMO,SAAS,yBACd,qBACA;AAAA,EACE,aAAa;AAAA,EACb,eAAe;AACjB,IAAqC,CAAC,GACzB;AACb,QAAM,qBAAiB;AAAA,IACrB,OAAO,MAAM,KAAK,iBAAiB;AACjC,YAAM,SAAS,MAAM,oBAAoB,MAAM,KAAK,YAAY;AAEhE,UAAI,OAAO,SAAS,CAAC,iBAAiB,OAAO,KAAsB,GAAG;AACpE,2BAAM,KAAK,OAAO,KAAK;AAAA,MACzB;AAEA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA,SAAS,CAAC,YACR,IAAI;AAAA,QAAQ,CAAC,YACX,WAAW,SAAS,KAAK,IAAI,MAAO,KAAK,SAAS,YAAY,CAAC;AAAA,MACjE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,gCAA6C,OACjD,MACA,KACA,iBACG;AACH,UAAM,SAAS,iBAAiB,IAAI;AACpC,QAAI,WAAW,OAAO;AACpB,aAAO,oBAAoB,MAAM,KAAK,YAAY;AAAA,IACpD;AACA,WAAO,eAAe,MAAM,KAAK,YAAY;AAAA,EAC/C;AAEA,SAAO;AACT;","names":["clsx","Swal","toast"]}
1
+ {"version":3,"sources":["../../src/utils/index.ts","../../src/utils/cn.ts","../../src/utils/resetPageParam.ts","../../src/utils/helpers.ts","../../src/utils/localStorage.ts","../../src/utils/permissions.ts","../../src/utils/handleApiError.ts","../../src/utils/createBaseQueryWithRetry.ts"],"sourcesContent":["export { cn } from \"./cn\";\r\nexport { resetPageParam } from \"./resetPageParam\";\r\nexport * from \"./helpers\";\r\nexport * from \"./localStorage\";\r\nexport * from \"./permissions\";\r\nexport {\r\n handleApiError,\r\n formatValidationErrorsHtml,\r\n confirmationAlert,\r\n DEFAULT_CONFIRM_ICONS,\r\n classifyError,\r\n isRetryableError,\r\n type RtkQueryError,\r\n type HandleApiErrorOptions,\r\n type ConfirmationAlertOptions,\r\n type ConfirmationAlertVariant,\r\n type ErrorClassification,\r\n type ErrorSuggestedAction,\r\n} from \"./handleApiError\";\r\nexport {\r\n createBaseQueryWithRetry,\r\n type CreateBaseQueryWithRetryOptions,\r\n} from \"./createBaseQueryWithRetry\";\r\n","import clsx from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: Parameters<typeof clsx>) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","/**\n * Sends pagination back to the first page after a filter changes the result set.\n *\n * Only touches `pageKey` when it is already present, so filter-only screens that\n * never paginate keep their URL clean. Mutates and returns `params` so it can be\n * chained inside a `setSearchParams((prev) => ...)` updater.\n */\nexport function resetPageParam(\n params: URLSearchParams,\n pageKey = \"page\",\n defaultPage = \"1\",\n) {\n if (params.has(pageKey)) {\n params.set(pageKey, defaultPage);\n }\n return params;\n}\n","export const truncateText = (\r\n text: string | number | null | undefined,\r\n maxLength = 20\r\n): string => {\r\n if (text === null || text === undefined) return \"\";\r\n const value = String(text);\r\n if (value.length <= maxLength) {\r\n return value;\r\n }\r\n return value.slice(0, maxLength - 3) + \"...\";\r\n};\r\n\r\nexport const truncateFileName = (\r\n fileName: string | null | undefined,\r\n maxLength = 20\r\n): string => {\r\n if (!fileName) return \"\";\r\n if (fileName.length <= maxLength) {\r\n return fileName;\r\n }\r\n const extension = fileName.slice(fileName.lastIndexOf(\".\"));\r\n const truncatedName =\r\n fileName.slice(0, maxLength - extension.length - 3) + \"...\";\r\n return truncatedName + extension;\r\n};\r\n\r\nexport function getApiError(apiError: unknown): string {\r\n if (!apiError) return \"An unknown error occurred\";\r\n\r\n if (typeof apiError === \"string\") {\r\n return apiError;\r\n }\r\n\r\n const error = apiError as {\r\n response?: { data?: Record<string, unknown> };\r\n message?: string;\r\n };\r\n\r\n if (error.response?.data) {\r\n const responseData = error.response.data;\r\n\r\n if (typeof responseData === \"string\") {\r\n return responseData;\r\n }\r\n\r\n const errors = responseData.errors;\r\n if (errors && typeof errors === \"object\") {\r\n for (const key in errors) {\r\n const messages = (errors as Record<string, unknown>)[key];\r\n if (Array.isArray(messages) && messages.length > 0) {\r\n return String(messages[0]);\r\n }\r\n }\r\n }\r\n\r\n if (responseData.message) {\r\n return String(responseData.message);\r\n }\r\n\r\n if (responseData.title) {\r\n return String(responseData.title);\r\n }\r\n }\r\n\r\n if (error.message) {\r\n return error.message;\r\n }\r\n\r\n return \"An unknown error occurred\";\r\n}\r\n\r\nexport const normalizeApiListItems = (responseData: unknown): unknown[] => {\r\n if (responseData == null) return [];\r\n if (Array.isArray(responseData)) return responseData;\r\n\r\n const record = responseData as Record<string, unknown>;\r\n const data = record.data;\r\n\r\n if (\r\n data &&\r\n typeof data === \"object\" &&\r\n !Array.isArray(data) &&\r\n Array.isArray((data as { items?: unknown[] }).items)\r\n ) {\r\n return (data as { items: unknown[] }).items;\r\n }\r\n\r\n const returnModel = record.returnModel as { items?: unknown[] } | undefined;\r\n if (Array.isArray(returnModel?.items)) return returnModel.items;\r\n if (Array.isArray(data)) return data;\r\n if (typeof data === \"object\" && data !== null) {\r\n return [data];\r\n }\r\n return [];\r\n};\r\n\r\nexport function capitalizeText(name: string | null | undefined): string {\r\n if (!name) return \"\";\r\n return name\r\n .split(\" \")\r\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n .join(\" \");\r\n}\r\n\r\nexport function toLowerCaseText(text: string | null | undefined): string {\r\n if (!text) return \"\";\r\n return text.toLowerCase();\r\n}\r\n\r\nexport const formatDate = (dateString: string | null | undefined): string => {\r\n if (dateString === null || dateString === undefined) return \"-\";\r\n const date = new Date(dateString);\r\n\r\n if (isNaN(date.getTime())) {\r\n return dateString;\r\n }\r\n\r\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\r\n const day = date.getDate().toString().padStart(2, \"0\");\r\n const year = date.getFullYear().toString().slice(-2);\r\n return `${month}/${day}/${year}`;\r\n};\r\n\r\nexport const isEmpty = (obj: object): boolean => {\r\n return Object.keys(obj).length === 0;\r\n};\r\n\r\nexport const toDateInputValue = (date: string | Date | null | undefined): string => {\r\n if (!date) return \"\";\r\n\r\n let d: Date;\r\n\r\n if (typeof date === \"string\") {\r\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) {\r\n return date;\r\n }\r\n d = new Date(date);\r\n } else {\r\n d = new Date(date);\r\n }\r\n\r\n if (isNaN(d.getTime())) return \"\";\r\n\r\n const localDate = new Date(d.getTime() - d.getTimezoneOffset() * 60000);\r\n const year = localDate.getFullYear();\r\n const month = (localDate.getMonth() + 1).toString().padStart(2, \"0\");\r\n const day = localDate.getDate().toString().padStart(2, \"0\");\r\n\r\n return `${year}-${month}-${day}`;\r\n};\r\n\r\nexport function convertCommaDataToArray(data: string | null | undefined): string[] {\r\n if (!data || data.trim() === \"\") {\r\n return [];\r\n }\r\n return data.split(\",\").map((item) => item.trim());\r\n}\r\n\r\nexport function checkIfExistsInArray<T>(array: T[], searchValue: T): boolean {\r\n return array.includes(searchValue);\r\n}\r\n\r\nexport const currencyFormatter = (value: number | null | undefined): string => {\r\n return value?.toLocaleString(\"en-US\", {\r\n style: \"currency\",\r\n currency: \"USD\",\r\n }) ?? \"\";\r\n};\r\nexport const formatNumber = (number: number | string | null | undefined): string => {\r\n if (isNaN(Number(number)) || number === null || number === undefined) {\r\n return \"0\";\r\n }\r\n\r\n const formattedNumber = Number(number)\r\n .toString()\r\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n\r\n return formattedNumber;\r\n};\r\n\r\nexport const parseCurrencyValueToNumber = (value: unknown): number => {\r\n if (value == null || value === \"\") return 0;\r\n\r\n const raw =\r\n typeof value === \"object\" && value !== null && \"value\" in value\r\n ? (value as { value: unknown }).value\r\n : value;\r\n\r\n const stringValue = raw == null || raw === \"\" ? \"\" : String(raw);\r\n const numericValue = stringValue.replace(/[$,]/g, \"\");\r\n return parseFloat(numericValue) || 0;\r\n};\r\n\r\nexport function flattenTableData<T extends Record<string, unknown>>(\r\n data: T[] | null | undefined,\r\n columns: { field?: string }[] | null | undefined\r\n): T[] {\r\n if (!Array.isArray(data)) return [];\r\n return data.map((row) => {\r\n const flatRow = { ...row };\r\n (columns ?? []).forEach((col) => {\r\n const key = col.field;\r\n if (!key) return;\r\n if (key.includes(\".\")) {\r\n const value = key.split(\".\").reduce<unknown>(\r\n (acc, part) => (acc as Record<string, unknown> | undefined)?.[part],\r\n row\r\n );\r\n (flatRow as Record<string, unknown>)[key] = value ?? \"\";\r\n }\r\n });\r\n return flatRow;\r\n });\r\n}\r\n\r\nexport const getErrorMessages = (error: {\r\n data?: {\r\n errors?: Record<string, string[]>;\r\n title?: string;\r\n error?: { name?: string[] };\r\n };\r\n} | null | undefined): string => {\r\n if (error?.data?.errors) {\r\n return Object.values(error.data.errors).flat().join(\"\\n\");\r\n }\r\n return (\r\n error?.data?.title ??\r\n error?.data?.error?.name?.[0] ??\r\n \"Failed to save\"\r\n );\r\n};\r\n\r\nexport const getFieldsByCategory = <T extends { category?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields?.filter(({ category = \"\" }) => category === key);\r\n};\r\n\r\nexport const getFieldsByName = <T extends { name?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields.filter(({ name = \"\" }) => name === key);\r\n};\r\n\r\nexport const deserializeJson = <T = unknown>(jsonString: string): T | null => {\r\n try {\r\n return JSON.parse(jsonString) as T;\r\n } catch (error) {\r\n console.error(\"Error parsing JSON:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nexport const formatDateTime = (dateString: string | null | undefined): string => {\r\n if (!dateString) return \"Invalid Date\";\r\n const date = new Date(dateString);\r\n if (isNaN(date.getTime())) return \"Invalid Date\";\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: \"numeric\",\r\n month: \"numeric\",\r\n day: \"numeric\",\r\n hour: \"numeric\",\r\n minute: \"numeric\",\r\n hour12: true,\r\n };\r\n return date.toLocaleString(\"en-US\", options);\r\n};\r\n\r\nexport const removeByPropertyValues = <T extends Record<string, unknown>>(\r\n items: T[] = [],\r\n property: keyof T & string,\r\n values: unknown[] = [],\r\n { caseInsensitive = false }: { caseInsensitive?: boolean } = {}\r\n): T[] => {\r\n if (!Array.isArray(items) || !property) return Array.isArray(items) ? items : [];\r\n const normalize = (v: unknown) =>\r\n caseInsensitive && typeof v === \"string\" ? v.toLowerCase() : v;\r\n const valuesArr = Array.isArray(values) ? values : [values];\r\n const toRemove = new Set(valuesArr.map(normalize));\r\n return items.filter((item) => !toRemove.has(normalize(item?.[property])));\r\n};\r\n\r\nexport const getFieldsByInputType = <T extends { inputType?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields.filter(({ inputType = \"\" }) => inputType === key);\r\n};\r\n","export const USER_STATE_STORAGE_KEY = \"authState\";\r\n\r\nfunction getStorage(): Storage | null {\r\n if (typeof window === \"undefined\") return null;\r\n return window.localStorage;\r\n}\r\n\r\nexport function getItem<T>(key: string, fallback: T | null = null): T | null {\r\n try {\r\n const raw = getStorage()?.getItem(key);\r\n if (raw === null || raw === undefined) {\r\n return fallback;\r\n }\r\n return JSON.parse(raw) as T;\r\n } catch {\r\n return fallback;\r\n }\r\n}\r\n\r\nexport function setItem<T>(key: string, value: T): void {\r\n try {\r\n getStorage()?.setItem(key, JSON.stringify(value));\r\n } catch {\r\n // Ignore write errors (quota exceeded, private mode, etc.)\r\n }\r\n}\r\n\r\nexport function removeItem(key: string): void {\r\n try {\r\n getStorage()?.removeItem(key);\r\n } catch {\r\n // Ignore remove errors\r\n }\r\n}\r\n\r\nexport function loadUserState<T = unknown>(\r\n key: string = USER_STATE_STORAGE_KEY\r\n): T | undefined {\r\n const value = getItem<T | undefined>(key, undefined);\r\n return value === null ? undefined : value;\r\n}\r\n\r\nexport function saveUserState<T = unknown>(\r\n state: T,\r\n key: string = USER_STATE_STORAGE_KEY\r\n): void {\r\n setItem(key, state);\r\n}\r\n\r\n/** Task-aligned aliases */\r\nexport const get = getItem;\r\nexport const set = setItem;\r\n\r\n/** Backward-compatible aliases used in federation apps */\r\nexport const getItemFromLocalStorage = getItem;\r\nexport const storeItemInLocalStorage = setItem;\r\nexport const saveItemLocalStorage = setItem;\r\n","export interface PermissionRecord {\r\n moduleName: string;\r\n permission: string;\r\n permissionId: string | number;\r\n}\r\n\r\nexport type TransformedPermissions = Record<\r\n string,\r\n Record<string, string | number>\r\n>;\r\n\r\nexport function transformPermissions(\r\n permissions: PermissionRecord[]\r\n): TransformedPermissions {\r\n return permissions.reduce<TransformedPermissions>((acc, permission) => {\r\n const { moduleName, permission: perm, permissionId } = permission;\r\n\r\n if (!acc[moduleName]) {\r\n acc[moduleName] = {};\r\n }\r\n\r\n acc[moduleName][perm] = permissionId;\r\n\r\n return acc;\r\n }, {});\r\n}\r\n","import toast from \"react-hot-toast\";\r\nimport Swal, { type SweetAlertOptions, type SweetAlertResult } from \"sweetalert2\";\r\n\r\nexport type RtkQueryError = {\r\n status?: number | string;\r\n originalStatus?: number;\r\n data?: {\r\n errors?: Record<string, string[]>;\r\n message?: string;\r\n title?: string;\r\n };\r\n message?: string;\r\n error?: string;\r\n};\r\n\r\nexport interface HandleApiErrorOptions {\r\n showAlert?: boolean;\r\n fallbackMessage?: string;\r\n}\r\n\r\nexport type ErrorSuggestedAction =\r\n | \"retry\"\r\n | \"refresh\"\r\n | \"contact-support\"\r\n | \"none\";\r\n\r\nexport type ErrorClassification = {\r\n isRetryable: boolean;\r\n userMessage: string;\r\n technicalMessage: string;\r\n suggestedAction: ErrorSuggestedAction;\r\n};\r\n\r\n/** Returns true for transient network/server errors that warrant automatic retry. */\r\nexport function isRetryableError(\r\n error: RtkQueryError | null | undefined\r\n): boolean {\r\n if (!error) return false;\r\n\r\n const status = error.status ?? error.originalStatus;\r\n\r\n if (\r\n status === \"FETCH_ERROR\" ||\r\n status === \"TIMEOUT_ERROR\" ||\r\n status === \"PARSING_ERROR\"\r\n ) {\r\n return true;\r\n }\r\n\r\n if (typeof status === \"number\") {\r\n if (status === 502 || status === 503 || status === 504) return true;\r\n if (status >= 500 && status < 600) return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/** Classifies RTK Query errors for user messaging and retry guidance. */\r\nexport function classifyError(\r\n error: RtkQueryError | null | undefined\r\n): ErrorClassification {\r\n if (!error) {\r\n return {\r\n isRetryable: false,\r\n userMessage: \"An error occurred.\",\r\n technicalMessage: \"Unknown error\",\r\n suggestedAction: \"none\",\r\n };\r\n }\r\n\r\n const status = error.status ?? error.originalStatus;\r\n const data = error.data;\r\n\r\n if (\r\n status === \"FETCH_ERROR\" ||\r\n status === \"TIMEOUT_ERROR\" ||\r\n status === \"PARSING_ERROR\"\r\n ) {\r\n return {\r\n isRetryable: true,\r\n userMessage: \"Network error. Please check your connection.\",\r\n technicalMessage: \"Network request failed\",\r\n suggestedAction: \"retry\",\r\n };\r\n }\r\n\r\n if (typeof status === \"number\" && status >= 500 && status < 600) {\r\n return {\r\n isRetryable: true,\r\n userMessage: \"Server is temporarily unavailable. Please try again.\",\r\n technicalMessage: `Server error: ${status}`,\r\n suggestedAction: \"retry\",\r\n };\r\n }\r\n\r\n return {\r\n isRetryable: false,\r\n userMessage:\r\n data?.message ||\r\n data?.title ||\r\n error.error ||\r\n \"An error occurred. Please try again.\",\r\n technicalMessage:\r\n typeof status === \"number\" || typeof status === \"string\"\r\n ? `Client error: ${status}`\r\n : \"Request failed\",\r\n suggestedAction: \"none\",\r\n };\r\n}\r\n\r\nexport function formatValidationErrorsHtml(\r\n errors: Record<string, string[]>\r\n): string {\r\n const items = Object.keys(errors).flatMap((field) =>\r\n (errors[field] || []).map((msg) => `<li>${msg}</li>`)\r\n );\r\n return `\r\n <div style=\"text-align:left\">\r\n <p>Please review and correct the following:</p>\r\n <ul style=\"margin:8px 0 0 16px; list-style:disc;\">\r\n ${items.join(\"\")}\r\n </ul>\r\n </div>\r\n `;\r\n}\r\n\r\nfunction showValidationAlert(html: string): void {\r\n void Swal.fire({\r\n title: \"Validation errors\",\r\n html,\r\n icon: \"error\",\r\n confirmButtonText: \"OK\",\r\n showCancelButton: false,\r\n confirmButtonColor: \"#FF7335\",\r\n });\r\n}\r\n\r\n/** Handles RTK Query errors with built-in toast.error or SweetAlert (when showAlert is true). */\r\nexport function handleApiError(\r\n error: RtkQueryError | null | undefined,\r\n { showAlert = false, fallbackMessage }: HandleApiErrorOptions = {}\r\n): void {\r\n if (!error) return;\r\n\r\n const status = error.status ?? error.originalStatus;\r\n const data = error.data;\r\n\r\n if (status === 200) {\r\n return;\r\n }\r\n\r\n if (data?.errors && typeof data.errors === \"object\") {\r\n const errors = data.errors;\r\n\r\n if (showAlert) {\r\n showValidationAlert(formatValidationErrorsHtml(errors));\r\n } else {\r\n Object.keys(errors).forEach((field) => {\r\n (errors[field] || []).forEach((errorMessage) => {\r\n toast.error(errorMessage);\r\n });\r\n });\r\n }\r\n return;\r\n }\r\n\r\n if (status === 404) {\r\n return;\r\n }\r\n\r\n const message =\r\n fallbackMessage ||\r\n data?.message ||\r\n data?.title ||\r\n error.error ||\r\n error.message ||\r\n \"An error occurred. Please try again.\";\r\n\r\n toast.error(message);\r\n}\r\n\r\nconst BRAND_ORANGE = \"#FF7335\";\r\nconst DANGER_RED = \"#DC2626\";\r\nconst DANGER_ICON_BG = \"#FEE2E2\";\r\nconst CANCEL_BG = \"#ffffff\";\r\nconst CANCEL_TEXT = \"#374151\";\r\nconst CONFIRM_STYLE_ID = \"eztrak-confirm-alert-styles\";\r\n\r\nexport type ConfirmationAlertVariant = \"brand\" | \"danger\";\r\n\r\nexport interface ConfirmationAlertOptions {\r\n title?: string;\r\n text?: string;\r\n html?: string;\r\n /** Body HTML when `html` is not set. String only (not React nodes). */\r\n children?: string;\r\n icon?: \"warning\" | \"info\" | \"question\" | \"error\" | \"success\";\r\n /** Custom icon markup. When set, replaces SweetAlert's default icon content. */\r\n iconHtml?: string;\r\n iconColor?: string;\r\n iconBgColor?: string;\r\n showIcon?: boolean;\r\n confirmButtonText?: string;\r\n cancelButtonText?: string;\r\n confirmButtonColor?: string;\r\n cancelButtonColor?: string;\r\n confirmButtonTextColor?: string;\r\n cancelButtonTextColor?: string;\r\n showCancelButton?: boolean;\r\n showLoaderOnConfirm?: boolean;\r\n /** Type exactly — trimmed, case-sensitive. */\r\n inputExpectedValue?: string;\r\n inputPlaceholder?: string;\r\n reverseButtons?: boolean;\r\n focusCancel?: boolean;\r\n zIndex?: number;\r\n width?: string | number;\r\n /** Card corner radius. Default `1rem`. Number = px. */\r\n borderRadius?: string | number;\r\n /** Confirm/cancel button corner radius. Default `0.5rem`. Number = px. */\r\n buttonBorderRadius?: string | number;\r\n /** Typed-input margin. Number = px. Bottom default `1.25rem`; other sides default `0`. */\r\n inputMarginTop?: string | number;\r\n inputMarginRight?: string | number;\r\n inputMarginBottom?: string | number;\r\n inputMarginLeft?: string | number;\r\n /** `danger` = delete look; `brand` = orange confirm. Explicit options win. */\r\n variant?: ConfirmationAlertVariant;\r\n customClass?: SweetAlertOptions[\"customClass\"];\r\n onCancel?: () => void;\r\n}\r\n\r\nfunction cssSize(value: string | number | undefined, fallback: string): string {\r\n if (value === undefined) return fallback;\r\n return typeof value === \"number\" ? `${value}px` : value;\r\n}\r\n\r\n/** Reusable icon markup — override via `iconHtml`. */\r\nexport const DEFAULT_CONFIRM_ICONS = {\r\n warning: `\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z\" />\r\n </svg>\r\n `.trim(),\r\n} as const;\r\n\r\ntype VariantDefaults = Partial<\r\n Pick<\r\n ConfirmationAlertOptions,\r\n | \"title\"\r\n | \"confirmButtonText\"\r\n | \"confirmButtonColor\"\r\n | \"confirmButtonTextColor\"\r\n | \"cancelButtonColor\"\r\n | \"cancelButtonTextColor\"\r\n | \"iconColor\"\r\n | \"iconBgColor\"\r\n | \"iconHtml\"\r\n | \"showLoaderOnConfirm\"\r\n | \"icon\"\r\n >\r\n>;\r\n\r\nconst VARIANT_DEFAULTS: Record<ConfirmationAlertVariant, VariantDefaults> = {\r\n brand: {\r\n confirmButtonText: \"Yes\",\r\n confirmButtonColor: BRAND_ORANGE,\r\n confirmButtonTextColor: \"#ffffff\",\r\n cancelButtonColor: CANCEL_BG,\r\n cancelButtonTextColor: CANCEL_TEXT,\r\n iconColor: BRAND_ORANGE,\r\n iconBgColor: \"#FFEDD5\",\r\n iconHtml: DEFAULT_CONFIRM_ICONS.warning,\r\n icon: \"warning\",\r\n },\r\n danger: {\r\n title: \"Delete this item\",\r\n confirmButtonText: \"Yes, delete it!\",\r\n confirmButtonColor: DANGER_RED,\r\n confirmButtonTextColor: \"#ffffff\",\r\n cancelButtonColor: CANCEL_BG,\r\n cancelButtonTextColor: CANCEL_TEXT,\r\n iconColor: DANGER_RED,\r\n iconBgColor: DANGER_ICON_BG,\r\n iconHtml: DEFAULT_CONFIRM_ICONS.warning,\r\n icon: \"warning\",\r\n showLoaderOnConfirm: true,\r\n },\r\n};\r\n\r\nfunction ensureConfirmAlertStyles(): void {\r\n if (typeof document === \"undefined\") return;\r\n if (document.getElementById(CONFIRM_STYLE_ID)) return;\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = CONFIRM_STYLE_ID;\r\n style.textContent = `\r\n .ez-confirm-popup {\r\n border-radius: var(--ez-confirm-radius, 1rem) !important;\r\n padding: 1.5rem !important;\r\n max-width: 24rem !important;\r\n width: var(--ez-confirm-width, 100%) !important;\r\n box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25) !important;\r\n }\r\n .ez-confirm-title {\r\n font-size: 1.125rem !important;\r\n font-weight: 600 !important;\r\n color: #111827 !important;\r\n margin: 0 0 0.25rem !important;\r\n padding: 0 !important;\r\n }\r\n .ez-confirm-html {\r\n font-size: 0.875rem !important;\r\n color: #6b7280 !important;\r\n margin: 0 0 1.5rem !important;\r\n }\r\n .ez-confirm-icon {\r\n border: none !important;\r\n background: var(--ez-confirm-icon-bg, #fee2e2) !important;\r\n color: var(--ez-confirm-icon-color, #dc2626) !important;\r\n width: 3rem !important;\r\n height: 3rem !important;\r\n margin: 0 auto 1rem !important;\r\n border-radius: 9999px !important;\r\n }\r\n .ez-confirm-icon .swal2-icon-content {\r\n font-size: inherit !important;\r\n display: flex !important;\r\n align-items: center !important;\r\n justify-content: center !important;\r\n color: inherit !important;\r\n }\r\n .ez-confirm-actions {\r\n width: 100% !important;\r\n margin: 0 !important;\r\n gap: 0.75rem !important;\r\n }\r\n .ez-confirm-confirm,\r\n .ez-confirm-cancel {\r\n flex: 1 1 0 !important;\r\n margin: 0 !important;\r\n border-radius: var(--ez-confirm-btn-radius, 0.5rem) !important;\r\n font-size: 0.875rem !important;\r\n font-weight: 500 !important;\r\n padding: 0.625rem 1rem !important;\r\n box-shadow: none !important;\r\n }\r\n .ez-confirm-confirm {\r\n background: var(--ez-confirm-confirm-bg, #ff7335) !important;\r\n color: var(--ez-confirm-confirm-fg, #fff) !important;\r\n border: none !important;\r\n }\r\n .ez-confirm-confirm:hover {\r\n filter: brightness(0.95);\r\n }\r\n .ez-confirm-cancel {\r\n background: var(--ez-confirm-cancel-bg, #fff) !important;\r\n color: var(--ez-confirm-cancel-fg, #374151) !important;\r\n border: 1px solid #d1d5db !important;\r\n }\r\n .ez-confirm-cancel:hover {\r\n background: #f9fafb !important;\r\n }\r\n .ez-confirm-popup .swal2-input {\r\n margin-top: var(--ez-confirm-input-mt, 0) !important;\r\n margin-right: var(--ez-confirm-input-mr, 0) !important;\r\n margin-bottom: var(--ez-confirm-input-mb, 1.25rem) !important;\r\n margin-left: var(--ez-confirm-input-ml, 0) !important;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\nfunction pick<T>(\r\n explicit: T | undefined,\r\n fromVariant: T | undefined,\r\n fallback: T\r\n): T {\r\n if (explicit !== undefined) return explicit;\r\n if (fromVariant !== undefined) return fromVariant;\r\n return fallback;\r\n}\r\n\r\nfunction mergeCustomClass(\r\n base: NonNullable<SweetAlertOptions[\"customClass\"]>,\r\n extra?: SweetAlertOptions[\"customClass\"]\r\n): SweetAlertOptions[\"customClass\"] {\r\n if (!extra || typeof extra !== \"object\") return base;\r\n const merged: Record<string, string> = { ...(base as Record<string, string>) };\r\n for (const [key, value] of Object.entries(extra)) {\r\n if (typeof value === \"string\" && value) {\r\n merged[key] = merged[key] ? `${merged[key]} ${value}` : value;\r\n }\r\n }\r\n return merged;\r\n}\r\n\r\nfunction getConfirmErrorMessage(error: unknown): string {\r\n if (error && typeof error === \"object\") {\r\n const err = error as {\r\n message?: string;\r\n data?: { message?: string; title?: string };\r\n };\r\n return (\r\n err.data?.message ||\r\n err.data?.title ||\r\n err.message ||\r\n \"Something went wrong. Please try again.\"\r\n );\r\n }\r\n return \"Something went wrong. Please try again.\";\r\n}\r\n\r\nexport function confirmationAlert(\r\n onConfirm: () => void | Promise<void>,\r\n options: ConfirmationAlertOptions = {}\r\n): void {\r\n ensureConfirmAlertStyles();\r\n\r\n const variant = options.variant ?? \"brand\";\r\n const vd = VARIANT_DEFAULTS[variant];\r\n\r\n const inputExpectedValue = options.inputExpectedValue;\r\n const hasInput = Boolean(inputExpectedValue);\r\n\r\n const title = pick(\r\n options.title,\r\n vd.title,\r\n hasInput ? \"Confirmation Required\" : \"Delete this item\"\r\n );\r\n const text = options.text;\r\n const html = options.html ?? options.children;\r\n const icon = pick(options.icon, vd.icon, \"warning\" as const);\r\n const iconHtml = pick(options.iconHtml, vd.iconHtml, undefined);\r\n const iconColor = pick(options.iconColor, vd.iconColor, BRAND_ORANGE);\r\n const iconBgColor = pick(options.iconBgColor, vd.iconBgColor, \"#FFEDD5\");\r\n const showIcon = options.showIcon !== false;\r\n const confirmButtonText = pick(options.confirmButtonText, vd.confirmButtonText, \"Yes\");\r\n const cancelButtonText = options.cancelButtonText ?? \"Cancel\";\r\n const confirmButtonColor = pick(\r\n options.confirmButtonColor,\r\n vd.confirmButtonColor,\r\n BRAND_ORANGE\r\n );\r\n const cancelButtonColor = pick(\r\n options.cancelButtonColor,\r\n vd.cancelButtonColor,\r\n CANCEL_BG\r\n );\r\n const confirmButtonTextColor = pick(\r\n options.confirmButtonTextColor,\r\n vd.confirmButtonTextColor,\r\n \"#ffffff\"\r\n );\r\n const cancelButtonTextColor = pick(\r\n options.cancelButtonTextColor,\r\n vd.cancelButtonTextColor,\r\n CANCEL_TEXT\r\n );\r\n const showCancelButton = options.showCancelButton !== false;\r\n const showLoaderOnConfirm = pick(\r\n options.showLoaderOnConfirm,\r\n vd.showLoaderOnConfirm,\r\n false\r\n );\r\n const inputPlaceholder =\r\n options.inputPlaceholder ?? \"Type confirmation text to proceed\";\r\n // Cancel left, Confirm right (matches gallery delete card)\r\n const reverseButtons = options.reverseButtons ?? false;\r\n const focusCancel = options.focusCancel;\r\n const zIndex = options.zIndex;\r\n const width = options.width;\r\n const borderRadius = cssSize(options.borderRadius, \"1rem\");\r\n const buttonBorderRadius = cssSize(options.buttonBorderRadius, \"0.5rem\");\r\n const inputMarginTop = cssSize(options.inputMarginTop, \"0\");\r\n const inputMarginRight = cssSize(options.inputMarginRight, \"0\");\r\n const inputMarginBottom = cssSize(options.inputMarginBottom, \"1.25rem\");\r\n const inputMarginLeft = cssSize(options.inputMarginLeft, \"0\");\r\n const onCancel = options.onCancel;\r\n\r\n const useLoader = showLoaderOnConfirm || hasInput;\r\n\r\n const inputHtml =\r\n html ??\r\n (hasInput\r\n ? `\r\n ${text ? `<p style=\"margin-bottom: 15px;\">${text}</p>` : \"\"}\r\n <p style=\"margin-bottom: 10px; font-weight: bold; color: #666;\">\r\n Please type \"<span style=\"color: ${BRAND_ORANGE}; font-weight: bold;\">${inputExpectedValue}</span>\" to confirm:\r\n </p>\r\n `\r\n : undefined);\r\n\r\n const baseCustomClass = {\r\n popup: \"ez-confirm-popup\",\r\n title: \"ez-confirm-title\",\r\n htmlContainer: \"ez-confirm-html\",\r\n actions: \"ez-confirm-actions\",\r\n confirmButton: \"ez-confirm-confirm\",\r\n cancelButton: \"ez-confirm-cancel\",\r\n icon: \"ez-confirm-icon\",\r\n };\r\n\r\n const swalOptions: SweetAlertOptions = {\r\n title,\r\n showCancelButton,\r\n confirmButtonText,\r\n cancelButtonText,\r\n confirmButtonColor,\r\n cancelButtonColor,\r\n reverseButtons,\r\n focusCancel,\r\n customClass: mergeCustomClass(baseCustomClass, options.customClass),\r\n allowOutsideClick: () => !Swal.isLoading(),\r\n allowEscapeKey: () => !Swal.isLoading(),\r\n didOpen: () => {\r\n const popup = Swal.getPopup();\r\n if (popup) {\r\n popup.style.setProperty(\"--ez-confirm-confirm-bg\", confirmButtonColor);\r\n popup.style.setProperty(\"--ez-confirm-confirm-fg\", confirmButtonTextColor);\r\n popup.style.setProperty(\"--ez-confirm-cancel-bg\", cancelButtonColor);\r\n popup.style.setProperty(\"--ez-confirm-cancel-fg\", cancelButtonTextColor);\r\n popup.style.setProperty(\"--ez-confirm-icon-color\", iconColor);\r\n popup.style.setProperty(\"--ez-confirm-icon-bg\", iconBgColor);\r\n popup.style.setProperty(\"--ez-confirm-radius\", borderRadius);\r\n popup.style.setProperty(\"--ez-confirm-btn-radius\", buttonBorderRadius);\r\n popup.style.setProperty(\"--ez-confirm-input-mt\", inputMarginTop);\r\n popup.style.setProperty(\"--ez-confirm-input-mr\", inputMarginRight);\r\n popup.style.setProperty(\"--ez-confirm-input-mb\", inputMarginBottom);\r\n popup.style.setProperty(\"--ez-confirm-input-ml\", inputMarginLeft);\r\n if (width != null) {\r\n popup.style.setProperty(\r\n \"--ez-confirm-width\",\r\n typeof width === \"number\" ? `${width}px` : String(width)\r\n );\r\n }\r\n }\r\n if (zIndex == null) return;\r\n const container = Swal.getContainer();\r\n if (container) container.style.zIndex = String(zIndex);\r\n },\r\n };\r\n\r\n if (showIcon) {\r\n swalOptions.icon = icon;\r\n if (iconHtml) {\r\n swalOptions.iconHtml = iconHtml;\r\n }\r\n }\r\n\r\n if (hasInput) {\r\n swalOptions.html = inputHtml;\r\n swalOptions.input = \"text\";\r\n swalOptions.inputPlaceholder = inputPlaceholder;\r\n swalOptions.inputValidator = (value: string) => {\r\n if (!value?.trim()) return \"You need to enter the confirmation text!\";\r\n if (value.trim() !== inputExpectedValue!.trim()) {\r\n return `Please type \"${inputExpectedValue}\" exactly as shown!`;\r\n }\r\n return null;\r\n };\r\n } else if (html) {\r\n swalOptions.html = html;\r\n } else {\r\n swalOptions.text = text;\r\n }\r\n\r\n if (useLoader) {\r\n swalOptions.showLoaderOnConfirm = true;\r\n swalOptions.preConfirm = (inputValue: string) => {\r\n if (hasInput && inputValue?.trim() !== inputExpectedValue!.trim()) {\r\n Swal.showValidationMessage(\r\n `Please type \"${inputExpectedValue}\" exactly as shown!`\r\n );\r\n return false;\r\n }\r\n return Promise.resolve()\r\n .then(() => onConfirm())\r\n .catch((error) => {\r\n Swal.showValidationMessage(getConfirmErrorMessage(error));\r\n throw error;\r\n });\r\n };\r\n }\r\n\r\n void Swal.fire(swalOptions).then((result: SweetAlertResult) => {\r\n if (result.isConfirmed && !useLoader) {\r\n void Promise.resolve(onConfirm());\r\n return;\r\n }\r\n if (result.isDismissed) {\r\n onCancel?.();\r\n }\r\n });\r\n}\r\n","import { retry } from \"@reduxjs/toolkit/query\";\r\nimport type { BaseQueryFn } from \"@reduxjs/toolkit/query\";\r\nimport { isRetryableError, type RtkQueryError } from \"./handleApiError\";\r\n\r\nexport type CreateBaseQueryWithRetryOptions = {\r\n maxRetries?: number;\r\n maxBackoffMs?: number;\r\n};\r\n\r\nfunction getRequestMethod(args: unknown): string {\r\n if (typeof args === \"string\") return \"GET\";\r\n if (args && typeof args === \"object\" && \"method\" in args) {\r\n const method = (args as { method?: string }).method;\r\n return (method || \"GET\").toUpperCase();\r\n }\r\n return \"GET\";\r\n}\r\n\r\n/**\r\n * Wraps an authenticated baseQuery with RTK Query retry for GET requests only.\r\n * Retries transient network/server errors with exponential backoff.\r\n */\r\nexport function createBaseQueryWithRetry(\r\n baseQueryWithReauth: BaseQueryFn,\r\n {\r\n maxRetries = 3,\r\n maxBackoffMs = 8000,\r\n }: CreateBaseQueryWithRetryOptions = {}\r\n): BaseQueryFn {\r\n const retryableQuery = retry(\r\n async (args, api, extraOptions) => {\r\n const result = await baseQueryWithReauth(args, api, extraOptions);\r\n\r\n if (result.error && !isRetryableError(result.error as RtkQueryError)) {\r\n retry.fail(result.error);\r\n }\r\n\r\n return result;\r\n },\r\n {\r\n maxRetries,\r\n backoff: (attempt: number) =>\r\n new Promise((resolve) =>\r\n setTimeout(resolve, Math.min(1000 * 2 ** attempt, maxBackoffMs))\r\n ),\r\n }\r\n );\r\n\r\n const baseQueryWithConditionalRetry: BaseQueryFn = async (\r\n args,\r\n api,\r\n extraOptions\r\n ) => {\r\n const method = getRequestMethod(args);\r\n if (method !== \"GET\") {\r\n return baseQueryWithReauth(args, api, extraOptions);\r\n }\r\n return retryableQuery(args, api, extraOptions);\r\n };\r\n\r\n return baseQueryWithConditionalRetry;\r\n}\r\n"],"mappings":"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","names":["clsx","Swal","toast"]}
@@ -1,8 +1,9 @@
1
1
  import {
2
2
  createBaseQueryWithRetry,
3
3
  transformPermissions
4
- } from "../chunk-WZVYTP6G.mjs";
4
+ } from "../chunk-LS7AI4ER.mjs";
5
5
  import {
6
+ DEFAULT_CONFIRM_ICONS,
6
7
  USER_STATE_STORAGE_KEY,
7
8
  capitalizeText,
8
9
  checkIfExistsInArray,
@@ -43,8 +44,9 @@ import {
43
44
  toLowerCaseText,
44
45
  truncateFileName,
45
46
  truncateText
46
- } from "../chunk-EIX5CUQF.mjs";
47
+ } from "../chunk-QOYMQFOB.mjs";
47
48
  export {
49
+ DEFAULT_CONFIRM_ICONS,
48
50
  USER_STATE_STORAGE_KEY,
49
51
  capitalizeText,
50
52
  checkIfExistsInArray,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eztrak/shared",
3
- "version": "0.16.6",
3
+ "version": "0.17.1",
4
4
  "homepage": "https://github.com/mehrancentangle/eztrak-packages",
5
5
  "description": "Shared hooks, utils, and UI for Eztrak federation apps",
6
6
  "main": "./dist/index.js",