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.
@@ -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: (token: string) => Promise<AuthContextUserInterface>;
25
- removeToken?: (token: string) => Promise<void>;
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;IACZ,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;CACvB;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;AAiEH,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,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAClE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAmHpD,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(false);
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
- if (isUserTokenValid(auth)) {
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
- if (isTokenExpired(token.expires)) {
90
- console.warn("El token recibido ya está expirado");
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.accessToken);
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
- if (isUserTokenValid(userData)) {
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?.accessToken) {
132
- await removeToken(user.token.accessToken);
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
- if (isTokenExpired(user.token?.expires)) {
142
- // Token expirado, cerrar sesión
143
- removeStoredAuth();
144
- setUser(null);
145
- setIsAuthenticated(false);
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;AACH,eAAO,MAAM,QAAQ,+CAUpB,CAAC"}
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: (token: string) => Promise<AuthContextUserInterface>;
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: (token: string) => Promise<void>;
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,OAAO,MAAM,KACZ,OAAO,CAAC,wBAAwB,CAoBlC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAWjE,CAAC"}
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 (token) => {
45
+ export const mockGetUserData = async (auth) => {
46
46
  await simulateNetworkDelay();
47
- if (!token) {
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 (token) => {
69
+ export const mockRemoveToken = async (auth) => {
70
70
  await simulateNetworkDelay();
71
- if (!token) {
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: ${token.substring(0, 20)}...`);
77
+ console.log(`Token revocado: ${auth.accessToken.substring(0, 20)}...`);
78
78
  };