@forgepack/request 1.0.4
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/LICENCE +21 -0
- package/README.md +164 -0
- package/dist/api/api.d.ts +8 -0
- package/dist/api/api.d.ts.map +1 -0
- package/dist/api/api.js +35 -0
- package/dist/api/client.d.ts +30 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +50 -0
- package/dist/component/auth.d.ts +8 -0
- package/dist/component/auth.d.ts.map +1 -0
- package/dist/component/auth.js +9 -0
- package/dist/component/errorMessage.d.ts +6 -0
- package/dist/component/errorMessage.d.ts.map +1 -0
- package/dist/component/errorMessage.js +7 -0
- package/dist/component/request.d.ts +13 -0
- package/dist/component/request.d.ts.map +1 -0
- package/dist/component/request.js +12 -0
- package/dist/component/response.d.ts +13 -0
- package/dist/component/response.d.ts.map +1 -0
- package/dist/component/response.js +13 -0
- package/dist/component/token.d.ts +32 -0
- package/dist/component/token.d.ts.map +1 -0
- package/dist/component/token.js +16 -0
- package/dist/hook/useProvider.d.ts +13 -0
- package/dist/hook/useProvider.d.ts.map +1 -0
- package/dist/hook/useProvider.js +51 -0
- package/dist/hook/useRequest.d.ts +11 -0
- package/dist/hook/useRequest.d.ts.map +1 -0
- package/dist/hook/useRequest.js +38 -0
- package/dist/hook/useRequireAuth.d.ts +4 -0
- package/dist/hook/useRequireAuth.d.ts.map +1 -0
- package/dist/hook/useRequireAuth.js +21 -0
- package/dist/hooks/AuthContext.d.ts +19 -0
- package/dist/hooks/AuthContext.d.ts.map +1 -0
- package/dist/hooks/AuthContext.js +10 -0
- package/dist/hooks/AuthProvider.d.ts +27 -0
- package/dist/hooks/AuthProvider.d.ts.map +1 -0
- package/dist/hooks/AuthProvider.js +71 -0
- package/dist/hooks/useAuth.d.ts +33 -0
- package/dist/hooks/useAuth.d.ts.map +1 -0
- package/dist/hooks/useAuth.js +50 -0
- package/dist/hooks/useRequest.d.ts +37 -0
- package/dist/hooks/useRequest.d.ts.map +1 -0
- package/dist/hooks/useRequest.js +63 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/service/crud.d.ts +15 -0
- package/dist/service/crud.d.ts.map +1 -0
- package/dist/service/crud.js +116 -0
- package/dist/service/fetchPage.d.ts +5 -0
- package/dist/service/fetchPage.d.ts.map +1 -0
- package/dist/service/fetchPage.js +22 -0
- package/dist/service/token.d.ts +10 -0
- package/dist/service/token.d.ts.map +1 -0
- package/dist/service/token.js +93 -0
- package/dist/services/api.d.ts +33 -0
- package/dist/services/api.d.ts.map +1 -0
- package/dist/services/api.js +50 -0
- package/dist/services/auth.d.ts +51 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +117 -0
- package/dist/services/crud.d.ts +120 -0
- package/dist/services/crud.d.ts.map +1 -0
- package/dist/services/crud.js +199 -0
- package/dist/services/token.d.ts +88 -0
- package/dist/services/token.d.ts.map +1 -0
- package/dist/services/token.js +176 -0
- package/dist/types/auth.d.ts +64 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/error.d.ts +11 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +2 -0
- package/dist/types/request.d.ts +25 -0
- package/dist/types/request.d.ts.map +1 -0
- package/dist/types/request.js +2 -0
- package/dist/types/response.d.ts +44 -0
- package/dist/types/response.d.ts.map +1 -0
- package/dist/types/response.js +2 -0
- package/dist/types/token.d.ts +43 -0
- package/dist/types/token.d.ts.map +1 -0
- package/dist/types/token.js +2 -0
- package/dist/utils/constants.d.ts +41 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +73 -0
- package/package.json +57 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Auth, LoginCredentials, LoginResponse } from '../types/auth';
|
|
2
|
+
/**
|
|
3
|
+
* Interface que estende Auth com métodos de autenticação
|
|
4
|
+
* @interface AuthContextType
|
|
5
|
+
*/
|
|
6
|
+
export interface AuthContextType extends Auth {
|
|
7
|
+
/** Função para autenticar um usuário */
|
|
8
|
+
loginUser: (credentials: LoginCredentials) => Promise<LoginResponse>;
|
|
9
|
+
/** Função para desautenticar o usuário */
|
|
10
|
+
logoutUser: () => void;
|
|
11
|
+
/** Indica se o usuário está autenticado */
|
|
12
|
+
isAuthenticated: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Contexto React para gerenciamento de autenticação
|
|
16
|
+
* @constant
|
|
17
|
+
*/
|
|
18
|
+
export declare const AuthContext: import("react").Context<AuthContextType>;
|
|
19
|
+
//# sourceMappingURL=AuthContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../../src/hooks/AuthContext.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAGrE;;;GAGG;AACH,MAAM,WAAW,eAAgB,SAAQ,IAAI;IACzC,wCAAwC;IACxC,SAAS,EAAE,CAAC,WAAW,EAAE,gBAAgB,KAAK,OAAO,CAAC,aAAa,CAAC,CAAA;IACpE,0CAA0C;IAC1C,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,2CAA2C;IAC3C,eAAe,EAAE,OAAO,CAAA;CAC3B;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,0CAAiE,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthContext = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const constants_1 = require("../utils/constants");
|
|
6
|
+
/**
|
|
7
|
+
* Contexto React para gerenciamento de autenticação
|
|
8
|
+
* @constant
|
|
9
|
+
*/
|
|
10
|
+
exports.AuthContext = (0, react_1.createContext)(constants_1.initialAuth);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
/**
|
|
3
|
+
* Provedor de contexto de autenticação que gerencia o estado de autenticação globalmente
|
|
4
|
+
*
|
|
5
|
+
* Funcionalidades:
|
|
6
|
+
* - Gerencia estado de autenticação persistente
|
|
7
|
+
* - Verifica expiração de tokens automaticamente
|
|
8
|
+
* - Sincroniza estado entre abas do navegador
|
|
9
|
+
* - Fornece métodos de login/logout
|
|
10
|
+
*
|
|
11
|
+
* @param props - Propriedades do componente
|
|
12
|
+
* @param props.api - Instância do Axios para requisições
|
|
13
|
+
* @param props.children - Componentes filhos que receberão o contexto
|
|
14
|
+
* @returns Provider component
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <AuthProvider api={apiClient}>
|
|
19
|
+
* <App />
|
|
20
|
+
* </AuthProvider>
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare const AuthProvider: ({ api, children }: {
|
|
24
|
+
api: AxiosInstance;
|
|
25
|
+
children: React.ReactNode;
|
|
26
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=AuthProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../src/hooks/AuthProvider.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAGrC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,YAAY,GAAI,mBAAmB;IAC5C,GAAG,EAAE,aAAa,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B,4CAiDA,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthProvider = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const token_1 = require("../services/token");
|
|
7
|
+
const constants_1 = require("../utils/constants");
|
|
8
|
+
const auth_1 = require("../services/auth");
|
|
9
|
+
const AuthContext_1 = require("./AuthContext");
|
|
10
|
+
/**
|
|
11
|
+
* Provedor de contexto de autenticação que gerencia o estado de autenticação globalmente
|
|
12
|
+
*
|
|
13
|
+
* Funcionalidades:
|
|
14
|
+
* - Gerencia estado de autenticação persistente
|
|
15
|
+
* - Verifica expiração de tokens automaticamente
|
|
16
|
+
* - Sincroniza estado entre abas do navegador
|
|
17
|
+
* - Fornece métodos de login/logout
|
|
18
|
+
*
|
|
19
|
+
* @param props - Propriedades do componente
|
|
20
|
+
* @param props.api - Instância do Axios para requisições
|
|
21
|
+
* @param props.children - Componentes filhos que receberão o contexto
|
|
22
|
+
* @returns Provider component
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <AuthProvider api={apiClient}>
|
|
27
|
+
* <App />
|
|
28
|
+
* </AuthProvider>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
const AuthProvider = ({ api, children }) => {
|
|
32
|
+
const [state, setState] = (0, react_1.useState)(() => (0, token_1.isValidToken)() ? (0, token_1.getToken)() : constants_1.initialAuth);
|
|
33
|
+
const loginUser = (0, react_1.useCallback)(async (credentials) => {
|
|
34
|
+
const result = await (0, auth_1.login)(api, '/auth/login', credentials);
|
|
35
|
+
if (result.success && result.data) {
|
|
36
|
+
setState(result.data);
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}, [api]);
|
|
40
|
+
const logoutUser = (0, react_1.useCallback)(() => {
|
|
41
|
+
(0, auth_1.logout)();
|
|
42
|
+
setState(constants_1.initialAuth);
|
|
43
|
+
window.location.href = '/login';
|
|
44
|
+
}, []);
|
|
45
|
+
// Verifica token expirado a cada minuto
|
|
46
|
+
(0, react_1.useEffect)(() => {
|
|
47
|
+
const interval = setInterval(() => {
|
|
48
|
+
if (state.accessToken && !(0, token_1.isValidToken)()) {
|
|
49
|
+
logoutUser();
|
|
50
|
+
}
|
|
51
|
+
}, 60000);
|
|
52
|
+
return () => clearInterval(interval);
|
|
53
|
+
}, [state.accessToken, logoutUser]);
|
|
54
|
+
// Escuta mudanças no localStorage (ex.: logout em outra aba)
|
|
55
|
+
(0, react_1.useEffect)(() => {
|
|
56
|
+
const handleStorageChange = (e) => {
|
|
57
|
+
if (e.key === 'token') {
|
|
58
|
+
if (!e.newValue || !(0, token_1.isValidToken)()) {
|
|
59
|
+
setState(constants_1.initialAuth);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
setState((0, token_1.getToken)());
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
window.addEventListener('storage', handleStorageChange);
|
|
67
|
+
return () => window.removeEventListener('storage', handleStorageChange);
|
|
68
|
+
}, []);
|
|
69
|
+
return ((0, jsx_runtime_1.jsx)(AuthContext_1.AuthContext.Provider, { value: { ...state, loginUser, logoutUser, isAuthenticated: (0, token_1.isValidToken)() }, children: children }));
|
|
70
|
+
};
|
|
71
|
+
exports.AuthProvider = AuthProvider;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { AuthContextType } from './AuthContext';
|
|
2
|
+
/**
|
|
3
|
+
* Hook para acessar o contexto de autenticação
|
|
4
|
+
*
|
|
5
|
+
* @returns Contexto de autenticação com estado e métodos
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const { isAuthenticated, loginUser, logoutUser, role } = useAuth()
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export declare const useAuth: () => AuthContextType;
|
|
13
|
+
/**
|
|
14
|
+
* Componente de proteção de rotas que verifica autenticação e autorização
|
|
15
|
+
*
|
|
16
|
+
* Comportamento:
|
|
17
|
+
* - Se usuário tem role permitida: renderiza conteúdo (Outlet)
|
|
18
|
+
* - Se autenticado mas sem permissão: redireciona para /notAllowed
|
|
19
|
+
* - Se não autenticado: redireciona para /login
|
|
20
|
+
*
|
|
21
|
+
* @param props - Propriedades do componente
|
|
22
|
+
* @param props.allowedRoles - Array de roles que têm acesso à rota
|
|
23
|
+
* @returns Componente de navegação condicional
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* <Route path="/admin" element={<RequireAuth allowedRoles={['ADMIN']} />}>
|
|
28
|
+
* <Route index element={<AdminDashboard />} />
|
|
29
|
+
* </Route>
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare const RequireAuth: ({ allowedRoles }: any) => import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=useAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAe,eAAe,EAAE,MAAM,eAAe,CAAA;AAE5D;;;;;;;;;GASG;AACH,eAAO,MAAM,OAAO,QAAO,eAE1B,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,WAAW,GAAI,kBAAkB,GAAG,4CAWhD,CAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequireAuth = exports.useAuth = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const react_router_dom_1 = require("react-router-dom");
|
|
7
|
+
const AuthContext_1 = require("./AuthContext");
|
|
8
|
+
/**
|
|
9
|
+
* Hook para acessar o contexto de autenticação
|
|
10
|
+
*
|
|
11
|
+
* @returns Contexto de autenticação com estado e métodos
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const { isAuthenticated, loginUser, logoutUser, role } = useAuth()
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
const useAuth = () => {
|
|
19
|
+
return (0, react_1.useContext)(AuthContext_1.AuthContext);
|
|
20
|
+
};
|
|
21
|
+
exports.useAuth = useAuth;
|
|
22
|
+
/**
|
|
23
|
+
* Componente de proteção de rotas que verifica autenticação e autorização
|
|
24
|
+
*
|
|
25
|
+
* Comportamento:
|
|
26
|
+
* - Se usuário tem role permitida: renderiza conteúdo (Outlet)
|
|
27
|
+
* - Se autenticado mas sem permissão: redireciona para /notAllowed
|
|
28
|
+
* - Se não autenticado: redireciona para /login
|
|
29
|
+
*
|
|
30
|
+
* @param props - Propriedades do componente
|
|
31
|
+
* @param props.allowedRoles - Array de roles que têm acesso à rota
|
|
32
|
+
* @returns Componente de navegação condicional
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* <Route path="/admin" element={<RequireAuth allowedRoles={['ADMIN']} />}>
|
|
37
|
+
* <Route index element={<AdminDashboard />} />
|
|
38
|
+
* </Route>
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
const RequireAuth = ({ allowedRoles }) => {
|
|
42
|
+
const { role, accessToken } = (0, exports.useAuth)();
|
|
43
|
+
const location = (0, react_router_dom_1.useLocation)();
|
|
44
|
+
return ((role === null || role === void 0 ? void 0 : role.find((role) => allowedRoles === null || allowedRoles === void 0 ? void 0 : allowedRoles.includes(role)))
|
|
45
|
+
? (0, jsx_runtime_1.jsx)(react_router_dom_1.Outlet, {})
|
|
46
|
+
: accessToken
|
|
47
|
+
? (0, jsx_runtime_1.jsx)(react_router_dom_1.Navigate, { to: '/notAllowed', state: { from: location }, replace: true })
|
|
48
|
+
: (0, jsx_runtime_1.jsx)(react_router_dom_1.Navigate, { to: '/login', state: { from: location }, replace: true }));
|
|
49
|
+
};
|
|
50
|
+
exports.RequireAuth = RequireAuth;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ErrorMessage } from '../types/error';
|
|
2
|
+
import { Page } from '../types/response';
|
|
3
|
+
import { Search } from '../types/request';
|
|
4
|
+
import { AxiosInstance } from 'axios';
|
|
5
|
+
/**
|
|
6
|
+
* Hook React para gerenciamento de requisições HTTP paginadas com estado
|
|
7
|
+
*
|
|
8
|
+
* Funcionalidades:
|
|
9
|
+
* - Gerencia estado de loading, dados e erros
|
|
10
|
+
* - Suporte a paginação e busca
|
|
11
|
+
* - Cancelamento automático de requisições pendentes
|
|
12
|
+
* - Re-execução automática quando parâmetros mudam
|
|
13
|
+
*
|
|
14
|
+
* @param api - Instância configurada do Axios
|
|
15
|
+
* @param endpoint - Endpoint da API (sem barra inicial)
|
|
16
|
+
* @param search - Parâmetros opcionais de busca e paginação
|
|
17
|
+
* @returns Objeto contendo response, error, loading e função request
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const { response, error, loading, request } = useRequest(
|
|
22
|
+
* apiClient,
|
|
23
|
+
* 'users',
|
|
24
|
+
* { page: 0, size: 10, value: 'search term' }
|
|
25
|
+
* )
|
|
26
|
+
*
|
|
27
|
+
* // Re-executar manualmente
|
|
28
|
+
* await request()
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare const useRequest: (api: AxiosInstance, endpoint: string, search?: Search) => {
|
|
32
|
+
response: Page<unknown>;
|
|
33
|
+
error: ErrorMessage[];
|
|
34
|
+
loading: boolean;
|
|
35
|
+
request: () => Promise<void>;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=useRequest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRequest.d.ts","sourceRoot":"","sources":["../../src/hooks/useRequest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAErC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,aAAa,EAAE,UAAU,MAAM,EAAE,SAAS,MAAM;;;;;CA8B/E,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useRequest = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const constants_1 = require("../utils/constants");
|
|
6
|
+
const api_1 = require("../services/api");
|
|
7
|
+
/**
|
|
8
|
+
* Hook React para gerenciamento de requisições HTTP paginadas com estado
|
|
9
|
+
*
|
|
10
|
+
* Funcionalidades:
|
|
11
|
+
* - Gerencia estado de loading, dados e erros
|
|
12
|
+
* - Suporte a paginação e busca
|
|
13
|
+
* - Cancelamento automático de requisições pendentes
|
|
14
|
+
* - Re-execução automática quando parâmetros mudam
|
|
15
|
+
*
|
|
16
|
+
* @param api - Instância configurada do Axios
|
|
17
|
+
* @param endpoint - Endpoint da API (sem barra inicial)
|
|
18
|
+
* @param search - Parâmetros opcionais de busca e paginação
|
|
19
|
+
* @returns Objeto contendo response, error, loading e função request
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const { response, error, loading, request } = useRequest(
|
|
24
|
+
* apiClient,
|
|
25
|
+
* 'users',
|
|
26
|
+
* { page: 0, size: 10, value: 'search term' }
|
|
27
|
+
* )
|
|
28
|
+
*
|
|
29
|
+
* // Re-executar manualmente
|
|
30
|
+
* await request()
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
const useRequest = (api, endpoint, search) => {
|
|
34
|
+
const [response, setResponse] = (0, react_1.useState)(constants_1.initialPage);
|
|
35
|
+
const [error, setError] = (0, react_1.useState)([constants_1.initialErrorMessage]);
|
|
36
|
+
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
37
|
+
const abortControllerRef = (0, react_1.useRef)(null);
|
|
38
|
+
const request = (0, react_1.useCallback)(async () => {
|
|
39
|
+
var _a;
|
|
40
|
+
(_a = abortControllerRef.current) === null || _a === void 0 ? void 0 : _a.abort();
|
|
41
|
+
const controller = new AbortController();
|
|
42
|
+
abortControllerRef.current = controller;
|
|
43
|
+
try {
|
|
44
|
+
setLoading(true);
|
|
45
|
+
setError([constants_1.initialErrorMessage]);
|
|
46
|
+
const data = await (0, api_1.fetchPage)(api, endpoint, search, controller.signal);
|
|
47
|
+
setResponse(data);
|
|
48
|
+
}
|
|
49
|
+
catch (requestError) {
|
|
50
|
+
setError([requestError]);
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
setLoading(false);
|
|
54
|
+
abortControllerRef.current = null;
|
|
55
|
+
}
|
|
56
|
+
}, [endpoint, search]);
|
|
57
|
+
(0, react_1.useEffect)(() => {
|
|
58
|
+
request();
|
|
59
|
+
return () => { var _a; return (_a = abortControllerRef.current) === null || _a === void 0 ? void 0 : _a.abort(); };
|
|
60
|
+
}, [request]);
|
|
61
|
+
return { response, error, loading, request };
|
|
62
|
+
};
|
|
63
|
+
exports.useRequest = useRequest;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Pacote React para gerenciamento de requisições HTTP com autenticação JWT
|
|
3
|
+
* @author Marcelo Gadelha
|
|
4
|
+
* @version 1.0.3
|
|
5
|
+
* @license Apache License 2.0
|
|
6
|
+
*
|
|
7
|
+
* Este pacote fornece uma solução completa para:
|
|
8
|
+
* - Autenticação JWT com interceptors automáticos
|
|
9
|
+
* - Hooks React para requisições e gerenciamento de estado
|
|
10
|
+
* - Componentes de autenticação e autorização
|
|
11
|
+
* - Operações CRUD padronizadas
|
|
12
|
+
* - Gerenciamento de tokens e paginação
|
|
13
|
+
*/
|
|
14
|
+
export * from './api/client';
|
|
15
|
+
export * from './types/auth';
|
|
16
|
+
export * from './types/error';
|
|
17
|
+
export * from './types/request';
|
|
18
|
+
export * from './types/response';
|
|
19
|
+
export * from './types/token';
|
|
20
|
+
export * from './hooks/AuthContext';
|
|
21
|
+
export * from './hooks/AuthProvider';
|
|
22
|
+
export * from './hooks/useAuth';
|
|
23
|
+
export * from './hooks/useRequest';
|
|
24
|
+
export * from './services/api';
|
|
25
|
+
export * from './services/auth';
|
|
26
|
+
export * from './services/crud';
|
|
27
|
+
export * from './services/token';
|
|
28
|
+
export * from './utils/constants';
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,cAAc,cAAc,CAAA;AAG5B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAG7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAGlC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAGhC,cAAc,mBAAmB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Pacote React para gerenciamento de requisições HTTP com autenticação JWT
|
|
4
|
+
* @author Marcelo Gadelha
|
|
5
|
+
* @version 1.0.3
|
|
6
|
+
* @license Apache License 2.0
|
|
7
|
+
*
|
|
8
|
+
* Este pacote fornece uma solução completa para:
|
|
9
|
+
* - Autenticação JWT com interceptors automáticos
|
|
10
|
+
* - Hooks React para requisições e gerenciamento de estado
|
|
11
|
+
* - Componentes de autenticação e autorização
|
|
12
|
+
* - Operações CRUD padronizadas
|
|
13
|
+
* - Gerenciamento de tokens e paginação
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
27
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
28
|
+
};
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
// API client e configurações
|
|
31
|
+
__exportStar(require("./api/client"), exports);
|
|
32
|
+
// Tipos e interfaces
|
|
33
|
+
__exportStar(require("./types/auth"), exports);
|
|
34
|
+
__exportStar(require("./types/error"), exports);
|
|
35
|
+
__exportStar(require("./types/request"), exports);
|
|
36
|
+
__exportStar(require("./types/response"), exports);
|
|
37
|
+
__exportStar(require("./types/token"), exports);
|
|
38
|
+
// Hooks React para gerenciamento de estado
|
|
39
|
+
__exportStar(require("./hooks/AuthContext"), exports);
|
|
40
|
+
__exportStar(require("./hooks/AuthProvider"), exports);
|
|
41
|
+
__exportStar(require("./hooks/useAuth"), exports);
|
|
42
|
+
__exportStar(require("./hooks/useRequest"), exports);
|
|
43
|
+
// Serviços para operações de dados
|
|
44
|
+
__exportStar(require("./services/api"), exports);
|
|
45
|
+
__exportStar(require("./services/auth"), exports);
|
|
46
|
+
__exportStar(require("./services/crud"), exports);
|
|
47
|
+
__exportStar(require("./services/token"), exports);
|
|
48
|
+
// Utilitários e constantes
|
|
49
|
+
__exportStar(require("./utils/constants"), exports);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
import { ErrorMessage } from '../component/errorMessage';
|
|
3
|
+
import { Search } from '../component/request';
|
|
4
|
+
export declare const login: <Auth>(api: AxiosInstance, url: string, object: Auth) => Promise<Auth | ErrorMessage[]>;
|
|
5
|
+
export declare const reset: <Auth>(api: AxiosInstance, url: string, object: Auth) => Promise<Auth | ErrorMessage[]>;
|
|
6
|
+
export declare const logout: () => void;
|
|
7
|
+
export declare const changePassword: <User>(api: AxiosInstance, data: User) => Promise<User | ErrorMessage[]>;
|
|
8
|
+
export declare const create: <T>(api: AxiosInstance, url: string, object: T) => Promise<any>;
|
|
9
|
+
export declare const createAll: <T>(api: AxiosInstance, url: string, object: T[]) => Promise<T | ErrorMessage[]>;
|
|
10
|
+
export declare const retrieve: <T>(api: AxiosInstance, url: string, search?: Search, signal?: AbortSignal) => Promise<T | ErrorMessage[]>;
|
|
11
|
+
export declare const update: <T>(api: AxiosInstance, url: string, object: T) => Promise<T | ErrorMessage[]>;
|
|
12
|
+
export declare const remove: <T>(api: AxiosInstance, url: string, id: string) => Promise<T | ErrorMessage[]>;
|
|
13
|
+
export declare const removeComposite: <T>(api: AxiosInstance, url: string, object: Object, one: string, two: string, three: string, four: string) => Promise<T | ErrorMessage[]>;
|
|
14
|
+
export declare const removeAll: <T>(api: AxiosInstance, url: string) => Promise<T | ErrorMessage[]>;
|
|
15
|
+
//# sourceMappingURL=crud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/service/crud.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAqB7C,eAAO,MAAM,KAAK,GAAS,IAAI,EAAG,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,QAAQ,IAAI,mCAO9E,CAAA;AAED,eAAO,MAAM,KAAK,GAAS,IAAI,EAAG,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,QAAQ,IAAI,mCAO9E,CAAA;AAED,eAAO,MAAM,MAAM,YAElB,CAAA;AAED,eAAO,MAAM,cAAc,GAAS,IAAI,EAAG,KAAK,aAAa,EAAE,MAAM,IAAI,mCAOxE,CAAA;AAED,eAAO,MAAM,MAAM,GAAS,CAAC,EAAG,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,QAAQ,CAAC,iBAIzE,CAAA;AAED,eAAO,MAAM,SAAS,GAAS,CAAC,EAAG,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,QAAQ,CAAC,EAAE,gCAI9E,CAAA;AAED,eAAO,MAAM,QAAQ,GAAS,CAAC,EAAG,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,WAAW,gCAcvG,CAAA;AAED,eAAO,MAAM,MAAM,GAAS,CAAC,EAAG,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,QAAQ,CAAC,gCAIzE,CAAA;AAED,eAAO,MAAM,MAAM,GAAS,CAAC,EAAG,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,IAAI,MAAM,gCAI1E,CAAA;AAED,eAAO,MAAM,eAAe,GAAS,CAAC,EAAG,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,QAAQ,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,MAAM,gCAU9I,CAAA;AAED,eAAO,MAAM,SAAS,GAAS,CAAC,EAAG,KAAK,aAAa,EAAE,KAAK,MAAM,gCAIjE,CAAA"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removeAll = exports.removeComposite = exports.remove = exports.update = exports.retrieve = exports.createAll = exports.create = exports.changePassword = exports.logout = exports.reset = exports.login = void 0;
|
|
4
|
+
const token_1 = require("./token");
|
|
5
|
+
// Respostas de informação (100-199),
|
|
6
|
+
// Respostas de sucesso (200-299),
|
|
7
|
+
// Redirecionamentos (300-399)
|
|
8
|
+
// Erros do cliente (400-499)
|
|
9
|
+
// Erros do servidor (500-599).
|
|
10
|
+
const addError = (error) => {
|
|
11
|
+
var _a, _b;
|
|
12
|
+
let errorMessage = [];
|
|
13
|
+
if (error.response.data.validationErrors !== undefined) {
|
|
14
|
+
(_b = (_a = error.response.data) === null || _a === void 0 ? void 0 : _a.validationErrors) === null || _b === void 0 ? void 0 : _b.forEach((element) => {
|
|
15
|
+
errorMessage.push({ field: element.field, message: element.message });
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
errorMessage.push({ field: 'Error', message: 'Internal Error' });
|
|
20
|
+
}
|
|
21
|
+
return errorMessage;
|
|
22
|
+
};
|
|
23
|
+
const login = async (api, url, object) => {
|
|
24
|
+
return await api.post(url, object)
|
|
25
|
+
.then(response => {
|
|
26
|
+
(0, token_1.setToken)(response.data);
|
|
27
|
+
return response.data;
|
|
28
|
+
})
|
|
29
|
+
.catch(error => { return addError(error); });
|
|
30
|
+
};
|
|
31
|
+
exports.login = login;
|
|
32
|
+
const reset = async (api, url, object) => {
|
|
33
|
+
return await api.put(url, object)
|
|
34
|
+
.then(response => {
|
|
35
|
+
(0, token_1.setToken)(response.data);
|
|
36
|
+
return response.data;
|
|
37
|
+
})
|
|
38
|
+
.catch(error => { return addError(error); });
|
|
39
|
+
};
|
|
40
|
+
exports.reset = reset;
|
|
41
|
+
const logout = () => {
|
|
42
|
+
(0, token_1.removeToken)();
|
|
43
|
+
};
|
|
44
|
+
exports.logout = logout;
|
|
45
|
+
const changePassword = async (api, data) => {
|
|
46
|
+
return await api.put(`/user/changePassword`, data)
|
|
47
|
+
.then(response => {
|
|
48
|
+
return response.data;
|
|
49
|
+
})
|
|
50
|
+
.catch(error => {
|
|
51
|
+
return addError(error);
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
exports.changePassword = changePassword;
|
|
55
|
+
const create = async (api, url, object) => {
|
|
56
|
+
return await api.post(`/${url}`, object)
|
|
57
|
+
.then(response => { return response.data; })
|
|
58
|
+
.catch(error => { return addError(error); });
|
|
59
|
+
};
|
|
60
|
+
exports.create = create;
|
|
61
|
+
const createAll = async (api, url, object) => {
|
|
62
|
+
return await api.post(`/${url}/createAll`, object)
|
|
63
|
+
.then(response => { return response.data; })
|
|
64
|
+
.catch(error => { return addError(error); });
|
|
65
|
+
};
|
|
66
|
+
exports.createAll = createAll;
|
|
67
|
+
const retrieve = async (api, url, search, signal) => {
|
|
68
|
+
var _a, _b, _c;
|
|
69
|
+
if ((search === null || search === void 0 ? void 0 : search.page) === undefined && (search === null || search === void 0 ? void 0 : search.size) === undefined) {
|
|
70
|
+
return await api.get(`/${url}`)
|
|
71
|
+
.then(response => { return response.data; })
|
|
72
|
+
.catch(error => { return addError(error); });
|
|
73
|
+
}
|
|
74
|
+
else if (((_a = search === null || search === void 0 ? void 0 : search.sort) === null || _a === void 0 ? void 0 : _a.order) === undefined) {
|
|
75
|
+
return await api.get(`/${url}?value=${search === null || search === void 0 ? void 0 : search.value}`, { params: { page: search === null || search === void 0 ? void 0 : search.page, size: search === null || search === void 0 ? void 0 : search.size }, signal })
|
|
76
|
+
.then(response => { return response.data; })
|
|
77
|
+
.catch(error => { return addError(error); });
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
return await api.get(`/${url}?value=${search === null || search === void 0 ? void 0 : search.value}`, { params: { page: search === null || search === void 0 ? void 0 : search.page, size: search === null || search === void 0 ? void 0 : search.size, sort: `${(_b = search === null || search === void 0 ? void 0 : search.sort) === null || _b === void 0 ? void 0 : _b.key},${(_c = search === null || search === void 0 ? void 0 : search.sort) === null || _c === void 0 ? void 0 : _c.order}` }, signal })
|
|
81
|
+
.then(response => { return response.data; })
|
|
82
|
+
.catch(error => { return addError(error); });
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
exports.retrieve = retrieve;
|
|
86
|
+
const update = async (api, url, object) => {
|
|
87
|
+
return await api.put(`/${url}`, object)
|
|
88
|
+
.then(response => { return response.data; })
|
|
89
|
+
.catch(error => { return addError(error); });
|
|
90
|
+
};
|
|
91
|
+
exports.update = update;
|
|
92
|
+
const remove = async (api, url, id) => {
|
|
93
|
+
return await api.delete(`/${url}/${id}`)
|
|
94
|
+
.then(response => { return response.data; })
|
|
95
|
+
.catch(error => { return addError(error); });
|
|
96
|
+
};
|
|
97
|
+
exports.remove = remove;
|
|
98
|
+
const removeComposite = async (api, url, object, one, two, three, four) => {
|
|
99
|
+
if (three !== '' && four !== '') {
|
|
100
|
+
return await api.delete(`/${url}`, object)
|
|
101
|
+
.then(response => { return response.data; })
|
|
102
|
+
.catch(error => { return addError(error); });
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return await api.delete(`/${url}/${one}/${two}`, object)
|
|
106
|
+
.then(response => { return response.data; })
|
|
107
|
+
.catch(error => { return addError(error); });
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
exports.removeComposite = removeComposite;
|
|
111
|
+
const removeAll = async (api, url) => {
|
|
112
|
+
return await api.delete(`/${url}`)
|
|
113
|
+
.then(response => { return response.data; })
|
|
114
|
+
.catch(error => { return addError(error); });
|
|
115
|
+
};
|
|
116
|
+
exports.removeAll = removeAll;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
import { Page } from '../component/response';
|
|
3
|
+
import { Search } from '../component/request';
|
|
4
|
+
export declare const FetchPage: (api: AxiosInstance, endpoint: string, search?: Search, signal?: AbortSignal) => Promise<Page>;
|
|
5
|
+
//# sourceMappingURL=fetchPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchPage.d.ts","sourceRoot":"","sources":["../../src/service/fetchPage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,eAAO,MAAM,SAAS,GAAU,KAAK,aAAa,EAAE,UAAU,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,WAAW,KAAG,OAAO,CAAC,IAAI,CAkBzH,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FetchPage = void 0;
|
|
4
|
+
const FetchPage = async (api, endpoint, search, signal) => {
|
|
5
|
+
var _a, _b, _c;
|
|
6
|
+
const uri = ((_a = search === null || search === void 0 ? void 0 : search.value) === null || _a === void 0 ? void 0 : _a.trim())
|
|
7
|
+
? `/${endpoint}?value=${encodeURIComponent(search.value)}`
|
|
8
|
+
: `/${endpoint}`;
|
|
9
|
+
const params = {
|
|
10
|
+
page: search === null || search === void 0 ? void 0 : search.page,
|
|
11
|
+
size: search === null || search === void 0 ? void 0 : search.size
|
|
12
|
+
};
|
|
13
|
+
if (((_b = search === null || search === void 0 ? void 0 : search.sort) === null || _b === void 0 ? void 0 : _b.order) && ((_c = search === null || search === void 0 ? void 0 : search.sort) === null || _c === void 0 ? void 0 : _c.key)) {
|
|
14
|
+
params.sort = `${search.sort.key},${search.sort.order}`;
|
|
15
|
+
}
|
|
16
|
+
const { data } = await api.get(uri, {
|
|
17
|
+
params: Object.keys(params).length > 0 ? params : undefined,
|
|
18
|
+
signal
|
|
19
|
+
});
|
|
20
|
+
return data;
|
|
21
|
+
};
|
|
22
|
+
exports.FetchPage = FetchPage;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Auth } from '../component/auth';
|
|
2
|
+
import { Header, Payload } from '../component/token';
|
|
3
|
+
export declare const isValidToken: () => boolean;
|
|
4
|
+
export declare const getToken: () => Auth;
|
|
5
|
+
export declare const setToken: (token: any) => void;
|
|
6
|
+
export declare const removeToken: () => void;
|
|
7
|
+
export declare const getPayload: () => Payload;
|
|
8
|
+
export declare const decodeJwt: () => string | null;
|
|
9
|
+
export declare const getHeader: () => Header;
|
|
10
|
+
//# sourceMappingURL=token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/service/token.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,MAAM,EAAiC,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAWnF,eAAO,MAAM,YAAY,QAAO,OAY/B,CAAA;AAED,eAAO,MAAM,QAAQ,QAAO,IAG3B,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,GAAG,KAAG,IAErC,CAAA;AAED,eAAO,MAAM,WAAW,YAEvB,CAAA;AAED,eAAO,MAAM,UAAU,QAAO,OAoB7B,CAAA;AAED,eAAO,MAAM,SAAS,qBAUrB,CAAA;AAED,eAAO,MAAM,SAAS,QAAO,MAoB5B,CAAA"}
|