{"version":3,"sources":["../src/utils/helpers/errorHandler/index.ts","../src/utils/helpers/helpersNeedToLoadBeforeTheyGetUsed/index.ts","../src/utils/constants/apiConstants/index.ts","../src/utils/constants/firebaseConstants/index.ts","../src/utils/constants/generic/index.ts","../src/enums/rolePermissionsEnum/index.ts","../src/utils/constants/permissions/index.ts","../src/utils/helpers/rolePermissionsHelpers/index.ts","../src/utils/constants/rolePermissionsConstants/index.ts","../src/utils/helpers/validators/index.ts","../src/utils/messages/index.ts","../src/enums/firebaseEnum/index.ts","../src/enums/generic/index.ts","../src/utils/helpers/generic/index.ts","../src/require-package/dayjs/index.ts"],"names":["reportCustomError","errData","message","showInConsole","_data","error","checkForDuplicateEnumValues","enumObject","values","uniqueValues","item","apiHeaderKeys","frbCollectionQueryDefaults","apiConstants","defaultValue","dayjs","dateFormat","urlParams","timeUnitType","urlTarget","fieldsValidation","svgIconTypes","allowedImageTypes","RoleEnum","PermissionEnum","_UserRoleEnum","PermissionTypeEnum","PermissionCheckModeEnum","permissionsData","_a","permissionsStrings","key","getPermissions","excludes","include","_excludes","el","_include","_key","exclude","getUserRoleEnumValueFromString","_userRole","mapPermissionsToStrings","permissions","uniquePermissions","permission","hasPermission","userPermissions","validateRequiredPermissions","requiredPermissions","checkModeForRequiredPermissions","validateExcludedPermissions","excludedPermissions","checkModeForExcludedPermissions","validateUserPermissions","permissionsToExcludeForAdmin","permissionsToExcludeForManager","permissionsToExcludeForEditor","permissionsToExcludeForCreator","permissionsToExcludeForReviewer","permissionsToExcludeForEngager","permissionsToIncludeForEngager","rolePermissionsMap","validateEmail","email","validateURL","url","validatePhoneNumber","phone","ztkMessages","DBColumnKeysShortFormEnum","FrbOrderbyDirectionEnum","FrbWhereConditionEnum","ResponseCodeEnum","ResponseStatusEnum","RequestTypeEnum","LinkTargetEnum","SearchParamKeysEnum","RequestContentTypeEnum","RequestStatusEnum","TransferMethodEnum","QueryKeyTypeEnum","ProcessStatusEnum","BooleanEnum","varTypesEnum","PlatformTypeEnum","TimeUnitEnum","getZUniqueKey","_b","_c","head","tail","emptyVoidReturnFunction","emptyVoidReturnFunctionPromise","zStringify","zJsonParse","isZNonEmptyString","value","isZNonEmptyStrings","_value","isZValidNumber","checkPositive","numberValue","isZValidNumbers","convertToTitleCase","s","convertToTitleCaseV1","isStringVariable","_","a","b","ZTotalPages","total","perPage","imageUrlToBase64","authToken","headers","request","response","blob","resolve","reject","reader","replaceUrlDynamicParts","itemsId","urlDynamicParts","resultUrl","dynamicPart","itemId","zConvertToBoolean","generateUniqueCode","length","characters","code","i","randomIndex","isNullOrUndefined","isNotNullOrUndefined","dumpValueNoLogNothing","isArray","arr","checkLength","typeIsArray","isObject","isSoftDeleted","dbItemIsBlocked","getDBTimeColumnValue","getDateFromFrbTimestamp","addUrlProtocolHandler","isLocalhost","obj","checkKeys","typeIsObject","buildFilterObject","filter","result","getActiveFilters","field","isValidUrl","isValidVanityUrl","domain","lowercaseUrl","containSpecialCharacters","text","generateSlug","options","lowercase","separator","trim","charMap","match","char","escapedSeparator","multiSeparatorRegex","trimRegex","validateInputCharacters","input","type","invalidRegex","matches","invalidChars","validatedValue","getImageBase64Url","file","containQueryParams","queryParams","param","getObjectKey","checkNull","checkIfKeyExists","isEqual","x","y","p","toRad","Value","calcCrow","lat1","lng1","lat2","lng2","dLat","dLon","truncateString","detectDeviceAndViewMode","webkitVer","isGoogle","isAndroid","androidDesktopMode","checkEqualityOfTwoArray","arrOne","arrTwo","element","isFileTypeAllowed","_d","getImageDimensions","img","objectUrl","height","width","event","imageElement","getImageAspectRatio","checkVariableType","val","isFunction","imageTypeAllowed","validateFileBeforeUpload","sizeLimit","isValidEmail","re","generateUUID","c","v","flattenArray","flat","normalizeEnumValue","normalizedType","matchedEntry","isFileTypeValid","filename","filetype","getTextOnly","getPaginationParams","pagination","returnDefaultValues","defaultOffset","defaultLimit","offset","limit","createRegexMatch","searchQuery","formatUSD","stripeAmount","formatStripeAmount","USDString","removeLeadingTrailingChars","onlyLeading","onlyTrailing","trimWhitespace","escapedChars","pattern","regex","hasLeadingOrTrailingSlash","escapeRegex","removeLeadingTrailing","escaped","formatCamelCaseToTitle","str","word","getTimeInUnit","valueUnit","outputUnit","valueInSeconds","isApplePrivateEmail","frbTimestamp","convertToDateTimestampToStoreInDB","_date","getRemainingTimeForCountDown","countDownTimeFinishDate","endDate","remainingTimeInMilliSeconds"],"mappings":"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","file":"chunk-EL7SDNMU.mjs","sourcesContent":["/**\n * Reports a custom error by logging it along with an optional message.\n *\n * @param errData - The error data to be reported.\n * @param message - An optional message to provide additional context.\n * @param showInConsole - A flag indicating whether to log the error in the console.\n */\nexport const reportCustomError = (\n  errData: unknown,\n  message?: string,\n  showInConsole = true\n): void => {\n  try {\n    const _data = {\n      err: errData,\n      message: `[reportCustomError] - ${message ?? ''}`,\n    };\n\n    if (showInConsole) {\n      // we will do some other logic as well, like sentry or datadog\n      console.error(_data);\n    }\n  } catch (error) {\n    console.error({ err: error });\n  }\n};\n","/**\n * Check for duplicate enum values.\n *\n * @param {object} enumObject - The enum object to check.\n * @param {string} message - The message to display if a duplicate value is found.\n */\nconst checkForDuplicateEnumValues = (\n  enumObject: object,\n  message: string = 'Duplicate enumObject value found:'\n): void => {\n  const values = Object.values(enumObject);\n  const uniqueValues = new Set();\n\n  for (const item of values) {\n    if (uniqueValues.has(item)) {\n      throw new Error(`${message} ${item}, for enumObject: ${enumObject}`);\n    }\n    uniqueValues.add(item);\n  }\n};\n\nexport { checkForDuplicateEnumValues };\n","/**\n * Constants for API header keys.\n */\nexport const apiHeaderKeys = {\n  authToken: 'f398hv2b-77e-sdf-dfs---',\n} as const;\n","import {\n  DBColumnKeysShortFormEnum,\n  FrbOrderbyDirectionEnum,\n} from '@app-enums/firebaseEnum';\n\n/**\n * Constants for the default values for a collection query.\n */\nexport const frbCollectionQueryDefaults: {\n  readonly limit: 100;\n  readonly offset: 0;\n  readonly orderBy: {\n    readonly fieldKey: DBColumnKeysShortFormEnum.createdAt;\n    readonly order: FrbOrderbyDirectionEnum.desc;\n  };\n} = {\n  limit: 100,\n  offset: 0,\n  orderBy: {\n    fieldKey: DBColumnKeysShortFormEnum.createdAt,\n    order: FrbOrderbyDirectionEnum.desc,\n  },\n} as const;\n","/**\n * Constants for API requests.\n */\nexport const apiConstants = {\n  authorizationTokenType: {\n    bearer: 'Bearer',\n  },\n} as const;\n\n/**\n * Constants for default values.\n */\nexport const defaultValue = {\n  fallbackValue: '---',\n};\n\n/**\n * Constants for dayjs.\n */\nexport const dayjs = {\n  formate: 'DD-MM-YYYY HH:mm A',\n};\n\n/**\n * Constants for date formats.\n */\nexport const dateFormat = {\n  ISODateTimeFormate: 'YYYY-MM-DDTHH:mm',\n  fullDateWithTime12Hour: 'MMMM D, h:mm a',\n  compactDateTimeWithAMPM: 'DD-MM-YYYY HH:mm A',\n  compactDateWithMonthAbbr: 'DD-MMM-YYYY',\n};\n\n/**\n * Constants for URL parameters.\n */\nexport const urlParams = {\n  googleMapsApiKey: '{{googleMapsApiKey}}',\n} as const;\n\n/**\n * Constants for time units.\n */\nexport const timeUnitType = {\n  MINUTES: 'minutes',\n} as const;\n\n/**\n * Constants for URL targets.\n */\nexport const urlTarget = {\n  blank: '_blank',\n} as const;\n\n/**\n * Constants for fields validation.\n */\nexport const fieldsValidation = {\n  generic: {\n    title: {\n      min: {\n        val: 1,\n        errorMessage: 'Title is required.',\n      },\n      max: {\n        val: 100,\n        errorMessage: 'Title max value can not be greater than 100.',\n      },\n      isOptional: false,\n    },\n    description: {\n      short: {\n        max: {\n          val: 250,\n          errorMessage: 'Description max value allowed is 250 characters.',\n        },\n        isOptional: true,\n      },\n      medium: {\n        max: {\n          val: 500,\n          errorMessage: 'Description max value allowed is 500 characters.',\n        },\n        isOptional: true,\n      },\n    },\n    phoneNumber: {\n      min: {\n        val: 12,\n        errorMessage: 'Phone number min value allowed is 13 characters.',\n      },\n      max: {\n        val: 13,\n        errorMessage: 'Phone number max value allowed is 13 characters.',\n      },\n      startWith: {\n        val: '+923',\n        errorMessage: 'Phone number must start with +923',\n      },\n      isOptional: false,\n    },\n    remarks: {\n      short: {\n        max: {\n          val: 250,\n          errorMessage: 'Remarks max value allowed is 250 characters.',\n        },\n        isOptional: true,\n      },\n      medium: {\n        max: {\n          val: 500,\n          errorMessage: 'Remarks max value allowed is 500 characters.',\n        },\n        isOptional: true,\n      },\n    },\n    verificationCode: {\n      length: {\n        val: 6,\n        errorMessage: 'Verification code must contain exactly 6 character(s)',\n      },\n    },\n  },\n} as const;\n\n/**\n * Constants for SVG icon types.\n */\nexport const svgIconTypes: string[] = ['image/svg', 'image/svg+xml'];\n\n/**\n * Constants for allowed image types.\n */\nexport const allowedImageTypes = 'image/png, image/jpeg, image/gif';\n","import { checkForDuplicateEnumValues } from '@app-utils/index';\n\n/**\n * Enum representing different roles.\n */\nexport enum RoleEnum {\n  superAdmin = 1,\n  admin = 2,\n  manager = 3,\n  editor = 4,\n  creator = 5,\n  reviewer = 6,\n  player = 7,\n  engager = 8,\n}\n\n/**\n * Enum representing different permissions.\n */\nexport enum PermissionEnum {\n  viewDashboard = 1,\n\n  // profile privacy\n  hideEarnings = 2, // don't show earnings on public profile page\n  hideProfile = 3, // don't show profile in public search result\n\n  listUsers = 4,\n  viewUser = 5,\n  createUser = 6,\n  updateUser = 7,\n  deleteUser = 8,\n  forceDeleteUser = 9,\n  blockUser = 10,\n  unBlockUser = 11,\n  updateUserBalance = 12,\n  viewTrashedUsers = 13,\n  viewTrashedUser = 14,\n\n  listGames = 15,\n  viewGame = 16,\n  createGame = 17,\n  updateGame = 18,\n  deleteGame = 19,\n  forceDeleteGame = 20,\n  blockGame = 21,\n  unBlockGame = 22,\n  viewTrashedGames = 23,\n  viewTrashedGame = 24,\n\n  listGameRooms = 25,\n  viewGameRoom = 26,\n  createGameRoom = 27,\n  updateGameRoom = 28,\n  deleteGameRoom = 29,\n  forceDeleteGameRoom = 30,\n  blockGameRoom = 31,\n  unBlockGameRoom = 32,\n  createPrivateGameRoom = 33, // don't show the room in available game rooms search page\n  viewTrashedGameRooms = 34,\n  viewTrashedGameRoom = 35,\n\n  // for both frontend players and backend admin level users\n  listTopupRequests = 36,\n  viewTopupRequest = 37,\n  createTopupRequest = 38,\n  updateTopupRequest = 39, // update the transaction screenshot and also for cancel topup request\n  deleteTopupRequest = 40,\n  forceDeleteTopupRequest = 41,\n  reviewTopupRequest = 42,\n  viewTrashedTopupRequests = 43,\n  viewTrashedTopupRequest = 44,\n\n  // withdrawRequests // for backend admin level user\n  listWithdrawRequests = 45,\n  viewWithdrawRequest = 46,\n  createWithdrawRequest = 47,\n  updateWithdrawRequest = 48,\n  deleteWithdrawRequest = 49,\n  forceDeleteWithdrawRequest = 50,\n  reviewWithdrawRequest = 51,\n  viewTrashedWithdrawRequests = 52,\n  viewTrashedWithdrawRequest = 53,\n\n  // User Role & Permissions\n  listRoles = 54,\n  viewRole = 55,\n  createRole = 56,\n  updateRole = 57,\n  deleteRole = 58,\n  forceDeleteRole = 59,\n  reviewRole = 60,\n  viewTrashedRoles = 61,\n  viewTrashedRole = 62,\n  attachRole = 63,\n  removeRole = 64,\n  addListPermissionsToRole = 65,\n  addViewPermissionsToRole = 66,\n  addCreatePermissionsToRole = 67,\n  addUpdatePermissionsToRole = 68,\n  addForceDeletePermissionsToRole = 69,\n  addListTrashedPermissionsToRole = 70,\n  addViewTrashedPermissionsToRole = 71,\n  addReviewPermissionsToRole = 72,\n  addOtherPermissionsToRole = 73,\n\n  // Coins Transfer History\n  listTransferCoinsRequests = 74,\n  viewTransferCoinsRequest = 75, // admin can not make any changes to transfer coins request\n\n  // InApp Notifications\n  listInAppNotifications = 76,\n  viewInAppNotification = 77,\n  createInAppNotification = 78,\n  updateInAppNotification = 79,\n  deleteInAppNotification = 80,\n  forceDeleteInAppNotification = 81,\n  viewTrashedInAppNotifications = 82,\n  viewTrashedInAppNotification = 83,\n  sendInAppNotificationToAllPlayers = 84,\n  sendInAppNotificationToAllAdminLevelUsers = 85,\n  sendInAppNotificationToSpecificPlayers = 86,\n  sendInAppNotificationToSpecificAdminLevelUsers = 87,\n  scheduleInAppNotifications = 88,\n\n  listAttachments = 89,\n  viewAttachment = 90,\n  createAttachment = 91,\n  updateAttachment = 92,\n  deleteAttachment = 93,\n  forceDeleteAttachment = 94,\n  viewTrashedAttachments = 95,\n  viewTrashedAttachment = 96,\n\n  listAppSettings = 97,\n  viewAppSetting = 98,\n  createAppSetting = 99,\n  updateAppSetting = 100,\n  deleteAppSetting = 101,\n  forceDeleteAppSetting = 102,\n  viewTrashedAppSettings = 103,\n  viewTrashedAppSetting = 104,\n\n  listTransactions = 105,\n  viewTransaction = 106,\n  createTransaction = 107,\n  updateTransaction = 108,\n  deleteTransaction = 109,\n  forceDeleteTransaction = 110,\n  viewTrashedTransactions = 111,\n  viewTrashedTransaction = 112,\n\n  listPlaces = 113,\n  viewPlace = 114,\n  createPlace = 115,\n  updatePlace = 116,\n  deletePlace = 117,\n  forceDeletePlace = 118,\n  viewTrashedPlaces = 119,\n  viewTrashedPlace = 120,\n  restoreTrashedPlace = 121,\n  blockPlace = 122,\n  unBlockPlace = 123,\n\n  restoreTrashedUser = 124,\n\n  restoreTrashedGame = 125,\n\n  restoreTrashedGameRoom = 126,\n\n  restoreTrashedTopupRequest = 127,\n\n  restoreTrashedWithdrawRequest = 128,\n\n  restoreTrashedRole = 129,\n\n  restoreTrashedInAppNotification = 130,\n\n  restoreTrashedAttachment = 131,\n\n  restoreTrashedAppSetting = 132,\n\n  restoreTrashedTransaction = 133,\n\n  addCoinsToUserAccount = 134,\n  removeCoinsFromUserAccount = 135,\n  listAdminCoinsUpdateLogs = 136,\n  viewAdminCoinsUpdateLog = 137,\n\n  listUserDetails = 138,\n  viewUserDetail = 139,\n  createUserDetail = 140,\n  updateUserDetail = 141,\n  deleteUserDetail = 142,\n  forceDeleteUserDetail = 143,\n  viewTrashedUserDetails = 144,\n  viewTrashedUserDetail = 145,\n}\n\n/**\n * Enum representing different user roles.\n */\nexport enum _UserRoleEnum {\n  superAdmin = '197g24g-28h3v2g9g972g3f',\n  admin = '28h3v2g9g9--72g3f',\n  manager = '38h3vrv3-ion2g9g97-2g3f',\n  editor = '48h3v2g9g97-2g3f',\n  creator = '58h3v2g9g8h-972g3f',\n  reviewer = '68h-3v2g9g972g3f',\n  player = '78h3v2g9-g972g3f',\n  engager = '8hfrfr----8h3v2g9-g972g3f',\n}\n\n/**\n * Enum representing different permission types.\n */\nexport enum PermissionTypeEnum {\n  viewTrashedItem = 1,\n  viewTrashedItems = 2,\n  viewBlockedItem = 3,\n}\n\n/**\n * Enum representing different permission check modes.\n */\nexport enum PermissionCheckModeEnum {\n  every = 1, // user must have every permissions that have passed.\n  any = 2, // user must have any permissions that have passed.\n}\n\n/**\n * Check for duplicate values in the RoleEnum.\n */\ncheckForDuplicateEnumValues(RoleEnum, 'Duplicate RoleEnum value found:');\n\n/**\n * Check for duplicate values in the PermissionCheckModeEnum.\n */\ncheckForDuplicateEnumValues(\n  PermissionCheckModeEnum,\n  'Duplicate PermissionCheckModeEnum value found:'\n);\n\n/**\n * Check for duplicate values in the PermissionEnum.\n */\ncheckForDuplicateEnumValues(\n  PermissionEnum,\n  'Duplicate PermissionEnum value found:'\n);\n\n/**\n * Check for duplicate values in the _UserRoleEnum.\n */\ncheckForDuplicateEnumValues(\n  _UserRoleEnum,\n  'Duplicate _UserRoleEnum value found:'\n);\n\n/**\n * Check for duplicate values in the PermissionTypeEnum.\n */\ncheckForDuplicateEnumValues(\n  PermissionTypeEnum,\n  'Duplicate PermissionTypeEnum value found:'\n);\n","import { PermissionEnum } from '@app-enums/rolePermissionsEnum';\n\n/**\n * Constants for permissions.\n */\nexport const permissionsData: {\n  value: PermissionEnum;\n  label: string;\n}[] = [\n  { value: PermissionEnum.viewDashboard, label: 'View dashboard' },\n\n  // Profile privacy\n  { value: PermissionEnum.hideEarnings, label: 'Hide earnings' },\n  { value: PermissionEnum.hideProfile, label: 'Hide profile' },\n\n  // User management\n  { value: PermissionEnum.listUsers, label: 'List users' },\n  { value: PermissionEnum.viewUser, label: 'View user' },\n  { value: PermissionEnum.createUser, label: 'Create user' },\n  { value: PermissionEnum.updateUser, label: 'Update user' },\n  { value: PermissionEnum.deleteUser, label: 'Delete user' },\n  { value: PermissionEnum.forceDeleteUser, label: 'Force delete user' },\n  { value: PermissionEnum.blockUser, label: 'Block user' },\n  { value: PermissionEnum.unBlockUser, label: 'Unblock user' },\n  { value: PermissionEnum.updateUserBalance, label: 'Update user balance' },\n  { value: PermissionEnum.viewTrashedUsers, label: 'View trashed users' },\n  { value: PermissionEnum.viewTrashedUser, label: 'View trashed user' },\n\n  // Game management\n  { value: PermissionEnum.listGames, label: 'List games' },\n  { value: PermissionEnum.viewGame, label: 'View game' },\n  { value: PermissionEnum.createGame, label: 'Create game' },\n  { value: PermissionEnum.updateGame, label: 'Update game' },\n  { value: PermissionEnum.deleteGame, label: 'Delete game' },\n  { value: PermissionEnum.forceDeleteGame, label: 'Force delete game' },\n  { value: PermissionEnum.blockGame, label: 'Block game' },\n  { value: PermissionEnum.unBlockGame, label: 'Unblock game' },\n  { value: PermissionEnum.viewTrashedGames, label: 'View trashed games' },\n  { value: PermissionEnum.viewTrashedGame, label: 'View trashed game' },\n\n  // Game room management\n  { value: PermissionEnum.listGameRooms, label: 'List game rooms' },\n  { value: PermissionEnum.viewGameRoom, label: 'View game room' },\n  { value: PermissionEnum.createGameRoom, label: 'Create game room' },\n  { value: PermissionEnum.updateGameRoom, label: 'Update game room' },\n  { value: PermissionEnum.deleteGameRoom, label: 'Delete game room' },\n  {\n    value: PermissionEnum.forceDeleteGameRoom,\n    label: 'Force delete game room',\n  },\n  { value: PermissionEnum.blockGameRoom, label: 'Block game room' },\n  { value: PermissionEnum.unBlockGameRoom, label: 'Unblock game room' },\n  {\n    value: PermissionEnum.createPrivateGameRoom,\n    label: 'Create private game room',\n  },\n  {\n    value: PermissionEnum.viewTrashedGameRooms,\n    label: 'View trashed game rooms',\n  },\n  {\n    value: PermissionEnum.viewTrashedGameRoom,\n    label: 'View trashed game room',\n  },\n\n  // Top-up requests\n  { value: PermissionEnum.listTopupRequests, label: 'List top-up requests' },\n  { value: PermissionEnum.viewTopupRequest, label: 'View top-up request' },\n  { value: PermissionEnum.createTopupRequest, label: 'Create top-up request' },\n  { value: PermissionEnum.updateTopupRequest, label: 'Update top-up request' },\n  { value: PermissionEnum.deleteTopupRequest, label: 'Delete top-up request' },\n  {\n    value: PermissionEnum.forceDeleteTopupRequest,\n    label: 'Force delete top-up request',\n  },\n  { value: PermissionEnum.reviewTopupRequest, label: 'Review top-up request' },\n  {\n    value: PermissionEnum.viewTrashedTopupRequests,\n    label: 'View trashed top-up requests',\n  },\n  {\n    value: PermissionEnum.viewTrashedTopupRequest,\n    label: 'View trashed top-up request',\n  },\n\n  // Withdraw requests\n  {\n    value: PermissionEnum.listWithdrawRequests,\n    label: 'List withdraw requests',\n  },\n  { value: PermissionEnum.viewWithdrawRequest, label: 'View withdraw request' },\n  {\n    value: PermissionEnum.createWithdrawRequest,\n    label: 'Create withdraw request',\n  },\n  {\n    value: PermissionEnum.updateWithdrawRequest,\n    label: 'Update withdraw request',\n  },\n  {\n    value: PermissionEnum.deleteWithdrawRequest,\n    label: 'Delete withdraw request',\n  },\n  {\n    value: PermissionEnum.forceDeleteWithdrawRequest,\n    label: 'Force delete withdraw request',\n  },\n  {\n    value: PermissionEnum.reviewWithdrawRequest,\n    label: 'Review withdraw request',\n  },\n  {\n    value: PermissionEnum.viewTrashedWithdrawRequests,\n    label: 'View trashed withdraw requests',\n  },\n  {\n    value: PermissionEnum.viewTrashedWithdrawRequest,\n    label: 'View trashed withdraw request',\n  },\n\n  // User roles and permissions\n  { value: PermissionEnum.listRoles, label: 'List roles' },\n  { value: PermissionEnum.viewRole, label: 'View role' },\n  { value: PermissionEnum.createRole, label: 'Create role' },\n  { value: PermissionEnum.updateRole, label: 'Update role' },\n  { value: PermissionEnum.deleteRole, label: 'Delete role' },\n  { value: PermissionEnum.forceDeleteRole, label: 'Force delete role' },\n  { value: PermissionEnum.reviewRole, label: 'Review role' },\n  { value: PermissionEnum.viewTrashedRoles, label: 'View trashed roles' },\n  { value: PermissionEnum.viewTrashedRole, label: 'View trashed role' },\n  { value: PermissionEnum.attachRole, label: 'Attach role' },\n  { value: PermissionEnum.removeRole, label: 'Remove role' },\n  {\n    value: PermissionEnum.addListPermissionsToRole,\n    label: 'Add list permissions to role',\n  },\n  {\n    value: PermissionEnum.addViewPermissionsToRole,\n    label: 'Add view permissions to role',\n  },\n  {\n    value: PermissionEnum.addCreatePermissionsToRole,\n    label: 'Add create permissions to role',\n  },\n  {\n    value: PermissionEnum.addUpdatePermissionsToRole,\n    label: 'Add update permissions to role',\n  },\n  {\n    value: PermissionEnum.addForceDeletePermissionsToRole,\n    label: 'Add force delete permissions to role',\n  },\n  {\n    value: PermissionEnum.addListTrashedPermissionsToRole,\n    label: 'Add list trashed permissions to role',\n  },\n  {\n    value: PermissionEnum.addViewTrashedPermissionsToRole,\n    label: 'Add view trashed permissions to role',\n  },\n  {\n    value: PermissionEnum.addReviewPermissionsToRole,\n    label: 'Add review permissions to role',\n  },\n  {\n    value: PermissionEnum.addOtherPermissionsToRole,\n    label: 'Add other permissions to role',\n  },\n\n  // Coins transfer history\n  {\n    value: PermissionEnum.listTransferCoinsRequests,\n    label: 'List transfer coins requests',\n  },\n  {\n    value: PermissionEnum.viewTransferCoinsRequest,\n    label: 'View transfer coins request',\n  },\n\n  // In-app notifications\n  {\n    value: PermissionEnum.listInAppNotifications,\n    label: 'List in-app notifications',\n  },\n  {\n    value: PermissionEnum.viewInAppNotification,\n    label: 'View in-app notification',\n  },\n  {\n    value: PermissionEnum.createInAppNotification,\n    label: 'Create in-app notification',\n  },\n  {\n    value: PermissionEnum.updateInAppNotification,\n    label: 'Update in-app notification',\n  },\n  {\n    value: PermissionEnum.deleteInAppNotification,\n    label: 'Delete in-app notification',\n  },\n  {\n    value: PermissionEnum.forceDeleteInAppNotification,\n    label: 'Force delete in-app notification',\n  },\n  {\n    value: PermissionEnum.viewTrashedInAppNotifications,\n    label: 'View trashed in-app notifications',\n  },\n  {\n    value: PermissionEnum.viewTrashedInAppNotification,\n    label: 'View trashed in-app notification',\n  },\n  {\n    value: PermissionEnum.sendInAppNotificationToAllPlayers,\n    label: 'Send in-app notification to all players',\n  },\n  {\n    value: PermissionEnum.sendInAppNotificationToAllAdminLevelUsers,\n    label: 'Send in-app notification to all admin users',\n  },\n  {\n    value: PermissionEnum.sendInAppNotificationToSpecificPlayers,\n    label: 'Send in-app notification to specific players',\n  },\n  {\n    value: PermissionEnum.sendInAppNotificationToSpecificAdminLevelUsers,\n    label: 'Send in-app notification to specific admin users',\n  },\n  {\n    value: PermissionEnum.scheduleInAppNotifications,\n    label: 'Schedule in-app notifications',\n  },\n\n  // Attachments\n  { value: PermissionEnum.listAttachments, label: 'List attachments' },\n  { value: PermissionEnum.viewAttachment, label: 'View attachment' },\n  { value: PermissionEnum.createAttachment, label: 'Create attachment' },\n  { value: PermissionEnum.updateAttachment, label: 'Update attachment' },\n  { value: PermissionEnum.deleteAttachment, label: 'Delete attachment' },\n  {\n    value: PermissionEnum.forceDeleteAttachment,\n    label: 'Force delete attachment',\n  },\n  {\n    value: PermissionEnum.viewTrashedAttachments,\n    label: 'View trashed attachments',\n  },\n  {\n    value: PermissionEnum.viewTrashedAttachment,\n    label: 'View trashed attachment',\n  },\n\n  // App settings\n  { value: PermissionEnum.listAppSettings, label: 'List app settings' },\n  { value: PermissionEnum.viewAppSetting, label: 'View app setting' },\n  { value: PermissionEnum.createAppSetting, label: 'Create app setting' },\n  { value: PermissionEnum.updateAppSetting, label: 'Update app setting' },\n  { value: PermissionEnum.deleteAppSetting, label: 'Delete app setting' },\n  {\n    value: PermissionEnum.forceDeleteAppSetting,\n    label: 'Force delete app setting',\n  },\n  {\n    value: PermissionEnum.viewTrashedAppSettings,\n    label: 'View trashed app settings',\n  },\n  {\n    value: PermissionEnum.viewTrashedAppSetting,\n    label: 'View trashed app setting',\n  },\n\n  // Transactions\n  { value: PermissionEnum.listTransactions, label: 'List transactions' },\n  { value: PermissionEnum.viewTransaction, label: 'View transaction' },\n  { value: PermissionEnum.createTransaction, label: 'Create transaction' },\n  { value: PermissionEnum.updateTransaction, label: 'Update transaction' },\n  { value: PermissionEnum.deleteTransaction, label: 'Delete transaction' },\n  {\n    value: PermissionEnum.forceDeleteTransaction,\n    label: 'Force delete transaction',\n  },\n  {\n    value: PermissionEnum.viewTrashedTransactions,\n    label: 'View trashed transactions',\n  },\n  {\n    value: PermissionEnum.viewTrashedTransaction,\n    label: 'View trashed transaction',\n  },\n];\n","import {\n  PermissionCheckModeEnum,\n  PermissionEnum,\n  RoleEnum,\n  _UserRoleEnum,\n} from '@app-enums/rolePermissionsEnum';\nimport { IHasRequiredPermissions } from '@app-types/permissions/index';\n\n// we can not add toLowerCase here, otherwise we will not be able to get any permission afterworlds\nconst permissionsStrings = Object.keys(PermissionEnum)?.filter((key) =>\n  isNaN(Number(key))\n);\n\n/**\n * Get permissions based on the specified excludes and includes.\n *\n * @param {string[]} excludes - The permissions to exclude.\n * @param {string[]} include - The permissions to include.\n * @returns {PermissionEnum[]} The permissions.\n */\nexport const getPermissions = (\n  excludes: string[] = [],\n  include: string[] = []\n): PermissionEnum[] => {\n  const _excludes = excludes?.map((el) => el?.toLowerCase());\n  const _include = include?.map((el) => el?.toLowerCase());\n\n  return permissionsStrings\n    ?.filter((key) => {\n      const _key = key?.toLowerCase();\n\n      if (_include?.length > 0 && _include?.includes(_key)) {\n        return true;\n      }\n\n      return !_excludes?.some((exclude) => {\n        return _key?.includes(exclude);\n      });\n    })\n    ?.map((key) => PermissionEnum[key as keyof typeof PermissionEnum]);\n};\n\n/**\n * Get the RoleEnum value from a string.\n *\n * @param {string} _userRole - The user role.\n * @returns {RoleEnum} The role enum value.\n */\nexport const getUserRoleEnumValueFromString = (_userRole: string): RoleEnum => {\n  switch (_userRole) {\n    case _UserRoleEnum.superAdmin:\n      return RoleEnum.superAdmin;\n    case _UserRoleEnum.admin:\n      return RoleEnum.admin;\n    case _UserRoleEnum.manager:\n      return RoleEnum.manager;\n    case _UserRoleEnum.editor:\n      return RoleEnum.editor;\n    case _UserRoleEnum.creator:\n      return RoleEnum.creator;\n    case _UserRoleEnum.reviewer:\n      return RoleEnum.reviewer;\n    case _UserRoleEnum.engager:\n      return RoleEnum.engager;\n    default:\n      return RoleEnum.player;\n  }\n};\n\n/**\n * Map permissions to their string values.\n *\n * @param {number[]} permissions - The permissions to map.\n * @returns {string[]} The permissions as strings.\n */\nexport const mapPermissionsToStrings = (permissions: number[]): string[] => {\n  // Use a Set to filter out non-unique values and ensure all values are greater than 0\n  const uniquePermissions = Array.from(new Set(permissions))?.filter(\n    (permission) => permission > 0\n  );\n\n  // Map the filtered permissions to their string values\n  return uniquePermissions?.map((permission) => PermissionEnum[permission]);\n};\n\n/**\n * Check if the user has a specific permission.\n *\n * @template T - The type of the permission (enum).\n * @param {Object} params - The parameters for the permission check.\n * @param {Array<T>} params.userPermissions - The list of permissions the user has.\n * @param {T} params.permission - The permission to check.\n * @returns {boolean} - Returns `true` if the user has the permission; otherwise, `false`.\n */\nexport const hasPermission = <T>({\n  permission,\n  userPermissions,\n}: {\n  userPermissions: T[];\n  permission: T;\n}): boolean => userPermissions?.includes(permission);\n\n/**\n * Checks if a user has the required permissions based on the specified check mode.\n *\n * @template T - The type of the permission (enum).\n * @param {Object} params - The parameters for the permission check.\n * @param {Array<T>} params.userPermissions - The list of permissions the user has.\n * @param {Array<T>} [params.requiredPermissions=[]] - The list of permissions required for the action.\n * @param {PermissionCheckModeEnum} [params.checkModeForRequiredPermissions=PermissionCheckModeEnum.every] -\n * The mode for checking required permissions:\n * - `PermissionCheckModeEnum.every`: Requires the user to have **all** the permissions.\n * - `PermissionCheckModeEnum.any`: Requires the user to have **at least one** of the permissions.\n * @returns {boolean} - Returns `true` if the user meets the required permissions; otherwise, `false`.\n */\nexport const validateRequiredPermissions = <T>({\n  userPermissions,\n  requiredPermissions = [],\n  checkModeForRequiredPermissions = PermissionCheckModeEnum.every,\n}: {\n  userPermissions: Array<T>;\n  requiredPermissions?: Array<T>;\n  checkModeForRequiredPermissions?: PermissionCheckModeEnum;\n}): boolean => {\n  if (!requiredPermissions || requiredPermissions?.length === 0) {\n    return true;\n  }\n  return checkModeForRequiredPermissions === PermissionCheckModeEnum.every\n    ? requiredPermissions?.every((permission) =>\n        hasPermission({ userPermissions, permission })\n      )\n    : requiredPermissions?.some((permission) =>\n        hasPermission({ userPermissions, permission })\n      );\n};\n\n/**\n * Checks if a user has excluded permissions that would prevent an action or hide a component.\n *\n * @template T - The type of the permission (enum).\n * @param {Object} params - The parameters for the exclusion check.\n * @param {Array<T>} params.userPermissions - The list of permissions the user has.\n * @param {Array<T>} [params.excludedPermissions=[]] - The list of permissions that should not be present.\n * @param {PermissionCheckModeEnum} [params.checkModeForExcludedPermissions=PermissionCheckModeEnum.every] -\n * The mode for checking excluded permissions:\n * - `PermissionCheckModeEnum.every`: Requires the user to have **all** of the excluded permissions.\n * - `PermissionCheckModeEnum.any`: Requires the user to have **at least one** of the excluded permissions.\n * @returns {boolean} - Returns `true` if the user lacks the excluded permissions; otherwise, `false`.\n */\nexport const validateExcludedPermissions = <T>({\n  userPermissions,\n  excludedPermissions = [], // to check for permissions that, if present, will hide the component\n  checkModeForExcludedPermissions = PermissionCheckModeEnum.every,\n}: {\n  userPermissions: Array<T>;\n  excludedPermissions?: Array<T>;\n  checkModeForExcludedPermissions?: PermissionCheckModeEnum;\n}): boolean => {\n  if (!excludedPermissions || excludedPermissions?.length === 0) {\n    return true;\n  }\n  return !(checkModeForExcludedPermissions === PermissionCheckModeEnum.every\n    ? excludedPermissions?.every((permission) =>\n        hasPermission({ userPermissions, permission })\n      )\n    : excludedPermissions?.some((permission) =>\n        hasPermission({ userPermissions, permission })\n      ));\n};\n\n/**\n * Determines whether a user meets the required and excluded permission checks.\n *\n * @template T - The type of the permission (e.g., a string, enum, etc.).\n * @param {Object} params - The parameters for the permission validation.\n * @param {Array<T>} params.userPermissions - The list of permissions the user has.\n * @param {Array<T>} [params.requiredPermissions=[]] - The list of required permissions.\n * @param {Array<T>} [params.excludedPermissions=[]] - The list of permissions that should not be present.\n * @param {PermissionCheckModeEnum} [params.checkModeForRequiredPermissions=PermissionCheckModeEnum.every] -\n * The mode for checking required permissions:\n * - `PermissionCheckModeEnum.every`: Requires **all** required permissions.\n * - `PermissionCheckModeEnum.any`: Requires **at least one** required permission.\n * @param {PermissionCheckModeEnum} [params.checkModeForExcludedPermissions=PermissionCheckModeEnum.every] -\n * The mode for checking excluded permissions:\n * - `PermissionCheckModeEnum.every`: Requires **all** excluded permissions.\n * - `PermissionCheckModeEnum.any`: Requires **at least one** excluded permission.\n * @returns {boolean} - Returns `true` if the user meets the required and excluded permission checks; otherwise, `false`.\n */\nexport const validateUserPermissions = <T>({\n  userPermissions,\n  requiredPermissions = [],\n  excludedPermissions = [], // to check for permissions that, if present, will hide the component\n  checkModeForRequiredPermissions = PermissionCheckModeEnum.every,\n  checkModeForExcludedPermissions = PermissionCheckModeEnum.every,\n}: IHasRequiredPermissions<T>): boolean => {\n  if (\n    validateRequiredPermissions({\n      userPermissions,\n      checkModeForRequiredPermissions,\n      requiredPermissions,\n    }) &&\n    validateExcludedPermissions({\n      userPermissions,\n      excludedPermissions,\n      checkModeForExcludedPermissions,\n    })\n  ) {\n    return true;\n  }\n\n  return false;\n};\n","import { RoleEnum } from '@app-enums/rolePermissionsEnum';\nimport { getPermissions } from '@app-utils/helpers/rolePermissionsHelpers';\n\n/**\n * Permissions to exclude for admin.\n */\nconst permissionsToExcludeForAdmin = [\n  'role',\n  'permission',\n  'forcedelete',\n  'trashed',\n  'transaction',\n  'appsetting',\n  'inappnotification',\n  'restore',\n  'addcoin',\n  'removecoin',\n  'admincoin',\n];\n\n/**\n * Permissions to exclude for manager.\n */\nconst permissionsToExcludeForManager = [\n  ...permissionsToExcludeForAdmin,\n  'user',\n  'delete',\n  'topuprequest',\n  'withdrawrequest',\n  'transfercoinsrequest',\n];\n\n/**\n * Permissions to exclude for editor.\n */\nconst permissionsToExcludeForEditor = [\n  ...permissionsToExcludeForManager,\n  'block',\n];\n\n/**\n * Permissions to exclude for creator.\n */\nconst permissionsToExcludeForCreator = [\n  ...permissionsToExcludeForManager,\n  'edit',\n  'update',\n  'review',\n];\n\n/**\n * Permissions to exclude for reviewer.\n */\nconst permissionsToExcludeForReviewer = [\n  ...permissionsToExcludeForCreator?.filter((el) => el !== 'review'),\n  'create',\n  'add',\n  'hide',\n];\n\n/**\n * Permissions to exclude for engager.\n */\nconst permissionsToExcludeForEngager = [\n  ...permissionsToExcludeForManager,\n  'review',\n  'user',\n  'hide',\n];\n\n/**\n * Permissions to include for engager.\n */\nconst permissionsToIncludeForEngager = ['createPrivateGameRoom'];\n\n/**\n * Map of roles to their permissions.\n */\nexport const rolePermissionsMap: { [key in RoleEnum]: () => number[] } = {\n  [RoleEnum.superAdmin]: () => getPermissions([]),\n  [RoleEnum.admin]: () => getPermissions(permissionsToExcludeForAdmin),\n  [RoleEnum.manager]: () => getPermissions(permissionsToExcludeForManager),\n  [RoleEnum.editor]: () => getPermissions(permissionsToExcludeForEditor),\n  [RoleEnum.creator]: () => getPermissions(permissionsToExcludeForCreator),\n  [RoleEnum.reviewer]: () => getPermissions(permissionsToExcludeForReviewer),\n  [RoleEnum.player]: () => [],\n  [RoleEnum.engager]: () =>\n    getPermissions(\n      permissionsToExcludeForEngager,\n      permissionsToIncludeForEngager\n    ),\n};\n","/**\n * Validates an email address.\n * @param {string} email - The email address to validate.\n * @returns {boolean} - Returns `true` if the email is valid; otherwise, `false`.\n */\nexport const validateEmail = (email: string): boolean => {\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return emailRegex.test(email);\n};\n\n/**\n * Validates a URL.\n * @param {string} url - The URL to validate.\n * @returns {boolean} - Returns `true` if the URL is valid; otherwise, `false`.\n */\nexport const validateURL = (url: string): boolean => {\n  const urlRegex = /^(https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*$/i;\n  return urlRegex.test(url);\n};\n\n/**\n * Validates a phone number.\n * @param {string} phone - The phone number to validate.\n * @returns {boolean} - Returns `true` if the phone number is valid; otherwise, `false`.\n */\nexport const validatePhoneNumber = (phone: string): boolean => {\n  const phoneRegex = /^\\+?[1-9]\\d{1,14}$/;\n  return phoneRegex.test(phone);\n};\n","/**\n * @summary Messages from zaions-tool-kit package\n */\nexport const ztkMessages = {\n  general: {\n    success: 'Request Completed',\n    failed: 'Request failed',\n    created: 'item created',\n    updated: 'item updated',\n    deleted: 'item deleted',\n    notFound: 'item notFound',\n    invalidData: 'invalid data',\n    tooManyRequests: 'tooManyRequests',\n    unAuthenticated: 'unAuthenticated',\n    unAuthorized: 'unAuthorized',\n    serverError: 'serverError',\n    badRequest: 'badRequest',\n    itemExists: 'itemExists',\n  },\n  profile: {\n    added: 'Profile data added successfully.',\n    updated: 'Profile data updated successfully.',\n  },\n} as const;\n","/**\n * DBColumnKeysShortFormEnum contains short form of DB column keys to reduce the size of the item in firestore and realtime database\n *\n * * Rules:\n * - for plural names, make sure to add \"s\" in the end and for singular names, it should not end with \"s\"\n * */\n\nimport { checkForDuplicateEnumValues } from '@app-utils/index';\n\n/**\n * Enum representing short form of DB column keys in firestore and realtime database\n */\nexport enum DBColumnKeysShortFormEnum {\n  // Keys defined in \"Generic Form Fields Enum\"\n  id = 'id',\n  userId = 'uid',\n  sortOrderNo = 'so',\n  createdAt = 'cat',\n  updatedAt = 'uat',\n  deletedAt = 'dat',\n  blockedAt = 'bat',\n  amount = 'am',\n  userData = 'ud',\n  playerId = 'pid',\n  otherPlayerId = 'opid', // this is mainly to use for transfer coins request, when it's between two players, i'm using userId, to identify main player (who created the request), and otherPlayerId to identify the receiver player, and if for any future collection we needed a request between current player and multiple other players then we will create and use \"otherPlayerIds\"\n  extraData = 'ed',\n  playerData = 'pdt',\n\n  // Keys used for \"user\"\n  name = 'n',\n  email = 'e',\n  phoneNumber = 'pn',\n  password = 'pw',\n  withdrawOptions = 'wos',\n  cnic = 'cn',\n  city = 'ci',\n  country = 'cu',\n  address = 'ad',\n  referredBy = 'rfb',\n  referralCode = 'rfc',\n  permissions = 'pms',\n  emailVerifiedAt = 'eva',\n  balance = 'blc',\n  role = 'r',\n  firstName = 'fn',\n  lastName = 'lne',\n  age = 'a',\n  gender = 'g',\n  constellation = 'const',\n  hometown = 'ht',\n  language = 'lang',\n  profileCompletePercentageNumber = 'pcpn',\n  birthdayDate = 'bdt',\n  aboutMe = 'abm',\n  hobbies = 'hs',\n  lifeStyle = 'ls',\n  music = 'mc',\n  movies = 'mos',\n  travel = 'tl',\n  books = 'bks',\n  gym = 'gm',\n  food = 'f',\n  cleanliness = 'cln',\n  smoke = 'sk',\n  pets = 'ps',\n  guests = 'gts',\n  occupation = 'o',\n  foodPreference = 'fp',\n  workSchedule = 'ws',\n  overnightGuests = 'ogs',\n  getUpTime = 'gut',\n  goToBedTime = 'gtt',\n  roomPreference = 'rp',\n  roommatePreference = 'rmp',\n  whereWantToLive = 'wwtl',\n  moveInDate = 'mid',\n  budget = 'b',\n  placePreference = 'pp',\n  buildingType = 'bt',\n  other = 'ot',\n  min = 'mi',\n  max = 'ma',\n  verificationCode = 'vc',\n\n  // Keys defined in \"Game related Form Fields\"\n  title = 't',\n  description = 'd',\n  maxPlayersAllowed = 'mxpa',\n  feePerPlayer = 'fpp',\n  serviceCharges = 'scs',\n  image = 'i',\n  minPlayersToStartGame = 'mipa',\n\n  // Keys defined in \"Game Room related Form Fields\"\n  isPrivate = 'ipt',\n  roomCode = 'rcd',\n  status = 'st',\n  gameId = 'gid',\n  gameRoomPlayerIds = 'grpsd', // basically there are two ways to do this, if we store the data of players (id, email, phoneNumber, the bare minimum), using this will keep that data for completed game rooms in DB (increasing the DB size, i think uselessly, as a gameRoom will get finished after 1h or max few days if you must :), but after that it's just read only data, staying there in DB, so storing just the IDs i think is a better way and we fetch and return users data using another API request, both ways have their ups and downs and i'm going with the second one), and i'm also removing the \"gameRoomPlayersCount\" field, just sticking with \"gameRoomPlayerIds\" for now, also removing \"gameRoomPlayersData\", but keeping that in \"FormFieldsEnum\" as will use that to send back users data in frontend.\n  gameRoomWillStartAt = 'grwsat',\n  // gameRoomStartedAt = \"grsat\",\n  firstPlayerGameRoomJoinedAt = 'fpgrja',\n  engagerStartedTheActualGameAt = 'estaga',\n  gameRoomWinnerPlayerId = 'grwpid',\n  gameRoomResultScreenShot = 'grrss',\n  timerForEngagerToStartActualGameInMinutes = 'tfetsag',\n  timerForPlayersToJoinActualGameInMinutes = 'tfptjag',\n  actualGameInfo = 'agi',\n  gameData = 'gd',\n  engagerReleasedGameRoomAt = 'ergrat',\n  engagerDeclaredGameRoomWinnerAt = 'edgrat',\n\n  // Topups\n  agentRemarks = 'ars',\n  transferMethod = 'tm',\n  receptScreenshot = 'rs',\n  transactionId = 'tid',\n\n  // Transaction Fields\n  itemId = 'itid',\n  balanceBefore = 'bb',\n  balanceAfter = 'ba',\n  type = 'ty',\n  adminUserId = 'auid',\n\n  // Logs\n  logType = 'lt',\n\n  // Transfer Coins\n  userRemarks = 'urs',\n  otherPlayerPhoneNumber = 'oppn',\n  otherPlayerName = 'opn',\n\n  // AppUserLog\n  totalTopupCoins = 'ttcs',\n  totalWithdrawCoins = 'twcs',\n  totalWonCoins = 'twncs',\n  totalTransferredCoins = 'ttdcs',\n  totalReceivedCoins = 'trcs',\n  totalLostCoins = 'tlcs',\n  totalGamesPlayed = 'tgp',\n  totalGamesLeft = 'tglt',\n  totalGamesWon = 'tgw',\n  totalGamesLost = 'tgl',\n  gameWinStreak = 'gwst',\n  gameLostStreak = 'glst',\n  lastGamePlayedAt = 'lgpat',\n  lastGameLeftAt = 'lglfat',\n  lastGameWonAt = 'lgqat',\n  lastGameLostAt = 'lglat',\n  totalGameRoomReleasedForThisPlayer = 'tgrrftp',\n  lastGameRoomReleasedForThisPlayerAt = 'tgrrftpat',\n  totalGameRoomReleasedByThisAdminUser = 'tgrrbtau',\n  lastGameRoomReleasedByThisAdminUserAt = 'tgrrbtauat',\n  totalCoinsEarnedAsGameRoomEngager = 'tcseagre', // what this user gets as \"earnedGameRoomEngagerFee\"\n  totalGameRoomsCompletedAsEngager = 'tgrcae',\n  lastGameRoomsCompletedAsEngagerAt = 'lgrcaeat',\n\n  // InApp Notifications\n  icon = 'ic',\n  sendAt = 'sat',\n  sendTo = 'sto',\n  specificUsersPhoneNumbers = 'supns',\n\n  // AppUserRoles & Permissions\n  roleIdentifier = 'ri',\n  isDefault = 'idf',\n\n  // AppLogs Collection Columns\n  // For Users Type Log Item\n  totalCount = 'tc', // keep it simple, mean all these total counts, make them including softDeleted, and when showing in frontend, just remove, softDeleted from these total count to get Excluding Trashed items count\n  totalSoftDeletedCount = 'tsdc',\n  totalPlayersCount = 'tpsc',\n  totalEngagersCount = 'tesc',\n  totalAdminsCount = 'tasc',\n  totalActiveCount = 'tac',\n  totalBlockedCount = 'tbc',\n  totalCompletedCount = 'tcc',\n  totalReleasedCount = 'trc',\n  // For Coins AppLog Item\n  totalServiceCharges = 'tsc', // coins system earned from service charges\n\n  // ----------- RoomMate Project Keys Starts Below -------------------------\n  // Mainly Added for RoomMate App\n  period = 'ped',\n  currency = 'cuy',\n  place = 'pl',\n  rent = 're',\n  generalInfo = 'gi',\n  location = 'loc',\n  images = 'ims',\n  details = 'dts',\n  latitude = 'lat',\n  longitude = 'lng',\n  placeId = 'pi',\n  streetAddress = 'sa',\n  apartmentSuit = 'as',\n  province = 'pvn',\n  postCode = 'psc',\n  bedroomImages = 'bris',\n  washroomImages = 'wris',\n  kitchenImages = 'kis',\n  otherImages = 'ois',\n  availabilityTerm = 'abt',\n  moveOutDate = 'mud',\n  minimumLease = 'mil',\n  houseInfo = 'hif',\n  otherRequirements = 'ors',\n  placeSharingDetail = 'psd',\n  placeBenefits = 'pbs',\n  leaseTime = 'lti',\n  leaseTimeUnit = 'ltu',\n  bedrooms = 'bds',\n  washrooms = 'wrs',\n  parking = 'pr',\n  units = 'us',\n  detail = 'dl',\n  bedroom = 'br',\n  livingRoom = 'lr',\n  kitchen = 'kc',\n  washroom = 'wr',\n  livingWithLandlord = 'lwld',\n  livingWithPersonDetails = 'lwpd',\n  furnished = 'fh',\n  benefits = 'bs',\n  otherBenefits = 'obs',\n  // ----------- RoomMate Project Keys Ends Above -------------------------\n\n  body = 'bd',\n  content = 'ct',\n  fcmDeviceToken = 'fcmt',\n  fcmDeviceTokens = 'fcmts',\n  apnsDeviceToken = 'apnt',\n  apnsDeviceTokens = 'apnts',\n  subtitle = 'ste',\n  tag = 'tg',\n  tags = 'tgs',\n  badge = 'bge',\n  notification = 'ncn',\n  notifications = 'ncns',\n  data = 'dt',\n  clickAction = 'ca',\n  link = 'ln',\n  group = 'gp',\n  groupSummary = 'gs',\n  sound = 'sd',\n  importance = 'ipe',\n  visibility = 'vsb',\n  light = 'lh',\n  lights = 'lhs',\n  lightColor = 'lcr',\n  vibration = 'vbr',\n  channel = 'cl',\n  channels = 'cls',\n  receive = 'rce',\n  value = 'vle',\n  actionId = 'aid',\n  inputValue = 'ipv',\n\n  // Ahsan - on 5-12-24\n  gameType = 'gt',\n  thirdPartyAppsData = 'tpasd',\n  thirdPartyAppData = 'tpad',\n  pubgAppId = 'pgai',\n  uniqueId = 'uqid',\n  userUniqueId = 'uuqid',\n  photoURL = 'pul',\n  displayName = 'dn',\n  ludoStarAppId = 'lsaid',\n  freeFireAppId = 'ffaid',\n  callOfDutyAppId = 'codaid',\n  robloxAppId = 'rxaid',\n  eightBallPoolAppId = 'ebpaid',\n  amongUsAppId = 'auaid',\n  unoAppId = 'uoaid',\n  miniMilitiaAppId = 'mmaid',\n  carromAppId = 'cmaid',\n  tennisClashAppId = 'tcaid',\n  chessAppId = 'chaid',\n  asphalt9AppId = 'a9aid',\n  golfBattleAppId = 'gbaid',\n  arenaBreakoutAppId = 'abaid',\n}\n\n/**\n * Enum representing different order by directions in firestore and realtime database\n */\nexport enum FrbOrderbyDirectionEnum {\n  asc = 'asc',\n  desc = 'desc',\n}\n\n/**\n * Enum representing different where conditions in firestore and realtime database\n */\nexport enum FrbWhereConditionEnum {\n  lessThan = '<',\n  lessThanOrEqualTo = '<=',\n  equalTo = '==',\n  notEqual = '!=',\n  greaterThanOrEqualTo = '>=',\n  greaterThan = '>',\n  arrayContains = 'array-contains',\n  inArray = 'in',\n  notInArray = 'not-in',\n  arrayContainsAny = 'array-contains-any',\n}\n\n/**\n * Check for duplicate values in the DBColumnKeysShortFormEnum.\n */\ncheckForDuplicateEnumValues(\n  DBColumnKeysShortFormEnum,\n  'Duplicate DBColumnKeysShortFormEnum value found:'\n);\ncheckForDuplicateEnumValues(\n  FrbOrderbyDirectionEnum,\n  'Duplicate FrbOrderbyDirectionEnum value found:'\n);\n\n/**\n * Check for duplicate values in the FrbWhereConditionEnum.\n */\ncheckForDuplicateEnumValues(\n  FrbWhereConditionEnum,\n  'Duplicate FrbWhereConditionEnum value found:'\n);\n","import { checkForDuplicateEnumValues } from '@app-utils/index';\n\n/**\n * Enum representing different response codes.\n */\nexport enum ResponseCodeEnum {\n  success = 'success',\n  failed = 'failed',\n  notFound = 'notFound', // data not found\n  badRequest = 'badRequest', // Means data is invalid\n  serverError = 'serverError', // some server error (try catch etc, which is not covered by defined cases and is in default else case)\n  created = 'created',\n  deleted = 'deleted',\n  updated = 'updated',\n  tooManyRequests = 'tooManyRequests',\n  invalidRequest = 'invalidRequest', // invalid url/api request which does not exists in express app router/routes for that OnRequest expressHandler\n  unAuthenticated = 'unAuthenticated',\n  unAuthorized = 'unAuthorized',\n  itemExists = 'itemExists',\n}\n\n/**\n * Enum representing different response status codes.\n */\nexport enum ResponseStatusEnum {\n  success = 200,\n  failed = 500,\n  notFound = 404,\n  badRequest = 400,\n  created = 201,\n  unAuthenticated = 401,\n  unAuthorized = 403,\n  tooManyRequests = 429,\n  invalidRequest = 410,\n  itemExists = 10001,\n}\n\n/**\n * Enum representing different request types.\n */\nexport enum RequestTypeEnum {\n  get = 'get',\n  post = 'post',\n  put = 'put',\n  delete = 'delete',\n}\n\n/**\n * Enum representing different link targets.\n */\nexport enum LinkTargetEnum {\n  blank = '_blank',\n}\n\n/**\n * Enum representing different search parameter keys.\n */\nexport enum SearchParamKeysEnum {\n  encryptedDataSearchParam = 's',\n}\n\n/**\n * Enum representing different request content types.\n */\nexport enum RequestContentTypeEnum {\n  Json = 'application/json',\n  FormData = 'multipart/form-data',\n}\n\n/**\n * Enum representing different request statuses.\n */\nexport enum RequestStatusEnum {\n  approved = 1,\n  rejected = 2,\n}\n\n/**\n * Enum representing different transfer methods.\n */\nexport enum TransferMethodEnum {\n  easypaisa = 1,\n  jazzcash = 2,\n}\n\n/**\n * Enum representing different query key types.\n */\nexport enum QueryKeyTypeEnum {\n  id = 1,\n  roomCode = 2,\n  email = 3,\n  phoneNumber = 4,\n  uniqueId = 5, // our custom system generated uniqueId (what we give each user/item in db), not the \"id/_id\" autogenerated by db itself for each item\n  pubgAppId = 6,\n}\n\n/**\n * Enum representing different process statuses.\n */\nexport enum ProcessStatusEnum {\n  completed = 1,\n  rejected = 2,\n}\n\n/**\n * Enum representing different boolean values.\n */\nexport enum BooleanEnum {\n  true = 1,\n  false = 0,\n}\n\n/**\n * Enum representing different variable types.\n */\nexport enum varTypesEnum {\n  STRING = 'string',\n  OBJECT = 'object',\n  ARRAY = 'array',\n  boolean = 'boolean',\n  NUMBER = 'number',\n  FUNCTION = 'function',\n}\n\n/**\n * Enum representing different platforms.\n */\nexport enum PlatformTypeEnum {\n  web = 'web',\n  android = 'android',\n  ios = 'ios',\n}\n\n/**\n * Enum representing different time units.\n */\nexport enum TimeUnitEnum {\n  Years = 'years',\n  Months = 'months',\n  Days = 'days',\n  Hours = 'hours',\n  Minutes = 'minutes',\n  Seconds = 'seconds',\n  Milliseconds = 'milliseconds',\n}\n\n/**\n * Check for duplicate values in the PlatformTypeEnum.\n */\ncheckForDuplicateEnumValues(\n  PlatformTypeEnum,\n  'duplicate values in PlatformTypeEnum'\n);\n\n/**\n * Check for duplicate values in the ResponseCodeEnum.\n */\ncheckForDuplicateEnumValues(\n  ResponseCodeEnum,\n  'duplicate values in ResponseCodeEnum'\n);\n\n/**\n * Check for duplicate values in the ResponseStatusEnum.\n */\ncheckForDuplicateEnumValues(\n  ResponseStatusEnum,\n  'duplicate values in ResponseStatusEnum'\n);\n\n/**\n * Check for duplicate values in the RequestTypeEnum.\n */\ncheckForDuplicateEnumValues(\n  RequestTypeEnum,\n  'duplicate values in RequestTypeEnum'\n);\n\n/**\n * Check for duplicate values in the LinkTargetEnum.\n */\ncheckForDuplicateEnumValues(\n  LinkTargetEnum,\n  'duplicate values in LinkTargetEnum'\n);\n\n/**\n * Check for duplicate values in the SearchParamKeysEnum.\n */\ncheckForDuplicateEnumValues(\n  SearchParamKeysEnum,\n  'duplicate values in SearchParamKeysEnum'\n);\n\n/**\n * Check for duplicate values in the RequestContentTypeEnum.\n */\ncheckForDuplicateEnumValues(\n  RequestContentTypeEnum,\n  'duplicate values in RequestContentTypeEnum'\n);\n\n/**\n * Check for duplicate values in the RequestStatusEnum.\n */\ncheckForDuplicateEnumValues(\n  RequestStatusEnum,\n  'duplicate values in RequestStatusEnum'\n);\n\n/**\n * Check for duplicate values in the TransferMethodEnum.\n */\ncheckForDuplicateEnumValues(\n  TransferMethodEnum,\n  'duplicate values in TransferMethodEnum'\n);\n\n/**\n * Check for duplicate values in the QueryKeyTypeEnum.\n */\ncheckForDuplicateEnumValues(\n  QueryKeyTypeEnum,\n  'duplicate values in QueryKeyTypeEnum'\n);\n\n/**\n * Check for duplicate values in the ProcessStatusEnum.\n */\ncheckForDuplicateEnumValues(\n  ProcessStatusEnum,\n  'duplicate values in ProcessStatusEnum'\n);\n\n/**\n * Check for duplicate values in the BooleanEnum.\n */\ncheckForDuplicateEnumValues(BooleanEnum, 'duplicate values in BooleanEnum');\n\n/**\n * Check for duplicate values in the varTypesEnum.\n */\ncheckForDuplicateEnumValues(varTypesEnum, 'duplicate values in varTypesEnum');\n\n/**\n * Check for duplicate values in the TimeUnitEnum.\n */\ncheckForDuplicateEnumValues(TimeUnitEnum, 'duplicate values in TimeUnitEnum');\n","import { DBColumnKeysShortFormEnum } from '@app-enums/firebaseEnum';\nimport { RequestContentTypeEnum, TimeUnitEnum } from '@app-enums/generic';\nimport {\n  allowedImageTypes,\n  apiConstants,\n  svgIconTypes,\n} from '@app-utils/constants/generic';\nimport { getDateFromFrbTimestamp } from '../../../require-package/dayjs';\nimport { DBItemGenericDataType } from '../../../types/firebaseTypes'; // will need to study this, the absolute import was giving error\nimport {\n  IGenericObject,\n  IPaginationOptions,\n} from '../../../types/genericTypes';\n\n/**\n * Generates a unique random key.\n *\n * @returns {string} A unique random key.\n */\nexport const getZUniqueKey = (): string => {\n  // Get the current timestamp and convert it to a base-36 string\n  const head = Date.now()?.toString(36);\n\n  // Generate a random number, convert it to a base-36 string, and remove the leading \"0.\"\n  const tail = Math.random()?.toString(36)?.substr(2);\n\n  // Concatenate the timestamp string and the random string, and return it\n  return head + tail;\n};\n\n/**\n * A utility function that logs a message and returns void.\n */\nexport const emptyVoidReturnFunction = (): void => {\n  // eslint-disable-next-line no-console\n  console.info({ message: 'emptyVoidReturnFunction' });\n};\n\n/**\n * A utility function that logs a message and returns a void Promise.\n */\nexport const emptyVoidReturnFunctionPromise = async (): Promise<void> => {\n  // eslint-disable-next-line no-console\n  console.info({ message: 'emptyVoidReturnFunction' });\n};\n\n/**\n * Serializes an object to a JSON-formatted string.\n *\n * @param _data - The data to be stringified.\n * @returns The JSON-formatted string.\n * To parsed JSON, use zJsonParse helper function\n */\nexport const zStringify = (_data: unknown): string => {\n  return JSON.stringify(_data);\n};\n\n/**\n * Parses a JSON-formatted string into an object of the specified type.\n *\n * @param _data - The JSON-formatted string to be parsed.\n * @returns The parsed object, or undefined if parsing fails.\n * To stringify JSON, use the zStringify helper function.\n */\nexport const zJsonParse = <T>(_data: string): T | undefined => {\n  try {\n    return JSON.parse(_data) as T;\n  } catch (error) {\n    return undefined;\n  }\n};\n\n/**\n * Checks if the given value is a non-empty string.\n *\n * @param value - The string value to be checked.\n * @returns A boolean indicating whether the string is non-empty or not.\n */\nexport const isZNonEmptyString = (\n  value: string | undefined | null\n): boolean => {\n  return value !== undefined && value !== null && value?.trim()?.length > 0;\n};\n\n/**\n * Checks if all the values in the given array are non-empty strings.\n *\n * @param values - An array of string values to be checked.\n * @returns A boolean indicating whether all strings in the array are non-empty or not.\n */\nexport const isZNonEmptyStrings = (\n  values: Array<string | undefined | null>\n): boolean => {\n  const _result = values?.every((_value) => isZNonEmptyString(_value));\n\n  return _result;\n};\n\n/**\n * Checks if the given value is a valid number.\n *\n * @param value - The value to be checked. Can be number, string, undefined, or null.\n * @param checkPositive - Optional parameter. If true, the function will also check if the value is a positive number.\n * @returns A boolean indicating whether the value is a valid number (and optionally a positive number).\n */\nexport const isZValidNumber = (\n  value: number | string | undefined | null,\n  checkPositive: boolean = false\n): boolean => {\n  const numberValue = Number(value);\n  const isValidNumber = !isNaN(numberValue);\n\n  if (!isValidNumber) return false;\n  if (checkPositive) {\n    return numberValue > 0;\n  }\n  return true;\n};\n\n/**\n * Checks if all the values in the given array are valid numbers.\n *\n * @param values - An array of values (number, string, undefined, or null) to be checked.\n * @param checkPositive - Optional parameter. If true, the function will also check if all values are positive numbers.\n * @returns A boolean indicating whether all values in the array are valid numbers (and optionally positive numbers).\n */\nexport const isZValidNumbers = (\n  values: Array<number | string | undefined | null>,\n  checkPositive: boolean = false\n): boolean => {\n  return values?.every((value) => isZValidNumber(value, checkPositive));\n};\n\n/**\n * Converts a string to title case by adding spaces between lowercase and uppercase letters and converting to lowercase.\n *\n * @param s - The input string.\n * @returns The title case string.\n */\nexport const convertToTitleCase = (s: string): string => {\n  return s\n    ?.replace(/([a-z])([A-Z])/g, '$1 $2') // Add space between lowercase and uppercase letters\n    ?.toLowerCase(); // Convert the string to lowercase\n};\n\n/**\n * Converts a string to title case by adding spaces between lowercase and uppercase letters and converting to lowercase.\n *\n * @param s - The input string.\n * @returns The title case string.\n */\nexport const convertToTitleCaseV1 = (s: string): string => {\n  return isStringVariable(s)\n    ? s?.replace(/^_*(.)|_+(.)/g, (_, a, b) => {\n        return a ? a?.toUpperCase() : ' ' + b?.toUpperCase();\n      })\n    : s;\n};\n\n/**\n * Calculates the total number of pages based on the total number of items and items per page.\n * @param total The total number of items.\n * @param perPage The number of items per page.\n * @returns The total number of pages.\n */\nexport const ZTotalPages = (total: number, perPage: number): number => {\n  if (total > 0 && perPage > 0) {\n    return Math.ceil(total / perPage);\n  }\n  return 0;\n};\n\n/**\n * Converts an image URL to a base64-encoded string.\n *\n * @param imageUrl - The URL of the image to convert.\n * @returns A Promise that resolves with the base64-encoded string of the image.\n */\nexport const imageUrlToBase64 = async (\n  url?: string,\n  authToken?: string\n): Promise<string> => {\n  try {\n    if (url !== undefined && isZNonEmptyString(url)) {\n      // Getting authToken from Storage.\n      const headers = new Headers({\n        'Content-Type': RequestContentTypeEnum.Json,\n        Authorization: `${apiConstants.authorizationTokenType.bearer} ${\n          authToken ?? ''\n        }`,\n        // Add other headers as needed\n      });\n      const request = new Request(url, {\n        method: 'GET',\n        headers,\n      });\n\n      const response = await fetch(request);\n      if (!response.ok) {\n        throw new Error(`Failed to fetch image. Status: ${response.status}`);\n      }\n      const blob = await response.blob();\n      const data = await new Promise((resolve, reject) => {\n        const reader = new FileReader();\n        reader.onloadend = () => {\n          resolve(reader.result);\n        };\n        reader.onerror = (error) => {\n          reject(error);\n        };\n        reader.readAsDataURL(blob);\n      });\n\n      return data as string;\n    }\n    return '';\n  } catch (error) {\n    console.error('Error fetching or converting image:', error);\n    return '';\n  }\n};\n\n/**\n * Replaces dynamic parts in a URL with corresponding values.\n * @param {string} url - The base URL string with dynamic parts.\n * @param {string[]} itemsId - An array of strings representing the dynamic parts to replace.\n * @param {string[]} urlDynamicParts - An array of strings representing the values to replace the dynamic parts.\n * @returns {string} The URL with dynamic parts replaced.\n */\nexport const replaceUrlDynamicParts = ({\n  url,\n  itemsId,\n  urlDynamicParts,\n}: {\n  url: string;\n  itemsId: Array<number | string>;\n  urlDynamicParts: Array<number | string>;\n}): string => {\n  if (itemsId?.length !== urlDynamicParts?.length) {\n    throw new Error('itemsId and urlDynamicParts must have the same length.');\n  }\n  let resultUrl = url;\n\n  for (let i = 0; i < urlDynamicParts?.length; i++) {\n    const dynamicPart = String(urlDynamicParts[i]);\n    if (String(resultUrl)?.includes(dynamicPart)) {\n      const itemId = String(itemsId[i]);\n      resultUrl = String(resultUrl)?.replace(dynamicPart, itemId);\n    }\n  }\n\n  return resultUrl;\n};\n\n/**\n * Converts a string to a boolean value.\n * @param {string | boolean} value - The value to convert to a boolean.\n * @returns {boolean} The converted boolean value.\n */\nexport const zConvertToBoolean = (value?: string | boolean): boolean => {\n  switch (value) {\n    case 'true':\n      return true;\n    case 'false':\n      return false;\n    default:\n      return Boolean(value); // handles other cases, like non-string inputs\n  }\n};\n\n/**\n * Generates a unique code of a specified length.\n * @param {number} [length=6] - The length of the code to generate.\n * @returns {string} The generated unique code.\n */\nexport const generateUniqueCode = (length: number = 6): string => {\n  const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';\n  let code = '';\n  for (let i = 0; i < length; i++) {\n    const randomIndex = Math.floor(Math.random() * characters?.length);\n    code += characters?.[randomIndex];\n  }\n  return code?.toLowerCase();\n};\n\n/**\n * Checks if a value is null or undefined.\n * @param {any} value - The value to check.\n * @returns {boolean} - Returns `true` if the value is null or undefined; otherwise, `false`.\n */\nexport const isNullOrUndefined = (value: any): boolean => {\n  return value === null || value === undefined;\n};\n\n/**\n * Checks if a value is not null or undefined.\n * @param {any} value - The value to check.\n * @returns {boolean} - Returns `true` if the value is not null or undefined; otherwise, `false`.\n */\nexport const isNotNullOrUndefined = (value: any): boolean => {\n  return !isNullOrUndefined(value);\n};\n\n/**\n * Dumps a value without logging anything.\n * @param {...any} _ - The values to dump.\n */\nexport const dumpValueNoLogNothing = (..._: any): void => {};\n\n/**\n * Checks if a value is an array.\n * @param {unknown} arr - The value to check.\n * @param {boolean} [checkLength=false] - Whether to check the length of the array.\n * @returns {boolean} - Returns `true` if the value is an array; otherwise, `false`.\n */\nexport const isArray = (arr: unknown, checkLength = false): boolean => {\n  const typeIsArray = isObject(arr, false) && Array.isArray(arr);\n  if (!checkLength) return typeIsArray;\n  else return typeIsArray && !!arr?.length;\n};\n\n/**\n * Checks if an item is soft deleted.\n * @param {DBItemGenericDataType} item - The item to check.\n * @returns {boolean} - Returns `true` if the item is soft deleted; otherwise, `false`.\n */\nexport const isSoftDeleted = ({\n  item,\n}: {\n  item: DBItemGenericDataType;\n}): boolean => {\n  return typeof item[DBColumnKeysShortFormEnum.deletedAt] === 'number';\n};\n\n/**\n * Checks if an item is blocked.\n * @param {DBItemGenericDataType} item - The item to check.\n * @returns {boolean} - Returns `true` if the item is blocked; otherwise, `false`.\n */\nexport const dbItemIsBlocked = ({\n  item,\n}: {\n  item: DBItemGenericDataType;\n}): boolean => {\n  return typeof item[DBColumnKeysShortFormEnum.blockedAt] === 'number';\n};\n\n/**\n * Gets the value of a database time column.\n * @param {IGenericObject} item - The item to check.\n * @param {DBColumnKeysShortFormEnum} key - The key of the column to get the value from.\n * @returns {string | undefined} - Returns the value of the column; otherwise, `undefined`.\n */\nexport const getDBTimeColumnValue = ({\n  key,\n  item,\n}: {\n  item?: IGenericObject;\n  key: DBColumnKeysShortFormEnum;\n}): string | undefined => {\n  const value = item?.[key];\n  if (value) {\n    return getDateFromFrbTimestamp(value);\n  } else {\n    return undefined;\n  }\n};\n\n/**\n * Adds a URL protocol handler to the given URL if it doesn't already have one.\n * @param {string} url - The URL to add the protocol handler to.\n * @param {boolean} isLocalhost - Whether the URL is on localhost.\n * @returns {string} The URL with the protocol handler added.\n */\nexport const addUrlProtocolHandler = (\n  url: string,\n  isLocalhost: boolean\n): string => {\n  if (url.search(/^http[s]?:\\/\\//) === -1) {\n    url = (isLocalhost ? 'http://' : 'https://') + url;\n    return url;\n  } else return url;\n};\n\n/**\n * Checks if an object contains key/value pairs.\n * @param {unknown} obj - The object to check.\n * @param {boolean} [checkKeys=true] - Whether to check the keys of the object.\n * @returns {boolean} - Returns `true` if the object contains key/value pairs; otherwise, `false`.\n */\nexport const isObject = (obj: unknown, checkKeys = true): boolean => {\n  const typeIsObject =\n    typeof obj === 'object' && obj != null && typeof obj !== 'undefined';\n  if (!checkKeys) return typeIsObject;\n  else return typeIsObject && !!Object.keys(obj)?.length;\n};\n\n/**\n * Builds a filter object from a given filter object.\n * @param {Record<string, unknown>} filter - The filter object to build from.\n * @returns {Record<string, unknown>} The built filter object.\n */\nexport const buildFilterObject = (\n  filter: Record<string, unknown>\n): Record<string, unknown> => {\n  if (!isObject(filter)) return {};\n\n  const result: Record<string, unknown> = {};\n\n  for (const key in filter) {\n    result.field = key;\n    result.values = filter[key];\n  }\n\n  return isArray(result.values) ? result : {};\n};\n\n/**\n * Gets the active filters from a given filter object.\n * @param {string} field - The field to get the active filters from.\n * @param {Record<string, unknown>} filter - The filter object to get the active filters from.\n * @returns {T | []} The active filters; otherwise, an empty array.\n */\nexport const getActiveFilters = <T = unknown>(\n  field: string,\n  filter: { field?: string; values?: T }\n): T | [] => {\n  if (filter?.field === field) {\n    return filter.values ?? [];\n  }\n\n  return [];\n};\n\n/**\n * Checks if a URL is valid.\n * @param {string} url - The URL to check.\n * @returns {boolean} - Returns `true` if the URL is valid; otherwise, `false`.\n */\nexport const isValidUrl = (url: string): boolean => {\n  const re = new RegExp(\n    '^(https?:\\\\/\\\\/)?' + // protocol\n      '((([a-z\\\\d]([a-z\\\\d-]*[a-z\\\\d])*)\\\\.)+[a-z]{2,}|' + // domain name\n      '((\\\\d{1,3}\\\\.){3}\\\\d{1,3}))' + // OR ip (v4) address\n      '(\\\\:\\\\d+)?(\\\\/[-a-z\\\\d%_.~+#]*)*' + // port and path\n      '(\\\\?[;&a-z\\\\d%_.~+#=-]*)?' + // query string\n      '(\\\\#[-a-z\\\\d_]*)?$',\n    'i'\n  ); // fragment locator\n  return re.test(url);\n};\n\n/**\n * Checks if a vanity URL is valid.\n * @param {string} domain - The domain to check.\n * @param {string} url - The URL to check.\n * @returns {boolean} - Returns `true` if the vanity URL is valid; otherwise, `false`.\n */\nexport const isValidVanityUrl = ({\n  domain,\n  url,\n}: {\n  url: string;\n  domain: string;\n}): boolean => {\n  const lowercaseUrl = url?.trim()?.toLowerCase();\n  if (lowercaseUrl === 'www' || lowercaseUrl === domain) {\n    return false;\n  }\n\n  const re = /^((?!.*[-]{2})(?=.*[a-z0-9]$)[a-z0-9][a-z0-9-]*$)+/;\n  return re.test(url);\n};\n\n/**\n * Checks if a text contains special characters.\n * @param {string} text - The text to check.\n * @returns {boolean} - Returns `true` if the text contains special characters; otherwise, `false`.\n */\nexport const containSpecialCharacters = (text: string): boolean => {\n  const re = /[^A-Za-z0-9&,'\"\"\"'\\'-(){} ]+/;\n  return re.test(text);\n};\n\n/**\n * Generates a URL-friendly slug from the provided text.\n *\n * This function:\n * 1. Converts text to lowercase\n * 2. Removes special characters and replaces them with hyphens\n * 3. Removes leading/trailing hyphens\n * 4. Replaces multiple consecutive hyphens with a single hyphen\n * 5. Handles non-Latin characters by transliterating them when possible\n *\n * @param {string} text - The text to convert into a slug\n * @param {Object} options - Optional configuration\n * @param {boolean} options.lowercase - Whether to convert to lowercase (default: true)\n * @param {string} options.separator - Character to use as separator (default: '-')\n * @param {boolean} options.trim - Whether to trim leading/trailing separators (default: true)\n * @returns {string | undefined} The generated slug or undefined if input is falsy\n */\nexport const generateSlug = ({\n  options = {},\n  text,\n}: {\n  text: string;\n  options?: {\n    lowercase?: boolean;\n    separator?: string;\n    trim?: boolean;\n  };\n}): string | undefined => {\n  if (!text) return undefined;\n\n  const { lowercase = true, separator = '-', trim = true } = options;\n\n  // Handle common accented characters and transliterate them\n  const charMap: Record<string, string> = {\n    à: 'a',\n    á: 'a',\n    â: 'a',\n    ã: 'a',\n    ä: 'a',\n    å: 'a',\n    è: 'e',\n    é: 'e',\n    ê: 'e',\n    ë: 'e',\n    ì: 'i',\n    í: 'i',\n    î: 'i',\n    ï: 'i',\n    ò: 'o',\n    ó: 'o',\n    ô: 'o',\n    õ: 'o',\n    ö: 'o',\n    ø: 'o',\n    ù: 'u',\n    ú: 'u',\n    û: 'u',\n    ü: 'u',\n    ñ: 'n',\n    ç: 'c',\n    ß: 'ss',\n    æ: 'ae',\n    œ: 'oe',\n  };\n\n  let result = text.trim();\n\n  // Convert accented characters\n  result = result.replace(/[àáâãäåèéêëìíîïòóôõöøùúûüñçßæœ]/gi, (match) => {\n    const char = match.toLowerCase();\n    return charMap[char] || match;\n  });\n\n  // Replace non-alphanumeric characters with separator\n  result = result.replace(/[^a-z0-9]/gi, separator);\n\n  // Replace multiple consecutive separators with a single one\n  const escapedSeparator = separator.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n  const multiSeparatorRegex = new RegExp(`${escapedSeparator}+`, 'g');\n  result = result.replace(multiSeparatorRegex, separator);\n\n  // Apply lowercase if needed\n  if (lowercase) {\n    result = result.toLowerCase();\n  }\n\n  // Trim separators from start and end if needed\n  if (trim) {\n    const trimRegex = new RegExp(\n      `^${escapedSeparator}|${escapedSeparator}$`,\n      'g'\n    );\n    result = result.replace(trimRegex, '');\n  }\n\n  return result;\n};\n\n/**\n * Checks if a string contains invalid characters for email or company name\n *\n * @param {string} input - The string to check for invalid characters\n * @param {'email' | 'companyName'} type - The type of validation to perform\n * @returns {{ isValid: boolean; invalidChars: string[] }} - Object containing validation result and list of invalid characters\n */\nexport const validateInputCharacters = ({\n  input,\n  type,\n}: {\n  input: string;\n  type: 'email' | 'name';\n}): { isValid: boolean; invalidChars: string[]; validatedValue: string } => {\n  if (!input) {\n    return { isValid: true, invalidChars: [], validatedValue: '' };\n  }\n\n  let invalidRegex: RegExp;\n\n  if (type === 'email') {\n    // RFC 5322 compliant email validation, but we're checking for invalid characters only\n    // Disallowed: spaces, quotes, backslashes, commas, etc. that aren't valid in email addresses\n    invalidRegex = /[^\\w.!#$%&'*+/=?^`{|}~@-]/g;\n  } else if (type === 'name') {\n    // For company names, we want to be more permissive but still restrict certain characters\n    // Disallowed: special characters that could cause issues in URLs, databases, or display\n    invalidRegex = /[<>\\\\^`{|}~]/g;\n  } else {\n    return { isValid: true, invalidChars: [], validatedValue: input };\n  }\n\n  const matches = input.match(invalidRegex);\n  const invalidChars = matches ? [...new Set(matches)] : [];\n\n  // Remove invalid characters to create the validated value\n  const validatedValue = input.replace(invalidRegex, '');\n\n  return {\n    isValid: invalidChars.length === 0,\n    invalidChars,\n    validatedValue,\n  };\n};\n\n/**\n * Gets the base64 URL of an image file.\n * @param {File} file - The image file to get the base64 URL of.\n * @returns {Promise<unknown>} The base64 URL of the image file.\n */\nexport const getImageBase64Url = (file: File): Promise<unknown> => {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.readAsDataURL(file);\n    reader.onload = () => resolve(reader.result);\n    reader.onerror = (error) => reject(error);\n  });\n};\n\n/**\n * Checks if a URL contains query parameters.\n * @param {string} url - The URL to check.\n * @returns {boolean | ''} - Returns `true` if the URL contains query parameters; otherwise, `false`.\n */\nexport const containQueryParams = (url: string): boolean | '' => {\n  const queryParams = ['?', '&', '#'];\n  return url && queryParams?.some((param) => url?.includes(param));\n};\n\n/**\n * Gets the value of a key from an object.\n * @param {any} obj - The object to get the value from.\n * @param {string} key - The key to get the value from.\n * @param {any} [defaultValue=null] - The default value to return if the key does not exist.\n * @param {boolean} [checkNull=true] - Whether to check if the key is null.\n * @returns {any} The value of the key; otherwise, the default value.\n */\nexport const getObjectKey = (\n  obj: any,\n  key: string,\n  defaultValue: any = null,\n  checkNull: boolean = true\n): any => {\n  if (checkIfKeyExists(obj, key, checkNull)) {\n    return obj[key];\n  } else {\n    return defaultValue;\n  }\n};\n\n/**\n * Checks if a key exists in an object.\n * @param {Record<string, unknown>} obj - The object to check.\n * @param {string} key - The key to check.\n * @param {boolean} [checkNull=false] - Whether to check if the key is null.\n * @returns {boolean} - Returns `true` if the key exists; otherwise, `false`.\n */\nexport const checkIfKeyExists = (\n  obj: Record<string, unknown>,\n  key: string,\n  checkNull = false\n): boolean => {\n  if (\n    isObject(obj, true) &&\n    Object.hasOwnProperty.call(obj, key) &&\n    obj[key] !== undefined\n  ) {\n    return checkNull ? obj[key] !== null : true;\n  }\n  return false;\n};\n\n/**\n * Checks if two values are equal.\n * @param {any} x - The first value to check.\n * @param {any} y - The second value to check.\n * @returns {boolean} - Returns `true` if the values are equal; otherwise, `false`.\n */\nexport const isEqual = (x: any, y: any): boolean => {\n  if (x === y) return true;\n  // if both x and y are null or undefined and exactly the same\n\n  if (!(x instanceof Object) || !(y instanceof Object)) return false;\n  // if they are not strictly equal, they both need to be Objects\n\n  if (x.constructor !== y.constructor) return false;\n  // they must have the exact same prototype chain, the closest we can do is\n  // test there constructor.\n\n  for (const p in x) {\n    if (!Object.hasOwnProperty.call(x, p)) continue;\n    // other properties were tested using x.constructor === y.constructor\n\n    if (!Object.hasOwnProperty.call(y, p)) return false;\n    // allows to compare x[p] and y[p] when set to undefined\n\n    if (x[p] === y[p]) continue;\n    // if they have the same strict value or identity then they are equal\n\n    if (typeof x[p] !== 'object') return false;\n    // Numbers, Strings, Functions, Booleans must be strictly equal\n\n    if (!isEqual(x[p], y[p])) return false;\n    // Objects and Arrays must be tested recursively\n  }\n\n  for (const p in y) {\n    if (Object.hasOwnProperty.call(y, p) && !Object.hasOwnProperty.call(x, p)) {\n      return false;\n    }\n  }\n  // allows x[p] to be set to undefined\n\n  return true;\n};\n\n/**\n * Converts a value to radians.\n * @param {number} Value - The value to convert to radians.\n * @returns {number} The value in radians.\n */\nexport const toRad = (Value: number): number => {\n  return (Value * Math.PI) / 180;\n};\n\n/**\n * Calculates the distance between two points on the Earth.\n * @param {number} lat1 - The latitude of the first point.\n * @param {number} lng1 - The longitude of the first point.\n * @param {number} lat2 - The latitude of the second point.\n * @param {number} lng2 - The longitude of the second point.\n * @returns {number} The distance between the two points in kilometers.\n */\nexport const calcCrow = (\n  lat1: number,\n  lng1: number,\n  lat2: number,\n  lng2: number\n): number => {\n  const R = 6371; // km\n  const dLat = toRad(lat2 - lat1);\n  const dLon = toRad(lng2 - lng1);\n  lat1 = toRad(lat1);\n  lat2 = toRad(lat2);\n\n  const a =\n    Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n    Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);\n  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n  const d = R * c;\n  return d;\n};\n\n/**\n * Truncates a string to a specified length.\n * @param {string} text - The text to truncate.\n * @param {number} [length=10] - The length to truncate the text to.\n * @returns {string} The truncated text.\n */\nexport const truncateString = (text: string, length: number = 10): string => {\n  if (!text) return '';\n  return text?.length > length\n    ? `${text?.slice(0, length) ?? ''}...`\n    : text ?? '';\n};\n\n/**\n * Detects the device and view mode.\n * @returns {Object} The device and view mode.\n */\nexport const detectDeviceAndViewMode = (): {\n  webkitVer: number;\n  isGoogle: boolean | 0;\n  isAndroid: boolean | 0;\n  androidDesktopMode: boolean | 0;\n} => {\n  const match = /WebKit\\/([0-9]+)|$/.exec(navigator.appVersion);\n  const webkitVer = match ? parseInt(match[1], 10) : 0; // also matches AppleWebKit\n  const isGoogle = webkitVer && navigator.vendor.indexOf('Google') === 0; // Also true for Opera Mobile and maybe others\n  const isAndroid = isGoogle && navigator.userAgent.indexOf('Android') > 0; // Careful - Firefox and Windows Mobile also have Android in user agent\n  const androidDesktopMode =\n    !isAndroid &&\n    isGoogle &&\n    navigator.platform.indexOf('Linux') === 0 &&\n    'ontouchstart' in document.documentElement;\n\n  return { webkitVer, isGoogle, isAndroid, androidDesktopMode };\n};\n\n/**\n * Checks if two arrays are equal.\n * @param {Array<unknown>} arrOne - The first array to check.\n * @param {Array<unknown>} arrTwo - The second array to check.\n * @returns {boolean} - Returns `true` if the arrays are equal; otherwise, `false`.\n */\nexport const checkEqualityOfTwoArray = (\n  arrOne: Array<unknown>,\n  arrTwo: Array<unknown>\n): boolean => {\n  const result = arrOne?.every((element) => {\n    return arrTwo?.includes(element);\n  });\n  return result;\n};\n\n/**\n * Checks if a file type is allowed.\n * @param {File} file - The file to check.\n * @param {string} type - The type of file to check.\n * @returns {boolean} - Returns `true` if the file type is allowed; otherwise, `false`.\n */\nexport const isFileTypeAllowed = (file: File, type = 'svg'): boolean => {\n  if (type === 'svg') {\n    return svgIconTypes?.includes(file?.type?.toLowerCase());\n  } else if (type === 'other') {\n    return allowedImageTypes?.includes(file?.type?.toLowerCase());\n  }\n  return false;\n};\n\n/**\n * Gets the dimensions of an image file.\n * @param {File} file - The image file to get the dimensions of.\n * @returns {Promise<{ width: number; height: number } | null>} The dimensions of the image file; otherwise, `null`.\n */\nexport const getImageDimensions = async (\n  file: File\n): Promise<{ width: number; height: number } | null> => {\n  if (!file) return null;\n\n  return await new Promise((resolve) => {\n    const img = document.createElement('img');\n    const objectUrl = window.URL.createObjectURL(file);\n    let height: number, width: number;\n\n    img.onload = function (event: Event) {\n      const imageElement = event?.target as HTMLImageElement;\n      height = imageElement.naturalHeight;\n      width = imageElement.naturalWidth;\n      URL.revokeObjectURL(objectUrl);\n\n      resolve({ width, height });\n    };\n\n    img.src = objectUrl;\n  });\n};\n\n/**\n * Gets the aspect ratio of an image.\n * @param {number} width - The width of the image.\n * @param {number} height - The height of the image.\n * @returns {number[] | null} The aspect ratio of the image; otherwise, `null`.\n */\nexport const getImageAspectRatio = (\n  width: number,\n  height: number\n): number[] | null => {\n  // return type (aspect ratio with [width, height] [1,1])\n  if (width === height) {\n    return [1, 1];\n  } else if (width > height) {\n    return [Math.round(width / height), Math.round(height / height)];\n  } else if (width < height) {\n    return [Math.round(width / width), Math.round(height / width)];\n  } else {\n    return null;\n  }\n};\n\n/**\n * Checks the type of a variable.\n * @param {unknown} val - The variable to check.\n * @param {string} type - The type to check.\n * @returns {boolean} - Returns `true` if the variable is of the specified type; otherwise, `false`.\n */\nexport const checkVariableType = (val: unknown, type = 'string'): boolean => {\n  switch (type) {\n    case 'string':\n      return typeof val === 'string' && typeof val !== 'undefined';\n    case 'number':\n      return typeof val === 'number' && typeof val !== 'undefined';\n    case 'boolean':\n      return typeof val === 'boolean' && typeof val !== 'undefined';\n    case 'object':\n      return isObject(val, true);\n    case 'array':\n      return isArray(val, true);\n    case 'function':\n      return typeof val === 'function' && typeof val !== 'undefined';\n    case 'undefined':\n      return typeof val === 'undefined';\n    default:\n      return false;\n  }\n};\n\n/**\n * Checks if a value is a string.\n * @param {unknown} val - The value to check.\n * @returns {boolean} - Returns `true` if the value is a string; otherwise, `false`.\n */\nexport const isStringVariable = (val?: unknown): boolean => {\n  return checkVariableType(val, 'string');\n};\n\n/**\n * Checks if a value is a function.\n * @param {unknown} val - The value to check.\n * @returns {boolean} - Returns `true` if the value is a function; otherwise, `false`.\n */\nexport const isFunction = (val: unknown): boolean => {\n  return checkVariableType(val, 'function');\n};\n\n/**\n * Checks if an image type is allowed.\n * @param {File} file - The file to check.\n * @returns {boolean} - Returns `true` if the image type is allowed; otherwise, `false`.\n */\nexport const imageTypeAllowed = (file: any): boolean => {\n  return allowedImageTypes?.includes(file?.type?.toLowerCase());\n};\n\n/**\n * Validates a file before upload.\n * @param {File} file - The file to validate.\n * @param {number} sizeLimit - The size limit of the file.\n * @returns {Object} The status and type of the file.\n */\nexport const validateFileBeforeUpload = ({\n  file,\n  sizeLimit,\n}: {\n  file: File;\n  sizeLimit: number;\n}): { status: string; type: string } => {\n  // check file size\n  const fileSize = parseFloat(`${file.size / 1024 / 1024}`) > sizeLimit;\n\n  // show warning alert\n  if (fileSize) return { status: 'error', type: 'FILE_SIZE_LIMIT' } as const;\n\n  // check if selected file is valid\n  const allowed = imageTypeAllowed(file);\n\n  // show warning alert\n  if (!allowed) return { status: 'error', type: 'INVALID_FILE_TYPE' } as const;\n\n  return { status: 'success', type: 'SUCCESS' } as const;\n};\n\n/**\n * Checks if an email is valid.\n * @param {string} email - The email to check.\n * @returns {boolean | ''} - Returns `true` if the email is valid; otherwise, `false`.\n */\nexport const isValidEmail = (email: string): boolean | '' => {\n  const re =\n    /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n  return email && re?.test(String(email)?.toLowerCase());\n};\n\n/**\n * Generates a UUID.\n * @returns {string} The generated UUID.\n */\nexport const generateUUID = (): string => {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'?.replace(/[xy]/g, function (c) {\n    var r = (Math.random() * 16) | 0,\n      v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v?.toString(16);\n  });\n};\n\n/**\n * Flattens an array.\n * @param {any[]} arr - The array to flatten.\n * @returns {T[]} The flattened array.\n */\nexport const flattenArray = <T>(arr: any[]): T[] => {\n  return arr.reduce((flat: T[], item: any) => {\n    return flat.concat(Array.isArray(item) ? flattenArray<T>(item) : item);\n  }, []);\n};\n\n/**\n * Normalizes a type string to match a given enum value.\n * Handles case-insensitive matching.\n *\n * @template T Enum type\n * @param {string} type - The type string to normalize\n * @param {T} enumObject - The enum to match against\n * @returns {T[keyof T] | null} The matched enum value or null if no match\n */\nexport const normalizeEnumValue = <T extends Record<string, string | number>>(\n  type: string,\n  enumObject: T\n): T[keyof T] | null => {\n  const normalizedType = type?.toLowerCase();\n  const matchedEntry = Object.entries(enumObject).find(\n    ([_, value]) => String(value)?.toLowerCase() === normalizedType\n  );\n  return matchedEntry ? (matchedEntry[1] as T[keyof T]) : null;\n};\n\n/**\n * Checks if a file type is valid.\n * @param {string} filename - The filename to check.\n * @param {string | RegExp} filetype - The filetype to check.\n * @returns {boolean} - Returns `true` if the file type is valid; otherwise, `false`.\n */\nexport const isFileTypeValid = (\n  filename: string,\n  filetype: string | RegExp\n): boolean => {\n  const pattern =\n    typeof filetype === 'string' ? new RegExp(filetype) : filetype;\n  return pattern.test(filename);\n};\n\n/**\n * Gets the text only from a string.\n * @param {string} text - The text to get the text only from.\n * @returns {string} The text only from the string.\n */\nexport const getTextOnly = (text: string): string => {\n  return (\n    text &&\n    text\n      ?.toLowerCase()\n      ?.replace(/[^\\w ]+/g, '')\n      ?.trim()\n      ?.replace(/ +/g, '')\n  );\n};\n\n/**\n * Gets the pagination parameters.\n * @param {IPaginationOptions} pagination - The pagination options.\n * @param {boolean} [returnDefaultValues=true] - Whether to return the default values.\n * @param {number} [defaultOffset=0] - The default offset.\n * @param {number} [defaultLimit=10] - The default limit.\n * @returns {Object} The pagination parameters.\n */\nexport const getPaginationParams = ({\n  pagination,\n  returnDefaultValues = true,\n  defaultOffset = 0,\n  defaultLimit = 10,\n}: {\n  pagination?: IPaginationOptions;\n  returnDefaultValues?: boolean;\n  defaultOffset?: number;\n  defaultLimit?: number;\n}): {\n  offset: number | null;\n  limit: number | null;\n} => {\n  let offset: number | null = returnDefaultValues ? defaultOffset : null;\n  let limit: number | null = returnDefaultValues ? defaultLimit : null;\n\n  if (pagination) {\n    offset = pagination?.offset ?? offset;\n    limit = pagination?.limit ?? limit;\n  }\n\n  return { offset, limit };\n};\n\n/**\n * Creates a regex match for a given search query.\n * @param {string} searchQuery - The search query to create a regex match for.\n * @returns {Object} The regex match.\n */\nexport const createRegexMatch = (\n  searchQuery = ''\n): {\n  $regex: RegExp;\n} => {\n  return {\n    $regex: new RegExp(searchQuery?.trim()?.toLowerCase(), 'i'),\n  };\n};\n\n/**\n * Formats a stripe amount to a USD string.\n * @param {number} stripeAmount - The stripe amount to format.\n * @returns {string} The formatted USD string.\n */\nexport const formatUSD = (stripeAmount: number) => {\n  return `$${(stripeAmount / 100).toFixed(2)}`;\n};\n\n/**\n * Formats a stripe amount to a USD string.\n * @param {string} USDString - The USD string to format.\n * @returns {number} The formatted stripe amount.\n */\nexport const formatStripeAmount = (USDString: string): number => {\n  return parseFloat(USDString) * 100;\n};\n\n/**\n * Removes leading and trailing characters from a string.\n * By default removes backslashes, but can be configured to remove any character(s).\n *\n * @param {Object} params - The parameters object\n * @param {string} params.input - The input string to process\n * @param {string | string[]} [params.characters='\\\\'] - Character(s) to remove from start/end\n * @param {boolean} [params.onlyLeading=false] - If true, only removes from the beginning\n * @param {boolean} [params.onlyTrailing=false] - If true, only removes from the end\n * @param {boolean} [params.trimWhitespace=false] - If true, also trims whitespace\n * @returns {string} The processed string with specified characters removed from start/end\n *\n * @example\n * // Remove backslashes (default behavior)\n * removeLeadingTrailingChars({ input: '\\\\test\\\\' }) // 'test'\n *\n * // Remove specific characters\n * removeLeadingTrailingChars({ input: '/path/', characters: '/' }) // 'path'\n *\n * // Remove multiple characters\n * removeLeadingTrailingChars({ input: '///test///', characters: ['/'] }) // 'test'\n *\n * // Only remove from start\n * removeLeadingTrailingChars({ input: '\\\\test\\\\', onlyLeading: true }) // 'test\\\\'\n */\nexport const removeLeadingTrailingChars = ({\n  input,\n  characters = '\\\\',\n  onlyLeading = false,\n  onlyTrailing = false,\n  trimWhitespace = false,\n}: {\n  input: string;\n  characters?: string | string[];\n  onlyLeading?: boolean;\n  onlyTrailing?: boolean;\n  trimWhitespace?: boolean;\n}): string => {\n  // Handle null/undefined input\n  if (!input || typeof input !== 'string') return '';\n\n  // Trim whitespace first if requested\n  let result = trimWhitespace ? input.trim() : input;\n\n  // Handle empty result after trimming\n  if (!result) return '';\n\n  // Normalize characters to array and escape for regex\n  const charArray = Array.isArray(characters) ? characters : [characters];\n  const escapedChars = charArray\n    .filter((char) => char && typeof char === 'string')\n    .map((char) => char.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n    .join('');\n\n  // Early return if no valid characters to remove\n  if (!escapedChars) return result;\n\n  // Build regex pattern based on options\n  let pattern = '';\n  if (!onlyTrailing) {\n    pattern += `^[${escapedChars}]+`; // Leading characters\n  }\n  if (!onlyLeading && !onlyTrailing) {\n    pattern += '|'; // OR operator between leading and trailing\n  }\n  if (!onlyLeading) {\n    pattern += `[${escapedChars}]+$`; // Trailing characters\n  }\n\n  // Apply the regex replacement\n  if (pattern) {\n    const regex = new RegExp(pattern, 'g');\n    result = result.replace(regex, '');\n  }\n\n  return result;\n};\n\n/**\n * Checks if a string starts or ends with a forward slash ('/').\n *\n * @param input - The input string to validate.\n * @returns True if the string starts or ends with '/', otherwise false.\n */\nexport const hasLeadingOrTrailingSlash = (input: string): boolean => {\n  return /^\\/|\\/$/?.test(input);\n};\n\n/**\n * Escapes special regex characters in a string by adding backslashes before them.\n * Preserves all safe characters that can be used in emails, usernames, product titles, etc.\n * Only escapes characters that would cause issues when passed to new RegExp().\n *\n * @param {Object} params - The parameters object\n * @param {string} params.input - The string to escape special regex characters in\n * @param {boolean} [params.removeLeadingTrailing=false] - Whether to remove leading and trailing backslashes\n * @returns {string} The string with special regex characters properly escaped with backslashes\n */\nexport const escapeRegex = ({\n  input,\n  removeLeadingTrailing = false,\n}: {\n  input: string;\n  removeLeadingTrailing?: boolean;\n}): string => {\n  // Handle null/undefined input\n  if (!input) return '';\n\n  // Escape ALL regex special characters that would cause issues in new RegExp()\n  // These characters have special meaning in regex and must be escaped:\n  // . * + ? ^ $ { } ( ) | [ ] \\ - (hyphen can be special in character classes)\n  // We add a backslash before each of these characters to treat them as literals\n  //\n  // Safe characters that DON'T need escaping: & % # \" : < > / , ; ' = ~ ` ! @\n  const escaped = input.replace(/[*?^${}()|[\\]\\\\/-]/g, '');\n\n  // Remove leading and trailing backslashes if requested\n  return removeLeadingTrailing\n    ? removeLeadingTrailingChars({ input: escaped })\n    : escaped;\n};\n\n/**\n * Formats a camelCase string to title case.\n * Adds spaces before capital letters and capitalizes the first letter of each word.\n * @param str - The camelCase string to format.\n * @returns The title case string.\n */\nexport const formatCamelCaseToTitle = (str: string): string => {\n  // First, add space before capital letters and convert to lowercase\n  const withSpaces = str.replace(/([A-Z])/g, ' $1').toLowerCase();\n\n  // Capitalize first letter of each word\n  return withSpaces\n    .split(' ')\n    .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n    .join(' ')\n    .trim();\n};\n\n/**\n * Converts a value from one time unit to another.\n * @param {TimeUnitEnum} valueUnit - The unit of the input value.\n * @param {number} value - The value to convert.\n * @param {TimeUnitEnum} outputUnit - The unit of the output value.\n * @returns {number} The converted value.\n */\nexport const getTimeInUnit = ({\n  valueUnit,\n  value,\n  outputUnit,\n}: {\n  valueUnit: TimeUnitEnum;\n  value: number;\n  outputUnit: TimeUnitEnum;\n}): number => {\n  // Convert input value to seconds as base unit\n  let valueInSeconds = value;\n\n  switch (valueUnit) {\n    case TimeUnitEnum.Years:\n      valueInSeconds = value * 365 * 24 * 60 * 60;\n      break;\n    case TimeUnitEnum.Months:\n      valueInSeconds = value * 30 * 24 * 60 * 60;\n      break;\n    case TimeUnitEnum.Days:\n      valueInSeconds = value * 24 * 60 * 60;\n      break;\n    case TimeUnitEnum.Hours:\n      valueInSeconds = value * 60 * 60;\n      break;\n    case TimeUnitEnum.Minutes:\n      valueInSeconds = value * 60;\n      break;\n    case TimeUnitEnum.Seconds:\n      valueInSeconds = value;\n      break;\n    case TimeUnitEnum.Milliseconds:\n      valueInSeconds = value / 1000;\n      break;\n  }\n\n  // Convert from seconds to output unit\n  switch (outputUnit) {\n    case TimeUnitEnum.Years:\n      return valueInSeconds / (365 * 24 * 60 * 60);\n    case TimeUnitEnum.Months:\n      return valueInSeconds / (30 * 24 * 60 * 60);\n    case TimeUnitEnum.Days:\n      return valueInSeconds / (24 * 60 * 60);\n    case TimeUnitEnum.Hours:\n      return valueInSeconds / (60 * 60);\n    case TimeUnitEnum.Minutes:\n      return valueInSeconds / 60;\n    case TimeUnitEnum.Seconds:\n      return valueInSeconds;\n    case TimeUnitEnum.Milliseconds:\n      return valueInSeconds * 1000;\n    default:\n      return valueInSeconds;\n  }\n};\n\n/**\n * Checks if an email is a private relay email for Apple ID.\n *\n * @param {string} email - The email address to check.\n * @returns {boolean} True if the email is a private relay email, false otherwise.\n */\nexport const isApplePrivateEmail = ({\n  email = '',\n  pattern = /^[a-zA-Z0-9._%+-]+@privaterelay\\.appleid\\.com$/,\n}: {\n  email: string;\n  pattern?: RegExp;\n}): boolean => {\n  return pattern.test(email);\n};\n","import dayjs from 'dayjs';\nimport { reportCustomError } from '../../utils/helpers/errorHandler';\nimport { isZNonEmptyString } from '../../utils/helpers/generic';\n\n/**\n * Get a date from a Firebase timestamp.\n *\n * @param {any} frbTimestamp - The Firebase timestamp.\n * @returns {string} The date in ISO format.\n */\nexport const getDateFromFrbTimestamp = (frbTimestamp: any): string => {\n  // unless the above code is updated this one should remain same\n  return new Date(frbTimestamp)?.toISOString();\n};\n\n/**\n * Convert a date to a timestamp.\n *\n * @param {string | number | Date} val - The date to convert.\n * @returns {number | null} The timestamp.\n */\nexport const convertToDateTimestampToStoreInDB = ({\n  val,\n}: {\n  val?: string | number | Date;\n}): number | null => {\n  const _date = dayjs(val);\n  if (val && _date?.isValid()) {\n    return _date?.toDate()?.getTime();\n  } else {\n    return null;\n  }\n};\n\n/**\n * Calculates the remaining time in milliseconds for a countdown based on the provided end date.\n *\n * @param {string | undefined} countDownTimeFinishDate - The end date for the countdown in string format.\n *\n * @returns {number} The remaining time in milliseconds. If the date is invalid or not provided, returns 0.\n */\nexport const getRemainingTimeForCountDown = (\n  countDownTimeFinishDate: string | undefined\n): number => {\n  try {\n    if (isZNonEmptyString(countDownTimeFinishDate)) {\n      const endDate = dayjs(countDownTimeFinishDate);\n      if (endDate?.isValid()) {\n        const remainingTimeInMilliSeconds = endDate?.diff(\n          dayjs(new Date()),\n          'milliseconds'\n        );\n\n        return Date.now() + remainingTimeInMilliSeconds;\n      } else {\n        return 0;\n      }\n    } else {\n      return 0; // time finished for countdown (as no date passed)\n    }\n  } catch (error) {\n    reportCustomError(error);\n    return 0;\n  }\n};\n"]}