@payez/next-mvp 4.1.8 → 4.1.9
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/README.md +792 -792
- package/dist/auth/better-auth.js +15 -3
- package/dist/components/account/MobileNavDrawer.js +18 -18
- package/dist/components/account/UserAvatarMenu.js +1 -1
- package/dist/components/admin/AlertSettingsTab.js +40 -40
- package/dist/components/admin/LoggingSettingsTab.js +28 -28
- package/dist/lib/idp-fetch.js +9 -25
- package/dist/pages/login/page.js +28 -28
- package/dist/pages/settings/EnhancedSettingsPage.js +17 -17
- package/package.json +1 -1
- package/scripts/dev-broker.ps1 +35 -35
- package/scripts/dev-local.ps1 +45 -45
- package/src/api/auth-handler.ts +548 -548
- package/src/api-handlers/account/change-password.ts +142 -142
- package/src/api-handlers/account/update-phone.ts +79 -79
- package/src/api-handlers/account/verify-email.ts +125 -125
- package/src/api-handlers/account/verify-sms.ts +125 -125
- package/src/api-handlers/admin/analytics.ts +443 -443
- package/src/api-handlers/admin/audit.ts +223 -223
- package/src/api-handlers/admin/index.ts +63 -63
- package/src/api-handlers/admin/redis-sessions.ts +251 -251
- package/src/api-handlers/admin/sessions.ts +318 -318
- package/src/api-handlers/admin/site-logs.ts +365 -365
- package/src/api-handlers/admin/users.ts +242 -242
- package/src/api-handlers/admin/vibe-data.ts +324 -324
- package/src/api-handlers/auth/refresh.ts +682 -682
- package/src/api-handlers/auth/signout.ts +199 -199
- package/src/api-handlers/auth/status.ts +20 -20
- package/src/api-handlers/auth/update-session.ts +110 -110
- package/src/api-handlers/auth/verify-code.ts +112 -112
- package/src/api-handlers/session/refresh-viability.ts +36 -36
- package/src/api-handlers/test/force-expire.ts +60 -60
- package/src/auth/auth-decision.ts +229 -229
- package/src/auth/better-auth.ts +15 -3
- package/src/auth/route-config.ts +219 -219
- package/src/auth/types/auth-types.ts +555 -555
- package/src/auth/types/index.ts +7 -7
- package/src/auth/utils/idp-client.ts +445 -445
- package/src/auth/utils/index.ts +6 -6
- package/src/auth/utils/token-utils.ts +243 -243
- package/src/client/AuthContext.tsx +143 -143
- package/src/client/fetch-with-auth.ts +47 -47
- package/src/components/SessionSync.tsx +138 -138
- package/src/components/SignalRHealthCheck.tsx +131 -131
- package/src/components/account/MobileNavDrawer.tsx +305 -305
- package/src/components/account/UserAvatarMenu.tsx +266 -266
- package/src/components/account/index.ts +13 -13
- package/src/components/admin/AlertSettingsTab.tsx +728 -728
- package/src/components/admin/AnalyticsTab.tsx +703 -703
- package/src/components/admin/DataBrowserTab.tsx +505 -505
- package/src/components/admin/LoggingSettingsTab.tsx +665 -665
- package/src/components/admin/SessionsTab.tsx +414 -414
- package/src/components/admin/StatsTab.tsx +379 -379
- package/src/components/admin/VibeAdminLayout.tsx +187 -187
- package/src/components/admin/index.ts +59 -59
- package/src/components/auth/FederatedAuthSection.tsx +95 -95
- package/src/components/auth/ModeAwareLoginPage.tsx +135 -135
- package/src/components/auth/ModeAwareSignupPage.tsx +267 -267
- package/src/components/auth/TraditionalAuthSection.tsx +99 -99
- package/src/components/recovery/CompleteStep.tsx +36 -36
- package/src/components/recovery/InitiateRecoveryStep.tsx +68 -68
- package/src/components/recovery/SelectMethodStep.tsx +73 -73
- package/src/components/recovery/SetPasswordStep.tsx +97 -97
- package/src/components/recovery/VerifyCodeStep.tsx +90 -90
- package/src/components/reserved/ReservedRecoveryWarning.tsx +160 -160
- package/src/components/reserved/ReservedStatusBox.tsx +118 -118
- package/src/components/ui/BetaBadge.tsx +58 -58
- package/src/components/ui/Footer.tsx +93 -93
- package/src/config/env.ts +57 -57
- package/src/config/logger.ts +62 -62
- package/src/config/vibe-log-transport.ts +264 -264
- package/src/hooks/useAuth.ts +117 -117
- package/src/hooks/useAuthSettings.ts +97 -97
- package/src/hooks/useAvailableProviders.ts +120 -120
- package/src/hooks/usePasswordValidation.ts +127 -127
- package/src/hooks/usePublicAuthSettings.ts +149 -149
- package/src/hooks/useSessionExpiration.ts +101 -101
- package/src/hooks/useViabilitySession.ts +336 -336
- package/src/index.ts +60 -60
- package/src/lib/api-handler.ts +643 -643
- package/src/lib/app-slug.ts +178 -178
- package/src/lib/geolocation.ts +265 -265
- package/src/lib/idp-fetch.ts +10 -26
- package/src/lib/jwt-decode.ts +82 -82
- package/src/lib/roles.ts +177 -177
- package/src/lib/site-logger.ts +245 -245
- package/src/lib/standardized-client-api.ts +901 -901
- package/src/lib/test-aware-get-token.ts +41 -41
- package/src/lib/user-agent-parser.ts +252 -252
- package/src/logging/api/admin-analytics.ts +51 -51
- package/src/logging/api/audit-log.ts +53 -53
- package/src/logging/components/AdminAnalyticsLayout.tsx +49 -49
- package/src/logging/components/AuditLogViewer.tsx +125 -125
- package/src/logging/components/ErrorMetricsCard.tsx +98 -98
- package/src/logging/components/HealthMetricsCard.tsx +70 -70
- package/src/logging/hooks/useAdminAnalytics.ts +22 -22
- package/src/logging/hooks/useAuditLog.ts +24 -24
- package/src/logging/hooks/useErrorMetrics.ts +40 -40
- package/src/logging/hooks/useHealthMetrics.ts +44 -44
- package/src/logging/index.ts +18 -18
- package/src/logging/types/analytics.ts +81 -81
- package/src/logging/types/audit.ts +31 -31
- package/src/logging/types/index.ts +3 -3
- package/src/middleware/create-middleware.ts +663 -663
- package/src/middleware/rbac-check.ts +279 -279
- package/src/middleware/twofa-presets.ts +224 -224
- package/src/pages/admin-login/page.tsx +221 -221
- package/src/pages/admin-page-permissions/PagePermissionsAdminPage.tsx +527 -527
- package/src/pages/admin-page-permissions/index.ts +7 -7
- package/src/pages/admin-roles/RolesAdminPage.tsx +533 -533
- package/src/pages/admin-roles/modals.tsx +469 -469
- package/src/pages/client-admin/ClientSiteAdminPage.tsx +382 -382
- package/src/pages/client-admin/index.ts +33 -33
- package/src/pages/coming-soon/page.tsx +83 -83
- package/src/pages/login/page.tsx +456 -456
- package/src/pages/profile/EnhancedProfilePage.tsx +485 -485
- package/src/pages/profile/index.ts +9 -9
- package/src/pages/profile/page.tsx +166 -166
- package/src/pages/recovery/page.tsx +234 -234
- package/src/pages/roles/MyRolesPage.tsx +211 -211
- package/src/pages/roles/components.tsx +294 -294
- package/src/pages/roles/index.ts +17 -17
- package/src/pages/security/EnhancedSecurityPage.tsx +565 -565
- package/src/pages/security/index.ts +9 -9
- package/src/pages/security/page.tsx +507 -507
- package/src/pages/settings/EnhancedSettingsPage.tsx +642 -642
- package/src/pages/settings/index.ts +9 -9
- package/src/pages/settings/page.tsx +47 -47
- package/src/pages/showcase/ShowcasePage.tsx +532 -532
- package/src/pages/showcase/index.ts +13 -13
- package/src/pages/test-env/EmergencyLogoutPage.tsx +180 -180
- package/src/pages/test-env/JwtInspectPage.tsx +456 -456
- package/src/pages/test-env/RefreshTokenPage.tsx +157 -157
- package/src/pages/test-env/TestEnvPage.tsx +118 -118
- package/src/pages/test-env/index.ts +25 -25
- package/src/pages/verify-code/page.tsx +652 -652
- package/src/routes/account/update-phone.ts +13 -13
- package/src/routes/auth/logout.ts +108 -108
- package/src/routes/auth/nextauth.ts +45 -45
- package/src/routes/auth/settings.ts +75 -75
- package/src/routes/auth/viability.ts +224 -224
- package/src/server/auth-guard.ts +170 -170
- package/src/server/slim-middleware.ts +117 -117
- package/src/server/with-auth.ts +93 -93
- package/src/stores/authStore.ts +1899 -1899
- package/src/templates/instrumentation.ts +41 -41
- package/src/utils/logout.ts +30 -30
- package/src/vibe/client.ts +590 -590
- package/src/vibe/enterprise-auth.ts +208 -208
- package/src/vibe/errors.ts +185 -185
- package/src/vibe/generic.ts +431 -431
- package/src/vibe/hooks/index.ts +367 -367
- package/src/vibe/index.ts +132 -132
- package/src/vibe/sessions.ts +551 -551
- package/src/vibe/types.ts +577 -577
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hook to detect and handle stale/expired sessions during 2FA flow
|
|
3
|
-
*
|
|
4
|
-
* Use this in verify-code pages to automatically redirect to login
|
|
5
|
-
* when the provisional bearer token has expired.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```tsx
|
|
9
|
-
* import { useSessionExpiration } from '@payez/next-mvp/hooks/useSessionExpiration';
|
|
10
|
-
*
|
|
11
|
-
* function VerifyCodePage() {
|
|
12
|
-
* const { data: session } = useSession();
|
|
13
|
-
* const router = useRouter();
|
|
14
|
-
* const searchParams = useSearchParams();
|
|
15
|
-
* const [error, setError] = useState<string | null>(null);
|
|
16
|
-
*
|
|
17
|
-
* const callbackUrl = searchParams?.get('callbackUrl') || '/dashboard';
|
|
18
|
-
*
|
|
19
|
-
* // Automatically handles session expiration
|
|
20
|
-
* const sessionValid = useSessionExpiration({
|
|
21
|
-
* session,
|
|
22
|
-
* router,
|
|
23
|
-
* callbackUrl,
|
|
24
|
-
* onExpired: (message) => setError(message)
|
|
25
|
-
* });
|
|
26
|
-
*
|
|
27
|
-
* if (!sessionValid) return null; // Will redirect
|
|
28
|
-
* // ... rest of component
|
|
29
|
-
* }
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
import { useEffect } from 'react';
|
|
34
|
-
import { authClient } from '../client/better-auth-client';
|
|
35
|
-
|
|
36
|
-
export interface UseSessionExpirationOptions {
|
|
37
|
-
/** Session object */
|
|
38
|
-
session: any | null | undefined;
|
|
39
|
-
/** Next.js router for navigation */
|
|
40
|
-
router: {
|
|
41
|
-
push: (url: string) => void;
|
|
42
|
-
};
|
|
43
|
-
/** URL to redirect to after login */
|
|
44
|
-
callbackUrl?: string;
|
|
45
|
-
/** Callback when session expires - use to set error state */
|
|
46
|
-
onExpired?: (message: string) => void;
|
|
47
|
-
/** Delay before redirect in milliseconds (default: 1500) */
|
|
48
|
-
redirectDelay?: number;
|
|
49
|
-
/** Custom redirect URL (default: /account-auth/login) */
|
|
50
|
-
loginUrl?: string;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Detects stale sessions and redirects to login
|
|
55
|
-
*
|
|
56
|
-
* Returns:
|
|
57
|
-
* - `true` if session is valid (has accessToken)
|
|
58
|
-
* - `false` if session is loading (no session yet)
|
|
59
|
-
* - `null` if session is stale (will trigger redirect)
|
|
60
|
-
*/
|
|
61
|
-
export function useSessionExpiration({
|
|
62
|
-
session,
|
|
63
|
-
router,
|
|
64
|
-
callbackUrl = '/dashboard',
|
|
65
|
-
onExpired,
|
|
66
|
-
redirectDelay = 1500,
|
|
67
|
-
loginUrl = '/account-auth/login'
|
|
68
|
-
}: UseSessionExpirationOptions): boolean | null {
|
|
69
|
-
useEffect(() => {
|
|
70
|
-
// If session exists but no accessToken, the token is stale/expired
|
|
71
|
-
if (session && !(session as any).accessToken) {
|
|
72
|
-
const message = 'Your session has expired. Redirecting to login...';
|
|
73
|
-
if (onExpired) {
|
|
74
|
-
onExpired(message);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
setTimeout(async () => {
|
|
78
|
-
// Clear the session before redirecting
|
|
79
|
-
await authClient.signOut();
|
|
80
|
-
|
|
81
|
-
const params = new URLSearchParams({
|
|
82
|
-
callbackUrl,
|
|
83
|
-
error: 'SessionExpired'
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
router.push(`${loginUrl}?${params.toString()}`);
|
|
87
|
-
}, redirectDelay);
|
|
88
|
-
}
|
|
89
|
-
}, [session, router, callbackUrl, onExpired, redirectDelay, loginUrl]);
|
|
90
|
-
|
|
91
|
-
// Return session validity state
|
|
92
|
-
if (session && !(session as any).accessToken) {
|
|
93
|
-
return null; // Stale session - will redirect
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if ((session as any)?.accessToken) {
|
|
97
|
-
return true; // Valid session
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return false; // No session yet - loading
|
|
101
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Hook to detect and handle stale/expired sessions during 2FA flow
|
|
3
|
+
*
|
|
4
|
+
* Use this in verify-code pages to automatically redirect to login
|
|
5
|
+
* when the provisional bearer token has expired.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* import { useSessionExpiration } from '@payez/next-mvp/hooks/useSessionExpiration';
|
|
10
|
+
*
|
|
11
|
+
* function VerifyCodePage() {
|
|
12
|
+
* const { data: session } = useSession();
|
|
13
|
+
* const router = useRouter();
|
|
14
|
+
* const searchParams = useSearchParams();
|
|
15
|
+
* const [error, setError] = useState<string | null>(null);
|
|
16
|
+
*
|
|
17
|
+
* const callbackUrl = searchParams?.get('callbackUrl') || '/dashboard';
|
|
18
|
+
*
|
|
19
|
+
* // Automatically handles session expiration
|
|
20
|
+
* const sessionValid = useSessionExpiration({
|
|
21
|
+
* session,
|
|
22
|
+
* router,
|
|
23
|
+
* callbackUrl,
|
|
24
|
+
* onExpired: (message) => setError(message)
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* if (!sessionValid) return null; // Will redirect
|
|
28
|
+
* // ... rest of component
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import { useEffect } from 'react';
|
|
34
|
+
import { authClient } from '../client/better-auth-client';
|
|
35
|
+
|
|
36
|
+
export interface UseSessionExpirationOptions {
|
|
37
|
+
/** Session object */
|
|
38
|
+
session: any | null | undefined;
|
|
39
|
+
/** Next.js router for navigation */
|
|
40
|
+
router: {
|
|
41
|
+
push: (url: string) => void;
|
|
42
|
+
};
|
|
43
|
+
/** URL to redirect to after login */
|
|
44
|
+
callbackUrl?: string;
|
|
45
|
+
/** Callback when session expires - use to set error state */
|
|
46
|
+
onExpired?: (message: string) => void;
|
|
47
|
+
/** Delay before redirect in milliseconds (default: 1500) */
|
|
48
|
+
redirectDelay?: number;
|
|
49
|
+
/** Custom redirect URL (default: /account-auth/login) */
|
|
50
|
+
loginUrl?: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Detects stale sessions and redirects to login
|
|
55
|
+
*
|
|
56
|
+
* Returns:
|
|
57
|
+
* - `true` if session is valid (has accessToken)
|
|
58
|
+
* - `false` if session is loading (no session yet)
|
|
59
|
+
* - `null` if session is stale (will trigger redirect)
|
|
60
|
+
*/
|
|
61
|
+
export function useSessionExpiration({
|
|
62
|
+
session,
|
|
63
|
+
router,
|
|
64
|
+
callbackUrl = '/dashboard',
|
|
65
|
+
onExpired,
|
|
66
|
+
redirectDelay = 1500,
|
|
67
|
+
loginUrl = '/account-auth/login'
|
|
68
|
+
}: UseSessionExpirationOptions): boolean | null {
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
// If session exists but no accessToken, the token is stale/expired
|
|
71
|
+
if (session && !(session as any).accessToken) {
|
|
72
|
+
const message = 'Your session has expired. Redirecting to login...';
|
|
73
|
+
if (onExpired) {
|
|
74
|
+
onExpired(message);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
setTimeout(async () => {
|
|
78
|
+
// Clear the session before redirecting
|
|
79
|
+
await authClient.signOut();
|
|
80
|
+
|
|
81
|
+
const params = new URLSearchParams({
|
|
82
|
+
callbackUrl,
|
|
83
|
+
error: 'SessionExpired'
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
router.push(`${loginUrl}?${params.toString()}`);
|
|
87
|
+
}, redirectDelay);
|
|
88
|
+
}
|
|
89
|
+
}, [session, router, callbackUrl, onExpired, redirectDelay, loginUrl]);
|
|
90
|
+
|
|
91
|
+
// Return session validity state
|
|
92
|
+
if (session && !(session as any).accessToken) {
|
|
93
|
+
return null; // Stale session - will redirect
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if ((session as any)?.accessToken) {
|
|
97
|
+
return true; // Valid session
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return false; // No session yet - loading
|
|
101
|
+
}
|