@timardex/cluemart-shared 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/{ad-C7GbDyUi.d.ts → ad-CJlx_QPS.d.ts} +7 -2
  2. package/dist/{ad-DB9gvcJW.d.mts → ad-DJUHk_vq.d.mts} +7 -2
  3. package/dist/{affiliate-DJhVZJ2h.d.mts → affiliate-BPVDrFmw.d.mts} +1 -1
  4. package/dist/{affiliate-DuDoOxK_.d.ts → affiliate-D8tYZCzH.d.ts} +1 -1
  5. package/dist/auth/index.cjs +29 -1
  6. package/dist/auth/index.cjs.map +1 -1
  7. package/dist/auth/index.d.mts +11 -3
  8. package/dist/auth/index.d.ts +11 -3
  9. package/dist/auth/index.mjs +2 -2
  10. package/dist/auth/index.mjs.map +1 -1
  11. package/dist/{chunk-WOBG6I4T.mjs → chunk-2P66EBGO.mjs} +2 -2
  12. package/dist/{chunk-XXHTG4GJ.mjs → chunk-RNY3JPNY.mjs} +11 -5
  13. package/dist/{chunk-XXHTG4GJ.mjs.map → chunk-RNY3JPNY.mjs.map} +1 -1
  14. package/dist/{chunk-WWAHS5R2.mjs → chunk-RU6XOXWO.mjs} +1 -1
  15. package/dist/chunk-RU6XOXWO.mjs.map +1 -0
  16. package/dist/{chunk-FVUZ5SPE.mjs → chunk-UN33JW2N.mjs} +2 -2
  17. package/dist/{chunk-TKSBCN3N.mjs → chunk-WT663GKK.mjs} +46 -4
  18. package/dist/chunk-WT663GKK.mjs.map +1 -0
  19. package/dist/formFields/index.mjs +3 -3
  20. package/dist/graphql/index.cjs +225 -175
  21. package/dist/graphql/index.cjs.map +1 -1
  22. package/dist/graphql/index.d.mts +29 -4
  23. package/dist/graphql/index.d.ts +29 -4
  24. package/dist/graphql/index.mjs +18 -2
  25. package/dist/hooks/index.cjs +197 -169
  26. package/dist/hooks/index.cjs.map +1 -1
  27. package/dist/hooks/index.d.mts +3 -3
  28. package/dist/hooks/index.d.ts +3 -3
  29. package/dist/hooks/index.mjs +5 -5
  30. package/dist/index.cjs +234 -178
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.mts +43 -4
  33. package/dist/index.d.ts +43 -4
  34. package/dist/index.mjs +221 -173
  35. package/dist/index.mjs.map +1 -1
  36. package/dist/types/index.cjs.map +1 -1
  37. package/dist/types/index.d.mts +3 -3
  38. package/dist/types/index.d.ts +3 -3
  39. package/dist/types/index.mjs +1 -1
  40. package/dist/{user-GnrqZmZP.d.ts → user-5leuGSFx.d.ts} +1 -2
  41. package/dist/{user-Znc91Cw5.d.mts → user-DM2rH8ii.d.mts} +1 -2
  42. package/dist/utils/index.cjs +9 -3
  43. package/dist/utils/index.cjs.map +1 -1
  44. package/dist/utils/index.d.mts +13 -3
  45. package/dist/utils/index.d.ts +13 -3
  46. package/dist/utils/index.mjs +2 -2
  47. package/package.json +1 -1
  48. package/dist/chunk-TKSBCN3N.mjs.map +0 -1
  49. package/dist/chunk-WWAHS5R2.mjs.map +0 -1
  50. /package/dist/{chunk-WOBG6I4T.mjs.map → chunk-2P66EBGO.mjs.map} +0 -0
  51. /package/dist/{chunk-FVUZ5SPE.mjs.map → chunk-UN33JW2N.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/auth/createAuthManager.ts","../../src/auth/interests.ts","../../src/auth/licenceUtils.ts","../../src/auth/useAuthCore.ts"],"sourcesContent":["export type AuthManager = {\n logout: () => Promise<void>;\n setLogout: (fn: () => Promise<void>) => void;\n handleRefetchUser: () => Promise<void>;\n setUserRefetch: (fn: () => Promise<void>) => void;\n};\n\n/**\n * Creates an auth manager used by Apollo error links to trigger logout/refetch\n * without importing React. Matches the former mobile authManager shape.\n *\n * `logout()` dedupes concurrent calls via an in-flight promise so token-refresh\n * failures do not kick off multiple logout sequences.\n */\nexport function createAuthManager(): AuthManager {\n let logoutFn: (() => Promise<void>) | null = null;\n let userRefetchFn: (() => Promise<void>) | null = null;\n let logoutPromise: Promise<void> | null = null;\n\n return {\n handleRefetchUser: async () => {\n if (userRefetchFn) {\n await userRefetchFn();\n } else {\n console.warn(\"❌ User refetch function not set!\");\n }\n },\n logout(): Promise<void> {\n if (logoutPromise !== null) return logoutPromise;\n if (logoutFn === null) {\n console.warn(\"❌ Logout function not set!\");\n return Promise.resolve();\n }\n logoutPromise = logoutFn().finally(() => {\n logoutPromise = null;\n });\n return logoutPromise;\n },\n setLogout(fn: () => Promise<void>) {\n logoutFn = fn;\n },\n setUserRefetch(fn: () => Promise<void>) {\n userRefetchFn = fn;\n },\n };\n}\n","import { EnumResourceType } from \"../enums\";\nimport { OptionItem } from \"../types\";\n\n/**\n * Labels shown to users for each selectable interest during registration.\n * Only overrides that differ from the enum value's capitalized form are listed.\n */\nconst INTEREST_LABEL_OVERRIDES: Partial<Record<EnumResourceType, string>> = {\n [EnumResourceType.VENDOR]: \"Stallholder\",\n};\n\nexport const interestOptions: OptionItem[] = [\n EnumResourceType.EVENT,\n EnumResourceType.VENDOR,\n EnumResourceType.PARTNER,\n EnumResourceType.VISITOR,\n].map((value) => ({\n label:\n INTEREST_LABEL_OVERRIDES[value] ??\n value.charAt(0).toUpperCase() + value.slice(1),\n value,\n}));\n\nexport const PROFILE_DASHBOARDS_PATH = \"Profile → Dashboards → \";\nexport const INSTRUCTION_MIDDLE = \", then tap \";\nexport const INSTRUCTION_AFTER = \" and fill in your details.\";\nexport const INSTRUCTION_BEFORE =\n \"After successfully registering, please sign in and\";\n\nexport type InterestInstruction = {\n action: string;\n before: string;\n dashboard: string;\n interest: EnumResourceType;\n};\n\nexport const INTEREST_INSTRUCTIONS: InterestInstruction[] = [\n {\n action: \"Create Stallholder\",\n before: `${INSTRUCTION_BEFORE} create your Stallholder profile, go to `,\n dashboard: \"Stallholder Dashboard\",\n interest: EnumResourceType.VENDOR,\n },\n {\n action: \"Create Event\",\n before: `${INSTRUCTION_BEFORE} create your Event profile, go to `,\n dashboard: \"Event Dashboard\",\n interest: EnumResourceType.EVENT,\n },\n {\n action: \"Create Partner\",\n before: `${INSTRUCTION_BEFORE} create your Partner profile, go to `,\n dashboard: \"Partner Dashboard\",\n interest: EnumResourceType.PARTNER,\n },\n];\n\n/**\n * Instructions for the interests currently selected during registration.\n * Multiple interests are supported.\n */\nexport const getInterestInstructions = (\n interests: EnumResourceType[] = [],\n): InterestInstruction[] =>\n INTEREST_INSTRUCTIONS.filter(({ interest }) => interests.includes(interest));\n","/* eslint-disable camelcase */\nimport { EnumResourceType, EnumUserLicence } from \"../enums\";\nimport type { SafeUserType } from \"../types\";\nimport { TIERS_BY_PRIORITY, type Tier } from \"../types/subscription\";\n\nimport type {\n HasLicenceResult,\n LicencedResourceType,\n LicencesByRole,\n LimitType,\n ProfileBadgeLicence,\n RoleLicences,\n} from \"./types\";\n\nexport function isLicencedResourceType(\n resourceType: EnumResourceType,\n): resourceType is LicencedResourceType {\n return (\n resourceType !== EnumResourceType.AFFILIATE &&\n resourceType !== EnumResourceType.SCHOOL\n );\n}\n\nexport function isProfileBadgeLicence(\n licenceType: EnumUserLicence,\n): licenceType is ProfileBadgeLicence {\n return (\n licenceType !== EnumUserLicence.STANDARD_AFFILIATE &&\n licenceType !== EnumUserLicence.STANDARD_SCHOOL\n );\n}\n\nexport const hasUserLicenceType = (\n authUser: SafeUserType | null,\n licenceType: EnumUserLicence,\n): boolean =>\n authUser?.licences?.some((licence) => licence.licenceType === licenceType) ??\n false;\n\nexport const hasLicence = (\n authUser: SafeUserType | null,\n licenceType: \"vendor\" | \"partner\" | \"event\",\n): HasLicenceResult => {\n const directLicence =\n authUser?.licences?.some((licence) =>\n licence.licenceType?.includes(licenceType),\n ) ?? false;\n\n return {\n directLicence,\n };\n};\n\n/** Default limits per subscription tier. */\nexport const DEFAULT_LIMITS: Record<LimitType, Record<Tier, number>> = {\n // 1 means calendar/productMenu is enabled, 0 means disabled\n availability: { pro: 1, pro_plus: 1, standard: 0 },\n calendar: { pro: 1, pro_plus: 1, standard: 0 },\n coupons: { pro: 1, pro_plus: 1, standard: 0 },\n images: { pro: 12, pro_plus: 12, standard: 6 },\n posters: { pro: 5, pro_plus: 5, standard: 5 },\n productsList: { pro: 1, pro_plus: 1, standard: 0 },\n relationShare: { pro: 1, pro_plus: 1, standard: 0 },\n statistics: { pro: 1, pro_plus: 1, standard: 0 },\n};\n\n/** All tiers off — used when the viewer does not own the resource. */\nexport const NO_LICENCE_FLAGS: LicencesByRole = {\n event: {\n pro_plus: false,\n // eslint-disable-next-line sort-keys\n pro: false,\n standard: false,\n },\n partner: {\n pro_plus: false,\n // eslint-disable-next-line sort-keys\n pro: false,\n standard: false,\n },\n vendor: {\n pro_plus: false,\n // eslint-disable-next-line sort-keys\n pro: false,\n standard: false,\n },\n};\n\n/**\n * Parses an array of licence strings into structured, role-based licences.\n * Users with no licences yet default to pro (create / trial access).\n */\nexport function getLicenceFlagsByRole(licences?: string[]): LicencesByRole {\n const normalized = licences?.map((l) => l.toLowerCase()) ?? [];\n const hasAnyLicence = normalized.length > 0;\n\n function resolve(role: EnumResourceType): RoleLicences {\n const result: RoleLicences = {\n pro_plus: false,\n // eslint-disable-next-line sort-keys\n pro: false,\n standard: false,\n };\n\n for (const tier of TIERS_BY_PRIORITY) {\n if (normalized.some((l) => l.startsWith(`${tier}_${role}`))) {\n result[tier] = true;\n break; // stop at first match → ensures mutual exclusivity\n }\n }\n\n // No licences at all → grant pro so new users can use pro features\n if (!hasAnyLicence) {\n result.pro = true;\n }\n\n return result;\n }\n\n return {\n event: resolve(EnumResourceType.EVENT),\n partner: resolve(EnumResourceType.PARTNER),\n vendor: resolve(EnumResourceType.VENDOR),\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { EnumResourceType, EnumUserLicence, EnumUserRole } from \"../enums\";\nimport { useLogout } from \"../graphql/hooks/auth\";\nimport { useGetUser } from \"../graphql/hooks/user/hooksQuery\";\nimport { USER_STORAGE_KEY } from \"../storage\";\nimport type { SafeUserType } from \"../types\";\n\nimport {\n DEFAULT_LIMITS,\n getLicenceFlagsByRole,\n hasLicence,\n hasUserLicenceType,\n isLicencedResourceType,\n NO_LICENCE_FLAGS,\n} from \"./licenceUtils\";\nimport {\n getPermissionsForRoles,\n hasRole as roleHasRole,\n permissionListIncludes,\n} from \"./permissions\";\nimport type { Permission } from \"./permissions\";\nimport type {\n LimitType,\n LogoutReason,\n UseAuthCoreAdapters,\n UseAuthReturnType,\n} from \"./types\";\n\n/**\n * Platform-agnostic auth session core (source of truth for shared useAuth).\n *\n * Owns: persisted user load/set, refetch, role/licence flags, logout orchestration.\n * Does not own: AsyncStorage vs localStorage, Expo/Next navigation, toasts,\n * Apollo/WS reset, Firebase — those stay in each app's adapter wrapper.\n */\nexport function useAuthCore(adapters: UseAuthCoreAdapters): UseAuthReturnType {\n const {\n storage,\n authManager,\n afterLogout,\n shouldCallLogoutMutation = () => true,\n notifyLogoutSuccess,\n notifySessionExpired,\n onError,\n } = adapters;\n\n const [authUser, setAuthUser] = useState<SafeUserType | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n const userId = useMemo(() => authUser?._id ?? \"\", [authUser?._id]);\n const { refetch } = useGetUser(userId);\n const { logout, loading } = useLogout();\n\n const handleSetAuthUser = useCallback(\n async (user: SafeUserType | null) => {\n setAuthUser(user);\n if (user) {\n await storage.setItem(USER_STORAGE_KEY, JSON.stringify(user));\n } else {\n await storage.removeItem(USER_STORAGE_KEY);\n }\n },\n [storage],\n );\n\n const handleRefetchUser = useCallback(async () => {\n if (!authUser) return;\n try {\n const result = await refetch();\n if (!result) return;\n const { data } = result;\n if (data?.user) await handleSetAuthUser(data.user);\n } catch (error: unknown) {\n onError?.(error, { action: \"refetchUser\" });\n console.warn(\n \"Failed to refetch user:\",\n error instanceof Error ? error.message : error,\n );\n }\n }, [authUser, handleSetAuthUser, onError, refetch]);\n\n const licences = useCallback(\n (resourceId: string) => {\n const myLicences =\n authUser?.licences?.map((licence) => licence.licenceType) ?? [];\n\n const myResourceIds = [\n authUser?.vendor ?? null,\n authUser?.partner ?? null,\n ...(authUser?.events ?? []),\n ].filter((id): id is string => id !== null);\n\n return myResourceIds.includes(resourceId)\n ? getLicenceFlagsByRole(myLicences)\n : NO_LICENCE_FLAGS;\n },\n [authUser],\n );\n\n const getLicenseAccessLevel = useCallback(\n (\n limitType: LimitType,\n resourceId: string,\n resourceType: EnumResourceType,\n ): number => {\n if (!isLicencedResourceType(resourceType)) {\n return 0;\n }\n\n // No resource yet (e.g. create flow): grant pro limits.\n if (resourceId === \"\") {\n return DEFAULT_LIMITS[limitType].pro;\n }\n\n const roleLicences = licences(resourceId)[resourceType];\n\n if (roleLicences.pro_plus) return DEFAULT_LIMITS[limitType].pro_plus;\n if (roleLicences.pro) return DEFAULT_LIMITS[limitType].pro;\n if (roleLicences.standard) return DEFAULT_LIMITS[limitType].standard;\n\n return 0;\n },\n [licences],\n );\n\n const hasVendorLicence = useMemo(\n () => hasLicence(authUser, \"vendor\"),\n [authUser],\n );\n\n const hasPartnerLicence = useMemo(\n () => hasLicence(authUser, \"partner\"),\n [authUser],\n );\n\n const hasEventLicence = useMemo(\n () => hasLicence(authUser, \"event\"),\n [authUser],\n );\n\n const hasUserLicence = useCallback(\n (licenceType: EnumUserLicence) => hasUserLicenceType(authUser, licenceType),\n [authUser],\n );\n\n const permissions = useMemo(() => {\n if (authUser?.permissions != null) {\n return authUser.permissions;\n }\n return getPermissionsForRoles(authUser?.roles);\n }, [authUser?.permissions, authUser?.roles]);\n\n const hasPermissionFn = useCallback(\n (permission: Permission) => permissionListIncludes(permissions, permission),\n [permissions],\n );\n\n const hasRoleFn = useCallback(\n (role: EnumUserRole) => roleHasRole(authUser?.roles, role),\n [authUser?.roles],\n );\n\n const isAdmin = useMemo(\n () =>\n roleHasRole(authUser?.roles, EnumUserRole.ADMIN) ||\n permissionListIncludes(permissions, \"dashboard.admin\") ||\n permissionListIncludes(permissions, \"*\"),\n [authUser?.roles, permissions],\n );\n\n const isSuperAdmin = useMemo(\n () => roleHasRole(authUser?.roles, EnumUserRole.SUPER_ADMIN),\n [authUser?.roles],\n );\n\n const isAffiliate = useMemo(\n () =>\n roleHasRole(authUser?.roles, EnumUserRole.AFFILIATE) &&\n authUser?.affiliate !== null &&\n authUser?.affiliate !== undefined,\n [authUser?.roles, authUser?.affiliate],\n );\n\n const isSchool = useMemo(\n () =>\n roleHasRole(authUser?.roles, EnumUserRole.SCHOOL) &&\n authUser?.school !== null &&\n authUser?.school !== undefined,\n [authUser?.roles, authUser?.school],\n );\n\n // Mount-only hydrate from storage. Do not re-run when adapter identities\n // change — that can overwrite a newer in-memory user (e.g. post-login setUser).\n useEffect(() => {\n const loadUser = async () => {\n try {\n const userJson = await storage.getItem(USER_STORAGE_KEY);\n await handleSetAuthUser(userJson ? JSON.parse(userJson) : null);\n } catch (error: unknown) {\n onError?.(error, { action: \"loadUserFromStorage\" });\n console.error(\"Failed to load user from storage:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n void loadUser();\n }, []);\n\n const logoutWithReason = useCallback(\n async (reason: LogoutReason) => {\n try {\n if (shouldCallLogoutMutation(reason)) {\n try {\n const result = await logout();\n const message = result?.data?.logout?.message as string | undefined;\n if (message) {\n notifyLogoutSuccess?.(message);\n }\n } catch (err: unknown) {\n onError?.(err, { action: \"logout\" });\n console.warn(\"Logout request failed (ignored):\", err);\n }\n }\n } finally {\n await afterLogout(reason);\n setAuthUser(null);\n await storage.removeItem(USER_STORAGE_KEY);\n }\n },\n [\n afterLogout,\n logout,\n notifyLogoutSuccess,\n onError,\n shouldCallLogoutMutation,\n storage,\n ],\n );\n\n const handleLogoutExplicit = useCallback(\n () => logoutWithReason(\"manual\"),\n [logoutWithReason],\n );\n\n const handleLogoutExpired = useCallback(async () => {\n const hadSession = authUser != null;\n if (!hadSession) return;\n await logoutWithReason(\"expired\");\n notifySessionExpired?.();\n }, [authUser, logoutWithReason, notifySessionExpired]);\n\n useEffect(() => {\n authManager.setLogout(() => handleLogoutExpired());\n authManager.setUserRefetch(() => handleRefetchUser());\n }, [authManager, handleLogoutExpired, handleRefetchUser]);\n\n return {\n authUser,\n getLicenseAccessLevel,\n handleLogoutExplicit,\n hasEventLicence,\n hasPartnerLicence,\n hasPermission: hasPermissionFn,\n hasRole: hasRoleFn,\n hasUserLicence,\n hasVendorLicence,\n isAdmin,\n isAffiliate,\n isLoading: loading || isLoading,\n isSchool,\n isSuperAdmin,\n permissions,\n refetchUser: handleRefetchUser,\n setUser: handleSetAuthUser,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/auth/createAuthManager.ts","../../src/auth/interests.ts","../../src/auth/licenceUtils.ts","../../src/auth/useAuthCore.ts"],"sourcesContent":["export type AuthManager = {\n logout: () => Promise<void>;\n setLogout: (fn: () => Promise<void>) => void;\n handleRefetchUser: () => Promise<void>;\n setUserRefetch: (fn: () => Promise<void>) => void;\n};\n\n/**\n * Creates an auth manager used by Apollo error links to trigger logout/refetch\n * without importing React. Matches the former mobile authManager shape.\n *\n * `logout()` dedupes concurrent calls via an in-flight promise so token-refresh\n * failures do not kick off multiple logout sequences.\n */\nexport function createAuthManager(): AuthManager {\n let logoutFn: (() => Promise<void>) | null = null;\n let userRefetchFn: (() => Promise<void>) | null = null;\n let logoutPromise: Promise<void> | null = null;\n\n return {\n handleRefetchUser: async () => {\n if (userRefetchFn) {\n await userRefetchFn();\n } else {\n console.warn(\"❌ User refetch function not set!\");\n }\n },\n logout(): Promise<void> {\n if (logoutPromise !== null) return logoutPromise;\n if (logoutFn === null) {\n console.warn(\"❌ Logout function not set!\");\n return Promise.resolve();\n }\n logoutPromise = logoutFn().finally(() => {\n logoutPromise = null;\n });\n return logoutPromise;\n },\n setLogout(fn: () => Promise<void>) {\n logoutFn = fn;\n },\n setUserRefetch(fn: () => Promise<void>) {\n userRefetchFn = fn;\n },\n };\n}\n","import { EnumResourceType } from \"../enums\";\nimport { OptionItem } from \"../types\";\n\n/**\n * Labels shown to users for each selectable interest during registration.\n * Only overrides that differ from the enum value's capitalized form are listed.\n */\nconst INTEREST_LABEL_OVERRIDES: Partial<Record<EnumResourceType, string>> = {\n [EnumResourceType.VENDOR]: \"Stallholder\",\n};\n\nexport const interestOptions: OptionItem[] = [\n EnumResourceType.EVENT,\n EnumResourceType.VENDOR,\n EnumResourceType.PARTNER,\n EnumResourceType.VISITOR,\n].map((value) => ({\n label:\n INTEREST_LABEL_OVERRIDES[value] ??\n value.charAt(0).toUpperCase() + value.slice(1),\n value,\n}));\n\nexport const PROFILE_DASHBOARDS_PATH = \"Profile → Dashboards → \";\nexport const INSTRUCTION_MIDDLE = \", then tap \";\nexport const INSTRUCTION_AFTER = \" and fill in your details.\";\nexport const INSTRUCTION_BEFORE =\n \"After successfully registering, please sign in and\";\n\nexport type InterestInstruction = {\n action: string;\n before: string;\n dashboard: string;\n interest: EnumResourceType;\n};\n\nexport const INTEREST_INSTRUCTIONS: InterestInstruction[] = [\n {\n action: \"Create Stallholder\",\n before: `${INSTRUCTION_BEFORE} create your Stallholder profile, go to `,\n dashboard: \"Stallholder Dashboard\",\n interest: EnumResourceType.VENDOR,\n },\n {\n action: \"Create Event\",\n before: `${INSTRUCTION_BEFORE} create your Event profile, go to `,\n dashboard: \"Event Dashboard\",\n interest: EnumResourceType.EVENT,\n },\n {\n action: \"Create Partner\",\n before: `${INSTRUCTION_BEFORE} create your Partner profile, go to `,\n dashboard: \"Partner Dashboard\",\n interest: EnumResourceType.PARTNER,\n },\n];\n\n/**\n * Instructions for the interests currently selected during registration.\n * Multiple interests are supported.\n */\nexport const getInterestInstructions = (\n interests: EnumResourceType[] = [],\n): InterestInstruction[] =>\n INTEREST_INSTRUCTIONS.filter(({ interest }) => interests.includes(interest));\n","/* eslint-disable camelcase */\nimport { EnumResourceType, EnumUserLicence } from \"../enums\";\nimport type { SafeUserType } from \"../types\";\nimport { TIERS_BY_PRIORITY, type Tier } from \"../types/subscription\";\n\nimport type {\n HasLicenceResult,\n LicencedResourceType,\n LicencesByRole,\n LimitType,\n ProfileBadgeLicence,\n RoleLicences,\n} from \"./types\";\n\nexport function isLicencedResourceType(\n resourceType: EnumResourceType,\n): resourceType is LicencedResourceType {\n return (\n resourceType !== EnumResourceType.AFFILIATE &&\n resourceType !== EnumResourceType.SCHOOL\n );\n}\n\nexport function isProfileBadgeLicence(\n licenceType: EnumUserLicence,\n): licenceType is ProfileBadgeLicence {\n return (\n licenceType !== EnumUserLicence.STANDARD_AFFILIATE &&\n licenceType !== EnumUserLicence.STANDARD_SCHOOL\n );\n}\n\nexport const hasUserLicenceType = (\n authUser: SafeUserType | null,\n licenceType: EnumUserLicence,\n): boolean =>\n authUser?.licences?.some((licence) => licence.licenceType === licenceType) ??\n false;\n\nexport const hasLicence = (\n authUser: SafeUserType | null,\n licenceType: \"vendor\" | \"partner\" | \"event\",\n): HasLicenceResult => {\n const directLicence =\n authUser?.licences?.some((licence) =>\n licence.licenceType?.includes(licenceType),\n ) ?? false;\n\n return {\n directLicence,\n };\n};\n\n/** Default limits per subscription tier. */\nexport const DEFAULT_LIMITS: Record<LimitType, Record<Tier, number>> = {\n // 1 means calendar/productMenu is enabled, 0 means disabled\n availability: { pro: 1, pro_plus: 1, standard: 0 },\n calendar: { pro: 1, pro_plus: 1, standard: 0 },\n coupons: { pro: 1, pro_plus: 1, standard: 0 },\n images: { pro: 12, pro_plus: 12, standard: 6 },\n posters: { pro: 5, pro_plus: 5, standard: 5 },\n productsList: { pro: 1, pro_plus: 1, standard: 0 },\n relationShare: { pro: 1, pro_plus: 1, standard: 0 },\n statistics: { pro: 1, pro_plus: 1, standard: 0 },\n};\n\n/** All tiers off — used when the viewer does not own the resource. */\nexport const NO_LICENCE_FLAGS: LicencesByRole = {\n event: {\n pro_plus: false,\n // eslint-disable-next-line sort-keys\n pro: false,\n standard: false,\n },\n partner: {\n pro_plus: false,\n // eslint-disable-next-line sort-keys\n pro: false,\n standard: false,\n },\n vendor: {\n pro_plus: false,\n // eslint-disable-next-line sort-keys\n pro: false,\n standard: false,\n },\n};\n\n/**\n * Parses an array of licence strings into structured, role-based licences.\n * Users with no licences yet default to pro (create / trial access).\n */\nexport function getLicenceFlagsByRole(licences?: string[]): LicencesByRole {\n const normalized = licences?.map((l) => l.toLowerCase()) ?? [];\n const hasAnyLicence = normalized.length > 0;\n\n function resolve(role: EnumResourceType): RoleLicences {\n const result: RoleLicences = {\n pro_plus: false,\n // eslint-disable-next-line sort-keys\n pro: false,\n standard: false,\n };\n\n for (const tier of TIERS_BY_PRIORITY) {\n if (normalized.some((l) => l.startsWith(`${tier}_${role}`))) {\n result[tier] = true;\n break; // stop at first match → ensures mutual exclusivity\n }\n }\n\n // No licences at all → grant pro so new users can use pro features\n if (!hasAnyLicence) {\n result.pro = true;\n }\n\n return result;\n }\n\n return {\n event: resolve(EnumResourceType.EVENT),\n partner: resolve(EnumResourceType.PARTNER),\n vendor: resolve(EnumResourceType.VENDOR),\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { EnumResourceType, EnumUserLicence, EnumUserRole } from \"../enums\";\nimport { useLogout } from \"../graphql/hooks/auth\";\nimport { useGetUser } from \"../graphql/hooks/user/hooksQuery\";\nimport { USER_STORAGE_KEY } from \"../storage\";\nimport type { SafeUserType } from \"../types\";\n\nimport {\n DEFAULT_LIMITS,\n getLicenceFlagsByRole,\n hasLicence,\n hasUserLicenceType,\n isLicencedResourceType,\n NO_LICENCE_FLAGS,\n} from \"./licenceUtils\";\nimport {\n getPermissionsForRoles,\n hasRole as roleHasRole,\n permissionListIncludes,\n} from \"./permissions\";\nimport type { Permission } from \"./permissions\";\nimport type {\n LimitType,\n LogoutReason,\n UseAuthCoreAdapters,\n UseAuthReturnType,\n} from \"./types\";\n\n/**\n * Platform-agnostic auth session core (source of truth for shared useAuth).\n *\n * Owns: persisted user load/set, refetch, role/licence flags, logout orchestration.\n * Does not own: AsyncStorage vs localStorage, Expo/Next navigation, toasts,\n * Apollo/WS reset, Firebase — those stay in each app's adapter wrapper.\n */\nexport function useAuthCore(adapters: UseAuthCoreAdapters): UseAuthReturnType {\n const {\n storage,\n authManager,\n afterLogout,\n shouldCallLogoutMutation = (reason: LogoutReason) => reason === \"manual\",\n notifyLogoutSuccess,\n notifySessionExpired,\n onError,\n } = adapters;\n\n const [authUser, setAuthUser] = useState<SafeUserType | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n const userId = useMemo(() => authUser?._id ?? \"\", [authUser?._id]);\n const { refetch } = useGetUser(userId);\n const { logout, loading } = useLogout();\n\n const handleSetAuthUser = useCallback(\n async (user: SafeUserType | null) => {\n setAuthUser(user);\n if (user) {\n await storage.setItem(USER_STORAGE_KEY, JSON.stringify(user));\n } else {\n await storage.removeItem(USER_STORAGE_KEY);\n }\n },\n [storage],\n );\n\n const handleRefetchUser = useCallback(async () => {\n if (!authUser) return;\n try {\n const result = await refetch();\n if (!result) return;\n const { data } = result;\n if (data?.user) await handleSetAuthUser(data.user);\n } catch (error: unknown) {\n onError?.(error, { action: \"refetchUser\" });\n console.warn(\n \"Failed to refetch user:\",\n error instanceof Error ? error.message : error,\n );\n }\n }, [authUser, handleSetAuthUser, onError, refetch]);\n\n const licences = useCallback(\n (resourceId: string) => {\n const myLicences =\n authUser?.licences?.map((licence) => licence.licenceType) ?? [];\n\n const myResourceIds = [\n authUser?.vendor ?? null,\n authUser?.partner ?? null,\n ...(authUser?.events ?? []),\n ].filter((id): id is string => id !== null);\n\n return myResourceIds.includes(resourceId)\n ? getLicenceFlagsByRole(myLicences)\n : NO_LICENCE_FLAGS;\n },\n [authUser],\n );\n\n const getLicenseAccessLevel = useCallback(\n (\n limitType: LimitType,\n resourceId: string,\n resourceType: EnumResourceType,\n ): number => {\n if (!isLicencedResourceType(resourceType)) {\n return 0;\n }\n\n // No resource yet (e.g. create flow): grant pro limits.\n if (resourceId === \"\") {\n return DEFAULT_LIMITS[limitType].pro;\n }\n\n const roleLicences = licences(resourceId)[resourceType];\n\n if (roleLicences.pro_plus) return DEFAULT_LIMITS[limitType].pro_plus;\n if (roleLicences.pro) return DEFAULT_LIMITS[limitType].pro;\n if (roleLicences.standard) return DEFAULT_LIMITS[limitType].standard;\n\n return 0;\n },\n [licences],\n );\n\n const hasVendorLicence = useMemo(\n () => hasLicence(authUser, \"vendor\"),\n [authUser],\n );\n\n const hasPartnerLicence = useMemo(\n () => hasLicence(authUser, \"partner\"),\n [authUser],\n );\n\n const hasEventLicence = useMemo(\n () => hasLicence(authUser, \"event\"),\n [authUser],\n );\n\n const hasUserLicence = useCallback(\n (licenceType: EnumUserLicence) => hasUserLicenceType(authUser, licenceType),\n [authUser],\n );\n\n const permissions = useMemo(() => {\n if (authUser?.permissions != null) {\n return authUser.permissions;\n }\n return getPermissionsForRoles(authUser?.roles);\n }, [authUser?.permissions, authUser?.roles]);\n\n const hasPermissionFn = useCallback(\n (permission: Permission) => permissionListIncludes(permissions, permission),\n [permissions],\n );\n\n const hasRoleFn = useCallback(\n (role: EnumUserRole) => roleHasRole(authUser?.roles, role),\n [authUser?.roles],\n );\n\n const isAdmin = useMemo(\n () =>\n roleHasRole(authUser?.roles, EnumUserRole.ADMIN) ||\n permissionListIncludes(permissions, \"dashboard.admin\") ||\n permissionListIncludes(permissions, \"*\"),\n [authUser?.roles, permissions],\n );\n\n const isSuperAdmin = useMemo(\n () => roleHasRole(authUser?.roles, EnumUserRole.SUPER_ADMIN),\n [authUser?.roles],\n );\n\n const isAffiliate = useMemo(\n () =>\n roleHasRole(authUser?.roles, EnumUserRole.AFFILIATE) &&\n authUser?.affiliate !== null &&\n authUser?.affiliate !== undefined,\n [authUser?.roles, authUser?.affiliate],\n );\n\n const isSchool = useMemo(\n () =>\n roleHasRole(authUser?.roles, EnumUserRole.SCHOOL) &&\n authUser?.school !== null &&\n authUser?.school !== undefined,\n [authUser?.roles, authUser?.school],\n );\n\n // Mount-only hydrate from storage. Do not re-run when adapter identities\n // change — that can overwrite a newer in-memory user (e.g. post-login setUser).\n useEffect(() => {\n const loadUser = async () => {\n try {\n const userJson = await storage.getItem(USER_STORAGE_KEY);\n await handleSetAuthUser(userJson ? JSON.parse(userJson) : null);\n } catch (error: unknown) {\n onError?.(error, { action: \"loadUserFromStorage\" });\n console.error(\"Failed to load user from storage:\", error);\n } finally {\n setIsLoading(false);\n }\n };\n\n void loadUser();\n }, []);\n\n const logoutWithReason = useCallback(\n async (reason: LogoutReason) => {\n try {\n if (shouldCallLogoutMutation(reason)) {\n try {\n const result = await logout();\n const message = result?.data?.logout?.message as string | undefined;\n if (message) {\n notifyLogoutSuccess?.(message);\n }\n } catch (err: unknown) {\n onError?.(err, { action: \"logout\" });\n console.warn(\"Logout request failed (ignored):\", err);\n }\n }\n } finally {\n await afterLogout(reason);\n setAuthUser(null);\n await storage.removeItem(USER_STORAGE_KEY);\n }\n },\n [\n afterLogout,\n logout,\n notifyLogoutSuccess,\n onError,\n shouldCallLogoutMutation,\n storage,\n ],\n );\n\n const handleLogoutExplicit = useCallback(\n () => logoutWithReason(\"manual\"),\n [logoutWithReason],\n );\n\n const handleLogoutExpired = useCallback(async () => {\n const hadSession = authUser != null;\n if (!hadSession) return;\n await logoutWithReason(\"expired\");\n notifySessionExpired?.();\n }, [authUser, logoutWithReason, notifySessionExpired]);\n\n useEffect(() => {\n authManager.setLogout(() => handleLogoutExpired());\n authManager.setUserRefetch(() => handleRefetchUser());\n }, [authManager, handleLogoutExpired, handleRefetchUser]);\n\n return {\n authUser,\n getLicenseAccessLevel,\n handleLogoutExplicit,\n hasEventLicence,\n hasPartnerLicence,\n hasPermission: hasPermissionFn,\n hasRole: hasRoleFn,\n hasUserLicence,\n hasVendorLicence,\n isAdmin,\n isAffiliate,\n isLoading: loading || isLoading,\n isSchool,\n isSuperAdmin,\n permissions,\n refetchUser: handleRefetchUser,\n setUser: handleSetAuthUser,\n };\n}\n"],"mappings":"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","names":[]}
@@ -42,7 +42,7 @@ import {
42
42
  VENDOR,
43
43
  VENDOR_INFO,
44
44
  VENDOR_PRODUCT_LIST_FIELDS_FRAGMENT
45
- } from "./chunk-TKSBCN3N.mjs";
45
+ } from "./chunk-WT663GKK.mjs";
46
46
  import {
47
47
  AD_METRIC_IMPRESSION_RETRY_DELAY_MS,
48
48
  DEFAULT_PAGE_SIZE,
@@ -4562,4 +4562,4 @@ export {
4562
4562
  useGetCoupon,
4563
4563
  usePaginatedList
4564
4564
  };
4565
- //# sourceMappingURL=chunk-WOBG6I4T.mjs.map
4565
+ //# sourceMappingURL=chunk-2P66EBGO.mjs.map
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  PROMO_CODE_PREFIX,
13
13
  gameScreenIdentifierList
14
- } from "./chunk-WWAHS5R2.mjs";
14
+ } from "./chunk-RU6XOXWO.mjs";
15
15
  import {
16
16
  isTransientNetworkError
17
17
  } from "./chunk-RAYUJODN.mjs";
@@ -1380,6 +1380,9 @@ function eventStartDatesSet(dateTime) {
1380
1380
  );
1381
1381
  }
1382
1382
  function hasMatchingEventDate(vendorStartDates, eventStartDates) {
1383
+ if (eventStartDates.size === 0) {
1384
+ return true;
1385
+ }
1383
1386
  return vendorStartDates.some((startDate) => eventStartDates.has(startDate));
1384
1387
  }
1385
1388
  function matchesSelectedDate(vendorStartDates, selectedDate) {
@@ -1533,8 +1536,8 @@ function getVendorEventRelationDateOptions(events) {
1533
1536
  value: startDate
1534
1537
  }));
