[PITCH] AUTOCOMPLETE CEP
Hoje finalizei um projeto que tem a finalidade de completar automaticamente o endereço fornecendo apenas o CEP, o objetivo foi para melhorar minhas habilidades em typescript e consumo de api, apesar de simples, deixei open-source para quem tiver o interesse em usar em seus e projetos e modificar da forma que quiser.
Link: https://autocomplete-cep.vercel.app
GitHub: https://github.com/Luizboaventura1/autocomplete-cep
A classe que faz a busca do cep:
/src/services/CEPService.ts
import ICEPService from "../types/ICEPService";
import type Address from "../types/Address";
class CEPService extends ICEPService {
async getAddress(cep: string | number): Promise<Address | string> {
try {
if (!ICEPService.isValidCEP(cep)) {
throw new Error("Invalid CEP format");
}
const response = await fetch(`${this.baseURL}/${cep}/json`);
if (!response.ok) {
throw new Error("Invalid CEP");
}
const addressData = await response.json();
return {
zipcode: addressData.cep,
street: addressData.logradouro,
complement: addressData.complemento,
unit: addressData.unidade,
neighborhood: addressData.bairro,
city: addressData.localidade,
stateAbbreviation: addressData.uf,
state: addressData.uf,
region: addressData.regiao,
ibge: addressData.ibge,
gia: addressData.gia,
areaCode: addressData.ddd,
siafi: addressData.siafi,
};
} catch (error: unknown) {
if (error instanceof Error) {
return error.message;
}
return "An unknown error occurred";
}
}
}
const cepService = new CEPService();
export default cepService;
A classe abstrata que define o tipo da subclasse
/src/types/ICEPService.ts
import type Address from "./Address";
export default abstract class ICEPService {
protected readonly baseURL = "https://viacep.com.br/ws"
abstract getAddress(cep: string | number): Promise<Address | string>;
static isValidCEP(cep: string | number): boolean {
const cepPattern = /^\d{5}-?\d{3}$/;
return cepPattern.test(String(cep));
}
}