@jmruthers/pace-core 0.5.66 → 0.5.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +26 -0
  2. package/dist/{DataTable-MFUXNGPR.js → DataTable-4IUY7BXB.js} +5 -5
  3. package/dist/{PublicLoadingSpinner-CXJ-W9wZ.d.ts → PublicLoadingSpinner-DdKXTkCZ.d.ts} +94 -1
  4. package/dist/{UnifiedAuthProvider-CQNiemcB.d.ts → UnifiedAuthProvider-D02AMXgO.d.ts} +3 -3
  5. package/dist/{chunk-VTJ5HCZB.js → chunk-IPCH4YPT.js} +2 -2
  6. package/dist/{chunk-QVEOQVD4.js → chunk-KRCRNXPD.js} +106 -14
  7. package/dist/chunk-KRCRNXPD.js.map +1 -0
  8. package/dist/{chunk-T2MQY57J.js → chunk-MOJXHWDE.js} +1 -1
  9. package/dist/{chunk-T2MQY57J.js.map → chunk-MOJXHWDE.js.map} +1 -1
  10. package/dist/{chunk-FVDOEGGG.js → chunk-NN45OBIS.js} +3 -3
  11. package/dist/{chunk-4HQ5BOVZ.js → chunk-OPCWH3A4.js} +3 -3
  12. package/dist/{chunk-CKNY7HYS.js → chunk-PXWEDX7Y.js} +2 -2
  13. package/dist/{chunk-PSE2XO4L.js → chunk-U6GPOF6J.js} +312 -264
  14. package/dist/chunk-U6GPOF6J.js.map +1 -0
  15. package/dist/{chunk-BTCA3ENN.js → chunk-UYA6U6H7.js} +4 -4
  16. package/dist/{chunk-C7GUF747.js → chunk-ZMS23NS5.js} +3 -3
  17. package/dist/{chunk-T6HVDA24.js → chunk-ZPG4XPV5.js} +2 -2
  18. package/dist/components.d.ts +3 -2
  19. package/dist/components.js +9 -7
  20. package/dist/components.js.map +1 -1
  21. package/dist/hooks.js +4 -4
  22. package/dist/index.d.ts +4 -3
  23. package/dist/index.js +12 -10
  24. package/dist/index.js.map +1 -1
  25. package/dist/providers.d.ts +1 -1
  26. package/dist/providers.js +3 -3
  27. package/dist/rbac/index.js +5 -5
  28. package/dist/utils.js +1 -1
  29. package/docs/api/README.md +26 -0
  30. package/docs/api/classes/ColumnFactory.md +1 -1
  31. package/docs/api/classes/ErrorBoundary.md +1 -1
  32. package/docs/api/classes/InvalidScopeError.md +1 -1
  33. package/docs/api/classes/MissingUserContextError.md +1 -1
  34. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  35. package/docs/api/classes/PermissionDeniedError.md +1 -1
  36. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  37. package/docs/api/classes/RBACAuditManager.md +1 -1
  38. package/docs/api/classes/RBACCache.md +1 -1
  39. package/docs/api/classes/RBACEngine.md +1 -1
  40. package/docs/api/classes/RBACError.md +1 -1
  41. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  42. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  43. package/docs/api/classes/StorageUtils.md +1 -1
  44. package/docs/api/interfaces/AggregateConfig.md +1 -1
  45. package/docs/api/interfaces/ButtonProps.md +1 -1
  46. package/docs/api/interfaces/CardProps.md +1 -1
  47. package/docs/api/interfaces/ColorPalette.md +1 -1
  48. package/docs/api/interfaces/ColorShade.md +1 -1
  49. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  50. package/docs/api/interfaces/DataTableAction.md +1 -1
  51. package/docs/api/interfaces/DataTableColumn.md +1 -1
  52. package/docs/api/interfaces/DataTableProps.md +1 -1
  53. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  54. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  55. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  56. package/docs/api/interfaces/EventContextType.md +1 -1
  57. package/docs/api/interfaces/EventLogoProps.md +1 -1
  58. package/docs/api/interfaces/EventProviderProps.md +1 -1
  59. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  60. package/docs/api/interfaces/FileUploadProps.md +1 -1
  61. package/docs/api/interfaces/FooterProps.md +1 -1
  62. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  63. package/docs/api/interfaces/InputProps.md +1 -1
  64. package/docs/api/interfaces/LabelProps.md +1 -1
  65. package/docs/api/interfaces/LoginFormProps.md +1 -1
  66. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  67. package/docs/api/interfaces/NavigationContextType.md +1 -1
  68. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  69. package/docs/api/interfaces/NavigationItem.md +1 -1
  70. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  71. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  72. package/docs/api/interfaces/Organisation.md +1 -1
  73. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  74. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  75. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  76. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  77. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  78. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  79. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  80. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  81. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  82. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  83. package/docs/api/interfaces/PaletteData.md +1 -1
  84. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  85. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  86. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  87. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  88. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  89. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  90. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  91. package/docs/api/interfaces/RBACConfig.md +1 -1
  92. package/docs/api/interfaces/RBACContextType.md +1 -1
  93. package/docs/api/interfaces/RBACLogger.md +1 -1
  94. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  95. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  96. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  97. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  98. package/docs/api/interfaces/RouteConfig.md +1 -1
  99. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  100. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  101. package/docs/api/interfaces/StorageConfig.md +1 -1
  102. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  103. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  104. package/docs/api/interfaces/StorageListOptions.md +1 -1
  105. package/docs/api/interfaces/StorageListResult.md +1 -1
  106. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  107. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  108. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  109. package/docs/api/interfaces/StyleImport.md +1 -1
  110. package/docs/api/interfaces/SwitchProps.md +34 -0
  111. package/docs/api/interfaces/ToastActionElement.md +1 -1
  112. package/docs/api/interfaces/ToastProps.md +1 -1
  113. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  114. package/docs/api/interfaces/UnifiedAuthProviderProps.md +4 -4
  115. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  116. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  117. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  118. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  119. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  120. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  121. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  122. package/docs/api/interfaces/UserEventAccess.md +1 -1
  123. package/docs/api/interfaces/UserMenuProps.md +1 -1
  124. package/docs/api/interfaces/UserProfile.md +1 -1
  125. package/docs/api/modules.md +38 -4
  126. package/docs/api-reference/providers.md +16 -7
  127. package/docs/migration-guides/unified-auth-provider-mandatory-timeouts.md +226 -0
  128. package/docs/security/README.md +5 -1
  129. package/package.json +2 -1
  130. package/src/components/Switch/Switch.test.tsx +438 -0
  131. package/src/components/Switch/Switch.tsx +140 -0
  132. package/src/components/Switch/index.ts +9 -0
  133. package/src/components/index.ts +2 -0
  134. package/src/hooks/public/usePublicEvent.ts +160 -13
  135. package/src/index.ts +2 -0
  136. package/src/providers/UnifiedAuthProvider.test.simple.tsx +42 -6
  137. package/src/providers/UnifiedAuthProvider.tsx +4 -4
  138. package/dist/chunk-PSE2XO4L.js.map +0 -1
  139. package/dist/chunk-QVEOQVD4.js.map +0 -1
  140. /package/dist/{DataTable-MFUXNGPR.js.map → DataTable-4IUY7BXB.js.map} +0 -0
  141. /package/dist/{chunk-VTJ5HCZB.js.map → chunk-IPCH4YPT.js.map} +0 -0
  142. /package/dist/{chunk-FVDOEGGG.js.map → chunk-NN45OBIS.js.map} +0 -0
  143. /package/dist/{chunk-4HQ5BOVZ.js.map → chunk-OPCWH3A4.js.map} +0 -0
  144. /package/dist/{chunk-CKNY7HYS.js.map → chunk-PXWEDX7Y.js.map} +0 -0
  145. /package/dist/{chunk-BTCA3ENN.js.map → chunk-UYA6U6H7.js.map} +0 -0
  146. /package/dist/{chunk-C7GUF747.js.map → chunk-ZMS23NS5.js.map} +0 -0
  147. /package/dist/{chunk-T6HVDA24.js.map → chunk-ZPG4XPV5.js.map} +0 -0
