flysoft-react-ui 1.0.4 → 1.0.5
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/contexts/AuthContext.d.ts +6 -3
- package/dist/contexts/AuthContext.d.ts.map +1 -1
- package/dist/contexts/AuthContext.js +83 -16
- package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts.map +1 -1
- package/dist/docs/AuthDocs.tsx/AuthDocs.js +47 -1
- package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts +2 -2
- package/dist/docs/AuthDocs.tsx/mockAuthService.d.ts.map +1 -1
- package/dist/docs/AuthDocs.tsx/mockAuthService.js +5 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export interface AuthContextUserInterface {
|
|
2
|
-
id?: number;
|
|
2
|
+
id?: number | string;
|
|
3
3
|
name?: string;
|
|
4
4
|
aditionalData?: any;
|
|
5
5
|
token?: AuthTokenInterface;
|
|
@@ -9,6 +9,7 @@ export interface AuthTokenInterface {
|
|
|
9
9
|
expires?: string;
|
|
10
10
|
tokenType?: string;
|
|
11
11
|
refreshToken?: string;
|
|
12
|
+
aditionalData?: any;
|
|
12
13
|
}
|
|
13
14
|
export interface AuthContextType {
|
|
14
15
|
user: AuthContextUserInterface | null;
|
|
@@ -21,8 +22,10 @@ export declare const AuthContext: import("react").Context<AuthContextType>;
|
|
|
21
22
|
interface AuthProviderProps {
|
|
22
23
|
children: React.ReactNode;
|
|
23
24
|
getToken: (username: string, password: string) => Promise<AuthTokenInterface>;
|
|
24
|
-
getUserData: (
|
|
25
|
-
|
|
25
|
+
getUserData: (auth: AuthTokenInterface) => Promise<AuthContextUserInterface>;
|
|
26
|
+
refreshToken?: (auth: AuthTokenInterface) => Promise<AuthTokenInterface>;
|
|
27
|
+
removeToken?: (auth: AuthTokenInterface) => Promise<void>;
|
|
28
|
+
showLog?: boolean;
|
|
26
29
|
}
|
|
27
30
|
export declare const AuthProvider: React.FC<AuthProviderProps>;
|
|
28
31
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../src/contexts/AuthContext.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../src/contexts/AuthContext.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACvC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,GAAG,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,WAAW,0CAMtB,CAAC;AAkEH,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9E,WAAW,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC7E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA6LpD,CAAC"}
|
|
@@ -60,40 +60,61 @@ const isUserTokenValid = (user) => {
|
|
|
60
60
|
}
|
|
61
61
|
return !isTokenExpired(user.token.expires);
|
|
62
62
|
};
|
|
63
|
-
export const AuthProvider = ({ children, getToken, getUserData, removeToken, }) => {
|
|
63
|
+
export const AuthProvider = ({ children, getToken, getUserData, refreshToken, removeToken, showLog = false, }) => {
|
|
64
64
|
const [user, setUser] = useState(null);
|
|
65
65
|
const [isAuthenticated, setIsAuthenticated] = useState(false);
|
|
66
66
|
const [isLoading, setIsLoading] = useState(false);
|
|
67
|
+
const log = (action, data, isError = false) => {
|
|
68
|
+
if (isError) {
|
|
69
|
+
console.error(`[AuthContext] ${action}: `, data);
|
|
70
|
+
}
|
|
71
|
+
else if (showLog) {
|
|
72
|
+
console.log(`[AuthContext] ${action}: `, data);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
67
75
|
useEffect(() => {
|
|
68
76
|
const auth = initAuth();
|
|
77
|
+
log("Init Auth - Retrieved from storage", auth);
|
|
69
78
|
// Verificar que el usuario tenga un token válido y vigente
|
|
70
|
-
|
|
79
|
+
const isValid = isUserTokenValid(auth);
|
|
80
|
+
log("Init Auth - Token valid check", { isValid, auth });
|
|
81
|
+
if (isValid) {
|
|
71
82
|
setUser(auth);
|
|
72
83
|
setIsAuthenticated(true);
|
|
84
|
+
log("Init Auth - User authenticated restored", auth);
|
|
73
85
|
}
|
|
74
86
|
else {
|
|
75
87
|
// Si el token está expirado o es inválido, limpiar el almacenamiento
|
|
76
88
|
if (auth.id && isTokenExpired(auth.token?.expires)) {
|
|
89
|
+
log("Init Auth - Token expired or invalid, cleaning storage", auth);
|
|
77
90
|
removeStoredAuth();
|
|
78
91
|
}
|
|
92
|
+
else {
|
|
93
|
+
log("Init Auth - No valid session found", auth);
|
|
94
|
+
}
|
|
79
95
|
setUser(null);
|
|
80
96
|
setIsAuthenticated(false);
|
|
81
97
|
}
|
|
82
98
|
}, []);
|
|
83
99
|
const login = async (username, password) => {
|
|
84
100
|
setIsLoading(true);
|
|
101
|
+
log("Login - Start", { username });
|
|
85
102
|
try {
|
|
86
103
|
const token = await getToken(username, password);
|
|
104
|
+
log("Login - Token received", token);
|
|
87
105
|
if (token.accessToken) {
|
|
88
|
-
// Verificar que el token recibido no esté expirado antes de continuar
|
|
89
|
-
|
|
90
|
-
|
|
106
|
+
// Verificar que el token recibido no esté expirado antes de continuar
|
|
107
|
+
const expired = isTokenExpired(token.expires);
|
|
108
|
+
log("Login - Token expiration check", { expires: token.expires, expired });
|
|
109
|
+
if (expired) {
|
|
110
|
+
log("Login - Token expired upon receipt", token, true);
|
|
91
111
|
setUser(null);
|
|
92
112
|
setIsAuthenticated(false);
|
|
93
113
|
setIsLoading(false);
|
|
94
114
|
return;
|
|
95
115
|
}
|
|
96
|
-
const { id, name, aditionalData } = await getUserData(token
|
|
116
|
+
const { id, name, aditionalData } = await getUserData(token);
|
|
117
|
+
log("Login - User data received", { id, name, aditionalData });
|
|
97
118
|
const userData = {
|
|
98
119
|
id,
|
|
99
120
|
name,
|
|
@@ -101,24 +122,30 @@ export const AuthProvider = ({ children, getToken, getUserData, removeToken, })
|
|
|
101
122
|
token,
|
|
102
123
|
};
|
|
103
124
|
// Validar nuevamente antes de establecer el estado
|
|
104
|
-
|
|
125
|
+
const isValid = isUserTokenValid(userData);
|
|
126
|
+
log("Login - Final validation", { isValid, userData });
|
|
127
|
+
if (isValid) {
|
|
105
128
|
setUser(userData);
|
|
106
129
|
storeAuth(userData);
|
|
107
130
|
setIsAuthenticated(true);
|
|
131
|
+
log("Login - Success", userData);
|
|
108
132
|
}
|
|
109
133
|
else {
|
|
110
134
|
setUser(null);
|
|
111
135
|
setIsAuthenticated(false);
|
|
136
|
+
log("Login - Validation failed", userData, true);
|
|
112
137
|
}
|
|
113
138
|
}
|
|
114
139
|
else {
|
|
115
140
|
setUser(null);
|
|
116
141
|
setIsAuthenticated(false);
|
|
142
|
+
log("Login - No access token in response", token, true);
|
|
117
143
|
}
|
|
118
144
|
}
|
|
119
145
|
catch (error) {
|
|
120
146
|
setUser(null);
|
|
121
147
|
setIsAuthenticated(false);
|
|
148
|
+
log("Login - Error", error, true);
|
|
122
149
|
throw error;
|
|
123
150
|
}
|
|
124
151
|
finally {
|
|
@@ -126,23 +153,63 @@ export const AuthProvider = ({ children, getToken, getUserData, removeToken, })
|
|
|
126
153
|
}
|
|
127
154
|
};
|
|
128
155
|
const logout = async () => {
|
|
156
|
+
log("Logout - Start", { user });
|
|
129
157
|
removeStoredAuth();
|
|
130
158
|
setUser(null);
|
|
131
|
-
if (removeToken && user?.token
|
|
132
|
-
|
|
159
|
+
if (removeToken && user?.token) {
|
|
160
|
+
try {
|
|
161
|
+
await removeToken(user.token);
|
|
162
|
+
log("Logout - Token removed from server");
|
|
163
|
+
}
|
|
164
|
+
catch (e) {
|
|
165
|
+
log("Logout - Error removing token", e, true);
|
|
166
|
+
}
|
|
133
167
|
}
|
|
134
168
|
setIsAuthenticated(false);
|
|
169
|
+
log("Logout - Completed");
|
|
135
170
|
};
|
|
136
171
|
// Validar el token periódicamente o cuando cambia el usuario
|
|
137
172
|
// Esto asegura que si el token expira durante la sesión, se actualice el estado
|
|
138
173
|
useEffect(() => {
|
|
139
174
|
if (user && user.token?.expires) {
|
|
140
|
-
const checkTokenExpiration = () => {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
175
|
+
const checkTokenExpiration = async () => {
|
|
176
|
+
const expired = isTokenExpired(user.token?.expires);
|
|
177
|
+
log("Token Check - Checking expiration", { expires: user.token?.expires, expired });
|
|
178
|
+
if (expired) {
|
|
179
|
+
let refreshed = false;
|
|
180
|
+
// Si existe la función de refresco, intentar renovar el token antes de cerrar sesión
|
|
181
|
+
if (refreshToken && user.token) {
|
|
182
|
+
try {
|
|
183
|
+
log("Token Check - Attempting refresh", { oldToken: user.token });
|
|
184
|
+
const newToken = await refreshToken(user.token);
|
|
185
|
+
log("Token Check - Refresh response", newToken);
|
|
186
|
+
// Verificar que el nuevo token sea válido y no esté expirado
|
|
187
|
+
if (newToken && newToken.accessToken && !isTokenExpired(newToken.expires)) {
|
|
188
|
+
const newUser = { ...user, token: newToken };
|
|
189
|
+
setUser(newUser);
|
|
190
|
+
storeAuth(newUser);
|
|
191
|
+
refreshed = true;
|
|
192
|
+
log("Token Check - Refresh success", newUser);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
log("Token Check - Refreshed token invalid or expired", newToken, true);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.error("Error al intentar refrescar el token:", error);
|
|
200
|
+
log("Token Check - Refresh error", error, true);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
log("Token Check - No refresh logic available or token missing", { refreshToken: !!refreshToken, token: !!user.token });
|
|
205
|
+
}
|
|
206
|
+
if (!refreshed) {
|
|
207
|
+
// Token expirado y no se pudo renovar, cerrar sesión
|
|
208
|
+
log("Token Check - Session expired, logging out");
|
|
209
|
+
removeStoredAuth();
|
|
210
|
+
setUser(null);
|
|
211
|
+
setIsAuthenticated(false);
|
|
212
|
+
}
|
|
146
213
|
}
|
|
147
214
|
};
|
|
148
215
|
// Verificar inmediatamente
|
|
@@ -151,6 +218,6 @@ export const AuthProvider = ({ children, getToken, getUserData, removeToken, })
|
|
|
151
218
|
const interval = setInterval(checkTokenExpiration, 60000);
|
|
152
219
|
return () => clearInterval(interval);
|
|
153
220
|
}
|
|
154
|
-
}, [user]);
|
|
221
|
+
}, [user, refreshToken]);
|
|
155
222
|
return (_jsx(AuthContext.Provider, { value: { user, isAuthenticated, isLoading, login, logout }, children: children }));
|
|
156
223
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthDocs.d.ts","sourceRoot":"","sources":["../../../src/docs/AuthDocs.tsx/AuthDocs.tsx"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"AuthDocs.d.ts","sourceRoot":"","sources":["../../../src/docs/AuthDocs.tsx/AuthDocs.tsx"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AAuDH,eAAO,MAAM,QAAQ,+CAWpB,CAAC"}
|
|
@@ -13,6 +13,52 @@ import { mockGetToken, mockGetUserData, mockRemoveToken, } from "./mockAuthServi
|
|
|
13
13
|
* - getUserData: Obtiene los datos del usuario autenticado
|
|
14
14
|
* - removeToken: Revoca/invalida un token (opcional)
|
|
15
15
|
*/
|
|
16
|
+
// const propiedaiGetToken = async (email: string, password: string): Promise<AuthTokenInterface> => {
|
|
17
|
+
// const authResponse: any = await apiClient.post({
|
|
18
|
+
// url: "https://propiedai.com/api/auth/login",
|
|
19
|
+
// body: {
|
|
20
|
+
// email: '',
|
|
21
|
+
// password: ''
|
|
22
|
+
// }
|
|
23
|
+
// });
|
|
24
|
+
// return {
|
|
25
|
+
// accessToken: authResponse.access_token,
|
|
26
|
+
// expires: new Date(Date.now() + authResponse.expires_in * 1000).toISOString(),
|
|
27
|
+
// tokenType: authResponse.token_type,
|
|
28
|
+
// refreshToken: authResponse.refresh_token,
|
|
29
|
+
// aditionalData: {
|
|
30
|
+
// user: {
|
|
31
|
+
// name: authResponse.user.name,
|
|
32
|
+
// surname: authResponse.user.surname,
|
|
33
|
+
// role: authResponse.user.role,
|
|
34
|
+
// id: authResponse.user.id
|
|
35
|
+
// }
|
|
36
|
+
// }
|
|
37
|
+
// }
|
|
38
|
+
// }
|
|
39
|
+
// const propiedaiGetUserData = async (auth: AuthTokenInterface): Promise<AuthContextUserInterface> => {
|
|
40
|
+
// return {
|
|
41
|
+
// id: auth.aditionalData?.user.id,
|
|
42
|
+
// name: auth.aditionalData?.user.name + ' ' + auth.aditionalData?.user.surname,
|
|
43
|
+
// aditionalData: {
|
|
44
|
+
// role: auth.aditionalData?.user.role,
|
|
45
|
+
// }
|
|
46
|
+
// }
|
|
47
|
+
// }
|
|
48
|
+
// const propiedaiRefreshToken = async (auth: AuthTokenInterface): Promise<AuthTokenInterface> => {
|
|
49
|
+
// const authResponse: any = await apiClient.post({
|
|
50
|
+
// url: "https://propiedai.com/api/auth/refresh",
|
|
51
|
+
// body: {
|
|
52
|
+
// refresh_token: auth.refreshToken,
|
|
53
|
+
// }
|
|
54
|
+
// });
|
|
55
|
+
// return {
|
|
56
|
+
// ...auth,
|
|
57
|
+
// accessToken: authResponse.access_token,
|
|
58
|
+
// expires: new Date(Date.now() + authResponse.expires_in * 1000).toISOString(),
|
|
59
|
+
// tokenType: authResponse.token_type,
|
|
60
|
+
// }
|
|
61
|
+
// }
|
|
16
62
|
export const AuthDocs = () => {
|
|
17
|
-
return (_jsx(AuthProvider, { getToken: mockGetToken, getUserData: mockGetUserData, removeToken: mockRemoveToken, children: _jsx(AuthDocsContent, {}) }));
|
|
63
|
+
return (_jsx(AuthProvider, { getToken: mockGetToken, getUserData: mockGetUserData, removeToken: mockRemoveToken, showLog: true, children: _jsx(AuthDocsContent, {}) }));
|
|
18
64
|
};
|
|
@@ -13,12 +13,12 @@ export declare const mockGetToken: (username: string, password: string) => Promi
|
|
|
13
13
|
* @param token - Token de acceso
|
|
14
14
|
* @returns Promise con los datos del usuario
|
|
15
15
|
*/
|
|
16
|
-
export declare const mockGetUserData: (
|
|
16
|
+
export declare const mockGetUserData: (auth: AuthTokenInterface) => Promise<AuthContextUserInterface>;
|
|
17
17
|
/**
|
|
18
18
|
* Mock de removeToken - Revoca/invalida un token
|
|
19
19
|
*
|
|
20
20
|
* @param token - Token a revocar
|
|
21
21
|
* @returns Promise que se resuelve cuando el token es revocado
|
|
22
22
|
*/
|
|
23
|
-
export declare const mockRemoveToken: (
|
|
23
|
+
export declare const mockRemoveToken: (auth: AuthTokenInterface) => Promise<void>;
|
|
24
24
|
//# sourceMappingURL=mockAuthService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockAuthService.d.ts","sourceRoot":"","sources":["../../../src/docs/AuthDocs.tsx/mockAuthService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,4BAA4B,CAAC;AAgBpC;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,EAChB,UAAU,MAAM,KACf,OAAO,CAAC,kBAAkB,CAqB5B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,
|
|
1
|
+
{"version":3,"file":"mockAuthService.d.ts","sourceRoot":"","sources":["../../../src/docs/AuthDocs.tsx/mockAuthService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,4BAA4B,CAAC;AAgBpC;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,EAChB,UAAU,MAAM,KACf,OAAO,CAAC,kBAAkB,CAqB5B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,MAAM,kBAAkB,KACvB,OAAO,CAAC,wBAAwB,CAoBlC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAU,MAAM,kBAAkB,KAAG,OAAO,CAAC,IAAI,CAW5E,CAAC"}
|
|
@@ -42,9 +42,9 @@ export const mockGetToken = async (username, password) => {
|
|
|
42
42
|
* @param token - Token de acceso
|
|
43
43
|
* @returns Promise con los datos del usuario
|
|
44
44
|
*/
|
|
45
|
-
export const mockGetUserData = async (
|
|
45
|
+
export const mockGetUserData = async (auth) => {
|
|
46
46
|
await simulateNetworkDelay();
|
|
47
|
-
if (!
|
|
47
|
+
if (!auth.accessToken) {
|
|
48
48
|
throw new Error("Token es requerido");
|
|
49
49
|
}
|
|
50
50
|
// Simular datos de usuario
|
|
@@ -66,13 +66,13 @@ export const mockGetUserData = async (token) => {
|
|
|
66
66
|
* @param token - Token a revocar
|
|
67
67
|
* @returns Promise que se resuelve cuando el token es revocado
|
|
68
68
|
*/
|
|
69
|
-
export const mockRemoveToken = async (
|
|
69
|
+
export const mockRemoveToken = async (auth) => {
|
|
70
70
|
await simulateNetworkDelay();
|
|
71
|
-
if (!
|
|
71
|
+
if (!auth.accessToken) {
|
|
72
72
|
throw new Error("Token es requerido");
|
|
73
73
|
}
|
|
74
74
|
// Simular revocación del token
|
|
75
75
|
// En una implementación real, aquí se haría una llamada al servidor
|
|
76
76
|
// para invalidar el token
|
|
77
|
-
console.log(`Token revocado: ${
|
|
77
|
+
console.log(`Token revocado: ${auth.accessToken.substring(0, 20)}...`);
|
|
78
78
|
};
|