Acrescentando estruturas e serviços para integração com backend
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -26,3 +26,6 @@ yarn-error.log*
|
|||||||
|
|
||||||
# Optional eslint cache
|
# Optional eslint cache
|
||||||
.eslintcache
|
.eslintcache
|
||||||
|
|
||||||
|
# não commitar url de environment
|
||||||
|
src/constants/environment.ts
|
||||||
|
|||||||
18
src/LocalStorage.ts
Normal file
18
src/LocalStorage.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
const tokenId = 'token';
|
||||||
|
const productDetails = '@productDetails';
|
||||||
|
|
||||||
|
const LocalStorage = {
|
||||||
|
getToken: (): string | null => {
|
||||||
|
return localStorage.getItem(tokenId)
|
||||||
|
},
|
||||||
|
|
||||||
|
setToken: (token: string) => {
|
||||||
|
localStorage.setItem(tokenId, token)
|
||||||
|
},
|
||||||
|
|
||||||
|
clearToken: () => {
|
||||||
|
localStorage.setItem(tokenId, '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default LocalStorage
|
||||||
19
src/config/api.config.ts
Normal file
19
src/config/api.config.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import environment from "../constants/environment";
|
||||||
|
|
||||||
|
const getBaseUrl = (): string => {
|
||||||
|
// const { hostname } = window.location;
|
||||||
|
|
||||||
|
const { url } = environment;
|
||||||
|
|
||||||
|
let apiUrl = null;
|
||||||
|
|
||||||
|
// if (hostname === 'projeto-integrado-f-web.herokuapp.com') {
|
||||||
|
// apiUrl = url.prod;
|
||||||
|
// } else {
|
||||||
|
apiUrl = url.local;
|
||||||
|
// }
|
||||||
|
|
||||||
|
return apiUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default { getBaseUrl };
|
||||||
11
src/constants/routes/sessionRoutes.ts
Normal file
11
src/constants/routes/sessionRoutes.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
const sessionRoutesDefault = '/session';
|
||||||
|
const sessionRoutes = {
|
||||||
|
create: {
|
||||||
|
url: `${sessionRoutesDefault}/`
|
||||||
|
},
|
||||||
|
refresh: {
|
||||||
|
url: `${sessionRoutesDefault}/refresh`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default sessionRoutes;
|
||||||
@@ -20,6 +20,9 @@ import {
|
|||||||
IonAlert,
|
IonAlert,
|
||||||
} from "@ionic/react";
|
} from "@ionic/react";
|
||||||
|
|
||||||
|
import * as sessionRoutes from '../../services/session';
|
||||||
|
import LocalStorage from "../../LocalStorage";
|
||||||
|
|
||||||
function validateEmail(email: string) {
|
function validateEmail(email: string) {
|
||||||
const re =
|
const re =
|
||||||
/^((?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]))$/;
|
/^((?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]))$/;
|
||||||
@@ -33,7 +36,7 @@ const Page: React.FC = () => {
|
|||||||
const [isError, setIsError] = useState<boolean>(false);
|
const [isError, setIsError] = useState<boolean>(false);
|
||||||
const [message, setMessage] = useState<string>("");
|
const [message, setMessage] = useState<string>("");
|
||||||
|
|
||||||
const handleLogin = () => {
|
const handleLogin = async () => {
|
||||||
// validação de inputs
|
// validação de inputs
|
||||||
if (!email) {
|
if (!email) {
|
||||||
setMessage("Por favor, informe um e-mail válido");
|
setMessage("Por favor, informe um e-mail válido");
|
||||||
@@ -53,26 +56,28 @@ const Page: React.FC = () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const loginData = {
|
const singinForm = {
|
||||||
email: email,
|
email: email,
|
||||||
password: password,
|
password: password,
|
||||||
};
|
};
|
||||||
|
|
||||||
const api = axios.create({
|
await sessionRoutes.create(singinForm).then(response => {
|
||||||
baseURL: `https://625dc16c4c36c7535779792c.mockapi.io/api/v1`,
|
// if (!response) return
|
||||||
});
|
|
||||||
|
|
||||||
api
|
const { token } = response
|
||||||
// .post("/login", loginData)
|
|
||||||
.get("/users/2")
|
LocalStorage.setToken(token);
|
||||||
.then((res) => {
|
|
||||||
// login bem-sucedido
|
history.push({ pathname: '/home' });
|
||||||
history.push("/dashboard/" + email);
|
}).catch(error => {
|
||||||
})
|
// if (!error.response) return
|
||||||
.catch((error) => {
|
|
||||||
setMessage("Falha na autenticação! Por favor, crie uma conta");
|
// se o backend retornou uma mensagem de erro customizada
|
||||||
setIsError(true);
|
// if (error.response.data.message) {
|
||||||
});
|
|
||||||
|
console.dir('error: ', {error})
|
||||||
|
alert('erro')
|
||||||
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
8
src/services/api.ts
Normal file
8
src/services/api.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import axios from 'axios';
|
||||||
|
import apiConfig from '../config/api.config';
|
||||||
|
|
||||||
|
const instance = axios.create({
|
||||||
|
baseURL: apiConfig.getBaseUrl(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export default instance;
|
||||||
33
src/services/session.ts
Normal file
33
src/services/session.ts
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import instance from '../services/api';
|
||||||
|
import sessionRoutes from '../constants/routes/sessionRoutes';
|
||||||
|
import LocalStorage from '../LocalStorage';
|
||||||
|
import { AxiosRequestHeaders } from 'axios';
|
||||||
|
|
||||||
|
let token: string | null;
|
||||||
|
let header: AxiosRequestHeaders;
|
||||||
|
|
||||||
|
interface createData {
|
||||||
|
email: string,
|
||||||
|
password: string,
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateHeader() {
|
||||||
|
token = LocalStorage.getToken();
|
||||||
|
header = {
|
||||||
|
Accept: 'application/json',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
"Authorization": 'Bearer ' + token
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function create(data: createData) {
|
||||||
|
const response = await instance.post(sessionRoutes.create.url, data);
|
||||||
|
return response.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function refresh() {
|
||||||
|
updateHeader();
|
||||||
|
|
||||||
|
let response = await instance.post(sessionRoutes.refresh.url, { token }, { headers: header });
|
||||||
|
return response.data;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user