@timardex/cluemart-shared 1.5.828 → 1.5.830
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/index.cjs +109 -13
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.mts +24 -4
- package/dist/auth/index.d.ts +24 -4
- package/dist/auth/index.mjs +18 -8
- package/dist/auth/index.mjs.map +1 -1
- package/dist/{chunk-GHW3ZGBY.mjs → chunk-VPANTTZI.mjs} +102 -8
- package/dist/chunk-VPANTTZI.mjs.map +1 -0
- package/dist/hooks/index.cjs +56 -6
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.mjs +1 -1
- package/dist/index.cjs +107 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +24 -1
- package/dist/index.d.ts +24 -1
- package/dist/index.mjs +100 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-GHW3ZGBY.mjs.map +0 -1
package/dist/auth/index.cjs
CHANGED
|
@@ -21,15 +21,20 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
// src/auth/index.ts
|
|
22
22
|
var auth_exports = {};
|
|
23
23
|
__export(auth_exports, {
|
|
24
|
+
ADMIN_APP_ROLES: () => ADMIN_APP_ROLES,
|
|
25
|
+
ADMIN_DASHBOARD_CONTEXTS: () => ADMIN_DASHBOARD_CONTEXTS,
|
|
24
26
|
DEFAULT_LIMITS: () => DEFAULT_LIMITS,
|
|
25
27
|
PERMISSIONS: () => PERMISSIONS,
|
|
26
28
|
ROLE_PERMISSIONS: () => ROLE_PERMISSIONS,
|
|
27
|
-
SUPER_ADMIN_EMAIL: () => SUPER_ADMIN_EMAIL,
|
|
28
29
|
UserProvider: () => UserProvider,
|
|
29
30
|
WILDCARD_PERMISSION: () => WILDCARD_PERMISSION,
|
|
31
|
+
canAccessAdminApp: () => canAccessAdminApp,
|
|
32
|
+
canAccessAdminPath: () => canAccessAdminPath,
|
|
30
33
|
createAuthManager: () => createAuthManager,
|
|
34
|
+
getDefaultAdminHome: () => getDefaultAdminHome,
|
|
31
35
|
getLicenceFlagsByRole: () => getLicenceFlagsByRole,
|
|
32
36
|
getPermissionsForRoles: () => getPermissionsForRoles,
|
|
37
|
+
getUsableAdminContexts: () => getUsableAdminContexts,
|
|
33
38
|
hasAllPermissions: () => hasAllPermissions,
|
|
34
39
|
hasAnyPermission: () => hasAnyPermission,
|
|
35
40
|
hasAnyRole: () => hasAnyRole,
|
|
@@ -40,14 +45,12 @@ __export(auth_exports, {
|
|
|
40
45
|
isLicencedResourceType: () => isLicencedResourceType,
|
|
41
46
|
isProfileBadgeLicence: () => isProfileBadgeLicence,
|
|
42
47
|
permissionListIncludes: () => permissionListIncludes,
|
|
48
|
+
resolveAdminContextFromPath: () => resolveAdminContextFromPath,
|
|
43
49
|
useAuthCore: () => useAuthCore,
|
|
44
50
|
useAuthUser: () => useAuthUser
|
|
45
51
|
});
|
|
46
52
|
module.exports = __toCommonJS(auth_exports);
|
|
47
53
|
|
|
48
|
-
// src/auth/constants.ts
|
|
49
|
-
var SUPER_ADMIN_EMAIL = "hello@cluemart.co.nz";
|
|
50
|
-
|
|
51
54
|
// src/auth/createAuthManager.ts
|
|
52
55
|
function createAuthManager() {
|
|
53
56
|
let logoutFn = null;
|
|
@@ -213,9 +216,6 @@ var WILDCARD_PERMISSION = "*";
|
|
|
213
216
|
// src/auth/permissions/rolePermissions.ts
|
|
214
217
|
var ADMIN_PERMISSIONS = [
|
|
215
218
|
"dashboard.admin",
|
|
216
|
-
"users.read",
|
|
217
|
-
"users.update",
|
|
218
|
-
"users.delete",
|
|
219
219
|
"events.read",
|
|
220
220
|
"events.create",
|
|
221
221
|
"events.update",
|
|
@@ -243,9 +243,7 @@ var ADMIN_PERMISSIONS = [
|
|
|
243
243
|
"posts.read",
|
|
244
244
|
"posts.create",
|
|
245
245
|
"posts.update",
|
|
246
|
-
"posts.delete"
|
|
247
|
-
"settings.read",
|
|
248
|
-
"settings.update"
|
|
246
|
+
"posts.delete"
|
|
249
247
|
];
|
|
250
248
|
var ROLE_PERMISSIONS = {
|
|
251
249
|
["super_admin" /* SUPER_ADMIN */]: ["*"],
|
|
@@ -305,6 +303,98 @@ function hasAnyRole(roles, checkRoles) {
|
|
|
305
303
|
return checkRoles.some((r) => set.has(r));
|
|
306
304
|
}
|
|
307
305
|
|
|
306
|
+
// src/auth/permissions/adminAppAccess.ts
|
|
307
|
+
var ADMIN_APP_ROLES = [
|
|
308
|
+
"super_admin" /* SUPER_ADMIN */,
|
|
309
|
+
"admin" /* ADMIN */,
|
|
310
|
+
"event" /* EVENT */,
|
|
311
|
+
"vendor" /* VENDOR */,
|
|
312
|
+
"partner" /* PARTNER */,
|
|
313
|
+
"school" /* SCHOOL */,
|
|
314
|
+
"affiliate" /* AFFILIATE */
|
|
315
|
+
];
|
|
316
|
+
var ADMIN_DASHBOARD_CONTEXTS = [
|
|
317
|
+
{
|
|
318
|
+
context: "staff",
|
|
319
|
+
home: "/dashboard",
|
|
320
|
+
label: "Staff",
|
|
321
|
+
pathPrefixes: ["/dashboard"],
|
|
322
|
+
roles: ["super_admin" /* SUPER_ADMIN */, "admin" /* ADMIN */]
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
context: "event",
|
|
326
|
+
home: "/event/dashboard",
|
|
327
|
+
label: "Events",
|
|
328
|
+
pathPrefixes: ["/event"],
|
|
329
|
+
roles: ["event" /* EVENT */]
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
context: "vendor",
|
|
333
|
+
home: "/vendor/dashboard",
|
|
334
|
+
label: "Stallholders",
|
|
335
|
+
pathPrefixes: ["/vendor"],
|
|
336
|
+
roles: ["vendor" /* VENDOR */]
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
context: "partner",
|
|
340
|
+
home: "/partner/dashboard",
|
|
341
|
+
label: "Partners",
|
|
342
|
+
pathPrefixes: ["/partner"],
|
|
343
|
+
roles: ["partner" /* PARTNER */]
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
context: "school",
|
|
347
|
+
home: "/school/dashboard",
|
|
348
|
+
label: "Schools",
|
|
349
|
+
pathPrefixes: ["/school"],
|
|
350
|
+
roles: ["school" /* SCHOOL */]
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
context: "affiliate",
|
|
354
|
+
home: "/affiliate/dashboard",
|
|
355
|
+
label: "Affiliate",
|
|
356
|
+
pathPrefixes: ["/affiliate"],
|
|
357
|
+
roles: ["affiliate" /* AFFILIATE */]
|
|
358
|
+
}
|
|
359
|
+
];
|
|
360
|
+
function canAccessAdminApp(roles) {
|
|
361
|
+
return hasAnyRole(roles, ADMIN_APP_ROLES);
|
|
362
|
+
}
|
|
363
|
+
function getUsableAdminContexts(roles) {
|
|
364
|
+
return ADMIN_DASHBOARD_CONTEXTS.filter((ctx) => hasAnyRole(roles, ctx.roles));
|
|
365
|
+
}
|
|
366
|
+
function getDefaultAdminHome(roles, preferredContext) {
|
|
367
|
+
const usable = getUsableAdminContexts(roles);
|
|
368
|
+
if (usable.length === 0) {
|
|
369
|
+
return "/login";
|
|
370
|
+
}
|
|
371
|
+
if (preferredContext) {
|
|
372
|
+
const preferred = usable.find((ctx) => ctx.context === preferredContext);
|
|
373
|
+
if (preferred) return preferred.home;
|
|
374
|
+
}
|
|
375
|
+
return usable[0].home;
|
|
376
|
+
}
|
|
377
|
+
function resolveAdminContextFromPath(pathname) {
|
|
378
|
+
for (const ctx of ADMIN_DASHBOARD_CONTEXTS) {
|
|
379
|
+
if (ctx.pathPrefixes.some(
|
|
380
|
+
(prefix) => pathname === prefix || pathname.startsWith(`${prefix}/`)
|
|
381
|
+
)) {
|
|
382
|
+
return ctx.context;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return null;
|
|
386
|
+
}
|
|
387
|
+
function canAccessAdminPath(roles, pathname) {
|
|
388
|
+
if (!canAccessAdminApp(roles)) return false;
|
|
389
|
+
const context = resolveAdminContextFromPath(pathname);
|
|
390
|
+
if (!context) {
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
const info = ADMIN_DASHBOARD_CONTEXTS.find((ctx) => ctx.context === context);
|
|
394
|
+
if (!info) return false;
|
|
395
|
+
return hasAnyRole(roles, info.roles);
|
|
396
|
+
}
|
|
397
|
+
|
|
308
398
|
// src/auth/useAuthCore.ts
|
|
309
399
|
var import_react = require("react");
|
|
310
400
|
|
|
@@ -1484,8 +1574,8 @@ function useAuthCore(adapters) {
|
|
|
1484
1574
|
[authUser?.roles, permissions]
|
|
1485
1575
|
);
|
|
1486
1576
|
const isSuperAdmin = (0, import_react.useMemo)(
|
|
1487
|
-
() => hasRole(authUser?.roles, "super_admin" /* SUPER_ADMIN */)
|
|
1488
|
-
[authUser?.roles
|
|
1577
|
+
() => hasRole(authUser?.roles, "super_admin" /* SUPER_ADMIN */),
|
|
1578
|
+
[authUser?.roles]
|
|
1489
1579
|
);
|
|
1490
1580
|
const isAffiliate = (0, import_react.useMemo)(
|
|
1491
1581
|
() => hasRole(authUser?.roles, "affiliate" /* AFFILIATE */) && authUser?.affiliate !== null && authUser?.affiliate !== void 0,
|
|
@@ -1590,15 +1680,20 @@ var useAuthUser = () => {
|
|
|
1590
1680
|
};
|
|
1591
1681
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1592
1682
|
0 && (module.exports = {
|
|
1683
|
+
ADMIN_APP_ROLES,
|
|
1684
|
+
ADMIN_DASHBOARD_CONTEXTS,
|
|
1593
1685
|
DEFAULT_LIMITS,
|
|
1594
1686
|
PERMISSIONS,
|
|
1595
1687
|
ROLE_PERMISSIONS,
|
|
1596
|
-
SUPER_ADMIN_EMAIL,
|
|
1597
1688
|
UserProvider,
|
|
1598
1689
|
WILDCARD_PERMISSION,
|
|
1690
|
+
canAccessAdminApp,
|
|
1691
|
+
canAccessAdminPath,
|
|
1599
1692
|
createAuthManager,
|
|
1693
|
+
getDefaultAdminHome,
|
|
1600
1694
|
getLicenceFlagsByRole,
|
|
1601
1695
|
getPermissionsForRoles,
|
|
1696
|
+
getUsableAdminContexts,
|
|
1602
1697
|
hasAllPermissions,
|
|
1603
1698
|
hasAnyPermission,
|
|
1604
1699
|
hasAnyRole,
|
|
@@ -1609,6 +1704,7 @@ var useAuthUser = () => {
|
|
|
1609
1704
|
isLicencedResourceType,
|
|
1610
1705
|
isProfileBadgeLicence,
|
|
1611
1706
|
permissionListIncludes,
|
|
1707
|
+
resolveAdminContextFromPath,
|
|
1612
1708
|
useAuthCore,
|
|
1613
1709
|
useAuthUser
|
|
1614
1710
|
});
|
package/dist/auth/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/auth/index.ts","../../src/auth/constants.ts","../../src/auth/createAuthManager.ts","../../src/types/subscription.ts","../../src/auth/licenceUtils.ts","../../src/auth/permissions/permissions.ts","../../src/auth/permissions/rolePermissions.ts","../../src/auth/permissions/helpers.ts","../../src/auth/useAuthCore.ts","../../src/graphql/hooks/auth.ts","../../src/graphql/mutations/auth.ts","../../src/graphql/queries/global.ts","../../src/graphql/hooks/user/hooksQuery.ts","../../src/graphql/queries/user.ts","../../src/graphql/queries/event.ts","../../src/graphql/queries/partner.ts","../../src/graphql/queries/vendor.ts","../../src/storage/index.ts","../../src/auth/UserProvider.tsx"],"sourcesContent":["/**\n * Client entry for shared auth.\n *\n * `\"use client\"` is required so Next.js treats this bundled module as a Client\n * Component boundary (`createContext` / hooks). Expo/Metro ignores the directive.\n */\n\"use client\";\n\nexport { SUPER_ADMIN_EMAIL } from \"./constants\";\nexport { createAuthManager } from \"./createAuthManager\";\nexport type { AuthManager } from \"./createAuthManager\";\nexport {\n DEFAULT_LIMITS,\n getLicenceFlagsByRole,\n hasLicence,\n hasUserLicenceType,\n isLicencedResourceType,\n isProfileBadgeLicence,\n} from \"./licenceUtils\";\nexport {\n getPermissionsForRoles,\n hasAllPermissions,\n hasAnyPermission,\n hasAnyRole,\n hasPermission,\n hasRole,\n permissionListIncludes,\n PERMISSIONS,\n ROLE_PERMISSIONS,\n WILDCARD_PERMISSION,\n} from \"./permissions\";\nexport type { Permission } from \"./permissions\";\nexport type {\n AuthManagerLike,\n AuthStorageAdapter,\n HasLicenceResult,\n LicencedResourceType,\n LicencesByRole,\n LimitType,\n LogoutReason,\n ProfileBadgeLicence,\n RoleLicences,\n UseAuthCoreAdapters,\n UseAuthReturnType,\n} from \"./types\";\nexport { useAuthCore } from \"./useAuthCore\";\nexport { UserProvider, useAuthUser } from \"./UserProvider\";\n","/** Super-admin identity used for elevated admin checks in clients. */\nexport const SUPER_ADMIN_EMAIL = \"hello@cluemart.co.nz\";\n","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 { EnumUserLicence } from \"../enums\";\n\n/** Tier keys in descending priority (highest first) for licence resolution. */\nexport const TIERS_BY_PRIORITY = [\"pro_plus\", \"pro\", \"standard\"] as const;\n\n/** Canonical subscription tier keys — matches Stripe/server tier identifiers. */\nexport type Tier = (typeof TIERS_BY_PRIORITY)[number];\n\n/** User-facing tier labels (decoupled from the Tier discriminant). */\nexport const TIER_DISPLAY_LABELS: Record<Tier, string> = {\n pro: \"Pro\",\n // eslint-disable-next-line camelcase\n pro_plus: \"Pro+ Ads\",\n standard: \"Standard\",\n};\n\n/** Maps licence enums to their canonical tier key. */\nexport const TIER_FROM_LICENCE: Record<EnumUserLicence, Tier> = {\n [EnumUserLicence.PRO_EVENT]: \"pro\",\n [EnumUserLicence.PRO_PLUS_EVENT]: \"pro_plus\",\n [EnumUserLicence.PRO_PLUS_VENDOR]: \"pro_plus\",\n [EnumUserLicence.PRO_VENDOR]: \"pro\",\n [EnumUserLicence.STANDARD_EVENT]: \"standard\",\n [EnumUserLicence.STANDARD_PARTNER]: \"standard\",\n [EnumUserLicence.STANDARD_VENDOR]: \"standard\",\n [EnumUserLicence.STANDARD_AFFILIATE]: \"standard\",\n [EnumUserLicence.STANDARD_SCHOOL]: \"standard\",\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 const associateLicence =\n authUser?.associates?.some((associate) =>\n associate.licence?.licenceType?.includes(licenceType),\n ) ?? false;\n\n return {\n associateLicence,\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 associates: { pro: 3, pro_plus: 3, standard: 0 },\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/**\n * Parses an array of licence strings into structured, role-based licences.\n */\nexport function getLicenceFlagsByRole(licences?: string[]): LicencesByRole {\n const normalized = licences?.map((l) => l.toLowerCase()) ?? [];\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 return result;\n }\n\n return {\n event: resolve(EnumResourceType.EVENT),\n partner: resolve(EnumResourceType.PARTNER),\n vendor: resolve(EnumResourceType.VENDOR),\n };\n}\n","/**\n * Canonical permission IDs. Add new permissions here first, then map them in\n * ROLE_PERMISSIONS. Prefer resource.action names (e.g. users.read).\n */\nexport const PERMISSIONS = [\n \"*\",\n // Dashboards\n \"dashboard.admin\",\n \"dashboard.affiliate\",\n \"dashboard.customer\",\n \"dashboard.event\",\n \"dashboard.partner\",\n \"dashboard.school\",\n \"dashboard.vendor\",\n // Admin: users\n \"users.delete\",\n \"users.read\",\n \"users.update\",\n // Admin: events\n \"events.create\",\n \"events.delete\",\n \"events.read\",\n \"events.update\",\n // Admin: vendors\n \"vendors.create\",\n \"vendors.delete\",\n \"vendors.read\",\n \"vendors.update\",\n // Admin: partners\n \"partners.create\",\n \"partners.delete\",\n \"partners.read\",\n \"partners.update\",\n // Admin: schools\n \"schools.create\",\n \"schools.delete\",\n \"schools.read\",\n \"schools.update\",\n // Admin: affiliates\n \"affiliates.create\",\n \"affiliates.delete\",\n \"affiliates.read\",\n \"affiliates.update\",\n // Admin: ads / posts / settings\n \"ads.create\",\n \"ads.delete\",\n \"ads.read\",\n \"ads.update\",\n \"posts.create\",\n \"posts.delete\",\n \"posts.read\",\n \"posts.update\",\n \"settings.read\",\n \"settings.update\",\n // Product: own-resource management\n \"affiliates.manage_own\",\n \"events.manage_own\",\n \"partners.manage_own\",\n \"schools.manage_own\",\n \"vendors.manage_own\",\n] as const;\n\nexport type Permission = (typeof PERMISSIONS)[number];\n\nexport const WILDCARD_PERMISSION: Permission = \"*\";\n","import { EnumUserRole } from \"../../enums\";\n\nimport type { Permission } from \"./permissions\";\n\nconst ADMIN_PERMISSIONS: readonly Permission[] = [\n \"dashboard.admin\",\n \"users.read\",\n \"users.update\",\n \"users.delete\",\n \"events.read\",\n \"events.create\",\n \"events.update\",\n \"events.delete\",\n \"vendors.read\",\n \"vendors.create\",\n \"vendors.update\",\n \"vendors.delete\",\n \"partners.read\",\n \"partners.create\",\n \"partners.update\",\n \"partners.delete\",\n \"schools.read\",\n \"schools.create\",\n \"schools.update\",\n \"schools.delete\",\n \"affiliates.read\",\n \"affiliates.create\",\n \"affiliates.update\",\n \"affiliates.delete\",\n \"ads.read\",\n \"ads.create\",\n \"ads.update\",\n \"ads.delete\",\n \"posts.read\",\n \"posts.create\",\n \"posts.update\",\n \"posts.delete\",\n \"settings.read\",\n \"settings.update\",\n];\n\n/**\n * Static role → permissions map. Source of truth for access.\n * Permissions for a user = union of all their roles' lists.\n */\nexport const ROLE_PERMISSIONS: Record<EnumUserRole, readonly Permission[]> = {\n [EnumUserRole.SUPER_ADMIN]: [\"*\"],\n [EnumUserRole.ADMIN]: ADMIN_PERMISSIONS,\n [EnumUserRole.CUSTOMER]: [\"dashboard.customer\"],\n [EnumUserRole.EVENT]: [\"dashboard.event\", \"events.manage_own\"],\n [EnumUserRole.VENDOR]: [\"dashboard.vendor\", \"vendors.manage_own\"],\n [EnumUserRole.PARTNER]: [\"dashboard.partner\", \"partners.manage_own\"],\n [EnumUserRole.SCHOOL]: [\"dashboard.school\", \"schools.manage_own\"],\n [EnumUserRole.AFFILIATE]: [\"dashboard.affiliate\", \"affiliates.manage_own\"],\n};\n","import { EnumUserRole } from \"../../enums\";\n\nimport type { Permission } from \"./permissions\";\nimport { WILDCARD_PERMISSION } from \"./permissions\";\nimport { ROLE_PERMISSIONS } from \"./rolePermissions\";\n\nfunction normalizeRoles(\n roles: EnumUserRole[] | null | undefined,\n): EnumUserRole[] {\n if (!roles?.length) return [];\n return roles;\n}\n\n/**\n * Union of permissions for the given roles (deduped, stable order).\n */\nexport function getPermissionsForRoles(\n roles: EnumUserRole[] | null | undefined,\n): Permission[] {\n const seen = new Set<Permission>();\n const result: Permission[] = [];\n\n for (const role of normalizeRoles(roles)) {\n const perms = ROLE_PERMISSIONS[role] ?? [];\n for (const perm of perms) {\n if (!seen.has(perm)) {\n seen.add(perm);\n result.push(perm);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Check a concrete permission list (e.g. authUser.permissions) for a grant.\n * Honours the \"*\" wildcard.\n */\nexport function permissionListIncludes(\n permissions: readonly Permission[] | null | undefined,\n permission: Permission,\n): boolean {\n if (!permissions?.length) return false;\n const set = new Set(permissions);\n if (set.has(WILDCARD_PERMISSION)) return true;\n return set.has(permission);\n}\n\nexport function hasPermission(\n roles: EnumUserRole[] | null | undefined,\n permission: Permission,\n): boolean {\n return permissionListIncludes(getPermissionsForRoles(roles), permission);\n}\n\nexport function hasAnyPermission(\n roles: EnumUserRole[] | null | undefined,\n permissions: readonly Permission[],\n): boolean {\n if (permissions.length === 0) return false;\n const granted = getPermissionsForRoles(roles);\n return permissions.some((p) => permissionListIncludes(granted, p));\n}\n\nexport function hasAllPermissions(\n roles: EnumUserRole[] | null | undefined,\n permissions: readonly Permission[],\n): boolean {\n if (permissions.length === 0) return true;\n const granted = getPermissionsForRoles(roles);\n return permissions.every((p) => permissionListIncludes(granted, p));\n}\n\nexport function hasRole(\n roles: EnumUserRole[] | null | undefined,\n role: EnumUserRole,\n): boolean {\n return normalizeRoles(roles).includes(role);\n}\n\nexport function hasAnyRole(\n roles: EnumUserRole[] | null | undefined,\n checkRoles: readonly EnumUserRole[],\n): boolean {\n if (checkRoles.length === 0) return false;\n const set = new Set(normalizeRoles(roles));\n return checkRoles.some((r) => set.has(r));\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 { SUPER_ADMIN_EMAIL } from \"./constants\";\nimport {\n DEFAULT_LIMITS,\n getLicenceFlagsByRole,\n hasLicence,\n hasUserLicenceType,\n isLicencedResourceType,\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 const associateLicences =\n authUser?.associates?.map(\n (associate) => associate.licence.licenceType,\n ) ?? [];\n\n // No resource yet (e.g. create flow / unloaded id): use the user's own\n // licences only — never hard-code elevated tiers for an empty id.\n if (resourceId === \"\") {\n return getLicenceFlagsByRole(myLicences);\n }\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 : getLicenceFlagsByRole(associateLicences);\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 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 () =>\n roleHasRole(authUser?.roles, EnumUserRole.SUPER_ADMIN) &&\n authUser?.email === SUPER_ADMIN_EMAIL,\n [authUser?.roles, authUser?.email],\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","import { useMutation } from \"@apollo/client\";\n\nimport { AuthPayloadType, RefreshTokenPayloadType } from \"src/types/auth\";\n\nimport {\n REQUEST_PASSWORD_RESET_MUTATION,\n LOGIN_MUTATION,\n REGISTER_MUTATION,\n VALIDATE_VERIFICATION_TOKEN_MUTATION,\n RESET_PASSWORD_MUTATION,\n LOGOUT_MUTATION,\n REFRESH_TOKEN_MUTATION,\n} from \"../mutations/auth\";\n\nexport const useRegister = () => {\n const [register, { loading, error }] = useMutation<{\n register: AuthPayloadType;\n }>(REGISTER_MUTATION);\n return { error, loading, register };\n};\n\nexport const useLogin = () => {\n const [login, { loading, error }] = useMutation<{\n login: AuthPayloadType;\n }>(LOGIN_MUTATION);\n return { error, loading, login };\n};\n\nexport const useLogout = () => {\n const [logout, { loading, error }] = useMutation(LOGOUT_MUTATION);\n return { error, loading, logout };\n};\n\nexport const useRefreshToken = () => {\n const [refreshToken, { loading, error }] = useMutation<{\n refreshToken: RefreshTokenPayloadType;\n }>(REFRESH_TOKEN_MUTATION);\n return { error, loading, refreshToken };\n};\n\nexport const useRequestPasswordReset = () => {\n const [requestPasswordReset, { loading, error }] = useMutation(\n REQUEST_PASSWORD_RESET_MUTATION,\n );\n\n return { error, loading, requestPasswordReset };\n};\n\nexport const useValidateVerificationToken = () => {\n const [validateVerificationToken, { loading, error }] = useMutation(\n VALIDATE_VERIFICATION_TOKEN_MUTATION,\n );\n\n return { error, loading, validateVerificationToken };\n};\n\nexport const useResetPassword = () => {\n const [resetPassword, { loading, error }] = useMutation(\n RESET_PASSWORD_MUTATION,\n );\n\n return { error, loading, resetPassword };\n};\n","import { gql } from \"@apollo/client\";\n\nimport { USER_FIELDS_FRAGMENT } from \"../queries/global\";\n\nexport const REGISTER_MUTATION = gql`\n mutation register($input: RegisterInputType!) {\n register(input: $input) {\n message\n refreshToken\n token\n user {\n ...UserFields\n }\n }\n }\n ${USER_FIELDS_FRAGMENT}\n`;\n\nexport const LOGIN_MUTATION = gql`\n mutation login($input: LoginInputType!) {\n login(input: $input) {\n message\n refreshToken\n token\n user {\n ...UserFields\n }\n }\n }\n ${USER_FIELDS_FRAGMENT}\n`;\n\nexport const LOGOUT_MUTATION = gql`\n mutation logout {\n logout {\n message\n }\n }\n`;\n\nexport const REFRESH_TOKEN_MUTATION = gql`\n mutation refreshToken($input: RefreshTokenInputType!) {\n refreshToken(input: $input) {\n refreshToken\n token\n }\n }\n`;\n\nexport const RESET_PASSWORD_MUTATION = gql`\n mutation resetPassword($input: ResetPasswordInputType!) {\n resetPassword(input: $input) {\n message\n }\n }\n`;\n\nexport const REQUEST_PASSWORD_RESET_MUTATION = gql`\n mutation requestPasswordReset($input: RequestPasswordResetInputType!) {\n requestPasswordReset(input: $input) {\n message\n }\n }\n`;\n\nexport const VALIDATE_VERIFICATION_TOKEN_MUTATION = gql`\n mutation validateVerificationToken(\n $input: ValidateVerificationTokenInputType!\n ) {\n validateVerificationToken(input: $input) {\n message\n }\n }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const POSTER_USAGE_FIELDS_FRAGMENT = gql`\n fragment PosterUsageFields on PosterUsageType {\n month\n count\n }\n`;\n\nexport const SOCIAL_MEDIA_FIELDS_FRAGMENT = gql`\n fragment SocialMediaFields on SocialMediaType {\n name\n link\n }\n`;\n\nexport const RESOURCE_IMAGE_FIELDS_FRAGMENT = gql`\n fragment ResourceImageFields on ResourceImageType {\n active\n source\n title\n }\n`;\n\nexport const OWNER_FIELDS_FRAGMENT = gql`\n fragment OwnerFields on OwnerType {\n email\n userId\n }\n`;\n\nexport const CATEGORY_FIELDS_FRAGMENT = gql`\n fragment CategoryFields on CategoryType {\n id\n name\n subcategories {\n id\n items {\n id\n name\n }\n name\n }\n }\n`;\n\nexport const LICENCE_FIELDS_FRAGMENT = gql`\n fragment LicenceFields on UserLicenceType {\n expiryDate\n issuedDate\n licenceType\n prevLicenceType\n }\n`;\n\nexport const ASSOCIATES_FIELDS_FRAGMENT = gql`\n fragment AssociatesFields on AssociateType {\n email\n resourceId\n resourceType\n licence {\n ...LicenceFields\n }\n }\n ${LICENCE_FIELDS_FRAGMENT}\n`;\n\nexport const TERMS_AGREEMENT_FIELDS_FRAGMENT = gql`\n fragment TermsAgreementFields on TermsAgreementType {\n appBuildNumber\n appId\n appVersion\n brand\n deviceName\n installationId\n manufacturer\n modelName\n osName\n osVersion\n termVersion\n timestamp\n }\n`;\n\nexport const DATETIME_FIELDS_FRAGMENT = gql`\n fragment DateTimeFields on DateTimeType {\n dateStatus\n endDate\n endTime\n startDate\n startTime\n }\n`;\n\nexport const LOCATION_GEO_FIELDS_FRAGMENT = gql`\n fragment LocationGeoFields on LocationGeoType {\n coordinates\n type\n }\n`;\n\nexport const LOCATION_FIELDS_FRAGMENT = gql`\n fragment LocationFields on LocationType {\n city\n country\n fullAddress\n geo {\n ...LocationGeoFields\n }\n latitude\n longitude\n region\n }\n ${LOCATION_GEO_FIELDS_FRAGMENT}\n`;\n\nconst USER_ACTIVITY_FIELDS_FRAGMENT = gql`\n fragment UserActivityFields on UserActivityType {\n favourites {\n events\n partners\n vendors\n }\n going {\n events {\n resourceId\n dateTime {\n ...DateTimeFields\n }\n }\n }\n interested {\n events {\n resourceId\n dateTime {\n ...DateTimeFields\n }\n }\n }\n present {\n events {\n resourceId\n dateTime {\n ...DateTimeFields\n }\n }\n }\n }\n ${DATETIME_FIELDS_FRAGMENT}\n`;\n\nexport const REDEEMED_REWARD_FIELDS_FRAGMENT = gql`\n fragment RedeemedRewardFields on RedeemedRewardType {\n name\n pointsUsed\n redeemedAt\n }\n`;\n\nexport const USER_FIELDS_FRAGMENT = gql`\n fragment UserFields on UserType {\n _id\n active\n associates {\n ...AssociatesFields\n }\n affiliate\n avatar {\n ...ResourceImageFields\n }\n createdAt\n deletedAt\n email\n events\n firstName\n game\n isTester\n lastName\n licences {\n ...LicenceFields\n }\n location {\n ...LocationFields\n }\n partner\n overallPoints\n platform\n preferredRegion\n permissions\n promoCodes\n roles\n redeemedRewards {\n ...RedeemedRewardFields\n }\n school\n termsAgreement {\n ...TermsAgreementFields\n }\n userActivity {\n ...UserActivityFields\n }\n vendor\n updatedAt\n }\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n ${ASSOCIATES_FIELDS_FRAGMENT}\n ${TERMS_AGREEMENT_FIELDS_FRAGMENT}\n ${USER_ACTIVITY_FIELDS_FRAGMENT}\n ${LICENCE_FIELDS_FRAGMENT}\n ${LOCATION_FIELDS_FRAGMENT}\n ${REDEEMED_REWARD_FIELDS_FRAGMENT}\n`;\n\nexport const STALL_TYPE_FIELDS_FRAGMENT = gql`\n fragment StallTypeFields on StallTypeType {\n label\n price\n stallCapacity\n }\n`;\n\nexport const RELATION_DATES_FRAGMENT = gql`\n fragment RelationDates on RelationDateType {\n dateTime {\n dateStatus\n endDate\n endTime\n startDate\n startTime\n stallType {\n ...StallTypeFields\n }\n }\n lastUpdateBy {\n resourceId\n userEmail\n }\n paymentReference\n status\n }\n ${STALL_TYPE_FIELDS_FRAGMENT}\n`;\n\nexport const CONTACT_DETAILS_FIELDS_FRAGMENT = gql`\n fragment ContactDetailsFields on ContactDetailsType {\n email\n landlinePhone\n mobilePhone\n }\n`;\n\nexport const EVENT_LIST_ITEM = gql`\n fragment EventListItemFields on EventListItemType {\n _id\n active\n approvedAt\n claimed\n cover {\n ...ResourceImageFields\n }\n createdAt\n dateTime {\n ...DateTimeFields\n }\n deletedAt\n description\n eventType\n googlePlaceId\n images {\n ...ResourceImageFields\n }\n location {\n ...LocationFields\n }\n logo {\n ...ResourceImageFields\n }\n name\n rainOrShine\n rating\n region\n relations {\n relationId\n relationDates {\n ...RelationDates\n }\n }\n reviewCount\n slug\n updatedAt\n }\n ${DATETIME_FIELDS_FRAGMENT}\n ${LOCATION_FIELDS_FRAGMENT}\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n ${RELATION_DATES_FRAGMENT}\n`;\n\nexport const RELATED_POST_FIELDS_FRAGMENT = gql`\n fragment RelatedPostFields on RelatedPostType {\n postActive\n postId\n postSlug\n postType\n }\n`;\n\nexport const SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT = gql`\n fragment SocialShareResourceFields on SocialShareResourceType {\n qrCode {\n ...ResourceImageFields\n }\n socialImage {\n ...ResourceImageFields\n }\n }\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n`;\n","import { useQuery } from \"@apollo/client\";\n\nimport {\n EventListItemType,\n EventType,\n PartnerType,\n VendorType,\n ResourceByUser,\n SafeUserType,\n} from \"src/types\";\n\nimport {\n GET_USER,\n GET_USER_ACTIVITIES,\n GET_USER_EVENTS,\n GET_USER_PARTNERS,\n GET_USER_RESOURCES,\n GET_USER_VENDORS,\n GET_USERS,\n} from \"../../queries/user\";\n\nexport const useGetUsers = () => {\n const { loading, error, data, refetch } = useQuery<{ users: SafeUserType[] }>(\n GET_USERS,\n {\n fetchPolicy: \"network-only\",\n },\n );\n\n const users = data?.users || [];\n\n return { error, loading, refetch, users };\n};\n\nexport const useGetUser = (_id: string) => {\n const { loading, error, data, refetch } = useQuery<{ user: SafeUserType }>(\n GET_USER,\n {\n fetchPolicy: \"network-only\",\n skip: !_id || _id === \"\",\n variables: { _id },\n },\n );\n\n const user = data?.user;\n\n return { error, loading, refetch, user };\n};\n\nexport const useGetUserEvents = () => {\n const { loading, error, data, refetch } = useQuery<{\n userEvents: EventType[];\n }>(GET_USER_EVENTS, {\n fetchPolicy: \"network-only\",\n });\n\n const userEvents = data?.userEvents || [];\n\n return { error, loading, refetch, userEvents };\n};\n\nexport const useGetUserVendors = () => {\n const { loading, error, data, refetch } = useQuery<{\n userVendors: VendorType[];\n }>(GET_USER_VENDORS, {\n fetchPolicy: \"network-only\",\n });\n\n const userVendors = data?.userVendors || [];\n\n return { error, loading, refetch, userVendors };\n};\n\nexport const useGetUserPartners = () => {\n const { loading, error, data, refetch } = useQuery<{\n userPartners: PartnerType[];\n }>(GET_USER_PARTNERS, {\n fetchPolicy: \"network-only\",\n });\n\n const userPartners = data?.userPartners || [];\n\n return { error, loading, refetch, userPartners };\n};\n\nexport const useGetUserActivities = () => {\n const { loading, error, data, refetch } = useQuery<{\n userActivities: {\n favourites: {\n events: EventListItemType[];\n partners: PartnerType[];\n vendors: VendorType[];\n };\n going: {\n events: EventListItemType[];\n };\n interested: {\n events: EventListItemType[];\n };\n present: {\n events: EventListItemType[];\n };\n };\n }>(GET_USER_ACTIVITIES, {\n fetchPolicy: \"network-only\",\n });\n\n const userActivities = {\n favourites: {\n events: data?.userActivities.favourites.events || [],\n partners: data?.userActivities.favourites.partners || [],\n vendors: data?.userActivities.favourites.vendors || [],\n },\n going: {\n events: data?.userActivities.going.events || [],\n },\n interested: {\n events: data?.userActivities.interested.events || [],\n },\n present: {\n events: data?.userActivities.present.events || [],\n },\n };\n\n return { error, loading, refetch, userActivities };\n};\n\nexport const useGetUserResources = (userId: string) => {\n const { loading, error, data, refetch } = useQuery<{\n userResources: {\n resources: ResourceByUser[];\n };\n }>(GET_USER_RESOURCES, {\n fetchPolicy: \"network-only\",\n skip: !userId || userId === \"\",\n variables: { userId },\n });\n\n const userResources = data?.userResources.resources || [];\n\n return { error, loading, refetch, userResources };\n};\n","import { gql } from \"@apollo/client\";\n\nimport { EVENT } from \"./event\";\nimport { EVENT_LIST_ITEM, USER_FIELDS_FRAGMENT } from \"./global\";\nimport { PARTNER } from \"./partner\";\nimport { VENDOR } from \"./vendor\";\n\nexport const GET_USERS = gql`\n query getUsers {\n users {\n ...UserFields\n }\n }\n ${USER_FIELDS_FRAGMENT}\n`;\n\nexport const GET_USER = gql`\n query getUser($_id: ID!) {\n user(_id: $_id) {\n ...UserFields\n }\n }\n ${USER_FIELDS_FRAGMENT}\n`;\n\nexport const GET_USER_EVENTS = gql`\n query getUserEvents {\n userEvents {\n ...EventFields\n }\n }\n ${EVENT}\n`;\n\nexport const GET_USER_VENDORS = gql`\n query getUserVendors {\n userVendors {\n ...VendorFields\n }\n }\n ${VENDOR}\n`;\n\nexport const GET_USER_PARTNERS = gql`\n query getUserPartners {\n userPartners {\n ...PartnerFields\n }\n }\n ${PARTNER}\n`;\n\nexport const GET_USER_ACTIVITIES = gql`\n query getUserActivities {\n userActivities {\n favourites {\n events {\n ...EventListItemFields\n }\n partners {\n ...PartnerFields\n }\n vendors {\n ...VendorFields\n }\n }\n going {\n events {\n ...EventListItemFields\n }\n }\n interested {\n events {\n ...EventListItemFields\n }\n }\n present {\n events {\n ...EventListItemFields\n }\n }\n }\n }\n ${EVENT_LIST_ITEM}\n ${VENDOR}\n ${PARTNER}\n`;\n\nexport const GET_USER_RESOURCES = gql`\n query getUserResources($userId: ID!) {\n userResources(userId: $userId) {\n resources {\n _id\n logo\n name\n resourceType\n }\n }\n }\n`;\n","import { gql } from \"@apollo/client\";\n\nimport {\n CONTACT_DETAILS_FIELDS_FRAGMENT,\n DATETIME_FIELDS_FRAGMENT,\n OWNER_FIELDS_FRAGMENT,\n ASSOCIATES_FIELDS_FRAGMENT,\n POSTER_USAGE_FIELDS_FRAGMENT,\n RELATION_DATES_FRAGMENT,\n RESOURCE_IMAGE_FIELDS_FRAGMENT,\n SOCIAL_MEDIA_FIELDS_FRAGMENT,\n STALL_TYPE_FIELDS_FRAGMENT,\n TERMS_AGREEMENT_FIELDS_FRAGMENT,\n LOCATION_FIELDS_FRAGMENT,\n EVENT_LIST_ITEM,\n RELATED_POST_FIELDS_FRAGMENT,\n SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT,\n} from \"./global\";\n\nexport const EVENT_INFO = gql`\n fragment EventInfoFields on EventInfoType {\n _id\n applicationDeadlineHours\n dateTime {\n dateStatus\n endDate\n endTime\n stallTypes {\n ...StallTypeFields\n }\n startDate\n startTime\n }\n eventId\n packInTime\n paymentDueHours\n paymentInfo {\n accountHolderName\n accountNumber\n link\n paymentMethod\n }\n refundPolicy {\n category\n label\n value\n }\n requirements {\n category\n label\n value\n }\n }\n ${STALL_TYPE_FIELDS_FRAGMENT}\n`;\n\nexport const EVENT = gql`\n fragment EventFields on EventType {\n _id\n active\n associates {\n ...AssociatesFields\n }\n adIds\n approvedAt\n cover {\n ...ResourceImageFields\n }\n claimed\n createdAt\n contactDetails {\n ...ContactDetailsFields\n }\n dateTime {\n ...DateTimeFields\n }\n description\n deletedAt\n googlePlaceId\n images {\n ...ResourceImageFields\n }\n eventType\n location {\n ...LocationFields\n }\n logo {\n ...ResourceImageFields\n }\n eventInfoId\n name\n nzbn\n owner {\n ...OwnerFields\n }\n promoCodes\n provider\n posterUsage {\n ...PosterUsageFields\n }\n region\n relations {\n relationId\n relationDates {\n ...RelationDates\n }\n }\n rating\n reviewCount\n rainOrShine\n relatedPost {\n ...RelatedPostFields\n }\n socialMedia {\n ...SocialMediaFields\n }\n sharePublic {\n ...SocialShareResourceFields\n }\n shareRelation {\n ...SocialShareResourceFields\n }\n slug\n tags\n termsAgreement {\n ...TermsAgreementFields\n }\n updatedAt\n }\n ${DATETIME_FIELDS_FRAGMENT}\n ${LOCATION_FIELDS_FRAGMENT}\n ${OWNER_FIELDS_FRAGMENT}\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n ${SOCIAL_MEDIA_FIELDS_FRAGMENT}\n ${POSTER_USAGE_FIELDS_FRAGMENT}\n ${ASSOCIATES_FIELDS_FRAGMENT}\n ${CONTACT_DETAILS_FIELDS_FRAGMENT}\n ${TERMS_AGREEMENT_FIELDS_FRAGMENT}\n ${RELATION_DATES_FRAGMENT}\n ${RELATED_POST_FIELDS_FRAGMENT}\n ${SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT}\n`;\n\nexport const GET_EVENTS = gql`\n query getEvents($dateStatus: EventDateStatusEnumType) {\n events(dateStatus: $dateStatus) {\n ...EventListItemFields\n }\n }\n ${EVENT_LIST_ITEM}\n`;\n\nexport const GET_EVENT = gql`\n query getEvent($_id: ID!) {\n event(_id: $_id) {\n ...EventFields\n }\n }\n ${EVENT}\n`;\n\nexport const GET_EVENT_BY_PLACE_ID = gql`\n query getEventByPlaceId($googlePlaceId: String!) {\n eventByPlaceId(googlePlaceId: $googlePlaceId) {\n ...EventListItemFields\n }\n }\n ${EVENT_LIST_ITEM}\n`;\n\nexport const GET_EVENTS_BY_REGION = gql`\n query getEventsByRegion(\n $region: String!\n $options: ResourcesByRegionOptions\n $dateStatus: EventDateStatusEnumType\n ) {\n eventsByRegion(\n region: $region\n options: $options\n dateStatus: $dateStatus\n ) {\n ...EventListItemFields\n }\n }\n ${EVENT_LIST_ITEM}\n`;\n\nexport const SEARCH_EVENTS = gql`\n query searchEvents(\n $region: String!\n $search: String\n $tags: [String]\n $dateStatus: EventDateStatusEnumType\n ) {\n eventsSearch(\n region: $region\n search: $search\n tags: $tags\n dateStatus: $dateStatus\n ) {\n ...EventListItemFields\n }\n }\n ${EVENT_LIST_ITEM}\n`;\n\nexport const GET_EVENTS_NEAR_ME = gql`\n query getEventsNearMe(\n $latitude: Float!\n $longitude: Float!\n $radius: Int\n $dateStatus: EventDateStatusEnumType\n ) {\n eventsNearMe(\n latitude: $latitude\n longitude: $longitude\n radius: $radius\n dateStatus: $dateStatus\n ) {\n ...EventListItemFields\n }\n }\n ${EVENT_LIST_ITEM}\n`;\n\nexport const GET_EVENT_INFO = gql`\n query getEventInfo($eventId: ID!) {\n eventInfo(eventId: $eventId) {\n ...EventInfoFields\n }\n }\n ${EVENT_INFO}\n`;\n","import { gql } from \"@apollo/client\";\n\nimport {\n ASSOCIATES_FIELDS_FRAGMENT,\n CONTACT_DETAILS_FIELDS_FRAGMENT,\n LOCATION_FIELDS_FRAGMENT,\n OWNER_FIELDS_FRAGMENT,\n POSTER_USAGE_FIELDS_FRAGMENT,\n RELATED_POST_FIELDS_FRAGMENT,\n RESOURCE_IMAGE_FIELDS_FRAGMENT,\n SOCIAL_MEDIA_FIELDS_FRAGMENT,\n SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT,\n TERMS_AGREEMENT_FIELDS_FRAGMENT,\n} from \"./global\";\n\nexport const PARTNER = gql`\n fragment PartnerFields on PartnerType {\n _id\n active\n associates {\n ...AssociatesFields\n }\n adIds\n approvedAt\n cover {\n ...ResourceImageFields\n }\n createdAt\n contactDetails {\n ...ContactDetailsFields\n }\n description\n deletedAt\n images {\n ...ResourceImageFields\n }\n location {\n ...LocationFields\n }\n logo {\n ...ResourceImageFields\n }\n name\n nzbn\n owner {\n ...OwnerFields\n }\n partnerType\n posterUsage {\n ...PosterUsageFields\n }\n rating\n region\n reviewCount\n relatedPost {\n ...RelatedPostFields\n }\n socialMedia {\n ...SocialMediaFields\n }\n slug\n sharePublic {\n ...SocialShareResourceFields\n }\n termsAgreement {\n ...TermsAgreementFields\n }\n updatedAt\n }\n ${TERMS_AGREEMENT_FIELDS_FRAGMENT}\n ${LOCATION_FIELDS_FRAGMENT}\n ${OWNER_FIELDS_FRAGMENT}\n ${ASSOCIATES_FIELDS_FRAGMENT}\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n ${POSTER_USAGE_FIELDS_FRAGMENT}\n ${SOCIAL_MEDIA_FIELDS_FRAGMENT}\n ${CONTACT_DETAILS_FIELDS_FRAGMENT}\n ${RELATED_POST_FIELDS_FRAGMENT}\n ${SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT}\n`;\n\nexport const GET_PARTNERS = gql`\n query getPartners {\n partners {\n ...PartnerFields\n }\n }\n ${PARTNER}\n`;\n\nexport const GET_PARTNER = gql`\n query getPartner($_id: ID!) {\n partner(_id: $_id) {\n ...PartnerFields\n }\n }\n ${PARTNER}\n`;\n\nexport const GET_PARTNERS_BY_REGION = gql`\n query getPartnersByRegion(\n $region: String!\n $options: ResourcesByRegionOptions\n ) {\n partnersByRegion(region: $region, options: $options) {\n ...PartnerFields\n }\n }\n ${PARTNER}\n`;\n\nexport const SEARCH_PARTNERS = gql`\n query searchPartners($search: String!, $region: String!) {\n partnersSearch(search: $search, region: $region) {\n ...PartnerFields\n }\n }\n ${PARTNER}\n`;\n","import { gql } from \"@apollo/client\";\n\nimport {\n OWNER_FIELDS_FRAGMENT,\n CATEGORY_FIELDS_FRAGMENT,\n RESOURCE_IMAGE_FIELDS_FRAGMENT,\n SOCIAL_MEDIA_FIELDS_FRAGMENT,\n POSTER_USAGE_FIELDS_FRAGMENT,\n CONTACT_DETAILS_FIELDS_FRAGMENT,\n TERMS_AGREEMENT_FIELDS_FRAGMENT,\n RELATION_DATES_FRAGMENT,\n ASSOCIATES_FIELDS_FRAGMENT,\n DATETIME_FIELDS_FRAGMENT,\n LOCATION_FIELDS_FRAGMENT,\n RELATED_POST_FIELDS_FRAGMENT,\n SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT,\n} from \"./global\";\n\nconst VENDOR_DATETIME_FIELDS_FRAGMENT = gql`\n fragment VendorDateTimeFields on VendorDateTimeType {\n dateStatus\n endDate\n endTime\n startDate\n startTime\n }\n`;\n\nconst VENDOR_PRODUCT_LIST_FIELDS_FRAGMENT = gql`\n fragment VendorProductListFields on VendorProductListType {\n description\n name\n price\n priceUnit\n productGroups\n }\n`;\n\nexport const VENDOR = gql`\n fragment VendorFields on VendorType {\n _id\n active\n associates {\n ...AssociatesFields\n }\n adIds\n approvedAt\n availability {\n corporate\n private\n school\n }\n vendorInfoId\n categories {\n ...CategoryFields\n }\n calendar {\n active\n calendarData {\n dateTime {\n ...VendorDateTimeFields\n }\n description\n location {\n ...LocationFields\n }\n }\n }\n contactDetails {\n ...ContactDetailsFields\n }\n cover {\n ...ResourceImageFields\n }\n createdAt\n claimed\n description\n deletedAt\n foodTruck\n images {\n ...ResourceImageFields\n }\n logo {\n ...ResourceImageFields\n }\n name\n owner {\n ...OwnerFields\n }\n products {\n active\n productsList {\n ...VendorProductListFields\n }\n }\n promoCodes\n posterUsage {\n ...PosterUsageFields\n }\n rating\n region\n reviewCount\n relatedPost {\n ...RelatedPostFields\n }\n relations {\n relationId\n relationDates {\n ...RelationDates\n }\n }\n slug\n socialMedia {\n ...SocialMediaFields\n }\n sharePublic {\n ...SocialShareResourceFields\n }\n shareRelation {\n ...SocialShareResourceFields\n }\n termsAgreement {\n ...TermsAgreementFields\n }\n updatedAt\n vendorType\n unregisteredVendorId\n }\n ${CATEGORY_FIELDS_FRAGMENT}\n ${VENDOR_DATETIME_FIELDS_FRAGMENT}\n ${LOCATION_FIELDS_FRAGMENT}\n ${OWNER_FIELDS_FRAGMENT}\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n ${SOCIAL_MEDIA_FIELDS_FRAGMENT}\n ${POSTER_USAGE_FIELDS_FRAGMENT}\n ${ASSOCIATES_FIELDS_FRAGMENT}\n ${VENDOR_PRODUCT_LIST_FIELDS_FRAGMENT}\n ${CONTACT_DETAILS_FIELDS_FRAGMENT}\n ${TERMS_AGREEMENT_FIELDS_FRAGMENT}\n ${RELATION_DATES_FRAGMENT}\n ${RELATED_POST_FIELDS_FRAGMENT}\n ${SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT}\n`;\n\nconst VENDOR_ATTRIBUTES_FRAGMENT = gql`\n fragment VendorAttributesFields on VendorAttributesType {\n details\n isRequired\n }\n`;\n\nexport const VENDOR_INFO = gql`\n fragment VendorInfoFields on VendorInfoType {\n _id\n compliance {\n foodBeverageLicense\n liabilityInsurance\n }\n documents {\n ...ResourceImageFields\n }\n requirements {\n electricity {\n ...VendorAttributesFields\n }\n gazebo {\n ...VendorAttributesFields\n }\n table {\n ...VendorAttributesFields\n }\n }\n product {\n foodFlavors\n packaging\n priceRange {\n max\n min\n }\n producedIn\n }\n stallInfo {\n size {\n depth\n width\n }\n }\n vendorId\n }\n ${VENDOR_ATTRIBUTES_FRAGMENT}\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n`;\n\nconst UNREGISTERED_VENDOR_INVITATION_FRAGMENT = gql`\n fragment UnregisteredVendorInvitationFields on UnregisteredVendorInvitationType {\n dateTime {\n ...DateTimeFields\n }\n inviterId\n }\n ${DATETIME_FIELDS_FRAGMENT}\n`;\n\nexport const UNREGISTERED_VENDOR = gql`\n fragment UnregisteredVendorFields on UnregisteredVendorType {\n _id\n active\n categoryIds\n claimed\n createdAt\n deletedAt\n email\n invitations {\n ...UnregisteredVendorInvitationFields\n }\n name\n region\n updatedAt\n }\n ${UNREGISTERED_VENDOR_INVITATION_FRAGMENT}\n`;\n\nexport const GET_VENDORS = gql`\n query getVendors {\n vendors {\n ...VendorFields\n }\n }\n ${VENDOR}\n`;\n\nexport const GET_VENDOR = gql`\n query getVendor($_id: ID!) {\n vendor(_id: $_id) {\n ...VendorFields\n }\n }\n ${VENDOR}\n`;\n\nexport const GET_VENDORS_BY_REGION = gql`\n query getVendorsByRegion(\n $region: String!\n $options: ResourcesByRegionOptions\n ) {\n vendorsByRegion(region: $region, options: $options) {\n ...VendorFields\n }\n }\n ${VENDOR}\n`;\n\nexport const SEARCH_VENDORS = gql`\n query searchVendors($search: String!, $region: String!) {\n vendorSearch(search: $search, region: $region) {\n ...VendorFields\n }\n }\n ${VENDOR}\n`;\n\nexport const GET_VENDOR_INFO = gql`\n query getVendorInfo($vendorId: ID!) {\n vendorInfo(vendorId: $vendorId) {\n ...VendorInfoFields\n }\n }\n ${VENDOR_INFO}\n`;\n\nexport const GET_UNREGISTERED_VENDORS = gql`\n query getUnregisteredVendors {\n unregisteredVendors {\n ...UnregisteredVendorFields\n }\n }\n ${UNREGISTERED_VENDOR}\n`;\n\nexport const GET_UNREGISTERED_VENDORS_BY_INVITER_ID = gql`\n query getUnregisteredVendorsByInviterId($inviterId: ID!) {\n unregisteredVendorsByInviterId(inviterId: $inviterId) {\n ...UnregisteredVendorFields\n }\n }\n ${UNREGISTERED_VENDOR}\n`;\n\nexport const GET_UNREGISTERED_VENDOR = gql`\n query getUnregisteredVendor($_id: ID!) {\n unregisteredVendor(_id: $_id) {\n ...UnregisteredVendorFields\n }\n }\n ${UNREGISTERED_VENDOR}\n`;\n","export const SAVED_PASSWORD_KEY = \"savedPassword\";\nexport const SAVED_EMAIL_KEY = \"savedEmail\";\nexport const SAVED_TOKEN_KEY = \"savedToken\";\nexport const SAVED_REFRESH_TOKEN_KEY = \"savedRefreshToken\";\nexport const USER_STORAGE_KEY = \"authUser\";\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":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCO,IAAM,oBAAoB;;;ACa1B,SAAS,oBAAiC;AAC/C,MAAI,WAAyC;AAC7C,MAAI,gBAA8C;AAClD,MAAI,gBAAsC;AAE1C,SAAO;AAAA,IACL,mBAAmB,YAAY;AAC7B,UAAI,eAAe;AACjB,cAAM,cAAc;AAAA,MACtB,OAAO;AACL,gBAAQ,KAAK,uCAAkC;AAAA,MACjD;AAAA,IACF;AAAA,IACA,SAAwB;AACtB,UAAI,kBAAkB,KAAM,QAAO;AACnC,UAAI,aAAa,MAAM;AACrB,gBAAQ,KAAK,iCAA4B;AACzC,eAAO,QAAQ,QAAQ;AAAA,MACzB;AACA,sBAAgB,SAAS,EAAE,QAAQ,MAAM;AACvC,wBAAgB;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,UAAU,IAAyB;AACjC,iBAAW;AAAA,IACb;AAAA,IACA,eAAe,IAAyB;AACtC,sBAAgB;AAAA,IAClB;AAAA,EACF;AACF;;;AC1CO,IAAM,oBAAoB,CAAC,YAAY,OAAO,UAAU;AAcxD,IAAM,oBAAmD;AAAA,EAC9D,4BAA0B,GAAG;AAAA,EAC7B,sCAA+B,GAAG;AAAA,EAClC,wCAAgC,GAAG;AAAA,EACnC,8BAA2B,GAAG;AAAA,EAC9B,sCAA+B,GAAG;AAAA,EAClC,0CAAiC,GAAG;AAAA,EACpC,wCAAgC,GAAG;AAAA,EACnC,8CAAmC,GAAG;AAAA,EACtC,wCAAgC,GAAG;AACrC;;;ACbO,SAAS,uBACd,cACsC;AACtC,SACE,gDACA;AAEJ;AAEO,SAAS,sBACd,aACoC;AACpC,SACE,iEACA;AAEJ;AAEO,IAAM,qBAAqB,CAChC,UACA,gBAEA,UAAU,UAAU,KAAK,CAAC,YAAY,QAAQ,gBAAgB,WAAW,KACzE;AAEK,IAAM,aAAa,CACxB,UACA,gBACqB;AACrB,QAAM,gBACJ,UAAU,UAAU;AAAA,IAAK,CAAC,YACxB,QAAQ,aAAa,SAAS,WAAW;AAAA,EAC3C,KAAK;AAEP,QAAM,mBACJ,UAAU,YAAY;AAAA,IAAK,CAAC,cAC1B,UAAU,SAAS,aAAa,SAAS,WAAW;AAAA,EACtD,KAAK;AAEP,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAGO,IAAM,iBAA0D;AAAA;AAAA,EAErE,YAAY,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,EAAE;AAAA,EAC/C,cAAc,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,EAAE;AAAA,EACjD,UAAU,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,EAAE;AAAA,EAC7C,QAAQ,EAAE,KAAK,IAAI,UAAU,IAAI,UAAU,EAAE;AAAA,EAC7C,SAAS,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,EAAE;AAAA,EAC5C,cAAc,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,EAAE;AAAA,EACjD,eAAe,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,EAAE;AAAA,EAClD,YAAY,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,EAAE;AACjD;AAKO,SAAS,sBAAsB,UAAqC;AACzE,QAAM,aAAa,UAAU,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;AAE7D,WAAS,QAAQ,MAAsC;AACrD,UAAM,SAAuB;AAAA,MAC3B,UAAU;AAAA;AAAA,MAEV,KAAK;AAAA,MACL,UAAU;AAAA,IACZ;AAEA,eAAW,QAAQ,mBAAmB;AACpC,UAAI,WAAW,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,GAAG;AAC3D,eAAO,IAAI,IAAI;AACf;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO,2BAA8B;AAAA,IACrC,SAAS,+BAAgC;AAAA,IACzC,QAAQ,6BAA+B;AAAA,EACzC;AACF;;;ACjGO,IAAM,cAAc;AAAA,EACzB;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,IAAM,sBAAkC;;;AC5D/C,IAAM,oBAA2C;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,IAAM,mBAAgE;AAAA,EAC3E,gCAAyB,GAAG,CAAC,GAAG;AAAA,EAChC,oBAAmB,GAAG;AAAA,EACtB,0BAAsB,GAAG,CAAC,oBAAoB;AAAA,EAC9C,oBAAmB,GAAG,CAAC,mBAAmB,mBAAmB;AAAA,EAC7D,sBAAoB,GAAG,CAAC,oBAAoB,oBAAoB;AAAA,EAChE,wBAAqB,GAAG,CAAC,qBAAqB,qBAAqB;AAAA,EACnE,sBAAoB,GAAG,CAAC,oBAAoB,oBAAoB;AAAA,EAChE,4BAAuB,GAAG,CAAC,uBAAuB,uBAAuB;AAC3E;;;AChDA,SAAS,eACP,OACgB;AAChB,MAAI,CAAC,OAAO,OAAQ,QAAO,CAAC;AAC5B,SAAO;AACT;AAKO,SAAS,uBACd,OACc;AACd,QAAM,OAAO,oBAAI,IAAgB;AACjC,QAAM,SAAuB,CAAC;AAE9B,aAAW,QAAQ,eAAe,KAAK,GAAG;AACxC,UAAM,QAAQ,iBAAiB,IAAI,KAAK,CAAC;AACzC,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,IAAI,IAAI,GAAG;AACnB,aAAK,IAAI,IAAI;AACb,eAAO,KAAK,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,uBACd,aACA,YACS;AACT,MAAI,CAAC,aAAa,OAAQ,QAAO;AACjC,QAAM,MAAM,IAAI,IAAI,WAAW;AAC/B,MAAI,IAAI,IAAI,mBAAmB,EAAG,QAAO;AACzC,SAAO,IAAI,IAAI,UAAU;AAC3B;AAEO,SAAS,cACd,OACA,YACS;AACT,SAAO,uBAAuB,uBAAuB,KAAK,GAAG,UAAU;AACzE;AAEO,SAAS,iBACd,OACA,aACS;AACT,MAAI,YAAY,WAAW,EAAG,QAAO;AACrC,QAAM,UAAU,uBAAuB,KAAK;AAC5C,SAAO,YAAY,KAAK,CAAC,MAAM,uBAAuB,SAAS,CAAC,CAAC;AACnE;AAEO,SAAS,kBACd,OACA,aACS;AACT,MAAI,YAAY,WAAW,EAAG,QAAO;AACrC,QAAM,UAAU,uBAAuB,KAAK;AAC5C,SAAO,YAAY,MAAM,CAAC,MAAM,uBAAuB,SAAS,CAAC,CAAC;AACpE;AAEO,SAAS,QACd,OACA,MACS;AACT,SAAO,eAAe,KAAK,EAAE,SAAS,IAAI;AAC5C;AAEO,SAAS,WACd,OACA,YACS;AACT,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAM,MAAM,IAAI,IAAI,eAAe,KAAK,CAAC;AACzC,SAAO,WAAW,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;AAC1C;;;ACxFA,mBAA0D;;;ACA1D,IAAAA,iBAA4B;;;ACA5B,IAAAC,iBAAoB;;;ACApB,oBAAoB;AAEb,IAAM,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAOrC,IAAM,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAOrC,IAAM,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQvC,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO9B,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAejC,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAShC,IAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAStC,uBAAuB;AAAA;AAGpB,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBxC,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUjC,IAAM,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAOrC,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYpC,4BAA4B;AAAA;AAGhC,IAAM,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgClC,wBAAwB;AAAA;AAGrB,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQxC,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA6ChC,8BAA8B;AAAA,IAC9B,0BAA0B;AAAA,IAC1B,+BAA+B;AAAA,IAC/B,6BAA6B;AAAA,IAC7B,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,+BAA+B;AAAA;AAG5B,IAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQnC,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAmBnC,0BAA0B;AAAA;AAGvB,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQxC,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAwC3B,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,8BAA8B;AAAA,IAC9B,uBAAuB;AAAA;AAGpB,IAAM,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASrC,IAAM,wCAAwC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASjD,8BAA8B;AAAA;;;ADvT3B,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAW7B,oBAAoB;AAAA;AAGjB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAW1B,oBAAoB;AAAA;AAGjB,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQxB,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS/B,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQhC,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQxC,IAAM,uCAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADrC7C,IAAM,YAAY,MAAM;AAC7B,QAAM,CAAC,QAAQ,EAAE,SAAS,MAAM,CAAC,QAAI,4BAAY,eAAe;AAChE,SAAO,EAAE,OAAO,SAAS,OAAO;AAClC;;;AG/BA,IAAAC,iBAAyB;;;ACAzB,IAAAC,iBAAoB;;;ACApB,IAAAC,iBAAoB;AAmBb,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkCtB,0BAA0B;AAAA;AAGvB,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAyEjB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,8BAA8B;AAAA,IAC9B,4BAA4B;AAAA,IAC5B,4BAA4B;AAAA,IAC5B,0BAA0B;AAAA,IAC1B,+BAA+B;AAAA,IAC/B,+BAA+B;AAAA,IAC/B,uBAAuB;AAAA,IACvB,4BAA4B;AAAA,IAC5B,qCAAqC;AAAA;AAGlC,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMtB,eAAe;AAAA;AAGZ,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMrB,KAAK;AAAA;AAGF,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMjC,eAAe;AAAA;AAGZ,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAchC,eAAe;AAAA;AAGZ,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBzB,eAAe;AAAA;AAGZ,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgB9B,eAAe;AAAA;AAGZ,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM1B,UAAU;AAAA;;;ACvOd,IAAAC,iBAAoB;AAeb,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsDnB,+BAA+B;AAAA,IAC/B,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,0BAA0B;AAAA,IAC1B,8BAA8B;AAAA,IAC9B,4BAA4B;AAAA,IAC5B,4BAA4B;AAAA,IAC5B,+BAA+B;AAAA,IAC/B,4BAA4B;AAAA,IAC5B,qCAAqC;AAAA;AAGlC,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMxB,OAAO;AAAA;AAGJ,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMvB,OAAO;AAAA;AAGJ,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASlC,OAAO;AAAA;AAGJ,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM3B,OAAO;AAAA;;;ACrHX,IAAAC,iBAAoB;AAkBpB,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUxC,IAAM,sCAAsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUrC,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA0FlB,wBAAwB;AAAA,IACxB,+BAA+B;AAAA,IAC/B,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,8BAA8B;AAAA,IAC9B,4BAA4B;AAAA,IAC5B,4BAA4B;AAAA,IAC5B,0BAA0B;AAAA,IAC1B,mCAAmC;AAAA,IACnC,+BAA+B;AAAA,IAC/B,+BAA+B;AAAA,IAC/B,uBAAuB;AAAA,IACvB,4BAA4B;AAAA,IAC5B,qCAAqC;AAAA;AAGzC,IAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAO5B,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAsCvB,0BAA0B;AAAA,IAC1B,8BAA8B;AAAA;AAGlC,IAAM,0CAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO5C,wBAAwB;AAAA;AAGrB,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgB/B,uCAAuC;AAAA;AAGpC,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMvB,MAAM;AAAA;AAGH,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMtB,MAAM;AAAA;AAGH,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASjC,MAAM;AAAA;AAGH,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM1B,MAAM;AAAA;AAGH,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM3B,WAAW;AAAA;AAGR,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMpC,mBAAmB;AAAA;AAGhB,IAAM,yCAAyC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMlD,mBAAmB;AAAA;AAGhB,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMnC,mBAAmB;AAAA;;;AH/RhB,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMrB,oBAAoB;AAAA;AAGjB,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMpB,oBAAoB;AAAA;AAGjB,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM3B,KAAK;AAAA;AAGF,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM5B,MAAM;AAAA;AAGH,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM7B,OAAO;AAAA;AAGJ,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA+B/B,eAAe;AAAA,IACf,MAAM;AAAA,IACN,OAAO;AAAA;AAGJ,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADtD3B,IAAM,aAAa,CAAC,QAAgB;AACzC,QAAM,EAAE,SAAS,OAAO,MAAM,QAAQ,QAAI;AAAA,IACxC;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,MAAM,CAAC,OAAO,QAAQ;AAAA,MACtB,WAAW,EAAE,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,OAAO,MAAM;AAEnB,SAAO,EAAE,OAAO,SAAS,SAAS,KAAK;AACzC;;;AK3CO,IAAM,mBAAmB;;;ATgCzB,SAAS,YAAY,UAAkD;AAC5E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,2BAA2B,MAAM;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,UAAU,WAAW,QAAI,uBAA8B,IAAI;AAClE,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,IAAI;AAE/C,QAAM,aAAS,sBAAQ,MAAM,UAAU,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC;AACjE,QAAM,EAAE,QAAQ,IAAI,WAAW,MAAM;AACrC,QAAM,EAAE,QAAQ,QAAQ,IAAI,UAAU;AAEtC,QAAM,wBAAoB;AAAA,IACxB,OAAO,SAA8B;AACnC,kBAAY,IAAI;AAChB,UAAI,MAAM;AACR,cAAM,QAAQ,QAAQ,kBAAkB,KAAK,UAAU,IAAI,CAAC;AAAA,MAC9D,OAAO;AACL,cAAM,QAAQ,WAAW,gBAAgB;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,wBAAoB,0BAAY,YAAY;AAChD,QAAI,CAAC,SAAU;AACf,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ;AAC7B,UAAI,CAAC,OAAQ;AACb,YAAM,EAAE,KAAK,IAAI;AACjB,UAAI,MAAM,KAAM,OAAM,kBAAkB,KAAK,IAAI;AAAA,IACnD,SAAS,OAAgB;AACvB,gBAAU,OAAO,EAAE,QAAQ,cAAc,CAAC;AAC1C,cAAQ;AAAA,QACN;AAAA,QACA,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,mBAAmB,SAAS,OAAO,CAAC;AAElD,QAAM,eAAW;AAAA,IACf,CAAC,eAAuB;AACtB,YAAM,aACJ,UAAU,UAAU,IAAI,CAAC,YAAY,QAAQ,WAAW,KAAK,CAAC;AAChE,YAAM,oBACJ,UAAU,YAAY;AAAA,QACpB,CAAC,cAAc,UAAU,QAAQ;AAAA,MACnC,KAAK,CAAC;AAIR,UAAI,eAAe,IAAI;AACrB,eAAO,sBAAsB,UAAU;AAAA,MACzC;AAEA,YAAM,gBAAgB;AAAA,QACpB,UAAU,UAAU;AAAA,QACpB,UAAU,WAAW;AAAA,QACrB,GAAI,UAAU,UAAU,CAAC;AAAA,MAC3B,EAAE,OAAO,CAAC,OAAqB,OAAO,IAAI;AAE1C,aAAO,cAAc,SAAS,UAAU,IACpC,sBAAsB,UAAU,IAChC,sBAAsB,iBAAiB;AAAA,IAC7C;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,4BAAwB;AAAA,IAC5B,CACE,WACA,YACA,iBACW;AACX,UAAI,CAAC,uBAAuB,YAAY,GAAG;AACzC,eAAO;AAAA,MACT;AAEA,YAAM,eAAe,SAAS,UAAU,EAAE,YAAY;AAEtD,UAAI,aAAa,SAAU,QAAO,eAAe,SAAS,EAAE;AAC5D,UAAI,aAAa,IAAK,QAAO,eAAe,SAAS,EAAE;AACvD,UAAI,aAAa,SAAU,QAAO,eAAe,SAAS,EAAE;AAE5D,aAAO;AAAA,IACT;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,uBAAmB;AAAA,IACvB,MAAM,WAAW,UAAU,QAAQ;AAAA,IACnC,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,wBAAoB;AAAA,IACxB,MAAM,WAAW,UAAU,SAAS;AAAA,IACpC,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,sBAAkB;AAAA,IACtB,MAAM,WAAW,UAAU,OAAO;AAAA,IAClC,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,qBAAiB;AAAA,IACrB,CAAC,gBAAiC,mBAAmB,UAAU,WAAW;AAAA,IAC1E,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,kBAAc,sBAAQ,MAAM;AAChC,QAAI,UAAU,eAAe,MAAM;AACjC,aAAO,SAAS;AAAA,IAClB;AACA,WAAO,uBAAuB,UAAU,KAAK;AAAA,EAC/C,GAAG,CAAC,UAAU,aAAa,UAAU,KAAK,CAAC;AAE3C,QAAM,sBAAkB;AAAA,IACtB,CAAC,eAA2B,uBAAuB,aAAa,UAAU;AAAA,IAC1E,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,gBAAY;AAAA,IAChB,CAAC,SAAuB,QAAY,UAAU,OAAO,IAAI;AAAA,IACzD,CAAC,UAAU,KAAK;AAAA,EAClB;AAEA,QAAM,cAAU;AAAA,IACd,MACE,QAAY,UAAU,0BAAyB,KAC/C,uBAAuB,aAAa,iBAAiB,KACrD,uBAAuB,aAAa,GAAG;AAAA,IACzC,CAAC,UAAU,OAAO,WAAW;AAAA,EAC/B;AAEA,QAAM,mBAAe;AAAA,IACnB,MACE,QAAY,UAAU,sCAA+B,KACrD,UAAU,UAAU;AAAA,IACtB,CAAC,UAAU,OAAO,UAAU,KAAK;AAAA,EACnC;AAEA,QAAM,kBAAc;AAAA,IAClB,MACE,QAAY,UAAU,kCAA6B,KACnD,UAAU,cAAc,QACxB,UAAU,cAAc;AAAA,IAC1B,CAAC,UAAU,OAAO,UAAU,SAAS;AAAA,EACvC;AAEA,QAAM,eAAW;AAAA,IACf,MACE,QAAY,UAAU,4BAA0B,KAChD,UAAU,WAAW,QACrB,UAAU,WAAW;AAAA,IACvB,CAAC,UAAU,OAAO,UAAU,MAAM;AAAA,EACpC;AAIA,8BAAU,MAAM;AACd,UAAM,WAAW,YAAY;AAC3B,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ,QAAQ,gBAAgB;AACvD,cAAM,kBAAkB,WAAW,KAAK,MAAM,QAAQ,IAAI,IAAI;AAAA,MAChE,SAAS,OAAgB;AACvB,kBAAU,OAAO,EAAE,QAAQ,sBAAsB,CAAC;AAClD,gBAAQ,MAAM,qCAAqC,KAAK;AAAA,MAC1D,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,SAAK,SAAS;AAAA,EAChB,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAmB;AAAA,IACvB,OAAO,WAAyB;AAC9B,UAAI;AACF,YAAI,yBAAyB,MAAM,GAAG;AACpC,cAAI;AACF,kBAAM,SAAS,MAAM,OAAO;AAC5B,kBAAM,UAAU,QAAQ,MAAM,QAAQ;AACtC,gBAAI,SAAS;AACX,oCAAsB,OAAO;AAAA,YAC/B;AAAA,UACF,SAAS,KAAc;AACrB,sBAAU,KAAK,EAAE,QAAQ,SAAS,CAAC;AACnC,oBAAQ,KAAK,oCAAoC,GAAG;AAAA,UACtD;AAAA,QACF;AAAA,MACF,UAAE;AACA,cAAM,YAAY,MAAM;AACxB,oBAAY,IAAI;AAChB,cAAM,QAAQ,WAAW,gBAAgB;AAAA,MAC3C;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,2BAAuB;AAAA,IAC3B,MAAM,iBAAiB,QAAQ;AAAA,IAC/B,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,0BAAsB,0BAAY,YAAY;AAClD,UAAM,aAAa,YAAY;AAC/B,QAAI,CAAC,WAAY;AACjB,UAAM,iBAAiB,SAAS;AAChC,2BAAuB;AAAA,EACzB,GAAG,CAAC,UAAU,kBAAkB,oBAAoB,CAAC;AAErD,8BAAU,MAAM;AACd,gBAAY,UAAU,MAAM,oBAAoB,CAAC;AACjD,gBAAY,eAAe,MAAM,kBAAkB,CAAC;AAAA,EACtD,GAAG,CAAC,aAAa,qBAAqB,iBAAiB,CAAC;AAExD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,WAAW;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;;;AUjRA,IAAAC,gBAAiE;AAaxD;AATT,IAAM,kBAAc,6BAA6C,MAAS;AAKnE,IAAM,eAGR,CAAC,EAAE,UAAU,MAAM,MAAM;AAC5B,SAAO,4CAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACvD;AAEO,IAAM,cAAc,MAAyB;AAClD,QAAM,cAAU,0BAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,SAAO;AACT;","names":["import_client","import_client","import_client","import_client","import_client","import_client","import_client","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../../src/auth/index.ts","../../src/auth/createAuthManager.ts","../../src/types/subscription.ts","../../src/auth/licenceUtils.ts","../../src/auth/permissions/permissions.ts","../../src/auth/permissions/rolePermissions.ts","../../src/auth/permissions/helpers.ts","../../src/auth/permissions/adminAppAccess.ts","../../src/auth/useAuthCore.ts","../../src/graphql/hooks/auth.ts","../../src/graphql/mutations/auth.ts","../../src/graphql/queries/global.ts","../../src/graphql/hooks/user/hooksQuery.ts","../../src/graphql/queries/user.ts","../../src/graphql/queries/event.ts","../../src/graphql/queries/partner.ts","../../src/graphql/queries/vendor.ts","../../src/storage/index.ts","../../src/auth/UserProvider.tsx"],"sourcesContent":["/**\n * Client entry for shared auth.\n *\n * `\"use client\"` is required so Next.js treats this bundled module as a Client\n * Component boundary (`createContext` / hooks). Expo/Metro ignores the directive.\n */\n\"use client\";\n\nexport { createAuthManager } from \"./createAuthManager\";\nexport type { AuthManager } from \"./createAuthManager\";\nexport {\n DEFAULT_LIMITS,\n getLicenceFlagsByRole,\n hasLicence,\n hasUserLicenceType,\n isLicencedResourceType,\n isProfileBadgeLicence,\n} from \"./licenceUtils\";\nexport {\n canAccessAdminApp,\n canAccessAdminPath,\n getDefaultAdminHome,\n getUsableAdminContexts,\n resolveAdminContextFromPath,\n getPermissionsForRoles,\n hasAllPermissions,\n hasAnyPermission,\n hasAnyRole,\n hasPermission,\n hasRole,\n permissionListIncludes,\n ADMIN_APP_ROLES,\n ADMIN_DASHBOARD_CONTEXTS,\n PERMISSIONS,\n ROLE_PERMISSIONS,\n WILDCARD_PERMISSION,\n} from \"./permissions\";\nexport type {\n AdminAppRole,\n AdminDashboardContext,\n AdminDashboardContextInfo,\n Permission,\n} from \"./permissions\";\nexport type {\n AuthManagerLike,\n AuthStorageAdapter,\n HasLicenceResult,\n LicencedResourceType,\n LicencesByRole,\n LimitType,\n LogoutReason,\n ProfileBadgeLicence,\n RoleLicences,\n UseAuthCoreAdapters,\n UseAuthReturnType,\n} from \"./types\";\nexport { useAuthCore } from \"./useAuthCore\";\nexport { UserProvider, useAuthUser } from \"./UserProvider\";\n","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 { EnumUserLicence } from \"../enums\";\n\n/** Tier keys in descending priority (highest first) for licence resolution. */\nexport const TIERS_BY_PRIORITY = [\"pro_plus\", \"pro\", \"standard\"] as const;\n\n/** Canonical subscription tier keys — matches Stripe/server tier identifiers. */\nexport type Tier = (typeof TIERS_BY_PRIORITY)[number];\n\n/** User-facing tier labels (decoupled from the Tier discriminant). */\nexport const TIER_DISPLAY_LABELS: Record<Tier, string> = {\n pro: \"Pro\",\n // eslint-disable-next-line camelcase\n pro_plus: \"Pro+ Ads\",\n standard: \"Standard\",\n};\n\n/** Maps licence enums to their canonical tier key. */\nexport const TIER_FROM_LICENCE: Record<EnumUserLicence, Tier> = {\n [EnumUserLicence.PRO_EVENT]: \"pro\",\n [EnumUserLicence.PRO_PLUS_EVENT]: \"pro_plus\",\n [EnumUserLicence.PRO_PLUS_VENDOR]: \"pro_plus\",\n [EnumUserLicence.PRO_VENDOR]: \"pro\",\n [EnumUserLicence.STANDARD_EVENT]: \"standard\",\n [EnumUserLicence.STANDARD_PARTNER]: \"standard\",\n [EnumUserLicence.STANDARD_VENDOR]: \"standard\",\n [EnumUserLicence.STANDARD_AFFILIATE]: \"standard\",\n [EnumUserLicence.STANDARD_SCHOOL]: \"standard\",\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 const associateLicence =\n authUser?.associates?.some((associate) =>\n associate.licence?.licenceType?.includes(licenceType),\n ) ?? false;\n\n return {\n associateLicence,\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 associates: { pro: 3, pro_plus: 3, standard: 0 },\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/**\n * Parses an array of licence strings into structured, role-based licences.\n */\nexport function getLicenceFlagsByRole(licences?: string[]): LicencesByRole {\n const normalized = licences?.map((l) => l.toLowerCase()) ?? [];\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 return result;\n }\n\n return {\n event: resolve(EnumResourceType.EVENT),\n partner: resolve(EnumResourceType.PARTNER),\n vendor: resolve(EnumResourceType.VENDOR),\n };\n}\n","/**\n * Canonical permission IDs. Add new permissions here first, then map them in\n * ROLE_PERMISSIONS. Prefer resource.action names (e.g. users.read).\n */\nexport const PERMISSIONS = [\n \"*\",\n // Dashboards\n \"dashboard.admin\",\n \"dashboard.affiliate\",\n \"dashboard.customer\",\n \"dashboard.event\",\n \"dashboard.partner\",\n \"dashboard.school\",\n \"dashboard.vendor\",\n // Admin: users\n \"users.delete\",\n \"users.read\",\n \"users.update\",\n // Admin: events\n \"events.create\",\n \"events.delete\",\n \"events.read\",\n \"events.update\",\n // Admin: vendors\n \"vendors.create\",\n \"vendors.delete\",\n \"vendors.read\",\n \"vendors.update\",\n // Admin: partners\n \"partners.create\",\n \"partners.delete\",\n \"partners.read\",\n \"partners.update\",\n // Admin: schools\n \"schools.create\",\n \"schools.delete\",\n \"schools.read\",\n \"schools.update\",\n // Admin: affiliates\n \"affiliates.create\",\n \"affiliates.delete\",\n \"affiliates.read\",\n \"affiliates.update\",\n // Admin: ads / posts / settings\n \"ads.create\",\n \"ads.delete\",\n \"ads.read\",\n \"ads.update\",\n \"posts.create\",\n \"posts.delete\",\n \"posts.read\",\n \"posts.update\",\n \"settings.read\",\n \"settings.update\",\n // Product: own-resource management\n \"affiliates.manage_own\",\n \"events.manage_own\",\n \"partners.manage_own\",\n \"schools.manage_own\",\n \"vendors.manage_own\",\n] as const;\n\nexport type Permission = (typeof PERMISSIONS)[number];\n\nexport const WILDCARD_PERMISSION: Permission = \"*\";\n","import { EnumUserRole } from \"../../enums\";\n\nimport type { Permission } from \"./permissions\";\n\nconst ADMIN_PERMISSIONS: readonly Permission[] = [\n \"dashboard.admin\",\n \"events.read\",\n \"events.create\",\n \"events.update\",\n \"events.delete\",\n \"vendors.read\",\n \"vendors.create\",\n \"vendors.update\",\n \"vendors.delete\",\n \"partners.read\",\n \"partners.create\",\n \"partners.update\",\n \"partners.delete\",\n \"schools.read\",\n \"schools.create\",\n \"schools.update\",\n \"schools.delete\",\n \"affiliates.read\",\n \"affiliates.create\",\n \"affiliates.update\",\n \"affiliates.delete\",\n \"ads.read\",\n \"ads.create\",\n \"ads.update\",\n \"ads.delete\",\n \"posts.read\",\n \"posts.create\",\n \"posts.update\",\n \"posts.delete\",\n];\n\n/**\n * Static role → permissions map. Source of truth for access.\n * Permissions for a user = union of all their roles' lists.\n */\nexport const ROLE_PERMISSIONS: Record<EnumUserRole, readonly Permission[]> = {\n [EnumUserRole.SUPER_ADMIN]: [\"*\"],\n [EnumUserRole.ADMIN]: ADMIN_PERMISSIONS,\n [EnumUserRole.CUSTOMER]: [\"dashboard.customer\"],\n [EnumUserRole.EVENT]: [\"dashboard.event\", \"events.manage_own\"],\n [EnumUserRole.VENDOR]: [\"dashboard.vendor\", \"vendors.manage_own\"],\n [EnumUserRole.PARTNER]: [\"dashboard.partner\", \"partners.manage_own\"],\n [EnumUserRole.SCHOOL]: [\"dashboard.school\", \"schools.manage_own\"],\n [EnumUserRole.AFFILIATE]: [\"dashboard.affiliate\", \"affiliates.manage_own\"],\n};\n","import { EnumUserRole } from \"../../enums\";\n\nimport type { Permission } from \"./permissions\";\nimport { WILDCARD_PERMISSION } from \"./permissions\";\nimport { ROLE_PERMISSIONS } from \"./rolePermissions\";\n\nfunction normalizeRoles(\n roles: EnumUserRole[] | null | undefined,\n): EnumUserRole[] {\n if (!roles?.length) return [];\n return roles;\n}\n\n/**\n * Union of permissions for the given roles (deduped, stable order).\n */\nexport function getPermissionsForRoles(\n roles: EnumUserRole[] | null | undefined,\n): Permission[] {\n const seen = new Set<Permission>();\n const result: Permission[] = [];\n\n for (const role of normalizeRoles(roles)) {\n const perms = ROLE_PERMISSIONS[role] ?? [];\n for (const perm of perms) {\n if (!seen.has(perm)) {\n seen.add(perm);\n result.push(perm);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Check a concrete permission list (e.g. authUser.permissions) for a grant.\n * Honours the \"*\" wildcard.\n */\nexport function permissionListIncludes(\n permissions: readonly Permission[] | null | undefined,\n permission: Permission,\n): boolean {\n if (!permissions?.length) return false;\n const set = new Set(permissions);\n if (set.has(WILDCARD_PERMISSION)) return true;\n return set.has(permission);\n}\n\nexport function hasPermission(\n roles: EnumUserRole[] | null | undefined,\n permission: Permission,\n): boolean {\n return permissionListIncludes(getPermissionsForRoles(roles), permission);\n}\n\nexport function hasAnyPermission(\n roles: EnumUserRole[] | null | undefined,\n permissions: readonly Permission[],\n): boolean {\n if (permissions.length === 0) return false;\n const granted = getPermissionsForRoles(roles);\n return permissions.some((p) => permissionListIncludes(granted, p));\n}\n\nexport function hasAllPermissions(\n roles: EnumUserRole[] | null | undefined,\n permissions: readonly Permission[],\n): boolean {\n if (permissions.length === 0) return true;\n const granted = getPermissionsForRoles(roles);\n return permissions.every((p) => permissionListIncludes(granted, p));\n}\n\nexport function hasRole(\n roles: EnumUserRole[] | null | undefined,\n role: EnumUserRole,\n): boolean {\n return normalizeRoles(roles).includes(role);\n}\n\nexport function hasAnyRole(\n roles: EnumUserRole[] | null | undefined,\n checkRoles: readonly EnumUserRole[],\n): boolean {\n if (checkRoles.length === 0) return false;\n const set = new Set(normalizeRoles(roles));\n return checkRoles.some((r) => set.has(r));\n}\n","import { EnumUserRole } from \"../../enums\";\n\nimport { hasAnyRole } from \"./helpers\";\n\n/** Roles allowed to sign into the admin web app (CUSTOMER-only is denied). */\nexport const ADMIN_APP_ROLES = [\n EnumUserRole.SUPER_ADMIN,\n EnumUserRole.ADMIN,\n EnumUserRole.EVENT,\n EnumUserRole.VENDOR,\n EnumUserRole.PARTNER,\n EnumUserRole.SCHOOL,\n EnumUserRole.AFFILIATE,\n] as const;\n\nexport type AdminAppRole = (typeof ADMIN_APP_ROLES)[number];\n\nexport type AdminDashboardContext =\n | \"staff\"\n | \"event\"\n | \"vendor\"\n | \"partner\"\n | \"school\"\n | \"affiliate\";\n\nexport type AdminDashboardContextInfo = {\n context: AdminDashboardContext;\n home: string;\n label: string;\n /** Path prefixes that belong to this context (including home). */\n pathPrefixes: readonly string[];\n roles: readonly EnumUserRole[];\n};\n\n/**\n * Priority order for default home + role switcher.\n * Staff first, then product roles.\n */\nexport const ADMIN_DASHBOARD_CONTEXTS: readonly AdminDashboardContextInfo[] = [\n {\n context: \"staff\",\n home: \"/dashboard\",\n label: \"Staff\",\n pathPrefixes: [\"/dashboard\"],\n roles: [EnumUserRole.SUPER_ADMIN, EnumUserRole.ADMIN],\n },\n {\n context: \"event\",\n home: \"/event/dashboard\",\n label: \"Events\",\n pathPrefixes: [\"/event\"],\n roles: [EnumUserRole.EVENT],\n },\n {\n context: \"vendor\",\n home: \"/vendor/dashboard\",\n label: \"Stallholders\",\n pathPrefixes: [\"/vendor\"],\n roles: [EnumUserRole.VENDOR],\n },\n {\n context: \"partner\",\n home: \"/partner/dashboard\",\n label: \"Partners\",\n pathPrefixes: [\"/partner\"],\n roles: [EnumUserRole.PARTNER],\n },\n {\n context: \"school\",\n home: \"/school/dashboard\",\n label: \"Schools\",\n pathPrefixes: [\"/school\"],\n roles: [EnumUserRole.SCHOOL],\n },\n {\n context: \"affiliate\",\n home: \"/affiliate/dashboard\",\n label: \"Affiliate\",\n pathPrefixes: [\"/affiliate\"],\n roles: [EnumUserRole.AFFILIATE],\n },\n] as const;\n\nexport function canAccessAdminApp(\n roles: EnumUserRole[] | null | undefined,\n): boolean {\n return hasAnyRole(roles, ADMIN_APP_ROLES);\n}\n\nexport function getUsableAdminContexts(\n roles: EnumUserRole[] | null | undefined,\n): AdminDashboardContextInfo[] {\n return ADMIN_DASHBOARD_CONTEXTS.filter((ctx) => hasAnyRole(roles, ctx.roles));\n}\n\nexport function getDefaultAdminHome(\n roles: EnumUserRole[] | null | undefined,\n preferredContext?: AdminDashboardContext | null,\n): string {\n const usable = getUsableAdminContexts(roles);\n if (usable.length === 0) {\n return \"/login\";\n }\n\n if (preferredContext) {\n const preferred = usable.find((ctx) => ctx.context === preferredContext);\n if (preferred) return preferred.home;\n }\n\n return usable[0].home;\n}\n\nexport function resolveAdminContextFromPath(\n pathname: string,\n): AdminDashboardContext | null {\n for (const ctx of ADMIN_DASHBOARD_CONTEXTS) {\n if (\n ctx.pathPrefixes.some(\n (prefix) => pathname === prefix || pathname.startsWith(`${prefix}/`),\n )\n ) {\n return ctx.context;\n }\n }\n return null;\n}\n\nexport function canAccessAdminPath(\n roles: EnumUserRole[] | null | undefined,\n pathname: string,\n): boolean {\n if (!canAccessAdminApp(roles)) return false;\n\n const context = resolveAdminContextFromPath(pathname);\n if (!context) {\n // Authenticated admin-app users may hit non-dashboard admin routes later;\n // unknown paths are allowed only if they have any admin-app role.\n return true;\n }\n\n const info = ADMIN_DASHBOARD_CONTEXTS.find((ctx) => ctx.context === context);\n if (!info) return false;\n return hasAnyRole(roles, info.roles);\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} 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 const associateLicences =\n authUser?.associates?.map(\n (associate) => associate.licence.licenceType,\n ) ?? [];\n\n // No resource yet (e.g. create flow / unloaded id): use the user's own\n // licences only — never hard-code elevated tiers for an empty id.\n if (resourceId === \"\") {\n return getLicenceFlagsByRole(myLicences);\n }\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 : getLicenceFlagsByRole(associateLicences);\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 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","import { useMutation } from \"@apollo/client\";\n\nimport { AuthPayloadType, RefreshTokenPayloadType } from \"src/types/auth\";\n\nimport {\n REQUEST_PASSWORD_RESET_MUTATION,\n LOGIN_MUTATION,\n REGISTER_MUTATION,\n VALIDATE_VERIFICATION_TOKEN_MUTATION,\n RESET_PASSWORD_MUTATION,\n LOGOUT_MUTATION,\n REFRESH_TOKEN_MUTATION,\n} from \"../mutations/auth\";\n\nexport const useRegister = () => {\n const [register, { loading, error }] = useMutation<{\n register: AuthPayloadType;\n }>(REGISTER_MUTATION);\n return { error, loading, register };\n};\n\nexport const useLogin = () => {\n const [login, { loading, error }] = useMutation<{\n login: AuthPayloadType;\n }>(LOGIN_MUTATION);\n return { error, loading, login };\n};\n\nexport const useLogout = () => {\n const [logout, { loading, error }] = useMutation(LOGOUT_MUTATION);\n return { error, loading, logout };\n};\n\nexport const useRefreshToken = () => {\n const [refreshToken, { loading, error }] = useMutation<{\n refreshToken: RefreshTokenPayloadType;\n }>(REFRESH_TOKEN_MUTATION);\n return { error, loading, refreshToken };\n};\n\nexport const useRequestPasswordReset = () => {\n const [requestPasswordReset, { loading, error }] = useMutation(\n REQUEST_PASSWORD_RESET_MUTATION,\n );\n\n return { error, loading, requestPasswordReset };\n};\n\nexport const useValidateVerificationToken = () => {\n const [validateVerificationToken, { loading, error }] = useMutation(\n VALIDATE_VERIFICATION_TOKEN_MUTATION,\n );\n\n return { error, loading, validateVerificationToken };\n};\n\nexport const useResetPassword = () => {\n const [resetPassword, { loading, error }] = useMutation(\n RESET_PASSWORD_MUTATION,\n );\n\n return { error, loading, resetPassword };\n};\n","import { gql } from \"@apollo/client\";\n\nimport { USER_FIELDS_FRAGMENT } from \"../queries/global\";\n\nexport const REGISTER_MUTATION = gql`\n mutation register($input: RegisterInputType!) {\n register(input: $input) {\n message\n refreshToken\n token\n user {\n ...UserFields\n }\n }\n }\n ${USER_FIELDS_FRAGMENT}\n`;\n\nexport const LOGIN_MUTATION = gql`\n mutation login($input: LoginInputType!) {\n login(input: $input) {\n message\n refreshToken\n token\n user {\n ...UserFields\n }\n }\n }\n ${USER_FIELDS_FRAGMENT}\n`;\n\nexport const LOGOUT_MUTATION = gql`\n mutation logout {\n logout {\n message\n }\n }\n`;\n\nexport const REFRESH_TOKEN_MUTATION = gql`\n mutation refreshToken($input: RefreshTokenInputType!) {\n refreshToken(input: $input) {\n refreshToken\n token\n }\n }\n`;\n\nexport const RESET_PASSWORD_MUTATION = gql`\n mutation resetPassword($input: ResetPasswordInputType!) {\n resetPassword(input: $input) {\n message\n }\n }\n`;\n\nexport const REQUEST_PASSWORD_RESET_MUTATION = gql`\n mutation requestPasswordReset($input: RequestPasswordResetInputType!) {\n requestPasswordReset(input: $input) {\n message\n }\n }\n`;\n\nexport const VALIDATE_VERIFICATION_TOKEN_MUTATION = gql`\n mutation validateVerificationToken(\n $input: ValidateVerificationTokenInputType!\n ) {\n validateVerificationToken(input: $input) {\n message\n }\n }\n`;\n","import { gql } from \"@apollo/client\";\n\nexport const POSTER_USAGE_FIELDS_FRAGMENT = gql`\n fragment PosterUsageFields on PosterUsageType {\n month\n count\n }\n`;\n\nexport const SOCIAL_MEDIA_FIELDS_FRAGMENT = gql`\n fragment SocialMediaFields on SocialMediaType {\n name\n link\n }\n`;\n\nexport const RESOURCE_IMAGE_FIELDS_FRAGMENT = gql`\n fragment ResourceImageFields on ResourceImageType {\n active\n source\n title\n }\n`;\n\nexport const OWNER_FIELDS_FRAGMENT = gql`\n fragment OwnerFields on OwnerType {\n email\n userId\n }\n`;\n\nexport const CATEGORY_FIELDS_FRAGMENT = gql`\n fragment CategoryFields on CategoryType {\n id\n name\n subcategories {\n id\n items {\n id\n name\n }\n name\n }\n }\n`;\n\nexport const LICENCE_FIELDS_FRAGMENT = gql`\n fragment LicenceFields on UserLicenceType {\n expiryDate\n issuedDate\n licenceType\n prevLicenceType\n }\n`;\n\nexport const ASSOCIATES_FIELDS_FRAGMENT = gql`\n fragment AssociatesFields on AssociateType {\n email\n resourceId\n resourceType\n licence {\n ...LicenceFields\n }\n }\n ${LICENCE_FIELDS_FRAGMENT}\n`;\n\nexport const TERMS_AGREEMENT_FIELDS_FRAGMENT = gql`\n fragment TermsAgreementFields on TermsAgreementType {\n appBuildNumber\n appId\n appVersion\n brand\n deviceName\n installationId\n manufacturer\n modelName\n osName\n osVersion\n termVersion\n timestamp\n }\n`;\n\nexport const DATETIME_FIELDS_FRAGMENT = gql`\n fragment DateTimeFields on DateTimeType {\n dateStatus\n endDate\n endTime\n startDate\n startTime\n }\n`;\n\nexport const LOCATION_GEO_FIELDS_FRAGMENT = gql`\n fragment LocationGeoFields on LocationGeoType {\n coordinates\n type\n }\n`;\n\nexport const LOCATION_FIELDS_FRAGMENT = gql`\n fragment LocationFields on LocationType {\n city\n country\n fullAddress\n geo {\n ...LocationGeoFields\n }\n latitude\n longitude\n region\n }\n ${LOCATION_GEO_FIELDS_FRAGMENT}\n`;\n\nconst USER_ACTIVITY_FIELDS_FRAGMENT = gql`\n fragment UserActivityFields on UserActivityType {\n favourites {\n events\n partners\n vendors\n }\n going {\n events {\n resourceId\n dateTime {\n ...DateTimeFields\n }\n }\n }\n interested {\n events {\n resourceId\n dateTime {\n ...DateTimeFields\n }\n }\n }\n present {\n events {\n resourceId\n dateTime {\n ...DateTimeFields\n }\n }\n }\n }\n ${DATETIME_FIELDS_FRAGMENT}\n`;\n\nexport const REDEEMED_REWARD_FIELDS_FRAGMENT = gql`\n fragment RedeemedRewardFields on RedeemedRewardType {\n name\n pointsUsed\n redeemedAt\n }\n`;\n\nexport const USER_FIELDS_FRAGMENT = gql`\n fragment UserFields on UserType {\n _id\n active\n associates {\n ...AssociatesFields\n }\n affiliate\n avatar {\n ...ResourceImageFields\n }\n createdAt\n deletedAt\n email\n events\n firstName\n game\n isTester\n lastName\n licences {\n ...LicenceFields\n }\n location {\n ...LocationFields\n }\n partner\n overallPoints\n platform\n preferredRegion\n permissions\n promoCodes\n roles\n redeemedRewards {\n ...RedeemedRewardFields\n }\n school\n termsAgreement {\n ...TermsAgreementFields\n }\n userActivity {\n ...UserActivityFields\n }\n vendor\n updatedAt\n }\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n ${ASSOCIATES_FIELDS_FRAGMENT}\n ${TERMS_AGREEMENT_FIELDS_FRAGMENT}\n ${USER_ACTIVITY_FIELDS_FRAGMENT}\n ${LICENCE_FIELDS_FRAGMENT}\n ${LOCATION_FIELDS_FRAGMENT}\n ${REDEEMED_REWARD_FIELDS_FRAGMENT}\n`;\n\nexport const STALL_TYPE_FIELDS_FRAGMENT = gql`\n fragment StallTypeFields on StallTypeType {\n label\n price\n stallCapacity\n }\n`;\n\nexport const RELATION_DATES_FRAGMENT = gql`\n fragment RelationDates on RelationDateType {\n dateTime {\n dateStatus\n endDate\n endTime\n startDate\n startTime\n stallType {\n ...StallTypeFields\n }\n }\n lastUpdateBy {\n resourceId\n userEmail\n }\n paymentReference\n status\n }\n ${STALL_TYPE_FIELDS_FRAGMENT}\n`;\n\nexport const CONTACT_DETAILS_FIELDS_FRAGMENT = gql`\n fragment ContactDetailsFields on ContactDetailsType {\n email\n landlinePhone\n mobilePhone\n }\n`;\n\nexport const EVENT_LIST_ITEM = gql`\n fragment EventListItemFields on EventListItemType {\n _id\n active\n approvedAt\n claimed\n cover {\n ...ResourceImageFields\n }\n createdAt\n dateTime {\n ...DateTimeFields\n }\n deletedAt\n description\n eventType\n googlePlaceId\n images {\n ...ResourceImageFields\n }\n location {\n ...LocationFields\n }\n logo {\n ...ResourceImageFields\n }\n name\n rainOrShine\n rating\n region\n relations {\n relationId\n relationDates {\n ...RelationDates\n }\n }\n reviewCount\n slug\n updatedAt\n }\n ${DATETIME_FIELDS_FRAGMENT}\n ${LOCATION_FIELDS_FRAGMENT}\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n ${RELATION_DATES_FRAGMENT}\n`;\n\nexport const RELATED_POST_FIELDS_FRAGMENT = gql`\n fragment RelatedPostFields on RelatedPostType {\n postActive\n postId\n postSlug\n postType\n }\n`;\n\nexport const SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT = gql`\n fragment SocialShareResourceFields on SocialShareResourceType {\n qrCode {\n ...ResourceImageFields\n }\n socialImage {\n ...ResourceImageFields\n }\n }\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n`;\n","import { useQuery } from \"@apollo/client\";\n\nimport {\n EventListItemType,\n EventType,\n PartnerType,\n VendorType,\n ResourceByUser,\n SafeUserType,\n} from \"src/types\";\n\nimport {\n GET_USER,\n GET_USER_ACTIVITIES,\n GET_USER_EVENTS,\n GET_USER_PARTNERS,\n GET_USER_RESOURCES,\n GET_USER_VENDORS,\n GET_USERS,\n} from \"../../queries/user\";\n\nexport const useGetUsers = () => {\n const { loading, error, data, refetch } = useQuery<{ users: SafeUserType[] }>(\n GET_USERS,\n {\n fetchPolicy: \"network-only\",\n },\n );\n\n const users = data?.users || [];\n\n return { error, loading, refetch, users };\n};\n\nexport const useGetUser = (_id: string) => {\n const { loading, error, data, refetch } = useQuery<{ user: SafeUserType }>(\n GET_USER,\n {\n fetchPolicy: \"network-only\",\n skip: !_id || _id === \"\",\n variables: { _id },\n },\n );\n\n const user = data?.user;\n\n return { error, loading, refetch, user };\n};\n\nexport const useGetUserEvents = () => {\n const { loading, error, data, refetch } = useQuery<{\n userEvents: EventType[];\n }>(GET_USER_EVENTS, {\n fetchPolicy: \"network-only\",\n });\n\n const userEvents = data?.userEvents || [];\n\n return { error, loading, refetch, userEvents };\n};\n\nexport const useGetUserVendors = () => {\n const { loading, error, data, refetch } = useQuery<{\n userVendors: VendorType[];\n }>(GET_USER_VENDORS, {\n fetchPolicy: \"network-only\",\n });\n\n const userVendors = data?.userVendors || [];\n\n return { error, loading, refetch, userVendors };\n};\n\nexport const useGetUserPartners = () => {\n const { loading, error, data, refetch } = useQuery<{\n userPartners: PartnerType[];\n }>(GET_USER_PARTNERS, {\n fetchPolicy: \"network-only\",\n });\n\n const userPartners = data?.userPartners || [];\n\n return { error, loading, refetch, userPartners };\n};\n\nexport const useGetUserActivities = () => {\n const { loading, error, data, refetch } = useQuery<{\n userActivities: {\n favourites: {\n events: EventListItemType[];\n partners: PartnerType[];\n vendors: VendorType[];\n };\n going: {\n events: EventListItemType[];\n };\n interested: {\n events: EventListItemType[];\n };\n present: {\n events: EventListItemType[];\n };\n };\n }>(GET_USER_ACTIVITIES, {\n fetchPolicy: \"network-only\",\n });\n\n const userActivities = {\n favourites: {\n events: data?.userActivities.favourites.events || [],\n partners: data?.userActivities.favourites.partners || [],\n vendors: data?.userActivities.favourites.vendors || [],\n },\n going: {\n events: data?.userActivities.going.events || [],\n },\n interested: {\n events: data?.userActivities.interested.events || [],\n },\n present: {\n events: data?.userActivities.present.events || [],\n },\n };\n\n return { error, loading, refetch, userActivities };\n};\n\nexport const useGetUserResources = (userId: string) => {\n const { loading, error, data, refetch } = useQuery<{\n userResources: {\n resources: ResourceByUser[];\n };\n }>(GET_USER_RESOURCES, {\n fetchPolicy: \"network-only\",\n skip: !userId || userId === \"\",\n variables: { userId },\n });\n\n const userResources = data?.userResources.resources || [];\n\n return { error, loading, refetch, userResources };\n};\n","import { gql } from \"@apollo/client\";\n\nimport { EVENT } from \"./event\";\nimport { EVENT_LIST_ITEM, USER_FIELDS_FRAGMENT } from \"./global\";\nimport { PARTNER } from \"./partner\";\nimport { VENDOR } from \"./vendor\";\n\nexport const GET_USERS = gql`\n query getUsers {\n users {\n ...UserFields\n }\n }\n ${USER_FIELDS_FRAGMENT}\n`;\n\nexport const GET_USER = gql`\n query getUser($_id: ID!) {\n user(_id: $_id) {\n ...UserFields\n }\n }\n ${USER_FIELDS_FRAGMENT}\n`;\n\nexport const GET_USER_EVENTS = gql`\n query getUserEvents {\n userEvents {\n ...EventFields\n }\n }\n ${EVENT}\n`;\n\nexport const GET_USER_VENDORS = gql`\n query getUserVendors {\n userVendors {\n ...VendorFields\n }\n }\n ${VENDOR}\n`;\n\nexport const GET_USER_PARTNERS = gql`\n query getUserPartners {\n userPartners {\n ...PartnerFields\n }\n }\n ${PARTNER}\n`;\n\nexport const GET_USER_ACTIVITIES = gql`\n query getUserActivities {\n userActivities {\n favourites {\n events {\n ...EventListItemFields\n }\n partners {\n ...PartnerFields\n }\n vendors {\n ...VendorFields\n }\n }\n going {\n events {\n ...EventListItemFields\n }\n }\n interested {\n events {\n ...EventListItemFields\n }\n }\n present {\n events {\n ...EventListItemFields\n }\n }\n }\n }\n ${EVENT_LIST_ITEM}\n ${VENDOR}\n ${PARTNER}\n`;\n\nexport const GET_USER_RESOURCES = gql`\n query getUserResources($userId: ID!) {\n userResources(userId: $userId) {\n resources {\n _id\n logo\n name\n resourceType\n }\n }\n }\n`;\n","import { gql } from \"@apollo/client\";\n\nimport {\n CONTACT_DETAILS_FIELDS_FRAGMENT,\n DATETIME_FIELDS_FRAGMENT,\n OWNER_FIELDS_FRAGMENT,\n ASSOCIATES_FIELDS_FRAGMENT,\n POSTER_USAGE_FIELDS_FRAGMENT,\n RELATION_DATES_FRAGMENT,\n RESOURCE_IMAGE_FIELDS_FRAGMENT,\n SOCIAL_MEDIA_FIELDS_FRAGMENT,\n STALL_TYPE_FIELDS_FRAGMENT,\n TERMS_AGREEMENT_FIELDS_FRAGMENT,\n LOCATION_FIELDS_FRAGMENT,\n EVENT_LIST_ITEM,\n RELATED_POST_FIELDS_FRAGMENT,\n SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT,\n} from \"./global\";\n\nexport const EVENT_INFO = gql`\n fragment EventInfoFields on EventInfoType {\n _id\n applicationDeadlineHours\n dateTime {\n dateStatus\n endDate\n endTime\n stallTypes {\n ...StallTypeFields\n }\n startDate\n startTime\n }\n eventId\n packInTime\n paymentDueHours\n paymentInfo {\n accountHolderName\n accountNumber\n link\n paymentMethod\n }\n refundPolicy {\n category\n label\n value\n }\n requirements {\n category\n label\n value\n }\n }\n ${STALL_TYPE_FIELDS_FRAGMENT}\n`;\n\nexport const EVENT = gql`\n fragment EventFields on EventType {\n _id\n active\n associates {\n ...AssociatesFields\n }\n adIds\n approvedAt\n cover {\n ...ResourceImageFields\n }\n claimed\n createdAt\n contactDetails {\n ...ContactDetailsFields\n }\n dateTime {\n ...DateTimeFields\n }\n description\n deletedAt\n googlePlaceId\n images {\n ...ResourceImageFields\n }\n eventType\n location {\n ...LocationFields\n }\n logo {\n ...ResourceImageFields\n }\n eventInfoId\n name\n nzbn\n owner {\n ...OwnerFields\n }\n promoCodes\n provider\n posterUsage {\n ...PosterUsageFields\n }\n region\n relations {\n relationId\n relationDates {\n ...RelationDates\n }\n }\n rating\n reviewCount\n rainOrShine\n relatedPost {\n ...RelatedPostFields\n }\n socialMedia {\n ...SocialMediaFields\n }\n sharePublic {\n ...SocialShareResourceFields\n }\n shareRelation {\n ...SocialShareResourceFields\n }\n slug\n tags\n termsAgreement {\n ...TermsAgreementFields\n }\n updatedAt\n }\n ${DATETIME_FIELDS_FRAGMENT}\n ${LOCATION_FIELDS_FRAGMENT}\n ${OWNER_FIELDS_FRAGMENT}\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n ${SOCIAL_MEDIA_FIELDS_FRAGMENT}\n ${POSTER_USAGE_FIELDS_FRAGMENT}\n ${ASSOCIATES_FIELDS_FRAGMENT}\n ${CONTACT_DETAILS_FIELDS_FRAGMENT}\n ${TERMS_AGREEMENT_FIELDS_FRAGMENT}\n ${RELATION_DATES_FRAGMENT}\n ${RELATED_POST_FIELDS_FRAGMENT}\n ${SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT}\n`;\n\nexport const GET_EVENTS = gql`\n query getEvents($dateStatus: EventDateStatusEnumType) {\n events(dateStatus: $dateStatus) {\n ...EventListItemFields\n }\n }\n ${EVENT_LIST_ITEM}\n`;\n\nexport const GET_EVENT = gql`\n query getEvent($_id: ID!) {\n event(_id: $_id) {\n ...EventFields\n }\n }\n ${EVENT}\n`;\n\nexport const GET_EVENT_BY_PLACE_ID = gql`\n query getEventByPlaceId($googlePlaceId: String!) {\n eventByPlaceId(googlePlaceId: $googlePlaceId) {\n ...EventListItemFields\n }\n }\n ${EVENT_LIST_ITEM}\n`;\n\nexport const GET_EVENTS_BY_REGION = gql`\n query getEventsByRegion(\n $region: String!\n $options: ResourcesByRegionOptions\n $dateStatus: EventDateStatusEnumType\n ) {\n eventsByRegion(\n region: $region\n options: $options\n dateStatus: $dateStatus\n ) {\n ...EventListItemFields\n }\n }\n ${EVENT_LIST_ITEM}\n`;\n\nexport const SEARCH_EVENTS = gql`\n query searchEvents(\n $region: String!\n $search: String\n $tags: [String]\n $dateStatus: EventDateStatusEnumType\n ) {\n eventsSearch(\n region: $region\n search: $search\n tags: $tags\n dateStatus: $dateStatus\n ) {\n ...EventListItemFields\n }\n }\n ${EVENT_LIST_ITEM}\n`;\n\nexport const GET_EVENTS_NEAR_ME = gql`\n query getEventsNearMe(\n $latitude: Float!\n $longitude: Float!\n $radius: Int\n $dateStatus: EventDateStatusEnumType\n ) {\n eventsNearMe(\n latitude: $latitude\n longitude: $longitude\n radius: $radius\n dateStatus: $dateStatus\n ) {\n ...EventListItemFields\n }\n }\n ${EVENT_LIST_ITEM}\n`;\n\nexport const GET_EVENT_INFO = gql`\n query getEventInfo($eventId: ID!) {\n eventInfo(eventId: $eventId) {\n ...EventInfoFields\n }\n }\n ${EVENT_INFO}\n`;\n","import { gql } from \"@apollo/client\";\n\nimport {\n ASSOCIATES_FIELDS_FRAGMENT,\n CONTACT_DETAILS_FIELDS_FRAGMENT,\n LOCATION_FIELDS_FRAGMENT,\n OWNER_FIELDS_FRAGMENT,\n POSTER_USAGE_FIELDS_FRAGMENT,\n RELATED_POST_FIELDS_FRAGMENT,\n RESOURCE_IMAGE_FIELDS_FRAGMENT,\n SOCIAL_MEDIA_FIELDS_FRAGMENT,\n SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT,\n TERMS_AGREEMENT_FIELDS_FRAGMENT,\n} from \"./global\";\n\nexport const PARTNER = gql`\n fragment PartnerFields on PartnerType {\n _id\n active\n associates {\n ...AssociatesFields\n }\n adIds\n approvedAt\n cover {\n ...ResourceImageFields\n }\n createdAt\n contactDetails {\n ...ContactDetailsFields\n }\n description\n deletedAt\n images {\n ...ResourceImageFields\n }\n location {\n ...LocationFields\n }\n logo {\n ...ResourceImageFields\n }\n name\n nzbn\n owner {\n ...OwnerFields\n }\n partnerType\n posterUsage {\n ...PosterUsageFields\n }\n rating\n region\n reviewCount\n relatedPost {\n ...RelatedPostFields\n }\n socialMedia {\n ...SocialMediaFields\n }\n slug\n sharePublic {\n ...SocialShareResourceFields\n }\n termsAgreement {\n ...TermsAgreementFields\n }\n updatedAt\n }\n ${TERMS_AGREEMENT_FIELDS_FRAGMENT}\n ${LOCATION_FIELDS_FRAGMENT}\n ${OWNER_FIELDS_FRAGMENT}\n ${ASSOCIATES_FIELDS_FRAGMENT}\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n ${POSTER_USAGE_FIELDS_FRAGMENT}\n ${SOCIAL_MEDIA_FIELDS_FRAGMENT}\n ${CONTACT_DETAILS_FIELDS_FRAGMENT}\n ${RELATED_POST_FIELDS_FRAGMENT}\n ${SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT}\n`;\n\nexport const GET_PARTNERS = gql`\n query getPartners {\n partners {\n ...PartnerFields\n }\n }\n ${PARTNER}\n`;\n\nexport const GET_PARTNER = gql`\n query getPartner($_id: ID!) {\n partner(_id: $_id) {\n ...PartnerFields\n }\n }\n ${PARTNER}\n`;\n\nexport const GET_PARTNERS_BY_REGION = gql`\n query getPartnersByRegion(\n $region: String!\n $options: ResourcesByRegionOptions\n ) {\n partnersByRegion(region: $region, options: $options) {\n ...PartnerFields\n }\n }\n ${PARTNER}\n`;\n\nexport const SEARCH_PARTNERS = gql`\n query searchPartners($search: String!, $region: String!) {\n partnersSearch(search: $search, region: $region) {\n ...PartnerFields\n }\n }\n ${PARTNER}\n`;\n","import { gql } from \"@apollo/client\";\n\nimport {\n OWNER_FIELDS_FRAGMENT,\n CATEGORY_FIELDS_FRAGMENT,\n RESOURCE_IMAGE_FIELDS_FRAGMENT,\n SOCIAL_MEDIA_FIELDS_FRAGMENT,\n POSTER_USAGE_FIELDS_FRAGMENT,\n CONTACT_DETAILS_FIELDS_FRAGMENT,\n TERMS_AGREEMENT_FIELDS_FRAGMENT,\n RELATION_DATES_FRAGMENT,\n ASSOCIATES_FIELDS_FRAGMENT,\n DATETIME_FIELDS_FRAGMENT,\n LOCATION_FIELDS_FRAGMENT,\n RELATED_POST_FIELDS_FRAGMENT,\n SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT,\n} from \"./global\";\n\nconst VENDOR_DATETIME_FIELDS_FRAGMENT = gql`\n fragment VendorDateTimeFields on VendorDateTimeType {\n dateStatus\n endDate\n endTime\n startDate\n startTime\n }\n`;\n\nconst VENDOR_PRODUCT_LIST_FIELDS_FRAGMENT = gql`\n fragment VendorProductListFields on VendorProductListType {\n description\n name\n price\n priceUnit\n productGroups\n }\n`;\n\nexport const VENDOR = gql`\n fragment VendorFields on VendorType {\n _id\n active\n associates {\n ...AssociatesFields\n }\n adIds\n approvedAt\n availability {\n corporate\n private\n school\n }\n vendorInfoId\n categories {\n ...CategoryFields\n }\n calendar {\n active\n calendarData {\n dateTime {\n ...VendorDateTimeFields\n }\n description\n location {\n ...LocationFields\n }\n }\n }\n contactDetails {\n ...ContactDetailsFields\n }\n cover {\n ...ResourceImageFields\n }\n createdAt\n claimed\n description\n deletedAt\n foodTruck\n images {\n ...ResourceImageFields\n }\n logo {\n ...ResourceImageFields\n }\n name\n owner {\n ...OwnerFields\n }\n products {\n active\n productsList {\n ...VendorProductListFields\n }\n }\n promoCodes\n posterUsage {\n ...PosterUsageFields\n }\n rating\n region\n reviewCount\n relatedPost {\n ...RelatedPostFields\n }\n relations {\n relationId\n relationDates {\n ...RelationDates\n }\n }\n slug\n socialMedia {\n ...SocialMediaFields\n }\n sharePublic {\n ...SocialShareResourceFields\n }\n shareRelation {\n ...SocialShareResourceFields\n }\n termsAgreement {\n ...TermsAgreementFields\n }\n updatedAt\n vendorType\n unregisteredVendorId\n }\n ${CATEGORY_FIELDS_FRAGMENT}\n ${VENDOR_DATETIME_FIELDS_FRAGMENT}\n ${LOCATION_FIELDS_FRAGMENT}\n ${OWNER_FIELDS_FRAGMENT}\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n ${SOCIAL_MEDIA_FIELDS_FRAGMENT}\n ${POSTER_USAGE_FIELDS_FRAGMENT}\n ${ASSOCIATES_FIELDS_FRAGMENT}\n ${VENDOR_PRODUCT_LIST_FIELDS_FRAGMENT}\n ${CONTACT_DETAILS_FIELDS_FRAGMENT}\n ${TERMS_AGREEMENT_FIELDS_FRAGMENT}\n ${RELATION_DATES_FRAGMENT}\n ${RELATED_POST_FIELDS_FRAGMENT}\n ${SOCIAL_SHARE_RESOURCE_FIELDS_FRAGMENT}\n`;\n\nconst VENDOR_ATTRIBUTES_FRAGMENT = gql`\n fragment VendorAttributesFields on VendorAttributesType {\n details\n isRequired\n }\n`;\n\nexport const VENDOR_INFO = gql`\n fragment VendorInfoFields on VendorInfoType {\n _id\n compliance {\n foodBeverageLicense\n liabilityInsurance\n }\n documents {\n ...ResourceImageFields\n }\n requirements {\n electricity {\n ...VendorAttributesFields\n }\n gazebo {\n ...VendorAttributesFields\n }\n table {\n ...VendorAttributesFields\n }\n }\n product {\n foodFlavors\n packaging\n priceRange {\n max\n min\n }\n producedIn\n }\n stallInfo {\n size {\n depth\n width\n }\n }\n vendorId\n }\n ${VENDOR_ATTRIBUTES_FRAGMENT}\n ${RESOURCE_IMAGE_FIELDS_FRAGMENT}\n`;\n\nconst UNREGISTERED_VENDOR_INVITATION_FRAGMENT = gql`\n fragment UnregisteredVendorInvitationFields on UnregisteredVendorInvitationType {\n dateTime {\n ...DateTimeFields\n }\n inviterId\n }\n ${DATETIME_FIELDS_FRAGMENT}\n`;\n\nexport const UNREGISTERED_VENDOR = gql`\n fragment UnregisteredVendorFields on UnregisteredVendorType {\n _id\n active\n categoryIds\n claimed\n createdAt\n deletedAt\n email\n invitations {\n ...UnregisteredVendorInvitationFields\n }\n name\n region\n updatedAt\n }\n ${UNREGISTERED_VENDOR_INVITATION_FRAGMENT}\n`;\n\nexport const GET_VENDORS = gql`\n query getVendors {\n vendors {\n ...VendorFields\n }\n }\n ${VENDOR}\n`;\n\nexport const GET_VENDOR = gql`\n query getVendor($_id: ID!) {\n vendor(_id: $_id) {\n ...VendorFields\n }\n }\n ${VENDOR}\n`;\n\nexport const GET_VENDORS_BY_REGION = gql`\n query getVendorsByRegion(\n $region: String!\n $options: ResourcesByRegionOptions\n ) {\n vendorsByRegion(region: $region, options: $options) {\n ...VendorFields\n }\n }\n ${VENDOR}\n`;\n\nexport const SEARCH_VENDORS = gql`\n query searchVendors($search: String!, $region: String!) {\n vendorSearch(search: $search, region: $region) {\n ...VendorFields\n }\n }\n ${VENDOR}\n`;\n\nexport const GET_VENDOR_INFO = gql`\n query getVendorInfo($vendorId: ID!) {\n vendorInfo(vendorId: $vendorId) {\n ...VendorInfoFields\n }\n }\n ${VENDOR_INFO}\n`;\n\nexport const GET_UNREGISTERED_VENDORS = gql`\n query getUnregisteredVendors {\n unregisteredVendors {\n ...UnregisteredVendorFields\n }\n }\n ${UNREGISTERED_VENDOR}\n`;\n\nexport const GET_UNREGISTERED_VENDORS_BY_INVITER_ID = gql`\n query getUnregisteredVendorsByInviterId($inviterId: ID!) {\n unregisteredVendorsByInviterId(inviterId: $inviterId) {\n ...UnregisteredVendorFields\n }\n }\n ${UNREGISTERED_VENDOR}\n`;\n\nexport const GET_UNREGISTERED_VENDOR = gql`\n query getUnregisteredVendor($_id: ID!) {\n unregisteredVendor(_id: $_id) {\n ...UnregisteredVendorFields\n }\n }\n ${UNREGISTERED_VENDOR}\n`;\n","export const SAVED_PASSWORD_KEY = \"savedPassword\";\nexport const SAVED_EMAIL_KEY = \"savedEmail\";\nexport const SAVED_TOKEN_KEY = \"savedToken\";\nexport const SAVED_REFRESH_TOKEN_KEY = \"savedRefreshToken\";\nexport const USER_STORAGE_KEY = \"authUser\";\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":["import_client","import_client","import_client","import_client","import_client","import_client","import_client","import_react"]}
|
package/dist/auth/index.d.mts
CHANGED
|
@@ -6,9 +6,6 @@ import React, { ReactNode } from 'react';
|
|
|
6
6
|
import '../global-959zf6qy.mjs';
|
|
7
7
|
import 'react-hook-form';
|
|
8
8
|
|
|
9
|
-
/** Super-admin identity used for elevated admin checks in clients. */
|
|
10
|
-
declare const SUPER_ADMIN_EMAIL = "hello@cluemart.co.nz";
|
|
11
|
-
|
|
12
9
|
type AuthManager = {
|
|
13
10
|
logout: () => Promise<void>;
|
|
14
11
|
setLogout: (fn: () => Promise<void>) => void;
|
|
@@ -24,6 +21,29 @@ type AuthManager = {
|
|
|
24
21
|
*/
|
|
25
22
|
declare function createAuthManager(): AuthManager;
|
|
26
23
|
|
|
24
|
+
/** Roles allowed to sign into the admin web app (CUSTOMER-only is denied). */
|
|
25
|
+
declare const ADMIN_APP_ROLES: readonly [EnumUserRole.SUPER_ADMIN, EnumUserRole.ADMIN, EnumUserRole.EVENT, EnumUserRole.VENDOR, EnumUserRole.PARTNER, EnumUserRole.SCHOOL, EnumUserRole.AFFILIATE];
|
|
26
|
+
type AdminAppRole = (typeof ADMIN_APP_ROLES)[number];
|
|
27
|
+
type AdminDashboardContext = "staff" | "event" | "vendor" | "partner" | "school" | "affiliate";
|
|
28
|
+
type AdminDashboardContextInfo = {
|
|
29
|
+
context: AdminDashboardContext;
|
|
30
|
+
home: string;
|
|
31
|
+
label: string;
|
|
32
|
+
/** Path prefixes that belong to this context (including home). */
|
|
33
|
+
pathPrefixes: readonly string[];
|
|
34
|
+
roles: readonly EnumUserRole[];
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Priority order for default home + role switcher.
|
|
38
|
+
* Staff first, then product roles.
|
|
39
|
+
*/
|
|
40
|
+
declare const ADMIN_DASHBOARD_CONTEXTS: readonly AdminDashboardContextInfo[];
|
|
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;
|
|
44
|
+
declare function resolveAdminContextFromPath(pathname: string): AdminDashboardContext | null;
|
|
45
|
+
declare function canAccessAdminPath(roles: EnumUserRole[] | null | undefined, pathname: string): boolean;
|
|
46
|
+
|
|
27
47
|
/**
|
|
28
48
|
* Union of permissions for the given roles (deduped, stable order).
|
|
29
49
|
*/
|
|
@@ -141,4 +161,4 @@ declare const UserProvider: React.FC<{
|
|
|
141
161
|
}>;
|
|
142
162
|
declare const useAuthUser: () => UseAuthReturnType;
|
|
143
163
|
|
|
144
|
-
export { type AuthManager, type AuthManagerLike, type AuthStorageAdapter, DEFAULT_LIMITS, type HasLicenceResult, type LicencedResourceType, type LicencesByRole, type LimitType, type LogoutReason, Permission, type ProfileBadgeLicence, ROLE_PERMISSIONS, type RoleLicences,
|
|
164
|
+
export { ADMIN_APP_ROLES, ADMIN_DASHBOARD_CONTEXTS, type AdminAppRole, type AdminDashboardContext, type AdminDashboardContextInfo, type AuthManager, type AuthManagerLike, type AuthStorageAdapter, DEFAULT_LIMITS, type HasLicenceResult, type LicencedResourceType, type LicencesByRole, type LimitType, type LogoutReason, Permission, type ProfileBadgeLicence, ROLE_PERMISSIONS, type RoleLicences, type UseAuthCoreAdapters, type UseAuthReturnType, UserProvider, canAccessAdminApp, canAccessAdminPath, createAuthManager, getDefaultAdminHome, getLicenceFlagsByRole, getPermissionsForRoles, getUsableAdminContexts, hasAllPermissions, hasAnyPermission, hasAnyRole, hasLicence, hasPermission, hasRole, hasUserLicenceType, isLicencedResourceType, isProfileBadgeLicence, permissionListIncludes, resolveAdminContextFromPath, useAuthCore, useAuthUser };
|