@timardex/cluemart-shared 1.6.130 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/ad-BUYzE6zx.d.ts +181 -0
  2. package/dist/ad-BhLoEul3.d.mts +181 -0
  3. package/dist/affiliate-BbtjeUP4.d.mts +73 -0
  4. package/dist/affiliate-C51nzKsw.d.ts +73 -0
  5. package/dist/apollo/index.d.mts +3 -3
  6. package/dist/apollo/index.d.ts +3 -3
  7. package/dist/auth/index.cjs +951 -2546
  8. package/dist/auth/index.cjs.map +1 -1
  9. package/dist/auth/index.d.mts +30 -28
  10. package/dist/auth/index.d.ts +30 -28
  11. package/dist/auth/index.mjs +25 -24
  12. package/dist/auth/index.mjs.map +1 -1
  13. package/dist/chunk-32MKHJTX.mjs +1207 -0
  14. package/dist/chunk-32MKHJTX.mjs.map +1 -0
  15. package/dist/chunk-AYO3E4DM.mjs +224 -0
  16. package/dist/chunk-AYO3E4DM.mjs.map +1 -0
  17. package/dist/chunk-BIJ5NDXW.mjs +962 -0
  18. package/dist/chunk-BIJ5NDXW.mjs.map +1 -0
  19. package/dist/chunk-DQ7ZHIXW.mjs +26 -0
  20. package/dist/chunk-DQ7ZHIXW.mjs.map +1 -0
  21. package/dist/chunk-ILILH7E2.mjs +219 -0
  22. package/dist/chunk-ILILH7E2.mjs.map +1 -0
  23. package/dist/{chunk-OHHJ3KJJ.mjs → chunk-LBEJECG3.mjs} +64 -71
  24. package/dist/chunk-LBEJECG3.mjs.map +1 -0
  25. package/dist/chunk-NPFJ2CN2.mjs +109 -0
  26. package/dist/chunk-NPFJ2CN2.mjs.map +1 -0
  27. package/dist/chunk-R6PCFOYO.mjs +3650 -0
  28. package/dist/chunk-R6PCFOYO.mjs.map +1 -0
  29. package/dist/{chunk-NWWKI4PJ.mjs → chunk-SD42WIMV.mjs} +5 -5
  30. package/dist/chunk-SD42WIMV.mjs.map +1 -0
  31. package/dist/chunk-VA5YN2K3.mjs +48 -0
  32. package/dist/chunk-VA5YN2K3.mjs.map +1 -0
  33. package/dist/{chunk-DATBGC2K.mjs → chunk-VPANTTZI.mjs} +23 -108
  34. package/dist/chunk-VPANTTZI.mjs.map +1 -0
  35. package/dist/chunk-X3OLM35T.mjs +278 -0
  36. package/dist/chunk-X3OLM35T.mjs.map +1 -0
  37. package/dist/contactUs--NoohZBu.d.ts +11 -0
  38. package/dist/contactUs-CBWzefUS.d.mts +11 -0
  39. package/dist/enums/index.cjs +229 -2
  40. package/dist/enums/index.cjs.map +1 -1
  41. package/dist/enums/index.d.mts +170 -5
  42. package/dist/enums/index.d.ts +170 -5
  43. package/dist/enums/index.mjs +41 -1
  44. package/dist/formFields/index.cjs +112 -284
  45. package/dist/formFields/index.cjs.map +1 -1
  46. package/dist/formFields/index.d.mts +2 -4
  47. package/dist/formFields/index.d.ts +2 -4
  48. package/dist/formFields/index.mjs +50 -919
  49. package/dist/formFields/index.mjs.map +1 -1
  50. package/dist/global-CUYYxpy2.d.ts +699 -0
  51. package/dist/global-DePDtOFt.d.mts +699 -0
  52. package/dist/graphql/index.cjs +2304 -2872
  53. package/dist/graphql/index.cjs.map +1 -1
  54. package/dist/graphql/index.d.mts +469 -422
  55. package/dist/graphql/index.d.ts +469 -422
  56. package/dist/graphql/index.mjs +160 -2547
  57. package/dist/graphql/index.mjs.map +1 -1
  58. package/dist/hooks/index.cjs +3869 -534
  59. package/dist/hooks/index.cjs.map +1 -1
  60. package/dist/hooks/index.d.mts +9 -10
  61. package/dist/hooks/index.d.ts +9 -10
  62. package/dist/hooks/index.mjs +72 -54
  63. package/dist/hooks/index.mjs.map +1 -1
  64. package/dist/images/index.mjs +21 -86
  65. package/dist/images/index.mjs.map +1 -1
  66. package/dist/index.cjs +4477 -5723
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.d.mts +1679 -2539
  69. package/dist/index.d.ts +1679 -2539
  70. package/dist/index.mjs +4453 -5682
  71. package/dist/index.mjs.map +1 -1
  72. package/dist/map/index.d.mts +2 -3
  73. package/dist/map/index.d.ts +2 -3
  74. package/dist/resourceActivities-CMUcn2P7.d.ts +130 -0
  75. package/dist/resourceActivities-CwbJFGIp.d.mts +130 -0
  76. package/dist/sharing/index.cjs +19 -23
  77. package/dist/sharing/index.cjs.map +1 -1
  78. package/dist/sharing/index.d.mts +3 -16
  79. package/dist/sharing/index.d.ts +3 -16
  80. package/dist/sharing/index.mjs +29 -183
  81. package/dist/sharing/index.mjs.map +1 -1
  82. package/dist/subscription-BU8GvH2K.d.ts +12 -0
  83. package/dist/subscription-bmAdrnfi.d.mts +12 -0
  84. package/dist/theme/index.mjs +5 -41
  85. package/dist/theme/index.mjs.map +1 -1
  86. package/dist/types/index.cjs +123 -868
  87. package/dist/types/index.cjs.map +1 -1
  88. package/dist/types/index.d.mts +15 -234
  89. package/dist/types/index.d.ts +15 -234
  90. package/dist/types/index.mjs +31 -61
  91. package/dist/user-D47MLFyH.d.ts +134 -0
  92. package/dist/user-DE8edl3u.d.mts +134 -0
  93. package/dist/utils/index.cjs +117 -292
  94. package/dist/utils/index.cjs.map +1 -1
  95. package/dist/utils/index.d.mts +23 -25
  96. package/dist/utils/index.d.ts +23 -25
  97. package/dist/utils/index.mjs +5 -6
  98. package/package.json +3 -10
  99. package/dist/affiliate-Bqqlffw8.d.mts +0 -36
  100. package/dist/affiliate-Btlp5XUp.d.ts +0 -36
  101. package/dist/affiliateAdapters-BW3BY7c5.d.mts +0 -118
  102. package/dist/affiliateAdapters-C51ISmuA.d.ts +0 -118
  103. package/dist/auth-BOmAO53v.d.ts +0 -169
  104. package/dist/auth-CsITA95p.d.mts +0 -169
  105. package/dist/chunk-DATBGC2K.mjs.map +0 -1
  106. package/dist/chunk-DDHECBJR.mjs +0 -726
  107. package/dist/chunk-DDHECBJR.mjs.map +0 -1
  108. package/dist/chunk-INQCDU24.mjs +0 -139
  109. package/dist/chunk-INQCDU24.mjs.map +0 -1
  110. package/dist/chunk-NWWKI4PJ.mjs.map +0 -1
  111. package/dist/chunk-OHHJ3KJJ.mjs.map +0 -1
  112. package/dist/chunk-TOEFAEF2.mjs +0 -69
  113. package/dist/chunk-TOEFAEF2.mjs.map +0 -1
  114. package/dist/chunk-UKW7NZEQ.mjs +0 -2813
  115. package/dist/chunk-UKW7NZEQ.mjs.map +0 -1
  116. package/dist/dailyClue-C6WXY73z.d.mts +0 -105
  117. package/dist/dailyClue-C6WXY73z.d.ts +0 -105
  118. package/dist/event-C9K7CSg4.d.ts +0 -53
  119. package/dist/event-W0NhL5Cd.d.mts +0 -53
  120. package/dist/global-BbSFfYdd.d.ts +0 -181
  121. package/dist/global-C6v9tRji.d.mts +0 -181
  122. package/dist/graphql-CDOfA79A.d.ts +0 -1253
  123. package/dist/graphql-CcvzTs9k.d.mts +0 -1253
  124. package/dist/resourceActivities-CS8YRIIL.d.mts +0 -89
  125. package/dist/resourceActivities-DOdNPkhW.d.ts +0 -89
  126. package/dist/subscription-Cj_qBA7u.d.mts +0 -20
  127. package/dist/subscription-OiJ50uJb.d.ts +0 -20
  128. package/dist/vendor-DmMi2qmx.d.mts +0 -73
  129. package/dist/vendor-M9hVZlni.d.ts +0 -73
