forked from RiseUP/riseup-squad20
92 lines
2.5 KiB
TypeScript
92 lines
2.5 KiB
TypeScript
import { clsx, type ClassValue } from "clsx"
|
|
import { twMerge } from "tailwind-merge"
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs))
|
|
}
|
|
|
|
export function validarCPFLocal(cpf: string): boolean {
|
|
if (!cpf) return false;
|
|
cpf = cpf.replace(/[^\d]+/g, "");
|
|
if (cpf.length !== 11) return false;
|
|
if (/^(\d)\1{10}$/.test(cpf)) return false;
|
|
|
|
let soma = 0, resto = 0;
|
|
for (let i = 1; i <= 9; i++) soma += parseInt(cpf.substring(i - 1, i)) * (11 - i);
|
|
resto = (soma * 10) % 11; if (resto === 10 || resto === 11) resto = 0;
|
|
if (resto !== parseInt(cpf.substring(9, 10))) return false;
|
|
|
|
soma = 0;
|
|
for (let i = 1; i <= 10; i++) soma += parseInt(cpf.substring(i - 1, i)) * (12 - i);
|
|
resto = (soma * 10) % 11; if (resto === 10 || resto === 11) resto = 0;
|
|
if (resto !== parseInt(cpf.substring(10, 11))) return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
// ===== FORMATAÇÃO DE CEP =====
|
|
export function formatCEP(cep: string): string {
|
|
if (!cep) return "";
|
|
const cleaned = cep.replace(/\D/g, "");
|
|
if (cleaned.length !== 8) return cleaned;
|
|
return `${cleaned.slice(0, 5)}-${cleaned.slice(5)}`;
|
|
}
|
|
|
|
export function validarCEP(cep: string): boolean {
|
|
if (!cep) return false;
|
|
const cleaned = cep.replace(/\D/g, "");
|
|
return cleaned.length === 8 && /^\d{8}$/.test(cleaned);
|
|
}
|
|
|
|
// ===== FORMATAÇÃO DE TELEFONE =====
|
|
export function formatTelefone(telefone: string): string {
|
|
if (!telefone) return "";
|
|
const cleaned = telefone.replace(/\D/g, "");
|
|
|
|
// Formatar em (00) 9XXXX-XXXX ou (00) XXXX-XXXX
|
|
if (cleaned.length === 11) {
|
|
return `(${cleaned.slice(0, 2)}) ${cleaned.slice(2, 7)}-${cleaned.slice(7)}`;
|
|
} else if (cleaned.length === 10) {
|
|
return `(${cleaned.slice(0, 2)}) ${cleaned.slice(2, 6)}-${cleaned.slice(6)}`;
|
|
}
|
|
|
|
return cleaned;
|
|
}
|
|
|
|
// ===== BUSCA DE CEP =====
|
|
export async function buscarCEP(cep: string): Promise<{
|
|
street: string;
|
|
neighborhood: string;
|
|
city: string;
|
|
state: string;
|
|
} | null> {
|
|
try {
|
|
if (!validarCEP(cep)) {
|
|
throw new Error("CEP inválido");
|
|
}
|
|
|
|
const cleaned = cep.replace(/\D/g, "");
|
|
const response = await fetch(`https://viacep.com.br/ws/${cleaned}/json/`);
|
|
|
|
if (!response.ok) {
|
|
throw new Error("Erro ao buscar CEP");
|
|
}
|
|
|
|
const data = await response.json();
|
|
|
|
if (data.erro) {
|
|
throw new Error("CEP não encontrado");
|
|
}
|
|
|
|
return {
|
|
street: data.logradouro || "",
|
|
neighborhood: data.bairro || "",
|
|
city: data.localidade || "",
|
|
state: data.uf || "",
|
|
};
|
|
} catch (err) {
|
|
console.error("[buscarCEP] Erro:", err);
|
|
return null;
|
|
}
|
|
}
|