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.
@@ -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,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
- 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
  }
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
- if (isTokenExpired(token.expires)) {
90
- console.warn("El token recibido ya está expirado");
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.accessToken);
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
- if (isUserTokenValid(userData)) {
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?.accessToken) {
132
- await removeToken(user.token.accessToken);
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
- if (isTokenExpired(user.token?.expires)) {
142
- // Token expirado, cerrar sesión
143
- removeStoredAuth();
144
- setUser(null);
145
- setIsAuthenticated(false);
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;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;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: (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
  };