@@ -1,8 +1,10 @@
1
- import { U as UserRoleEnumType, f as ResourceTypeEnum, e as LicencesEnumType, C as UserType } from '../graphql-CcvzTs9k.mjs';
2
- import { P as Permission, T as Tier } from '../subscription-Cj_qBA7u.mjs';
3
- export { a as PERMISSIONS, W as WILDCARD_PERMISSION } from '../subscription-Cj_qBA7u.mjs';
1
+ import { EnumUserRole, EnumResourceType, EnumUserLicence } from '../enums/index.mjs';
2
+ import { P as Permission, S as SafeUserType } from '../user-DE8edl3u.mjs';
3
+ export { a as PERMISSIONS, W as WILDCARD_PERMISSION } from '../user-DE8edl3u.mjs';
4
+ import { T as Tier } from '../subscription-bmAdrnfi.mjs';
4
5
  import React, { ReactNode } from 'react';
5
- import '../images/index.mjs';
6
+ import '../global-DePDtOFt.mjs';
7
+ import 'react-hook-form';
6
8
 
7
9
  type AuthManager = {
8
10
  logout: () => Promise<void>;
@@ -20,7 +22,7 @@ type AuthManager = {
20
22
  declare function createAuthManager(): AuthManager;
21
23
 
22
24
  /** Roles allowed to sign into the admin web app (CUSTOMER-only is denied). */
23
- declare const ADMIN_APP_ROLES: readonly [UserRoleEnumType.SuperAdmin, UserRoleEnumType.Admin, UserRoleEnumType.Event, UserRoleEnumType.Vendor, UserRoleEnumType.Partner, UserRoleEnumType.School, UserRoleEnumType.Affiliate];
25
+ declare const ADMIN_APP_ROLES: readonly [EnumUserRole.SUPER_ADMIN, EnumUserRole.ADMIN, EnumUserRole.EVENT, EnumUserRole.VENDOR, EnumUserRole.PARTNER, EnumUserRole.SCHOOL, EnumUserRole.AFFILIATE];
24
26
  type AdminAppRole = (typeof ADMIN_APP_ROLES)[number];
25
27
  type AdminDashboardContext = "staff" | "event" | "vendor" | "partner" | "school" | "affiliate";
26
28
  type AdminDashboardContextInfo = {
@@ -29,39 +31,39 @@ type AdminDashboardContextInfo = {
29
31
  label: string;
30
32
  /** Path prefixes that belong to this context (including home). */
31
33
  pathPrefixes: readonly string[];
32
- roles: readonly UserRoleEnumType[];
34
+ roles: readonly EnumUserRole[];
33
35
  };
34
36
  /**
35
37
  * Priority order for default home + role switcher.
36
38
  * Staff first, then product roles.
37
39
  */
38
40
  declare const ADMIN_DASHBOARD_CONTEXTS: readonly AdminDashboardContextInfo[];
39
- declare function canAccessAdminApp(roles: UserRoleEnumType[] | null | undefined): boolean;
40
- declare function getUsableAdminContexts(roles: UserRoleEnumType[] | null | undefined): AdminDashboardContextInfo[];
41
- declare function getDefaultAdminHome(roles: UserRoleEnumType[] | null | undefined, preferredContext?: AdminDashboardContext | null): string;
41
+ declare function canAccessAdminApp(roles: EnumUserRole[] | null | undefined): boolean;
42
+ declare function getUsableAdminContexts(roles: EnumUserRole[] | null | undefined): AdminDashboardContextInfo[];
43
+ declare function getDefaultAdminHome(roles: EnumUserRole[] | null | undefined, preferredContext?: AdminDashboardContext | null): string;
42
44
  declare function resolveAdminContextFromPath(pathname: string): AdminDashboardContext | null;
43
- declare function canAccessAdminPath(roles: UserRoleEnumType[] | null | undefined, pathname: string): boolean;
45
+ declare function canAccessAdminPath(roles: EnumUserRole[] | null | undefined, pathname: string): boolean;
44
46
 
45
47
  /**
46
48
  * Union of permissions for the given roles (deduped, stable order).
47
49
  */
48
- declare function getPermissionsForRoles(roles: UserRoleEnumType[] | null | undefined): Permission[];
50
+ declare function getPermissionsForRoles(roles: EnumUserRole[] | null | undefined): Permission[];
49
51
  /**
50
52
  * Check a concrete permission list (e.g. authUser.permissions) for a grant.
51
53
  * Honours the "*" wildcard.
52
54
  */
53
55
  declare function permissionListIncludes(permissions: readonly Permission[] | null | undefined, permission: Permission): boolean;
54
- declare function hasPermission(roles: UserRoleEnumType[] | null | undefined, permission: Permission): boolean;
55
- declare function hasAnyPermission(roles: UserRoleEnumType[] | null | undefined, permissions: readonly Permission[]): boolean;
56
- declare function hasAllPermissions(roles: UserRoleEnumType[] | null | undefined, permissions: readonly Permission[]): boolean;
57
- declare function hasRole(roles: UserRoleEnumType[] | null | undefined, role: UserRoleEnumType): boolean;
58
- declare function hasAnyRole(roles: UserRoleEnumType[] | null | undefined, checkRoles: readonly UserRoleEnumType[]): boolean;
56
+ declare function hasPermission(roles: EnumUserRole[] | null | undefined, permission: Permission): boolean;
57
+ declare function hasAnyPermission(roles: EnumUserRole[] | null | undefined, permissions: readonly Permission[]): boolean;
58
+ declare function hasAllPermissions(roles: EnumUserRole[] | null | undefined, permissions: readonly Permission[]): boolean;
59
+ declare function hasRole(roles: EnumUserRole[] | null | undefined, role: EnumUserRole): boolean;
60
+ declare function hasAnyRole(roles: EnumUserRole[] | null | undefined, checkRoles: readonly EnumUserRole[]): boolean;
59
61
 
60
62
  /**
61
63
  * Static role → permissions map. Source of truth for access.
62
64
  * Permissions for a user = union of all their roles' lists.
63
65
  */
64
- declare const ROLE_PERMISSIONS: Record<UserRoleEnumType, readonly Permission[]>;
66
+ declare const ROLE_PERMISSIONS: Record<EnumUserRole, readonly Permission[]>;
65
67
 
66
68
  type LimitType = "availability" | "images" | "calendar" | "posters" | "productsList" | "statistics" | "relationShare";
67
69
  interface RoleLicences {
@@ -75,9 +77,9 @@ interface LicencesByRole {
75
77
  partner: RoleLicences;
76
78
  }
77
79
  /** Resource types with subscription/licence limits (excludes affiliate & school). */
78
- type LicencedResourceType = Exclude<ResourceTypeEnum, ResourceTypeEnum.Affiliate | ResourceTypeEnum.School>;
80
+ type LicencedResourceType = Exclude<EnumResourceType, EnumResourceType.AFFILIATE | EnumResourceType.SCHOOL>;
79
81
  /** Licence badges shown on the profile screen (excludes affiliate & school). */
80
- type ProfileBadgeLicence = Exclude<LicencesEnumType, LicencesEnumType.StandardAffiliate | LicencesEnumType.StandardSchool>;
82
+ type ProfileBadgeLicence = Exclude<EnumUserLicence, EnumUserLicence.STANDARD_AFFILIATE | EnumUserLicence.STANDARD_SCHOOL>;
81
83
  type HasLicenceResult = {
82
84
  directLicence: boolean;
83
85
  };
@@ -110,29 +112,29 @@ type UseAuthCoreAdapters = {
110
112
  }) => void;
111
113
  };
112
114
  interface UseAuthReturnType {
113
- authUser: UserType | null;
115
+ authUser: SafeUserType | null;
114
116
  isAffiliate: boolean;
115
117
  isSchool: boolean;
116
118
  handleLogoutExplicit: () => Promise<void>;
117
119
  hasEventLicence: HasLicenceResult;
118
120
  hasPartnerLicence: HasLicenceResult;
119
121
  hasPermission: (permission: Permission) => boolean;
120
- hasRole: (role: UserRoleEnumType) => boolean;
121
- hasUserLicence: (licenceType: LicencesEnumType) => boolean;
122
+ hasRole: (role: EnumUserRole) => boolean;
123
+ hasUserLicence: (licenceType: EnumUserLicence) => boolean;
122
124
  hasVendorLicence: HasLicenceResult;
123
125
  isAdmin: boolean;
124
126
  isSuperAdmin: boolean;
125
127
  isLoading: boolean;
126
128
  permissions: Permission[];
127
- getLicenseAccessLevel: (limitType: LimitType, resourceId: string, resourceType: ResourceTypeEnum) => number;
129
+ getLicenseAccessLevel: (limitType: LimitType, resourceId: string, resourceType: EnumResourceType) => number;
128
130
  refetchUser: () => Promise<void>;
129
- setUser: (user: UserType | null) => Promise<void>;
131
+ setUser: (user: SafeUserType | null) => Promise<void>;
130
132
  }
131
133
 
132
- declare function isLicencedResourceType(resourceType: ResourceTypeEnum): resourceType is LicencedResourceType;
133
- declare function isProfileBadgeLicence(licenceType: LicencesEnumType): licenceType is ProfileBadgeLicence;
134
- declare const hasUserLicenceType: (authUser: UserType | null, licenceType: LicencesEnumType) => boolean;
135
- declare const hasLicence: (authUser: UserType | null, licenceType: "vendor" | "partner" | "event") => HasLicenceResult;
134
+ declare function isLicencedResourceType(resourceType: EnumResourceType): resourceType is LicencedResourceType;
135
+ declare function isProfileBadgeLicence(licenceType: EnumUserLicence): licenceType is ProfileBadgeLicence;
136
+ declare const hasUserLicenceType: (authUser: SafeUserType | null, licenceType: EnumUserLicence) => boolean;
137
+ declare const hasLicence: (authUser: SafeUserType | null, licenceType: "vendor" | "partner" | "event") => HasLicenceResult;
136
138
  /** Default limits per subscription tier. */
137
139
  declare const DEFAULT_LIMITS: Record<LimitType, Record<Tier, number>>;
138
140
  /** All tiers off — used when the viewer does not own the resource. */
@@ -1,8 +1,10 @@
1
- import { U as UserRoleEnumType, f as ResourceTypeEnum, e as LicencesEnumType, C as UserType } from '../graphql-CDOfA79A.js';
2
- import { P as Permission, T as Tier } from '../subscription-OiJ50uJb.js';
3
- export { a as PERMISSIONS, W as WILDCARD_PERMISSION } from '../subscription-OiJ50uJb.js';
1
+ import { EnumUserRole, EnumResourceType, EnumUserLicence } from '../enums/index.js';
2
+ import { P as Permission, S as SafeUserType } from '../user-D47MLFyH.js';
3
+ export { a as PERMISSIONS, W as WILDCARD_PERMISSION } from '../user-D47MLFyH.js';
4
+ import { T as Tier } from '../subscription-BU8GvH2K.js';
4
5
  import React, { ReactNode } from 'react';
5
- import '../images/index.js';
6
+ import '../global-CUYYxpy2.js';
7
+ import 'react-hook-form';
6
8
 
7
9
  type AuthManager = {
8
10
  logout: () => Promise<void>;
@@ -20,7 +22,7 @@ type AuthManager = {
20
22
  declare function createAuthManager(): AuthManager;
21
23
 
22
24
  /** Roles allowed to sign into the admin web app (CUSTOMER-only is denied). */
23
- declare const ADMIN_APP_ROLES: readonly [UserRoleEnumType.SuperAdmin, UserRoleEnumType.Admin, UserRoleEnumType.Event, UserRoleEnumType.Vendor, UserRoleEnumType.Partner, UserRoleEnumType.School, UserRoleEnumType.Affiliate];
25
+ declare const ADMIN_APP_ROLES: readonly [EnumUserRole.SUPER_ADMIN, EnumUserRole.ADMIN, EnumUserRole.EVENT, EnumUserRole.VENDOR, EnumUserRole.PARTNER, EnumUserRole.SCHOOL, EnumUserRole.AFFILIATE];
24
26
  type AdminAppRole = (typeof ADMIN_APP_ROLES)[number];
25
27
  type AdminDashboardContext = "staff" | "event" | "vendor" | "partner" | "school" | "affiliate";
26
28
  type AdminDashboardContextInfo = {
@@ -29,39 +31,39 @@ type AdminDashboardContextInfo = {
29
31
  label: string;
30
32
  /** Path prefixes that belong to this context (including home). */
31
33
  pathPrefixes: readonly string[];
32
- roles: readonly UserRoleEnumType[];
34
+ roles: readonly EnumUserRole[];
33
35
  };
34
36
  /**
35
37
  * Priority order for default home + role switcher.
36
38
  * Staff first, then product roles.
37
39
  */
38
40
  declare const ADMIN_DASHBOARD_CONTEXTS: readonly AdminDashboardContextInfo[];
39
- declare function canAccessAdminApp(roles: UserRoleEnumType[] | null | undefined): boolean;
40
- declare function getUsableAdminContexts(roles: UserRoleEnumType[] | null | undefined): AdminDashboardContextInfo[];
41
- declare function getDefaultAdminHome(roles: UserRoleEnumType[] | null | undefined, preferredContext?: AdminDashboardContext | null): string;
41
+ declare function canAccessAdminApp(roles: EnumUserRole[] | null | undefined): boolean;
42
+ declare function getUsableAdminContexts(roles: EnumUserRole[] | null | undefined): AdminDashboardContextInfo[];
43
+ declare function getDefaultAdminHome(roles: EnumUserRole[] | null | undefined, preferredContext?: AdminDashboardContext | null): string;
42
44
  declare function resolveAdminContextFromPath(pathname: string): AdminDashboardContext | null;
43
- declare function canAccessAdminPath(roles: UserRoleEnumType[] | null | undefined, pathname: string): boolean;
45
+ declare function canAccessAdminPath(roles: EnumUserRole[] | null | undefined, pathname: string): boolean;
44
46
 
45
47
  /**
46
48
  * Union of permissions for the given roles (deduped, stable order).
47
49
  */
48
- declare function getPermissionsForRoles(roles: UserRoleEnumType[] | null | undefined): Permission[];
50
+ declare function getPermissionsForRoles(roles: EnumUserRole[] | null | undefined): Permission[];
49
51
  /**
50
52
  * Check a concrete permission list (e.g. authUser.permissions) for a grant.
51
53
  * Honours the "*" wildcard.
52
54
  */
53
55
  declare function permissionListIncludes(permissions: readonly Permission[] | null | undefined, permission: Permission): boolean;
54
- declare function hasPermission(roles: UserRoleEnumType[] | null | undefined, permission: Permission): boolean;
55
- declare function hasAnyPermission(roles: UserRoleEnumType[] | null | undefined, permissions: readonly Permission[]): boolean;
56
- declare function hasAllPermissions(roles: UserRoleEnumType[] | null | undefined, permissions: readonly Permission[]): boolean;
57
- declare function hasRole(roles: UserRoleEnumType[] | null | undefined, role: UserRoleEnumType): boolean;
58
- declare function hasAnyRole(roles: UserRoleEnumType[] | null | undefined, checkRoles: readonly UserRoleEnumType[]): boolean;
56
+ declare function hasPermission(roles: EnumUserRole[] | null | undefined, permission: Permission): boolean;
57
+ declare function hasAnyPermission(roles: EnumUserRole[] | null | undefined, permissions: readonly Permission[]): boolean;
58
+ declare function hasAllPermissions(roles: EnumUserRole[] | null | undefined, permissions: readonly Permission[]): boolean;
59
+ declare function hasRole(roles: EnumUserRole[] | null | undefined, role: EnumUserRole): boolean;
60
+ declare function hasAnyRole(roles: EnumUserRole[] | null | undefined, checkRoles: readonly EnumUserRole[]): boolean;
59
61
 
60
62
  /**
61
63
  * Static role → permissions map. Source of truth for access.
62
64
  * Permissions for a user = union of all their roles' lists.
63
65
  */
64
- declare const ROLE_PERMISSIONS: Record<UserRoleEnumType, readonly Permission[]>;
66
+ declare const ROLE_PERMISSIONS: Record<EnumUserRole, readonly Permission[]>;
65
67
 
66
68
  type LimitType = "availability" | "images" | "calendar" | "posters" | "productsList" | "statistics" | "relationShare";
67
69
  interface RoleLicences {
@@ -75,9 +77,9 @@ interface LicencesByRole {
75
77
  partner: RoleLicences;
76
78
  }
77
79
  /** Resource types with subscription/licence limits (excludes affiliate & school). */
78
- type LicencedResourceType = Exclude<ResourceTypeEnum, ResourceTypeEnum.Affiliate | ResourceTypeEnum.School>;
80
+ type LicencedResourceType = Exclude<EnumResourceType, EnumResourceType.AFFILIATE | EnumResourceType.SCHOOL>;
79
81
  /** Licence badges shown on the profile screen (excludes affiliate & school). */
80
- type ProfileBadgeLicence = Exclude<LicencesEnumType, LicencesEnumType.StandardAffiliate | LicencesEnumType.StandardSchool>;
82
+ type ProfileBadgeLicence = Exclude<EnumUserLicence, EnumUserLicence.STANDARD_AFFILIATE | EnumUserLicence.STANDARD_SCHOOL>;
81
83
  type HasLicenceResult = {
82
84
  directLicence: boolean;
83
85
  };
@@ -110,29 +112,29 @@ type UseAuthCoreAdapters = {
110
112
  }) => void;
111
113
  };
112
114
  interface UseAuthReturnType {
113
- authUser: UserType | null;
115
+ authUser: SafeUserType | null;
114
116
  isAffiliate: boolean;
115
117
  isSchool: boolean;
116
118
  handleLogoutExplicit: () => Promise<void>;
117
119
  hasEventLicence: HasLicenceResult;
118
120
  hasPartnerLicence: HasLicenceResult;
119
121
  hasPermission: (permission: Permission) => boolean;
120
- hasRole: (role: UserRoleEnumType) => boolean;
121
- hasUserLicence: (licenceType: LicencesEnumType) => boolean;
122
+ hasRole: (role: EnumUserRole) => boolean;
123
+ hasUserLicence: (licenceType: EnumUserLicence) => boolean;
122
124
  hasVendorLicence: HasLicenceResult;
123
125
  isAdmin: boolean;
124
126
  isSuperAdmin: boolean;
125
127
  isLoading: boolean;
126
128
  permissions: Permission[];
127
- getLicenseAccessLevel: (limitType: LimitType, resourceId: string, resourceType: ResourceTypeEnum) => number;
129
+ getLicenseAccessLevel: (limitType: LimitType, resourceId: string, resourceType: EnumResourceType) => number;
128
130
  refetchUser: () => Promise<void>;
129
- setUser: (user: UserType | null) => Promise<void>;
131
+ setUser: (user: SafeUserType | null) => Promise<void>;
130
132
  }
131
133
 
132
- declare function isLicencedResourceType(resourceType: ResourceTypeEnum): resourceType is LicencedResourceType;
133
- declare function isProfileBadgeLicence(licenceType: LicencesEnumType): licenceType is ProfileBadgeLicence;
134
- declare const hasUserLicenceType: (authUser: UserType | null, licenceType: LicencesEnumType) => boolean;
135
- declare const hasLicence: (authUser: UserType | null, licenceType: "vendor" | "partner" | "event") => HasLicenceResult;
134
+ declare function isLicencedResourceType(resourceType: EnumResourceType): resourceType is LicencedResourceType;
135
+ declare function isProfileBadgeLicence(licenceType: EnumUserLicence): licenceType is ProfileBadgeLicence;
136
+ declare const hasUserLicenceType: (authUser: SafeUserType | null, licenceType: EnumUserLicence) => boolean;
137
+ declare const hasLicence: (authUser: SafeUserType | null, licenceType: "vendor" | "partner" | "event") => HasLicenceResult;
136
138
  /** Default limits per subscription tier. */
137
139
  declare const DEFAULT_LIMITS: Record<LimitType, Record<Tier, number>>;
138
140
  /** All tiers off — used when the viewer does not own the resource. */
@@ -1,17 +1,9 @@
1
1
  "use client";
2
- import {
3
- USER_STORAGE_KEY
4
- } from "../chunk-DWO35OY4.mjs";
5
- import {
6
- useGetUser,
7
- useLogout
8
- } from "../chunk-UKW7NZEQ.mjs";
9
2
  import {
10
3
  ADMIN_APP_ROLES,
11
4
  ADMIN_DASHBOARD_CONTEXTS,
12
5
  PERMISSIONS,
13
6
  ROLE_PERMISSIONS,
14
- TIERS_BY_PRIORITY,
15
7
  WILDCARD_PERMISSION,
16
8
  canAccessAdminApp,
17
9
  canAccessAdminPath,
@@ -24,10 +16,19 @@ import {
24
16
  hasPermission,
25
17
  hasRole,
26
18
  permissionListIncludes,
27
- resolveAdminContextFromPath,
28
- toUserPermissions
29
- } from "../chunk-DATBGC2K.mjs";
30
- import "../chunk-INQCDU24.mjs";
19
+ resolveAdminContextFromPath
20
+ } from "../chunk-VPANTTZI.mjs";
21
+ import {
22
+ USER_STORAGE_KEY
23
+ } from "../chunk-DWO35OY4.mjs";
24
+ import {
25
+ TIERS_BY_PRIORITY
26
+ } from "../chunk-DQ7ZHIXW.mjs";
27
+ import {
28
+ useGetUser,
29
+ useLogout
30
+ } from "../chunk-32MKHJTX.mjs";
31
+ import "../chunk-X3OLM35T.mjs";
31
32
 
32
33
  // src/auth/createAuthManager.ts
33
34
  function createAuthManager() {
@@ -64,10 +65,10 @@ function createAuthManager() {
64
65
 
65
66
  // src/auth/licenceUtils.ts
66
67
  function isLicencedResourceType(resourceType) {
67
- return resourceType !== "affiliate" /* Affiliate */ && resourceType !== "school" /* School */;
68
+ return resourceType !== "affiliate" /* AFFILIATE */ && resourceType !== "school" /* SCHOOL */;
68
69
  }
69
70
  function isProfileBadgeLicence(licenceType) {
70
- return licenceType !== "standard_affiliate" /* StandardAffiliate */ && licenceType !== "standard_school" /* StandardSchool */;
71
+ return licenceType !== "standard_affiliate" /* STANDARD_AFFILIATE */ && licenceType !== "standard_school" /* STANDARD_SCHOOL */;
71
72
  }
72
73
  var hasUserLicenceType = (authUser, licenceType) => authUser?.licences?.some((licence) => licence.licenceType === licenceType) ?? false;
73
74
  var hasLicence = (authUser, licenceType) => {
@@ -130,9 +131,9 @@ function getLicenceFlagsByRole(licences) {
130
131
  return result;
131
132
  }
132
133
  return {
133
- event: resolve("event" /* Event */),
134
- partner: resolve("partner" /* Partner */),
135
- vendor: resolve("vendor" /* Vendor */)
134
+ event: resolve("event" /* EVENT */),
135
+ partner: resolve("partner" /* PARTNER */),
136
+ vendor: resolve("vendor" /* VENDOR */)
136
137
  };
137
138
  }
138
139
 
@@ -181,12 +182,12 @@ function useAuthCore(adapters) {
181
182
  }, [authUser, handleSetAuthUser, onError, refetch]);
182
183
  const licences = useCallback(
183
184
  (resourceId) => {
184
- const myLicences = authUser?.licences?.map((licence) => licence.licenceType).filter((type) => type != null) ?? [];
185
+ const myLicences = authUser?.licences?.map((licence) => licence.licenceType) ?? [];
185
186
  const myResourceIds = [
186
187
  authUser?.vendor ?? null,
187
188
  authUser?.partner ?? null,
188
189
  ...authUser?.events ?? []
189
- ].filter((id) => id != null);
190
+ ].filter((id) => id !== null);
190
191
  return myResourceIds.includes(resourceId) ? getLicenceFlagsByRole(myLicences) : NO_LICENCE_FLAGS;
191
192
  },
192
193
  [authUser]
@@ -225,7 +226,7 @@ function useAuthCore(adapters) {
225
226
  );
226
227
  const permissions = useMemo(() => {
227
228
  if (authUser?.permissions != null) {
228
- return toUserPermissions(authUser.permissions);
229
+ return authUser.permissions;
229
230
  }
230
231
  return getPermissionsForRoles(authUser?.roles);
231
232
  }, [authUser?.permissions, authUser?.roles]);
@@ -238,19 +239,19 @@ function useAuthCore(adapters) {
238
239
  [authUser?.roles]
239
240
  );
240
241
  const isAdmin = useMemo(
241
- () => hasRole(authUser?.roles, "admin" /* Admin */) || permissionListIncludes(permissions, "dashboard.admin") || permissionListIncludes(permissions, "*"),
242
+ () => hasRole(authUser?.roles, "admin" /* ADMIN */) || permissionListIncludes(permissions, "dashboard.admin") || permissionListIncludes(permissions, "*"),
242
243
  [authUser?.roles, permissions]
243
244
  );
244
245
  const isSuperAdmin = useMemo(
245
- () => hasRole(authUser?.roles, "super_admin" /* SuperAdmin */),
246
+ () => hasRole(authUser?.roles, "super_admin" /* SUPER_ADMIN */),
246
247
  [authUser?.roles]
247
248
  );
248
249
  const isAffiliate = useMemo(
249
- () => hasRole(authUser?.roles, "affiliate" /* Affiliate */) && authUser?.affiliate !== null && authUser?.affiliate !== void 0,
250
+ () => hasRole(authUser?.roles, "affiliate" /* AFFILIATE */) && authUser?.affiliate !== null && authUser?.affiliate !== void 0,
250
251
  [authUser?.roles, authUser?.affiliate]
251
252
  );
252
253
  const isSchool = useMemo(
253
- () => hasRole(authUser?.roles, "school" /* School */) && authUser?.school !== null && authUser?.school !== void 0,
254
+ () => hasRole(authUser?.roles, "school" /* SCHOOL */) && authUser?.school !== null && authUser?.school !== void 0,
254
255
  [authUser?.roles, authUser?.school]
255
256
  );
256
257
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/auth/createAuthManager.ts","../../src/auth/licenceUtils.ts","../../src/auth/useAuthCore.ts","../../src/auth/UserProvider.tsx"],"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","/* eslint-disable camelcase */\nimport { ResourceTypeEnum, LicencesEnumType } from \"../generated/graphql\";\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: ResourceTypeEnum,\n): resourceType is LicencedResourceType {\n return (\n resourceType !== ResourceTypeEnum.Affiliate &&\n resourceType !== ResourceTypeEnum.School\n );\n}\n\nexport function isProfileBadgeLicence(\n licenceType: LicencesEnumType,\n): licenceType is ProfileBadgeLicence {\n return (\n licenceType !== LicencesEnumType.StandardAffiliate &&\n licenceType !== LicencesEnumType.StandardSchool\n );\n}\n\nexport const hasUserLicenceType = (\n authUser: SafeUserType | null,\n licenceType: LicencesEnumType,\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 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: ResourceTypeEnum): 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(ResourceTypeEnum.Event),\n partner: resolve(ResourceTypeEnum.Partner),\n vendor: resolve(ResourceTypeEnum.Vendor),\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport {\n ResourceTypeEnum,\n LicencesEnumType,\n UserRoleEnumType,\n} from \"../generated/graphql\";\nimport { useLogout } from \"../graphql/hooks/auth\";\nimport { useGetUser } from \"../graphql/hooks/user/hooksQuery\";\nimport { USER_STORAGE_KEY } from \"../storage\";\nimport type { SafeUserType } from \"../types\";\nimport { toUserPermissions } from \"../types/userAdapters\";\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\n ?.map((licence) => licence.licenceType)\n .filter((type): type is LicencesEnumType => type != null) ?? [];\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: ResourceTypeEnum,\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: LicencesEnumType) =>\n hasUserLicenceType(authUser, licenceType),\n [authUser],\n );\n\n const permissions = useMemo(() => {\n if (authUser?.permissions != null) {\n return toUserPermissions(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: UserRoleEnumType) => roleHasRole(authUser?.roles, role),\n [authUser?.roles],\n );\n\n const isAdmin = useMemo(\n () =>\n roleHasRole(authUser?.roles, UserRoleEnumType.Admin) ||\n permissionListIncludes(permissions, \"dashboard.admin\") ||\n permissionListIncludes(permissions, \"*\"),\n [authUser?.roles, permissions],\n );\n\n const isSuperAdmin = useMemo(\n () => roleHasRole(authUser?.roles, UserRoleEnumType.SuperAdmin),\n [authUser?.roles],\n );\n\n const isAffiliate = useMemo(\n () =>\n roleHasRole(authUser?.roles, UserRoleEnumType.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, UserRoleEnumType.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","/**\n * Shared React context for auth session state.\n *\n * Apps keep a thin local UserProvider that calls their platform `useAuth`\n * (adapters) and pass the result here as `value`. Import `useAuthUser` from\n * this module (or re-export it) so consumers share one context instance.\n *\n * `\"use client\"`: required for Next.js; ignored by React Native.\n */\n\"use client\";\n\nimport React, { createContext, useContext, type ReactNode } from \"react\";\n\nimport type { UseAuthReturnType } from \"./types\";\n\nconst UserContext = createContext<UseAuthReturnType | undefined>(undefined);\n\n/**\n * Provides auth session value from the app's thin useAuth wrapper.\n */\nexport const UserProvider: React.FC<{\n children: ReactNode;\n value: UseAuthReturnType;\n}> = ({ children, value }) => {\n return <UserContext.Provider value={value}>{children}</UserContext.Provider>;\n};\n\nexport const useAuthUser = (): UseAuthReturnType => {\n const context = useContext(UserContext);\n if (!context) {\n throw new Error(\"useAuthUser must be used within a UserProvider\");\n }\n return context;\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/auth/createAuthManager.ts","../../src/auth/licenceUtils.ts","../../src/auth/useAuthCore.ts","../../src/auth/UserProvider.tsx"],"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","/* 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 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","/**\n * Shared React context for auth session state.\n *\n * Apps keep a thin local UserProvider that calls their platform `useAuth`\n * (adapters) and pass the result here as `value`. Import `useAuthUser` from\n * this module (or re-export it) so consumers share one context instance.\n *\n * `\"use client\"`: required for Next.js; ignored by React Native.\n */\n\"use client\";\n\nimport React, { createContext, useContext, type ReactNode } from \"react\";\n\nimport type { UseAuthReturnType } from \"./types\";\n\nconst UserContext = createContext<UseAuthReturnType | undefined>(undefined);\n\n/**\n * Provides auth session value from the app's thin useAuth wrapper.\n */\nexport const UserProvider: React.FC<{\n children: ReactNode;\n value: UseAuthReturnType;\n}> = ({ children, value }) => {\n return <UserContext.Provider value={value}>{children}</UserContext.Provider>;\n};\n\nexport const useAuthUser = (): UseAuthReturnType => {\n const context = useContext(UserContext);\n if (!context) {\n throw new Error(\"useAuthUser must be used within a UserProvider\");\n }\n return context;\n};\n"],"mappings":"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","names":[]}