package/README.md CHANGED
@@ -2,6 +2,32 @@
2
2
 
3
3
  Clean, modern React component library with Tailwind v4 styling and native utilities.
4
4
 
5
+ ## ⚠️ Breaking Changes
6
+
7
+ ### Version 0.5.65+ - Mandatory Inactivity Timeouts
8
+
9
+ The `UnifiedAuthProvider` now requires mandatory inactivity timeout configuration for security:
10
+
11
+ ```tsx
12
+ // ❌ Before (will cause TypeScript errors)
13
+ <UnifiedAuthProvider supabaseClient={supabase} appName="my-app">
14
+ <AppContent />
15
+ </UnifiedAuthProvider>
16
+
17
+ // ✅ After (required configuration)
18
+ <UnifiedAuthProvider
19
+ supabaseClient={supabase}
20
+ appName="my-app"
21
+ idleTimeoutMs={30 * 60 * 1000} // Required
22
+ warnBeforeMs={5 * 60 * 1000} // Required
23
+ onIdleLogout={() => navigate('/login')} // Required
24
+ >
25
+ <AppContent />
26
+ </UnifiedAuthProvider>
27
+ ```
28
+
29
+ [📖 Migration Guide](./docs/migration-guides/unified-auth-provider-mandatory-timeouts.md)
30
+
5
31
  ## 🚀 PaceAppLayout Usage
6
32
 
7
33
  **PaceAppLayout uses React Router's nested routing pattern for optimal performance and scalability.**
@@ -32,11 +32,11 @@ import {
32
32
  useDataTableContext,
33
33
  usePluginRegistry,
34
34
  useStateManager
35
- } from "./chunk-4HQ5BOVZ.js";
36
- import "./chunk-C7GUF747.js";
35
+ } from "./chunk-OPCWH3A4.js";
36
+ import "./chunk-ZMS23NS5.js";
37
37
  import "./chunk-NHR52QAQ.js";
38
38
  import "./chunk-B2WTCLCV.js";
