flysoft-react-ui 1.0.4 → 1.0.6
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 +85 -17
- package/dist/docs/AuthDocs.tsx/AuthDocs.d.ts.map +1 -1
- package/dist/docs/AuthDocs.tsx/AuthDocs.js +1 -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,CA8LpD,CAAC"}
|
|
@@ -60,40 +60,62 @@ 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
|
-
const [isLoading, setIsLoading] = useState(
|
|
66
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
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
|
}
|
|
98
|
+
setIsLoading(false);
|
|
82
99
|
}, []);
|
|
83
100
|
const login = async (username, password) => {
|
|
84
101
|
setIsLoading(true);
|
|
102
|
+
log("Login - Start", { username });
|
|
85
103
|
try {
|
|
86
104
|
const token = await getToken(username, password);
|
|
105
|
+
log("Login - Token received", token);
|
|
87
106
|
if (token.accessToken) {
|
|
88
|
-
// Verificar que el token recibido no esté expirado antes de continuar
|
|
89
|
-
|
|
90
|
-
|
|
107
|
+
// Verificar que el token recibido no esté expirado antes de continuar
|
|
108
|
+
const expired = isTokenExpired(token.expires);
|
|
109
|
+
log("Login - Token expiration check", { expires: token.expires, expired });
|
|
110
|
+
if (expired) {
|
|
111
|
+
log("Login - Token expired upon receipt", token, true);
|
|
91
112
|
setUser(null);
|
|
92
113
|
setIsAuthenticated(false);
|
|
93
114
|
setIsLoading(false);
|
|
94
115
|
return;
|
|
95
116
|
}
|
|
96
|
-
const { id, name, aditionalData } = await getUserData(token
|
|
117
|
+
const { id, name, aditionalData } = await getUserData(token);
|
|
118
|
+
log("Login - User data received", { id, name, aditionalData });
|
|
97
119
|
const userData = {
|
|
98
120
|
id,
|
|
99
121
|
name,
|
|
@@ -101,24 +123,30 @@ export const AuthProvider = ({ children, getToken, getUserData, removeToken, })
|
|
|
101
123
|
token,
|
|
102
124
|
};
|
|
103
125
|
// Validar nuevamente antes de establecer el estado
|
|
104
|
-
|
|
126
|
+
const isValid = isUserTokenValid(userData);
|
|
127
|
+
log("Login - Final validation", { isValid, userData });
|
|
128
|
+
if (isValid) {
|
|
105
129
|
setUser(userData);
|
|
106
130
|
storeAuth(userData);
|
|
107
131
|
setIsAuthenticated(true);
|
|
132
|
+
log("Login - Success", userData);
|
|
108
133
|
}
|
|
109
134
|
else {
|
|
110
135
|
setUser(null);
|
|
111
136
|
setIsAuthenticated(false);
|
|
137
|
+
log("Login - Validation failed", userData, true);
|
|
112
138
|
}
|
|
113
139
|
}
|
|
114
140
|
else {
|
|
115
141
|
setUser(null);
|
|
116
142
|
setIsAuthenticated(false);
|
|
143
|
+
log("Login - No access token in response", token, true);
|
|
117
144
|
}
|
|
118
145
|
}
|
|
119
146
|
catch (error) {
|
|
120
147
|
setUser(null);
|
|
121
148
|
setIsAuthenticated(false);
|
|
149
|
+
log("Login - Error", error, true);
|
|
122
150
|
throw error;
|
|
123
151
|
}
|
|
124
152
|
finally {
|
|
@@ -126,23 +154,63 @@ export const AuthProvider = ({ children, getToken, getUserData, removeToken, })
|
|
|
126
154
|
}
|
|
127
155
|
};
|
|
128
156
|
const logout = async () => {
|
|
157
|
+
log("Logout - Start", { user });
|
|
129
158
|
removeStoredAuth();
|
|
130
159
|
setUser(null);
|
|
131
|
-
if (removeToken && user?.token
|
|
132
|
-
|
|
160
|
+
if (removeToken && user?.token) {
|
|
161
|
+
try {
|
|
162
|
+
await removeToken(user.token);
|
|
163
|
+
log("Logout - Token removed from server");
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
log("Logout - Error removing token", e, true);
|
|
167
|
+
}
|
|
133
168
|
}
|
|
134
169
|
setIsAuthenticated(false);
|
|
170
|
+
log("Logout - Completed");
|
|
135
171
|
};
|
|
136
172
|
// Validar el token periódicamente o cuando cambia el usuario
|
|
137
173
|
// Esto asegura que si el token expira durante la sesión, se actualice el estado
|
|
138
174
|
useEffect(() => {
|
|
139
175
|
if (user && user.token?.expires) {
|
|
140
|
-
const checkTokenExpiration = () => {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
176
|
+
const checkTokenExpiration = async () => {
|
|
177
|
+
const expired = isTokenExpired(user.token?.expires);
|
|
178
|
+
log("Token Check - Checking expiration", { expires: user.token?.expires, expired });
|
|
179
|
+
if (expired) {
|
|
180
|
+
let refreshed = false;
|
|
181
|
+
// Si existe la función de refresco, intentar renovar el token antes de cerrar sesión
|
|
182
|
+
if (refreshToken && user.token) {
|
|
183
|
+
try {
|
|
184
|
+
log("Token Check - Attempting refresh", { oldToken: user.token });
|
|
185
|
+
const newToken = await refreshToken(user.token);
|
|
186
|
+
log("Token Check - Refresh response", newToken);
|
|
187
|
+
// Verificar que el nuevo token sea válido y no esté expirado
|
|
188
|
+
if (newToken && newToken.accessToken && !isTokenExpired(newToken.expires)) {
|
|
189
|
+
const newUser = { ...user, token: newToken };
|
|
190
|
+
setUser(newUser);
|
|
191
|
+
storeAuth(newUser);
|
|
192
|
+
refreshed = true;
|
|
193
|
+
log("Token Check - Refresh success", newUser);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
log("Token Check - Refreshed token invalid or expired", newToken, true);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
console.error("Error al intentar refrescar el token:", error);
|
|
201
|
+
log("Token Check - Refresh error", error, true);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
log("Token Check - No refresh logic available or token missing", { refreshToken: !!refreshToken, token: !!user.token });
|
|
206
|
+
}
|
|
207
|
+
if (!refreshed) {
|
|
208
|
+
// Token expirado y no se pudo renovar, cerrar sesión
|
|
209
|
+
log("Token Check - Session expired, logging out");
|
|
210
|
+
removeStoredAuth();
|
|
211
|
+
setUser(null);
|
|
212
|
+
setIsAuthenticated(false);
|
|
213
|
+
}
|
|
146
214
|
}
|
|
147
215
|
};
|
|
148
216
|
// Verificar inmediatamente
|
|
@@ -151,6 +219,6 @@ export const AuthProvider = ({ children, getToken, getUserData, removeToken, })
|
|
|
151
219
|
const interval = setInterval(checkTokenExpiration, 60000);
|
|
152
220
|
return () => clearInterval(interval);
|
|
153
221
|
}
|
|
154
|
-
}, [user]);
|
|
222
|
+
}, [user, refreshToken]);
|
|
155
223
|
return (_jsx(AuthContext.Provider, { value: { user, isAuthenticated, isLoading, login, logout }, children: children }));
|
|
156
224
|
};
|
|
@@ -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;AAGH,eAAO,MAAM,QAAQ,+CAWpB,CAAC"}
|
|
@@ -14,5 +14,5 @@ import { mockGetToken, mockGetUserData, mockRemoveToken, } from "./mockAuthServi
|
|
|
14
14
|
* - removeToken: Revoca/invalida un token (opcional)
|
|
15
15
|
*/
|
|
16
16
|
export const AuthDocs = () => {
|
|
17
|
-
return (_jsx(AuthProvider, { getToken: mockGetToken, getUserData: mockGetUserData, removeToken: mockRemoveToken, children: _jsx(AuthDocsContent, {}) }));
|
|
17
|
+
return (_jsx(AuthProvider, { getToken: mockGetToken, getUserData: mockGetUserData, removeToken: mockRemoveToken, showLog: true, children: _jsx(AuthDocsContent, {}) }));
|
|
18
18
|
};
|
|
@@ -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
|
};
|