1535
1538
  }
1536
- function getVendorEventsEmptyMessage() {
1537
- return "No events found.";
1539
+ function getVendorEventsEmptyMessage(hasAnyEventsForVendor = false, selectedDate = null) {
1540
+ return hasAnyEventsForVendor && selectedDate ? "No events found for this date." : "No events found.";
1538
1541
  }
1539
1542
 
1540
1543
  // src/utils/affiliate.ts
@@ -1785,7 +1788,10 @@ function getVendorEventsData({
1785
1788
  })
1786
1789
  );
1787
1790
  return {
1788
- emptyMessage: getVendorEventsEmptyMessage(),
1791
+ emptyMessage: getVendorEventsEmptyMessage(
1792
+ (events?.length ?? 0) > 0,
1793
+ selectedDate
1794
+ ),
1789
1795
  eventDateOptions,
1790
1796
  eventsByDate: filterVendorEventsBySelectedDate(events, selectedDate),
1791
1797
  hasDatePills: eventDateOptions.length > 0
@@ -1929,4 +1935,4 @@ export {
1929
1935
  toUserFacingErrorMessage,
1930
1936
  getErrorMessage
1931
1937
  };
1932
- //# sourceMappingURL=chunk-XXHTG4GJ.mjs.map
1938
+ //# sourceMappingURL=chunk-RNY3JPNY.mjs.map