39
- import "./chunk-VTJ5HCZB.js";
39
+ import "./chunk-IPCH4YPT.js";
40
40
  import {
41
41
  DataChunkManager,
42
42
  SearchIndex,
@@ -48,7 +48,7 @@ import {
48
48
  throttle,
49
49
  useDataTablePerformance
50
50
  } from "./chunk-YNUBMSMV.js";
51
- import "./chunk-T2MQY57J.js";
51
+ import "./chunk-MOJXHWDE.js";
52
52
  import "./chunk-ULBI5JGB.js";
53
53
  import "./chunk-5BSLGBYI.js";
54
54
  import "./chunk-D7ARGIA3.js";
@@ -97,4 +97,4 @@ export {
97
97
  usePluginRegistry,
98
98
  useStateManager
99
99
  };
100
- //# sourceMappingURL=DataTable-MFUXNGPR.js.map
100
+ //# sourceMappingURL=DataTable-4IUY7BXB.js.map
@@ -3,6 +3,7 @@ import React__default, { Component, ReactNode, ErrorInfo } from 'react';
3
3
  import * as LabelPrimitive from '@radix-ui/react-label';
4
4
  import * as AvatarPrimitive from '@radix-ui/react-avatar';
5
5
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
6
+ import * as SwitchPrimitive from '@radix-ui/react-switch';
6
7
  import * as ProgressPrimitive from '@radix-ui/react-progress';
7
8
  import * as react_jsx_runtime from 'react/jsx-runtime';
8
9
  import * as DialogPrimitive from '@radix-ui/react-dialog';
@@ -468,6 +469,98 @@ declare const AvatarFallback: React.ForwardRefExoticComponent<Omit<AvatarPrimiti
468
469
 
469
470
  declare const Checkbox: React.ForwardRefExoticComponent<Omit<CheckboxPrimitive.CheckboxProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
470
471
 
472
+ /**
473
+ * @file Switch Component
474
+ * @package @jmruthers/pace-core
475
+ * @module Components/Switch
476
+ * @since 0.5.67
477
+ *
478
+ * A toggle switch component built on Radix UI primitives.
479
+ * Provides an accessible, keyboard-navigable switch for boolean states.
480
+ *
481
+ * Features:
482
+ * - WCAG 2.1 AA compliant
483
+ * - Keyboard navigation (Space/Enter)
484
+ * - Focus visible indicators
485
+ * - Disabled state support
486
+ * - Smooth animations
487
+ * - Tailwind v4 compatible
488
+ * - Theme-aware colors
489
+ *
490
+ * @example
491
+ * ```tsx
492
+ * import { Switch } from '@jmruthers/pace-core';
493
+ *
494
+ * function Example() {
495
+ * const [checked, setChecked] = React.useState(false);
496
+ *
497
+ * return (
498
+ * <div className="flex items-center gap-2">
499
+ * <Switch
500
+ * checked={checked}
501
+ * onCheckedChange={setChecked}
502
+ * id="notifications"
503
+ * />
504
+ * <label htmlFor="notifications">
505
+ * Enable notifications
506
+ * </label>
507
+ * </div>
508
+ * );
509
+ * }
510
+ * ```
511
+ *
512
+ * @example With Form
513
+ * ```tsx
514
+ * import { Switch, Label } from '@jmruthers/pace-core';
515
+ *
516
+ * function FormExample() {
517
+ * return (
518
+ * <div className="flex items-center gap-2">
519
+ * <Switch id="terms" />
520
+ * <Label htmlFor="terms">
521
+ * I agree to the terms and conditions
522
+ * </Label>
523
+ * </div>
524
+ * );
525
+ * }
526
+ * ```
527
+ *
528
+ * @example Disabled State
529
+ * ```tsx
530
+ * <Switch disabled checked />
531
+ * ```
532
+ *
533
+ * @accessibility
534
+ * - Uses Radix UI's accessible switch primitive
535
+ * - Proper keyboard navigation (Space to toggle)
536
+ * - Screen reader announcements for state changes
537
+ * - Focus visible styles for keyboard users
538
+ * - ARIA attributes handled automatically
539
+ */
540
+
541
+ /**
542
+ * Switch component props
543
+ * Extends all props from Radix UI Switch.Root
544
+ */
545
+ interface SwitchProps extends React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root> {
546
+ /**
547
+ * Additional CSS classes to apply to the switch
548
+ */
549
+ className?: string;
550
+ }
551
+ /**
552
+ * Switch component
553
+ *
554
+ * A toggle switch for boolean states. Built on Radix UI for accessibility.
555
+ *
556
+ * @component
557
+ * @example
558
+ * ```tsx
559
+ * <Switch checked={isEnabled} onCheckedChange={setIsEnabled} />
560
+ * ```
561
+ */
562
+ declare const Switch: React.ForwardRefExoticComponent<SwitchProps & React.RefAttributes<HTMLButtonElement>>;
563
+
471
564
  /**
472
565
  * @file Progress Component
473
566
  * @package @jmruthers/pace-core
@@ -3384,4 +3477,4 @@ declare function PublicLoadingSkeleton({ lines, className }: {
3384
3477
  className?: string;
3385
3478
  }): react_jsx_runtime.JSX.Element;
3386
3479
 
3387
- export { ToastViewport as $, Alert as A, Button as B, Card as C, Dialog as D, DialogContent as E, type FileSizeLimits as F, DialogHeader as G, DialogBody as H, Input as I, DialogFooter as J, DialogTitle as K, Label as L, DialogDescription as M, Select as N, SelectGroup as O, Progress as P, SelectValue as Q, SelectTrigger as R, type StorageConfig as S, SelectContent as T, SelectLabel as U, SelectItem as V, SelectSeparator as W, Toast as X, Toaster as Y, ToastAction as Z, ToastProvider as _, type StorageUploadOptions as a, type EventLogoProps as a$, ToastTitle as a0, ToastDescription as a1, ToastClose as a2, type ToastActionElement as a3, type ToastProps as a4, Tooltip as a5, TooltipTrigger as a6, TooltipContent as a7, TooltipProvider as a8, TooltipRoot as a9, TableCell as aA, TableFooter as aB, TableHead as aC, TableRow as aD, type StorageFileInfo as aE, PublicPageLayout as aF, usePublicPageContext$1 as aG, PublicPageHeader as aH, PublicPageProvider as aI, usePublicPageContext as aJ, useIsPublicPage as aK, PublicPageFooter as aL, PublicPageDebugger as aM, PublicPageDiagnostic as aN, PublicPageContextChecker as aO, EventLogo as aP, EventLogoCompact as aQ, EventLogoLarge as aR, PublicErrorBoundary as aS, useErrorBoundary as aT, DefaultPublicErrorFallback as aU, PublicLoadingSpinner as aV, PublicLoadingSpinnerFullPage as aW, PublicLoadingSkeleton as aX, type PublicPageLayoutProps as aY, type PublicPageHeaderProps as aZ, type PublicPageFooterProps as a_, Form as aa, LoginForm as ab, type LoginFormProps as ac, Header as ad, Footer as ae, type FooterProps as af, NavigationMenu as ag, type NavigationMenuProps as ah, type NavigationItem as ai, UserMenu as aj, type UserMenuProps as ak, PaceAppLayout as al, type PaceAppLayoutProps as am, PaceLoginPage as an, type PaceLoginPageProps as ao, ErrorBoundary as ap, LoadingSpinner as aq, EventSelector as ar, OrganisationSelector as as, PasswordResetForm as at, useStorage as au, useFileUpload as av, Table as aw, TableHeader as ax, TableBody as ay, TableCaption as az, type StorageFileMetadata as b, type PublicErrorBoundaryProps as b0, type PublicErrorBoundaryState as b1, type PublicLoadingSpinnerProps as b2, type CardActionsProps as b3, type DialogProps as b4, type DialogTriggerProps as b5, type DialogContentProps as b6, type DialogOverlayProps as b7, type DialogHeaderProps as b8, type DialogFooterProps as b9, type DialogTitleProps as ba, type DialogDescriptionProps as bb, type DialogSize as bc, type FormProps as bd, type OrganisationSelectorProps as be, type ErrorBoundaryProps as bf, type ErrorBoundaryState as bg, type UseStorageOptions as bh, type UseStorageReturn as bi, type StorageUploadResult as c, type StorageUrlOptions as d, type StorageListOptions as e, type StorageListResult as f, type ButtonProps as g, CardHeader as h, CardFooter as i, CardTitle as j, CardDescription as k, CardContent as l, CardActions as m, type CardProps as n, type InputProps as o, type LabelProps as p, AlertTitle as q, AlertDescription as r, Avatar as s, AvatarImage as t, AvatarFallback as u, Checkbox as v, DialogPortal as w, DialogOverlay as x, DialogTrigger as y, DialogClose as z };
3480
+ export { ToastAction as $, Alert as A, Button as B, Card as C, Dialog as D, DialogTrigger as E, type FileSizeLimits as F, DialogClose as G, DialogContent as H, Input as I, DialogHeader as J, DialogBody as K, Label as L, DialogFooter as M, DialogTitle as N, DialogDescription as O, Progress as P, Select as Q, SelectGroup as R, type StorageConfig as S, SelectValue as T, SelectTrigger as U, SelectContent as V, SelectLabel as W, SelectItem as X, SelectSeparator as Y, Toast as Z, Toaster as _, type StorageUploadOptions as a, type PublicPageHeaderProps as a$, ToastProvider as a0, ToastViewport as a1, ToastTitle as a2, ToastDescription as a3, ToastClose as a4, type ToastActionElement as a5, type ToastProps as a6, Tooltip as a7, TooltipTrigger as a8, TooltipContent as a9, TableBody as aA, TableCaption as aB, TableCell as aC, TableFooter as aD, TableHead as aE, TableRow as aF, type StorageFileInfo as aG, PublicPageLayout as aH, usePublicPageContext$1 as aI, PublicPageHeader as aJ, PublicPageProvider as aK, usePublicPageContext as aL, useIsPublicPage as aM, PublicPageFooter as aN, PublicPageDebugger as aO, PublicPageDiagnostic as aP, PublicPageContextChecker as aQ, EventLogo as aR, EventLogoCompact as aS, EventLogoLarge as aT, PublicErrorBoundary as aU, useErrorBoundary as aV, DefaultPublicErrorFallback as aW, PublicLoadingSpinner as aX, PublicLoadingSpinnerFullPage as aY, PublicLoadingSkeleton as aZ, type PublicPageLayoutProps as a_, TooltipProvider as aa, TooltipRoot as ab, Form as ac, LoginForm as ad, type LoginFormProps as ae, Header as af, Footer as ag, type FooterProps as ah, NavigationMenu as ai, type NavigationMenuProps as aj, type NavigationItem as ak, UserMenu as al, type UserMenuProps as am, PaceAppLayout as an, type PaceAppLayoutProps as ao, PaceLoginPage as ap, type PaceLoginPageProps as aq, ErrorBoundary as ar, LoadingSpinner as as, EventSelector as at, OrganisationSelector as au, PasswordResetForm as av, useStorage as aw, useFileUpload as ax, Table as ay, TableHeader as az, type StorageFileMetadata as b, type PublicPageFooterProps as b0, type EventLogoProps as b1, type PublicErrorBoundaryProps as b2, type PublicErrorBoundaryState as b3, type PublicLoadingSpinnerProps as b4, type CardActionsProps as b5, type DialogProps as b6, type DialogTriggerProps as b7, type DialogContentProps as b8, type DialogOverlayProps as b9, type DialogHeaderProps as ba, type DialogFooterProps as bb, type DialogTitleProps as bc, type DialogDescriptionProps as bd, type DialogSize as be, type FormProps as bf, type OrganisationSelectorProps as bg, type ErrorBoundaryProps as bh, type ErrorBoundaryState as bi, type UseStorageOptions as bj, type UseStorageReturn as bk, type StorageUploadResult as c, type StorageUrlOptions as d, type StorageListOptions as e, type StorageListResult as f, type ButtonProps as g, CardHeader as h, CardFooter as i, CardTitle as j, CardDescription as k, CardContent as l, CardActions as m, type CardProps as n, type InputProps as o, type LabelProps as p, AlertTitle as q, AlertDescription as r, Avatar as s, AvatarImage as t, AvatarFallback as u, Checkbox as v, Switch as w, type SwitchProps as x, DialogPortal as y, DialogOverlay as z };
@@ -85,9 +85,9 @@ interface UnifiedAuthProviderProps {
85
85
  enablePersistence?: boolean;
86
86
  requireOrganisationContext?: boolean;
87
87
  enableRBAC?: boolean;
88
- idleTimeoutMs?: number;
89
- warnBeforeMs?: number;
90
- onIdleLogout?: (reason: 'inactivity') => void;
88
+ idleTimeoutMs: number;
89
+ warnBeforeMs: number;
90
+ onIdleLogout: (reason: 'inactivity') => void;
91
91
  renderInactivityWarning?: (args: {
92
92
  timeRemaining: number;
93
93
  onStaySignedIn: () => void;
@@ -3,7 +3,7 @@ import {
3
3
  init_UnifiedAuthProvider,
4
4
  useOrganisations,
5
5
  useUnifiedAuth
6
- } from "./chunk-T2MQY57J.js";
6
+ } from "./chunk-MOJXHWDE.js";
7
7
  import {
8
8
  DebugLogger,
9
9
  init_debugLogger,
@@ -312,4 +312,4 @@ export {
312
312
  EventProvider_exports,
313
313
  init_EventProvider
314
314
  };
315
- //# sourceMappingURL=chunk-VTJ5HCZB.js.map
315
+ //# sourceMappingURL=chunk-IPCH4YPT.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  usePublicPageContext
3
- } from "./chunk-T6HVDA24.js";
3
+ } from "./chunk-ZPG4XPV5.js";
4
4
  import {
5
5
  init_OrganisationProvider,
6
6
  init_UnifiedAuthProvider,
7
7
  useOrganisations,
8
8
  useUnifiedAuth
9
- } from "./chunk-T2MQY57J.js";
9
+ } from "./chunk-MOJXHWDE.js";
10
10
 
11
11
  // src/hooks/useOrganisationPermissions.ts
12
12
  init_OrganisationProvider();
@@ -308,6 +308,13 @@ function usePublicEvent(eventCode, options = {}) {
308
308
  }
309
309
  return createClient(environment.supabaseUrl, environment.supabaseKey);
310
310
  }, [environment.supabaseUrl, environment.supabaseKey]);
311
+ const refreshSchemaCache = useCallback2(async () => {
312
+ try {
313
+ await supabase.from("information_schema.routines").select("routine_name").limit(1);
314
+ } catch (error2) {
315
+ console.debug("[usePublicEvent] Schema cache refresh attempt failed:", error2);
316
+ }
317
+ }, [supabase]);
311
318
  const fetchEvent = useCallback2(async () => {
312
319
  if (!eventCode || !supabase) {
313
320
  setError(new Error("Invalid event code or Supabase client not available"));
@@ -327,18 +334,103 @@ function usePublicEvent(eventCode, options = {}) {
327
334
  try {
328
335
  setIsLoading(true);
329
336
  setError(null);
330
- const { data, error: rpcError } = await supabase.rpc("get_public_event_by_code", {
331
- event_code_param: eventCode
332
- });
333
- if (rpcError) {
334
- throw new Error(rpcError.message || "Failed to fetch event");
335
- }
336
- if (!data || data.length === 0 || !data[0]) {
337
- setEvent(null);
338
- setError(new Error("Event not found"));
339
- return;
337
+ let eventData = null;
338
+ try {
339
+ const { data, error: rpcError } = await supabase.rpc("get_public_event_by_code", {
340
+ event_code_param: eventCode
341
+ });
342
+ if (rpcError) {
343
+ if (rpcError.message?.includes("Could not find the function") || rpcError.message?.includes("does not exist") || rpcError.message?.includes("schema cache")) {
344
+ console.warn("[usePublicEvent] RPC function not found or schema cache issue, attempting refresh:", rpcError.message);
345
+ await refreshSchemaCache();
346
+ try {
347
+ const { data: retryData, error: retryError } = await supabase.rpc("get_public_event_by_code", {
348
+ event_code_param: eventCode
349
+ });
350
+ if (!retryError && retryData && retryData.length > 0) {
351
+ eventData = retryData[0];
352
+ } else {
353
+ throw new Error("RPC still failing after cache refresh");
354
+ }
355
+ } catch (retryError) {
356
+ console.warn("[usePublicEvent] RPC still failing after cache refresh, falling back to direct table access");
357
+ const { data: tableData, error: tableError } = await supabase.from("event").select(`
358
+ event_id,
359
+ event_name,
360
+ event_date,
361
+ event_venue,
362
+ event_participants,
363
+ event_colours,
364
+ organisation_id,
365
+ event_days,
366
+ event_typicalunit,
367
+ event_rounddown,
368
+ event_youthmultiplier,
369
+ event_catering_email,
370
+ event_news,
371
+ event_billing,
372
+ event_footer,
373
+ event_email
374
+ `).eq("event_code", eventCode).eq("is_visible", true).not("organisation_id", "is", null).limit(1).single();
375
+ if (tableError) {
376
+ throw new Error(tableError.message || "Failed to fetch event from table");
377
+ }
378
+ if (!tableData) {
379
+ setEvent(null);
380
+ setError(new Error("Event not found"));
381
+ return;
382
+ }
383
+ const { data: logoData } = await supabase.from("file_references").select("file_path").eq("table_name", "event").eq("record_id", tableData.event_id).eq("is_public", true).eq("file_metadata->>category", "event_logos").limit(1).single();
384
+ eventData = {
385
+ ...tableData,
386
+ event_logo: logoData?.file_path || null
387
+ };
388
+ }
389
+ } else {
390
+ throw new Error(rpcError.message || "Failed to fetch event");
391
+ }
392
+ } else {
393
+ if (!data || data.length === 0 || !data[0]) {
394
+ setEvent(null);
395
+ setError(new Error("Event not found"));
396
+ return;
397
+ }
398
+ eventData = data[0];
399
+ }
400
+ } catch (rpcError) {
401
+ console.warn("[usePublicEvent] RPC call failed, falling back to direct table access:", rpcError);
402
+ const { data: tableData, error: tableError } = await supabase.from("event").select(`
403
+ event_id,
404
+ event_name,
405
+ event_date,
406
+ event_venue,
407
+ event_participants,
408
+ event_colours,
409
+ organisation_id,
410
+ event_days,
411
+ event_typicalunit,
412
+ event_rounddown,
413
+ event_youthmultiplier,
414
+ event_catering_email,
415
+ event_news,
416
+ event_billing,
417
+ event_footer,
418
+ event_email
419
+ `).eq("event_code", eventCode).eq("is_visible", true).not("organisation_id", "is", null).limit(1).single();
420
+ if (tableError) {
421
+ throw new Error(tableError.message || "Failed to fetch event from table");
422
+ }
423
+ if (!tableData) {
424
+ setEvent(null);
425
+ setError(new Error("Event not found"));
426
+ return;
427
+ }
428
+ const { data: logoData } = await supabase.from("file_references").select("file_path").eq("table_name", "event").eq("record_id", tableData.event_id).eq("is_public", true).eq("file_metadata->>category", "event_logos").limit(1).single();
429
+ eventData = {
430
+ ...tableData,
431
+ event_logo: logoData?.file_path || null
432
+ };
340
433
  }
341
- const eventData = data[0];
342
434
  const transformedEvent = {
343
435
  id: eventData.event_id,
344
436
  event_id: eventData.event_id,
@@ -526,4 +618,4 @@ export {
526
618
  generatePublicRoutePath,
527
619
  extractEventCodeFromPath
528
620
  };
529
- //# sourceMappingURL=chunk-QVEOQVD4.js.map
621
+ //# sourceMappingURL=chunk-KRCRNXPD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useOrganisationPermissions.ts","../src/hooks/useOrganisationSecurity.ts","../src/hooks/public/usePublicEvent.ts","../src/hooks/public/usePublicRouteParams.ts"],"sourcesContent":["/**\n * @file useOrganisationPermissions Hook\n * @package @jmruthers/pace-core\n * @module Hooks/useOrganisationPermissions\n * @since 0.4.0\n *\n * Hook for managing organisation-specific permissions and role validation.\n * Provides secure access to user's role and permissions within organisations.\n *\n * @example\n * ```tsx\n * function OrganisationComponent() {\n * const { \n * isOrgAdmin, \n * canManageMembers,\n * userRole,\n * hasOrganisationAccess\n * } = useOrganisationPermissions();\n * \n * return (\n * <div>\n * {isOrgAdmin && <AdminPanel />}\n * {canManageMembers && <MemberManagement />}\n * <p>Your role: {userRole}</p>\n * </div>\n * );\n * }\n * \n * // For specific organisation\n * function MultiOrgComponent() {\n * const permissions = useOrganisationPermissions('org-123');\n * \n * if (!permissions.hasOrganisationAccess) {\n * return <div>No access to this organisation</div>;\n * }\n * \n * return <div>Role in org-123: {permissions.userRole}</div>;\n * }\n * ```\n *\n * @security\n * - Validates user membership in organisation\n * - Provides role-based permission checks\n * - Ensures secure access to organisation data\n * - Real-time permission validation\n */\n\nimport { useMemo } from 'react';\nimport { useOrganisations } from '../providers/OrganisationProvider';\nimport type { OrganisationRole, OrganisationPermission } from '../types/organisation';\n\nexport interface UseOrganisationPermissionsReturn {\n /** User's role in the organisation */\n userRole: OrganisationRole | 'no_access';\n \n /** Whether user has organisation admin role */\n isOrgAdmin: boolean;\n \n /** Whether user is a super admin */\n isSuperAdmin: boolean;\n \n /** Whether user can moderate content */\n canModerate: boolean;\n \n /** Whether user can manage members */\n canManageMembers: boolean;\n \n /** Whether user can manage organisation settings */\n canManageSettings: boolean;\n \n /** Whether user can manage events */\n canManageEvents: boolean;\n \n /** Whether user has any admin privileges */\n hasAdminPrivileges: boolean;\n \n /** Whether user has access to the organisation */\n hasOrganisationAccess: boolean;\n \n /** Check if user has specific permission */\n hasPermission: (permission: OrganisationPermission) => boolean;\n \n /** Get all permissions for the user */\n getAllPermissions: () => OrganisationPermission[];\n \n /** Organisation ID being checked */\n organisationId: string;\n}\n\n/**\n * Hook to access organisation-specific permissions and roles\n * \n * @param orgId - Optional organisation ID. Defaults to currently selected organisation\n * @returns Organisation permissions and role information\n */\nexport function useOrganisationPermissions(orgId?: string): UseOrganisationPermissionsReturn {\n const { \n selectedOrganisation, \n getUserRole, \n validateOrganisationAccess,\n ensureOrganisationContext\n } = useOrganisations();\n\n const organisationId = useMemo(() => {\n if (orgId) {\n return orgId;\n }\n try {\n const currentOrg = ensureOrganisationContext();\n return currentOrg.id;\n } catch {\n return '';\n }\n }, [orgId, ensureOrganisationContext]);\n\n const userRole = useMemo(() => {\n if (!organisationId) return 'no_access';\n const role = getUserRole(organisationId);\n // Map to valid OrganisationRole or 'no_access'\n if (role === 'org_admin' || role === 'leader' || role === 'member' || role === 'supporter') {\n return role as OrganisationRole;\n }\n return 'no_access';\n }, [organisationId, getUserRole]);\n\n const hasOrganisationAccess = useMemo(() => {\n if (!organisationId) return false;\n return validateOrganisationAccess(organisationId);\n }, [organisationId, validateOrganisationAccess]);\n\n const permissions = useMemo(() => {\n if (!hasOrganisationAccess || userRole === 'no_access') {\n return {\n isOrgAdmin: false,\n isSuperAdmin: false,\n canModerate: false,\n canManageMembers: false,\n canManageSettings: false,\n canManageEvents: false,\n hasAdminPrivileges: false\n };\n }\n\n const isOrgAdmin = userRole === 'org_admin';\n const isLeader = userRole === 'leader';\n const isMember = userRole === 'member';\n const isSupporter = userRole === 'supporter';\n\n // Super admin is handled separately via user profile context\n // Check global user context for super admin status\n const globalUser = (globalThis as any).__PACE_USER__;\n const isSuperAdmin = globalUser?.app_metadata?.globalRole === 'super_admin' || \n globalUser?.user_metadata?.globalRole === 'super_admin' ||\n isOrgAdmin; // Fallback to org_admin for backward compatibility\n\n return {\n isOrgAdmin,\n isSuperAdmin,\n canModerate: isSuperAdmin || isOrgAdmin || isLeader,\n canManageMembers: isSuperAdmin || isOrgAdmin || isLeader, // Leaders can manage members\n canManageSettings: isSuperAdmin || isOrgAdmin,\n canManageEvents: isSuperAdmin || isOrgAdmin || isLeader,\n hasAdminPrivileges: isSuperAdmin || isOrgAdmin || isLeader // Leaders have admin privileges\n };\n }, [hasOrganisationAccess, userRole]);\n\n const hasPermission = useMemo(() => {\n return (permission: OrganisationPermission): boolean => {\n if (!hasOrganisationAccess || userRole === 'no_access') {\n return false;\n }\n\n // Super admin has all permissions (org_admin acts as super admin within org)\n if (userRole === 'org_admin' || permission === '*') {\n return true;\n }\n\n // Map permissions to roles using the defined permissions from organisation types\n const rolePermissions: Record<OrganisationRole, OrganisationPermission[]> = {\n supporter: ['view_basic'],\n member: ['view_basic', 'view_details'],\n leader: ['view_basic', 'view_details', 'moderate_content', 'manage_events'],\n org_admin: ['view_basic', 'view_details', 'moderate_content', 'manage_events', 'manage_members', 'manage_settings']\n };\n\n const userPermissions = rolePermissions[userRole as OrganisationRole] || [];\n return userPermissions.includes(permission) || userPermissions.includes('*');\n };\n }, [hasOrganisationAccess, userRole]);\n\n const getAllPermissions = useMemo(() => {\n return (): OrganisationPermission[] => {\n if (!hasOrganisationAccess || userRole === 'no_access') {\n return [];\n }\n\n const rolePermissions: Record<OrganisationRole, OrganisationPermission[]> = {\n supporter: ['view_basic'],\n member: ['view_basic', 'view_details'],\n leader: ['view_basic', 'view_details', 'moderate_content', 'manage_events'],\n org_admin: ['view_basic', 'view_details', 'moderate_content', 'manage_events', 'manage_members', 'manage_settings']\n };\n\n return rolePermissions[userRole as OrganisationRole] || [];\n };\n }, [hasOrganisationAccess, userRole]);\n\n return useMemo(() => ({\n userRole,\n organisationId,\n hasOrganisationAccess,\n hasPermission,\n getAllPermissions,\n ...permissions\n }), [userRole, organisationId, hasOrganisationAccess, hasPermission, getAllPermissions, permissions]);\n} ","/**\n * @file Organisation Security Hook\n * @package @jmruthers/pace-core\n * @module Hooks/OrganisationSecurity\n * @since 0.4.0\n *\n * Security-focused hook for organisation access validation and super admin functionality.\n * Provides utilities for validating user access to organisations and checking permissions.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useUnifiedAuth } from '../providers/UnifiedAuthProvider';\nimport { useOrganisations } from '../providers/OrganisationProvider';\n// Legacy useRBAC hook removed - use new RBAC system instead\nimport type { OrganisationSecurityError, SuperAdminContext } from '../types/organisation';\nimport type { Permission } from '../rbac/types';\n\nexport interface OrganisationSecurityHook {\n // Super admin context\n superAdminContext: SuperAdminContext;\n \n // Access validation\n validateOrganisationAccess: (orgId: string) => Promise<boolean>;\n hasMinimumRole: (minRole: string, orgId?: string) => boolean;\n canAccessChildOrganisations: (orgId?: string) => boolean;\n \n // Permission checks\n hasPermission: (permission: string, orgId?: string) => Promise<boolean>;\n getUserPermissions: (orgId?: string) => Promise<string[]>;\n \n // Audit logging\n logOrganisationAccess: (action: string, details?: any) => Promise<void>;\n \n // Security utilities\n ensureOrganisationAccess: (orgId: string) => Promise<void>;\n validateUserAccess: (userId: string, orgId: string) => Promise<boolean>;\n}\n\nexport const useOrganisationSecurity = (): OrganisationSecurityHook => {\n const { user, session, supabase } = useUnifiedAuth();\n const { selectedOrganisation, getUserRole, validateOrganisationAccess: validateAccess } = useOrganisations();\n // Get global role directly from user metadata\n const globalRole = useMemo(() => {\n if (!user) return null;\n return user.app_metadata?.globalRole === 'super_admin' || \n user.user_metadata?.globalRole === 'super_admin' ? 'super_admin' : null;\n }, [user]);\n\n // Super admin context\n const superAdminContext = useMemo((): SuperAdminContext => {\n const isSuperAdmin = globalRole === 'super_admin';\n return {\n isSuperAdmin,\n hasGlobalAccess: isSuperAdmin,\n canManageAllOrganisations: isSuperAdmin\n };\n }, [globalRole]);\n\n // Validate organisation access with database check\n const validateOrganisationAccess = useCallback(async (orgId: string): Promise<boolean> => {\n if (!user || !session || !supabase) return false;\n \n try {\n // Super admin has access to all organisations\n if (superAdminContext.isSuperAdmin) {\n return true;\n }\n\n // Check organisation membership using consolidated rbac_organisation_roles table\n const { data, error } = await supabase\n .from('rbac_organisation_roles')\n .select('id')\n .eq('user_id', user.id)\n .eq('organisation_id', orgId)\n .eq('status', 'active')\n .is('revoked_at', null)\n .in('role', ['org_admin', 'leader', 'member']) // Only actual members, not supporters\n .single();\n\n if (error) {\n console.error('[useOrganisationSecurity] Error validating organisation access:', error);\n return false;\n }\n\n return !!data;\n } catch (error) {\n console.error('[useOrganisationSecurity] Exception validating organisation access:', error);\n return false;\n }\n }, [user, session, supabase, superAdminContext.isSuperAdmin]);\n\n // Check if user has minimum role\n const hasMinimumRole = useCallback((minRole: string, orgId?: string): boolean => {\n // Super admin has all roles\n if (superAdminContext.isSuperAdmin) {\n return true;\n }\n\n const targetOrgId = orgId || selectedOrganisation?.id;\n if (!targetOrgId) return false;\n\n const userRole = getUserRole(targetOrgId);\n const roleHierarchy = ['supporter', 'member', 'leader', 'org_admin'];\n \n const userRoleIndex = roleHierarchy.indexOf(userRole);\n const minRoleIndex = roleHierarchy.indexOf(minRole);\n \n return userRoleIndex >= minRoleIndex;\n }, [selectedOrganisation, getUserRole, superAdminContext.isSuperAdmin]);\n\n // Check if user can access child organisations\n const canAccessChildOrganisations = useCallback((orgId?: string): boolean => {\n // Super admin can access all organisations\n if (superAdminContext.isSuperAdmin) {\n return true;\n }\n\n const targetOrgId = orgId || selectedOrganisation?.id;\n if (!targetOrgId) return false;\n\n const userRole = getUserRole(targetOrgId);\n return userRole === 'org_admin';\n }, [selectedOrganisation, getUserRole, superAdminContext.isSuperAdmin]);\n\n // Check specific permission using the new RBAC system\n const hasPermission = useCallback(async (permission: string, orgId?: string): Promise<boolean> => {\n // Super admin has all permissions\n if (superAdminContext.isSuperAdmin) {\n return true;\n }\n\n const targetOrgId = orgId || selectedOrganisation?.id;\n if (!targetOrgId || !user) return false;\n\n try {\n // Use the new RBAC system\n const { isPermitted } = await import('../rbac/api');\n \n const scope = {\n organisationId: targetOrgId,\n eventId: user.user_metadata?.eventId || user.app_metadata?.eventId,\n appId: user.user_metadata?.appId || user.app_metadata?.appId,\n };\n\n return await isPermitted({\n userId: user.id,\n scope,\n permission: permission as Permission\n });\n } catch (error) {\n console.error('[useOrganisationSecurity] Exception checking permission:', error);\n return false;\n }\n }, [selectedOrganisation, user, superAdminContext.isSuperAdmin]);\n\n // Get user's permissions for organisation using the new RBAC system\n const getUserPermissions = useCallback(async (orgId?: string): Promise<string[]> => {\n // Super admin has all permissions\n if (superAdminContext.isSuperAdmin) {\n return ['*']; // All permissions\n }\n\n const targetOrgId = orgId || selectedOrganisation?.id;\n if (!targetOrgId || !user) return [];\n\n try {\n // Use the new RBAC system\n const { getPermissionMap } = await import('../rbac/api');\n \n const scope = {\n organisationId: targetOrgId,\n eventId: user.user_metadata?.eventId || user.app_metadata?.eventId,\n appId: user.user_metadata?.appId || user.app_metadata?.appId,\n };\n\n const permissionMap = await getPermissionMap({\n userId: user.id,\n scope\n });\n \n // Flatten all permissions from all pages\n const allPermissions = Object.values(permissionMap).flat();\n return [...new Set(allPermissions)]; // Remove duplicates\n } catch (error) {\n console.error('[useOrganisationSecurity] Exception getting user permissions:', error);\n return [];\n }\n }, [selectedOrganisation, user, getUserRole, superAdminContext.isSuperAdmin]);\n\n // Log organisation access for audit using the new RBAC audit system\n const logOrganisationAccess = useCallback(async (action: string, details?: any): Promise<void> => {\n if (!user || !selectedOrganisation) return;\n\n try {\n // Use the new RBAC audit system - only if we have a valid organisation ID\n if (selectedOrganisation.id) {\n const { emitAuditEvent } = await import('../rbac/audit');\n \n await emitAuditEvent({\n type: 'permission_check',\n userId: user.id,\n organisationId: selectedOrganisation.id,\n permission: action,\n decision: true, // Assume access was granted if we're logging it\n source: 'api',\n duration_ms: 0, // No actual permission check performed here\n metadata: details || {}\n });\n }\n } catch (error) {\n console.error('[useOrganisationSecurity] Error logging organisation access:', error);\n }\n }, [user, selectedOrganisation]);\n\n // Ensure organisation access (throws if no access)\n const ensureOrganisationAccess = useCallback(async (orgId: string): Promise<void> => {\n const hasAccess = await validateOrganisationAccess(orgId);\n \n if (!hasAccess) {\n const error = new Error(`User does not have access to organisation ${orgId}`) as OrganisationSecurityError;\n error.name = 'OrganisationSecurityError';\n error.code = 'ACCESS_DENIED';\n error.organisationId = orgId;\n error.userId = user?.id;\n throw error;\n }\n }, [validateOrganisationAccess, user]);\n\n // Validate user access (for admin functions)\n const validateUserAccess = useCallback(async (userId: string, orgId: string): Promise<boolean> => {\n if (!supabase) return false;\n\n try {\n // Super admin can validate any user\n if (superAdminContext.isSuperAdmin) {\n return true;\n }\n\n // Regular users can only validate their own access\n if (userId !== user?.id) {\n return false;\n }\n\n return await validateOrganisationAccess(orgId);\n } catch (error) {\n console.error('[useOrganisationSecurity] Exception validating user access:', error);\n return false;\n }\n }, [supabase, superAdminContext.isSuperAdmin, user, validateOrganisationAccess]);\n\n return {\n superAdminContext,\n validateOrganisationAccess,\n hasMinimumRole,\n canAccessChildOrganisations,\n hasPermission,\n getUserPermissions,\n logOrganisationAccess,\n ensureOrganisationAccess,\n validateUserAccess\n };\n}; ","/**\n * @file Public Event Hook\n * @package @jmruthers/pace-core\n * @module Hooks/Public\n * @since 1.0.0\n *\n * A React hook for accessing public event data without authentication.\n * Provides event information by event_code for public pages.\n *\n * Features:\n * - No authentication required\n * - Caching for performance\n * - Error handling and loading states\n * - TypeScript support\n * - Automatic refetch capabilities\n *\n * @example\n * ```tsx\n * import { usePublicEvent } from '@jmruthers/pace-core';\n *\n * function PublicEventPage() {\n * const { eventCode } = usePublicRouteParams();\n * const { event, isLoading, error, refetch } = usePublicEvent(eventCode);\n *\n * if (isLoading) return <div>Loading event...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!event) return <div>Event not found</div>;\n *\n * return (\n * <div>\n * <h1>{event.event_name}</h1>\n * <p>Date: {event.event_date}</p>\n * <p>Venue: {event.event_venue}</p>\n * </div>\n * );\n * }\n * ```\n *\n * @accessibility\n * - No direct accessibility concerns (hook)\n * - Enables accessible public event display\n * - Supports screen reader friendly loading states\n *\n * @security\n * - Only returns public-safe event data\n * - Validates event_code before querying\n * - No sensitive information exposed\n * - Rate limiting applied at database level\n *\n * @performance\n * - Built-in caching with TTL\n * - Minimal re-renders with stable references\n * - Lazy loading support\n * - Error boundary integration\n *\n * @dependencies\n * - React 18+ - Hooks and effects\n * - @supabase/supabase-js - Database integration\n * - Event types - Type definitions\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { createClient } from '@supabase/supabase-js';\nimport type { Event } from '../../types/unified';\nimport type { Database } from '../../types/database';\nimport { usePublicPageContext } from '../../components/PublicLayout/PublicPageProvider';\n\n// Simple in-memory cache for public data\nconst publicDataCache = new Map<string, { data: any; timestamp: number; ttl: number }>();\n\nexport interface UsePublicEventReturn {\n /** The event data, null if not loaded or not found */\n event: Event | null;\n /** Whether the data is currently loading */\n isLoading: boolean;\n /** Any error that occurred during loading */\n error: Error | null;\n /** Function to manually refetch the data */\n refetch: () => Promise<void>;\n}\n\nexport interface UsePublicEventOptions {\n /** Cache TTL in milliseconds (default: 5 minutes) */\n cacheTtl?: number;\n /** Whether to enable caching (default: true) */\n enableCache?: boolean;\n}\n\n/**\n * Hook for accessing public event data by event_code\n * \n * This hook provides access to public event information without requiring\n * authentication. It includes caching, error handling, and loading states.\n * \n * @param eventCode - The event code to look up\n * @param options - Configuration options for caching and behavior\n * @returns Object containing event data, loading state, error, and refetch function\n */\nexport function usePublicEvent(\n eventCode: string,\n options: UsePublicEventOptions = {}\n): UsePublicEventReturn {\n const {\n cacheTtl = 5 * 60 * 1000, // 5 minutes\n enableCache = true\n } = options;\n\n const [event, setEvent] = useState<Event | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Get environment variables from public page context or fallback to direct access\n let environment: { supabaseUrl: string | null; supabaseKey: string | null };\n \n try {\n environment = usePublicPageContext().environment;\n } catch {\n // Fallback to direct environment variable access if not in PublicPageProvider\n environment = {\n supabaseUrl: (import.meta as any).env?.VITE_SUPABASE_URL || (import.meta as any).env?.NEXT_PUBLIC_SUPABASE_URL || null,\n supabaseKey: (import.meta as any).env?.VITE_SUPABASE_ANON_KEY || (import.meta as any).env?.NEXT_PUBLIC_SUPABASE_ANON_KEY || null\n };\n }\n \n // Create a simple Supabase client for public access\n const supabase = useMemo(() => {\n if (typeof window === 'undefined') return null;\n \n if (!environment.supabaseUrl || !environment.supabaseKey) {\n console.warn('[usePublicEvent] Missing Supabase environment variables. Please ensure VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY are set in your environment.');\n return null;\n }\n\n return createClient<Database>(environment.supabaseUrl, environment.supabaseKey);\n }, [environment.supabaseUrl, environment.supabaseKey]);\n\n // Helper function to try refreshing schema cache\n const refreshSchemaCache = useCallback(async () => {\n try {\n // Try to trigger a schema refresh by querying a system table\n await (supabase as any).from('information_schema.routines').select('routine_name').limit(1);\n } catch (error) {\n // Ignore errors, this is just an attempt to refresh cache\n console.debug('[usePublicEvent] Schema cache refresh attempt failed:', error);\n }\n }, [supabase]);\n\n const fetchEvent = useCallback(async (): Promise<void> => {\n if (!eventCode || !supabase) {\n setError(new Error('Invalid event code or Supabase client not available'));\n setIsLoading(false);\n return;\n }\n\n // Check cache first\n const cacheKey = `public_event_${eventCode}`;\n if (enableCache) {\n const cached = publicDataCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < cached.ttl) {\n setEvent(cached.data);\n setIsLoading(false);\n setError(null);\n return;\n }\n }\n\n try {\n setIsLoading(true);\n setError(null);\n\n let eventData: any = null;\n\n try {\n // Try to call the public event RPC function first\n const { data, error: rpcError } = await (supabase as any).rpc('get_public_event_by_code', {\n event_code_param: eventCode\n });\n\n if (rpcError) {\n // If RPC function doesn't exist or schema cache issue, try refresh first, then fallback\n if (rpcError.message?.includes('Could not find the function') || \n rpcError.message?.includes('does not exist') ||\n rpcError.message?.includes('schema cache')) {\n console.warn('[usePublicEvent] RPC function not found or schema cache issue, attempting refresh:', rpcError.message);\n \n // Try to refresh schema cache first\n await refreshSchemaCache();\n \n // Try RPC call one more time after refresh\n try {\n const { data: retryData, error: retryError } = await (supabase as any).rpc('get_public_event_by_code', {\n event_code_param: eventCode\n });\n \n if (!retryError && retryData && retryData.length > 0) {\n eventData = retryData[0];\n } else {\n throw new Error('RPC still failing after cache refresh');\n }\n } catch (retryError) {\n console.warn('[usePublicEvent] RPC still failing after cache refresh, falling back to direct table access');\n \n // Fallback: Direct table access with public RLS policy\n const { data: tableData, error: tableError } = await (supabase as any)\n .from('event')\n .select(`\n event_id,\n event_name,\n event_date,\n event_venue,\n event_participants,\n event_colours,\n organisation_id,\n event_days,\n event_typicalunit,\n event_rounddown,\n event_youthmultiplier,\n event_catering_email,\n event_news,\n event_billing,\n event_footer,\n event_email\n `)\n .eq('event_code', eventCode)\n .eq('is_visible', true)\n .not('organisation_id', 'is', null)\n .limit(1)\n .single();\n\n if (tableError) {\n throw new Error(tableError.message || 'Failed to fetch event from table');\n }\n\n if (!tableData) {\n setEvent(null);\n setError(new Error('Event not found'));\n return;\n }\n\n // Get event logo from file_references\n const { data: logoData } = await (supabase as any)\n .from('file_references')\n .select('file_path')\n .eq('table_name', 'event')\n .eq('record_id', tableData.event_id)\n .eq('is_public', true)\n .eq('file_metadata->>category', 'event_logos')\n .limit(1)\n .single();\n\n eventData = {\n ...tableData,\n event_logo: logoData?.file_path || null\n };\n }\n } else {\n throw new Error(rpcError.message || 'Failed to fetch event');\n }\n } else {\n if (!data || data.length === 0 || !data[0]) {\n setEvent(null);\n setError(new Error('Event not found'));\n return;\n }\n eventData = data[0];\n }\n } catch (rpcError) {\n // If RPC call fails for any reason (including schema cache issues), try direct table access\n console.warn('[usePublicEvent] RPC call failed, falling back to direct table access:', rpcError);\n \n const { data: tableData, error: tableError } = await (supabase as any)\n .from('event')\n .select(`\n event_id,\n event_name,\n event_date,\n event_venue,\n event_participants,\n event_colours,\n organisation_id,\n event_days,\n event_typicalunit,\n event_rounddown,\n event_youthmultiplier,\n event_catering_email,\n event_news,\n event_billing,\n event_footer,\n event_email\n `)\n .eq('event_code', eventCode)\n .eq('is_visible', true)\n .not('organisation_id', 'is', null)\n .limit(1)\n .single();\n\n if (tableError) {\n throw new Error(tableError.message || 'Failed to fetch event from table');\n }\n\n if (!tableData) {\n setEvent(null);\n setError(new Error('Event not found'));\n return;\n }\n\n // Get event logo from file_references\n const { data: logoData } = await (supabase as any)\n .from('file_references')\n .select('file_path')\n .eq('table_name', 'event')\n .eq('record_id', tableData.event_id)\n .eq('is_public', true)\n .eq('file_metadata->>category', 'event_logos')\n .limit(1)\n .single();\n\n eventData = {\n ...tableData,\n event_logo: logoData?.file_path || null\n };\n }\n \n // Transform to Event type\n const transformedEvent: Event = {\n id: eventData.event_id,\n event_id: eventData.event_id,\n event_name: eventData.event_name,\n event_code: eventCode,\n event_date: eventData.event_date,\n event_venue: eventData.event_venue,\n event_participants: eventData.event_participants,\n event_logo: eventData.event_logo,\n event_colours: eventData.event_colours,\n organisation_id: eventData.organisation_id,\n is_visible: true,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n // Legacy compatibility\n name: eventData.event_name,\n start_date: eventData.event_date\n };\n\n setEvent(transformedEvent);\n\n // Cache the result\n if (enableCache) {\n publicDataCache.set(cacheKey, {\n data: transformedEvent,\n timestamp: Date.now(),\n ttl: cacheTtl\n });\n }\n\n } catch (err) {\n console.error('[usePublicEvent] Error fetching event:', err);\n const error = err instanceof Error ? err : new Error('Unknown error occurred');\n setError(error);\n setEvent(null);\n } finally {\n setIsLoading(false);\n }\n }, [eventCode, supabase, cacheTtl, enableCache]);\n\n // Fetch event when eventCode changes\n useEffect(() => {\n fetchEvent();\n }, [fetchEvent]);\n\n const refetch = useCallback(async (): Promise<void> => {\n // Clear cache for this event\n if (enableCache) {\n const cacheKey = `public_event_${eventCode}`;\n publicDataCache.delete(cacheKey);\n }\n await fetchEvent();\n }, [fetchEvent, eventCode, enableCache]);\n\n return {\n event,\n isLoading,\n error,\n refetch\n };\n}\n\n/**\n * Clear all cached public event data\n * Useful for testing or when you need to force refresh all data\n */\nexport function clearPublicEventCache(): void {\n for (const [key] of publicDataCache) {\n if (key.startsWith('public_event_')) {\n publicDataCache.delete(key);\n }\n }\n}\n\n/**\n * Get cache statistics for debugging\n */\nexport function getPublicEventCacheStats(): { size: number; keys: string[] } {\n const keys = Array.from(publicDataCache.keys()).filter(key => key.startsWith('public_event_'));\n return {\n size: keys.length,\n keys\n };\n}\n","/**\n * @file Public Route Params Hook\n * @package @jmruthers/pace-core\n * @module Hooks/Public\n * @since 1.0.0\n *\n * A React hook for extracting and validating public route parameters.\n * Provides event code extraction and validation for public pages.\n *\n * Features:\n * - URL parameter extraction\n * - Event code validation\n * - TypeScript support\n * - Error handling\n * - Route pattern support\n *\n * @example\n * ```tsx\n * import { usePublicRouteParams } from '@jmruthers/pace-core';\n *\n * function PublicEventPage() {\n * const { eventCode, eventId, event, error, isLoading } = usePublicRouteParams();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!event) return <div>Event not found</div>;\n *\n * return (\n * <div>\n * <h1>{event.event_name}</h1>\n * <p>Event Code: {eventCode}</p>\n * </div>\n * );\n * }\n * ```\n *\n * @accessibility\n * - No direct accessibility concerns (hook)\n * - Enables accessible route parameter handling\n * - Supports screen reader friendly error states\n *\n * @security\n * - Validates event codes before processing\n * - Sanitizes URL parameters\n * - No sensitive information exposed\n * - Rate limiting applied at route level\n *\n * @performance\n * - Minimal re-renders with stable references\n * - Efficient parameter extraction\n * - Caching integration\n *\n * @dependencies\n * - React 18+ - Hooks and effects\n * - React Router - URL parameter extraction\n * - Event types - Type definitions\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useParams, useLocation } from 'react-router-dom';\nimport type { Event } from '../../types/unified';\nimport { usePublicEvent } from './usePublicEvent';\n\nexport interface UsePublicRouteParamsReturn {\n /** The event code from the URL */\n eventCode: string | null;\n /** The event ID (resolved from event code) */\n eventId: string | null;\n /** The full event object */\n event: Event | null;\n /** Whether the route parameters are being processed */\n isLoading: boolean;\n /** Any error that occurred during processing */\n error: Error | null;\n /** Function to manually refetch the event data */\n refetch: () => Promise<void>;\n}\n\ninterface UsePublicRouteParamsOptions {\n /** Whether to automatically fetch event data (default: true) */\n fetchEventData?: boolean;\n /** Custom event code parameter name (default: 'eventCode') */\n eventCodeParam?: string;\n /** Whether to validate event code format (default: true) */\n validateEventCode?: boolean;\n}\n\n/**\n * Validate event code format\n * Event codes should be alphanumeric with optional hyphens/underscores\n */\nfunction validateEventCodeFormat(eventCode: string): boolean {\n if (!eventCode || typeof eventCode !== 'string') return false;\n \n // Allow alphanumeric characters, hyphens, and underscores\n // Length between 3 and 50 characters\n const eventCodeRegex = /^[a-zA-Z0-9_-]{3,50}$/;\n return eventCodeRegex.test(eventCode);\n}\n\n/**\n * Hook for extracting and validating public route parameters\n * \n * This hook extracts event codes from URL parameters and optionally\n * fetches the corresponding event data. It provides validation and\n * error handling for public routes.\n * \n * @param options - Configuration options for behavior\n * @returns Object containing route parameters, event data, loading state, error, and refetch function\n */\nexport function usePublicRouteParams(\n options: UsePublicRouteParamsOptions = {}\n): UsePublicRouteParamsReturn {\n const {\n fetchEventData = true,\n eventCodeParam = 'eventCode',\n validateEventCode = true\n } = options;\n\n const params = useParams();\n const location = useLocation();\n \n const [error, setError] = useState<Error | null>(null);\n\n // Extract event code from URL parameters\n const eventCode = useMemo(() => {\n const code = params[eventCodeParam] as string;\n \n if (!code) {\n // Don't set error immediately - let the component handle missing eventCode gracefully\n return null;\n }\n\n // Validate event code format if requested\n if (validateEventCode && !validateEventCodeFormat(code)) {\n setError(new Error(`Invalid event code format: ${code}`));\n return null;\n }\n\n setError(null);\n return code;\n }, [params, eventCodeParam, validateEventCode]);\n\n // Use the public event hook to fetch event data\n const {\n event,\n isLoading: eventLoading,\n error: eventError,\n refetch: refetchEvent\n } = usePublicEvent(eventCode || '', {\n enableCache: true,\n cacheTtl: 5 * 60 * 1000 // 5 minutes\n });\n\n // Determine if we should show loading state\n const isLoading = useMemo(() => {\n if (!fetchEventData) return false;\n return eventLoading;\n }, [fetchEventData, eventLoading]);\n\n // Determine the final error state\n const finalError = useMemo(() => {\n if (error) return error;\n if (eventError) return eventError;\n return null;\n }, [error, eventError]);\n\n // Extract event ID from event data\n const eventId = useMemo(() => {\n if (!event) return null;\n return event.event_id || event.id;\n }, [event]);\n\n // Refetch function\n const refetch = useCallback(async (): Promise<void> => {\n if (!fetchEventData) return;\n await refetchEvent();\n }, [fetchEventData, refetchEvent]);\n\n // Log route access for debugging\n useEffect(() => {\n if (eventCode && event) {\n console.log('[usePublicRouteParams] Public route accessed:', {\n eventCode,\n eventId: event.event_id,\n eventName: event.event_name,\n path: location.pathname\n });\n }\n }, [eventCode, event, location.pathname]);\n\n return {\n eventCode,\n eventId,\n event: fetchEventData ? event : null,\n isLoading,\n error: finalError,\n refetch\n };\n}\n\n/**\n * Hook for extracting just the event code without fetching event data\n * Useful when you only need the event code and will fetch data separately\n */\nexport function usePublicEventCode(\n eventCodeParam: string = 'eventCode'\n): { eventCode: string | null; error: Error | null } {\n const params = useParams();\n \n const eventCode = useMemo(() => {\n const code = params[eventCodeParam] as string;\n \n if (!code) {\n return null;\n }\n\n // Validate event code format\n if (!validateEventCodeFormat(code)) {\n return null;\n }\n\n return code;\n }, [params, eventCodeParam]);\n\n const error = useMemo(() => {\n if (!eventCode) {\n return new Error(`Event code parameter '${eventCodeParam}' not found or invalid`);\n }\n return null;\n }, [eventCode, eventCodeParam]);\n\n return {\n eventCode,\n error\n };\n}\n\n/**\n * Utility function to generate public route paths\n */\nexport function generatePublicRoutePath(\n eventCode: string,\n pageName: string = 'index'\n): string {\n if (!eventCode || !validateEventCodeFormat(eventCode)) {\n throw new Error('Invalid event code for route generation');\n }\n \n return `/public/event/${eventCode}/${pageName}`;\n}\n\n/**\n * Utility function to extract event code from a public route path\n */\nexport function extractEventCodeFromPath(path: string): string | null {\n const match = path.match(/^\\/public\\/event\\/([a-zA-Z0-9_-]{3,50})(?:\\/.*)?$/);\n return match ? match[1] : null;\n}\n"],"mappings":"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","names":["useMemo","useCallback","useMemo","useMemo","useCallback","error","useState","useEffect","useCallback","useMemo","useState","useMemo","useCallback","useEffect"]}
@@ -7891,4 +7891,4 @@ lodash/lodash.js:
7891
7891
  * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
7892
7892
  *)
7893
7893
  */
7894
- //# sourceMappingURL=chunk-T2MQY57J.js.map
7894
+ //# sourceMappingURL=chunk-MOJXHWDE.js.map