@artatol-acp/auth-nextjs 0.3.6 → 0.3.8
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/client/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type ACPAuthContextValue = {
|
|
|
5
5
|
isLoading: boolean;
|
|
6
6
|
login: (email: string, password: string) => Promise<void>;
|
|
7
7
|
logout: () => Promise<void>;
|
|
8
|
-
refresh: () => Promise<
|
|
8
|
+
refresh: () => Promise<boolean>;
|
|
9
9
|
resendVerification: (email: string) => Promise<void>;
|
|
10
10
|
};
|
|
11
11
|
export type ACPAuthProviderProps = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAuE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5G,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAIF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,oBAAoB,2CAuF1E;AAED,wBAAgB,OAAO,IAAI,mBAAmB,CAM7C;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,mBAAmB,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/** @jsxImportSource react */
|
|
2
|
+
'use client';
|
|
3
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
4
|
+
import { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
5
|
+
import { createContext, useContext, useState, useEffect, useRef, useCallback } from 'react';
|
|
6
|
+
const ACPAuthContext = createContext(null);
|
|
7
|
+
export function ACPAuthProvider({ children, baseUrl }) {
|
|
8
|
+
const [user, setUser] = useState(null);
|
|
9
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
10
|
+
const clientRef = useRef(new ACPAuthClient({
|
|
11
|
+
baseUrl,
|
|
12
|
+
apiKey: '',
|
|
13
|
+
autoRefresh: true,
|
|
14
|
+
refreshThresholdSeconds: 60
|
|
15
|
+
}));
|
|
16
|
+
const intervalRef = useRef(null);
|
|
17
|
+
const clearRefreshInterval = useCallback(() => {
|
|
18
|
+
if (intervalRef.current) {
|
|
19
|
+
clearInterval(intervalRef.current);
|
|
20
|
+
intervalRef.current = null;
|
|
21
|
+
}
|
|
22
|
+
}, []);
|
|
23
|
+
const refresh = useCallback(async () => {
|
|
24
|
+
try {
|
|
25
|
+
await clientRef.current.refresh();
|
|
26
|
+
const userData = await clientRef.current.me();
|
|
27
|
+
setUser(userData);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}, []);
|
|
34
|
+
const login = useCallback(async (email, password) => {
|
|
35
|
+
const result = await clientRef.current.login({ email, password });
|
|
36
|
+
if ('requiresTwoFactor' in result) {
|
|
37
|
+
throw new Error('2FA_REQUIRED');
|
|
38
|
+
}
|
|
39
|
+
// User logged in successfully, token is automatically set in client
|
|
40
|
+
setUser(result.user);
|
|
41
|
+
}, []);
|
|
42
|
+
const logout = useCallback(async () => {
|
|
43
|
+
// First clear the interval to prevent race conditions
|
|
44
|
+
clearRefreshInterval();
|
|
45
|
+
// Then clear user state
|
|
46
|
+
setUser(null);
|
|
47
|
+
// Finally call logout API
|
|
48
|
+
try {
|
|
49
|
+
await clientRef.current.logout();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Ignore logout errors, user is already logged out locally
|
|
53
|
+
}
|
|
54
|
+
}, [clearRefreshInterval]);
|
|
55
|
+
const resendVerification = useCallback(async (email) => {
|
|
56
|
+
await clientRef.current.resendVerificationEmail({ email });
|
|
57
|
+
}, []);
|
|
58
|
+
// Initial session restore
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
refresh().finally(() => setIsLoading(false));
|
|
61
|
+
}, [refresh]);
|
|
62
|
+
// Auto-refresh interval
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (!user) {
|
|
65
|
+
clearRefreshInterval();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const REFRESH_INTERVAL = 4 * 60 * 1000; // 4 minutes
|
|
69
|
+
intervalRef.current = setInterval(() => {
|
|
70
|
+
refresh().then(success => {
|
|
71
|
+
if (!success) {
|
|
72
|
+
clearRefreshInterval();
|
|
73
|
+
setUser(null);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}, REFRESH_INTERVAL);
|
|
77
|
+
return clearRefreshInterval;
|
|
78
|
+
}, [user, refresh, clearRefreshInterval]);
|
|
79
|
+
return (_jsx(ACPAuthContext.Provider, { value: { user, isLoading, login, logout, refresh, resendVerification }, children: children }));
|
|
80
|
+
}
|
|
81
|
+
export function useAuth() {
|
|
82
|
+
const context = useContext(ACPAuthContext);
|
|
83
|
+
if (!context) {
|
|
84
|
+
throw new Error('useAuth must be used within ACPAuthProvider');
|
|
85
|
+
}
|
|
86
|
+
return context;
|
|
87
|
+
}
|
|
88
|
+
// Re-export client for direct use
|
|
89
|
+
export { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
90
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@artatol-acp/auth-nextjs",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.8",
|
|
4
4
|
"description": "Next.js SDK for Artatol Cloud Platform Authentication with support for App Router, Server Actions, and Middleware",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"types": "./dist/server/index.d.ts"
|
|
16
16
|
},
|
|
17
17
|
"./client": {
|
|
18
|
-
"import": "./dist/client/index.
|
|
18
|
+
"import": "./dist/client/index.js",
|
|
19
19
|
"types": "./dist/client/index.d.ts"
|
|
20
20
|
},
|
|
21
21
|
"./middleware": {
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
"author": "Artatol",
|
|
38
38
|
"license": "MIT",
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"next": "^14.0.0 || ^15.0.0",
|
|
40
|
+
"next": "^14.0.0 || ^15.0.0 || ^16.0.0",
|
|
41
41
|
"react": "^18.0.0 || ^19.0.0"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@artatol-acp/auth-js": "^0.3.
|
|
44
|
+
"@artatol-acp/auth-js": "^0.3.7",
|
|
45
45
|
"jose": "^5.9.6"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
package/dist/client/index.jsx
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/** @jsxImportSource react */
|
|
2
|
-
'use client';
|
|
3
|
-
import { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
4
|
-
import { createContext, useContext, useState, useEffect } from 'react';
|
|
5
|
-
const ACPAuthContext = createContext(null);
|
|
6
|
-
export function ACPAuthProvider({ children, baseUrl }) {
|
|
7
|
-
const [user, setUser] = useState(null);
|
|
8
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
9
|
-
const [client] = useState(() => new ACPAuthClient({
|
|
10
|
-
baseUrl,
|
|
11
|
-
apiKey: '',
|
|
12
|
-
autoRefresh: true,
|
|
13
|
-
refreshThresholdSeconds: 60
|
|
14
|
-
}));
|
|
15
|
-
const refresh = async () => {
|
|
16
|
-
try {
|
|
17
|
-
await client.refresh();
|
|
18
|
-
// Fetch user data after successful refresh
|
|
19
|
-
const userData = await client.me();
|
|
20
|
-
setUser(userData);
|
|
21
|
-
}
|
|
22
|
-
catch (error) {
|
|
23
|
-
setUser(null);
|
|
24
|
-
client.setAccessToken(null);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
const login = async (email, password) => {
|
|
28
|
-
const result = await client.login({ email, password });
|
|
29
|
-
if ('requiresTwoFactor' in result) {
|
|
30
|
-
throw new Error('2FA_REQUIRED');
|
|
31
|
-
}
|
|
32
|
-
// User logged in successfully, token is automatically set in client
|
|
33
|
-
setUser(result.user);
|
|
34
|
-
};
|
|
35
|
-
const logout = async () => {
|
|
36
|
-
await client.logout();
|
|
37
|
-
setUser(null);
|
|
38
|
-
};
|
|
39
|
-
const resendVerification = async (email) => {
|
|
40
|
-
await client.resendVerificationEmail({ email });
|
|
41
|
-
};
|
|
42
|
-
useEffect(() => {
|
|
43
|
-
// Try to restore session on mount
|
|
44
|
-
refresh().finally(() => setIsLoading(false));
|
|
45
|
-
}, []);
|
|
46
|
-
// Auto-refresh interval - refresh token every 4 minutes
|
|
47
|
-
useEffect(() => {
|
|
48
|
-
if (!user)
|
|
49
|
-
return;
|
|
50
|
-
const REFRESH_INTERVAL = 4 * 60 * 1000; // 4 minutes
|
|
51
|
-
const interval = setInterval(() => {
|
|
52
|
-
refresh().catch(() => {
|
|
53
|
-
// If refresh fails, user session is invalid
|
|
54
|
-
setUser(null);
|
|
55
|
-
client.setAccessToken(null);
|
|
56
|
-
});
|
|
57
|
-
}, REFRESH_INTERVAL);
|
|
58
|
-
return () => clearInterval(interval);
|
|
59
|
-
}, [user]);
|
|
60
|
-
return (<ACPAuthContext.Provider value={{ user, isLoading, login, logout, refresh, resendVerification }}>
|
|
61
|
-
{children}
|
|
62
|
-
</ACPAuthContext.Provider>);
|
|
63
|
-
}
|
|
64
|
-
export function useAuth() {
|
|
65
|
-
const context = useContext(ACPAuthContext);
|
|
66
|
-
if (!context) {
|
|
67
|
-
throw new Error('useAuth must be used within ACPAuthProvider');
|
|
68
|
-
}
|
|
69
|
-
return context;
|
|
70
|
-
}
|
|
71
|
-
// Re-export client for direct use
|
|
72
|
-
export { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
73
|
-
//# sourceMappingURL=index.jsx.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"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"}
|