H1 'Sites e sistemas que trazem pedidos pelo WhatsApp e tiram sua operação da planilha.'; HeroWork maior com a SEV; menu Cases, Serviços, Como trabalho, Sobre e IA com next/link e pré-carregamento no hover; menu do celular em tela cheia; WhatsApp flutuante e no rodapé com a mensagem da rota; rodapé em todas as páginas; FAQ da home; /ia como oferta de revisão de app feito com IA; formulário com noscript, validação do mailto e plano B do pop-up; cartões sem foco indevido; sem a fonte Monument.
62 lines
2.4 KiB
TypeScript
62 lines
2.4 KiB
TypeScript
const COUNTRY = ["5", "5"];
|
|
const AREA = ["4", "7"];
|
|
const NINE = ["9"];
|
|
const FIRST = ["9", "2", "7", "4"];
|
|
const LAST = ["2", "3", "6", "5"];
|
|
|
|
export function getWhatsAppNumber() {
|
|
return [...COUNTRY, ...AREA, ...NINE, ...FIRST, ...LAST].join("");
|
|
}
|
|
|
|
export function getWhatsAppDisplayNumber() {
|
|
return `+${COUNTRY.join("")} ${AREA.join("")} ${NINE.join("")}${FIRST.join("")}-${LAST.join("")}`;
|
|
}
|
|
|
|
export function buildWhatsAppUrl(message: string) {
|
|
return `https://wa.me/${getWhatsAppNumber()}?text=${encodeURIComponent(message)}`;
|
|
}
|
|
|
|
/**
|
|
* Nomes dos serviços e dos cases, montados no servidor (app/layout.tsx) a partir de lib/site-content.ts:
|
|
* esse arquivo reúne o texto de todas as páginas e não deve ir inteiro para o navegador.
|
|
*/
|
|
export interface WhatsAppContexts {
|
|
/** slug do serviço -> nome do serviço */
|
|
services: Record<string, string>;
|
|
/** id do case -> nome do projeto ou do cliente */
|
|
cases: Record<string, string>;
|
|
}
|
|
|
|
/** Entra na frase "Quero conversar sobre {assunto}." da mensagem. */
|
|
export const AI_REVIEW_SUBJECT = "a revisão de um aplicativo feito com IA";
|
|
|
|
/** Nome pela chave; nome vazio ou só com espaços vale como ausente, para a mensagem cair no assunto padrão em vez de "sobre .". */
|
|
function lookup(table: Record<string, string> | undefined, key: string) {
|
|
const name = table && Object.hasOwn(table, key) ? table[key].trim() : "";
|
|
return name || undefined;
|
|
}
|
|
|
|
/**
|
|
* Assunto da conversa de WhatsApp para a rota atual. Em /servicos/<slug> cita o serviço, em /cases/<slug> o case
|
|
* e em /ia a revisão de aplicativo; nas demais rotas devolve undefined e a mensagem fala de "um projeto".
|
|
*/
|
|
export function whatsAppSubjectForPath(
|
|
pathname: string | null | undefined,
|
|
contexts?: WhatsAppContexts,
|
|
): string | undefined {
|
|
const path = pathname?.replace(/\/$/, "") ?? "";
|
|
if (path === "/ia") return AI_REVIEW_SUBJECT;
|
|
|
|
const slug = path.match(/^\/servicos\/([^/]+)$/)?.[1];
|
|
if (slug) return lookup(contexts?.services, slug);
|
|
|
|
const caseId = path.match(/^\/cases\/([^/]+)$/)?.[1];
|
|
const title = caseId ? lookup(contexts?.cases, caseId) : undefined;
|
|
return title ? `um projeto parecido com o da ${title}` : undefined;
|
|
}
|
|
|
|
/** Páginas de serviço e de case: nelas o botão do cabeçalho abre o WhatsApp em vez de ir ao formulário da home. */
|
|
export function isServiceOrCasePath(pathname: string | null | undefined) {
|
|
return /^\/(servicos|cases)\/[^/]+\/?$/.test(pathname ?? "");
|
|
}
|