feat(servicos): topo, entregáveis e cases por serviço, assunto próprio no WhatsApp e títulos curtos
This commit is contained in:
1 parent
cf360041bd
commit
2fd8b063d9
33 files changed
+1578
-300
No files matched your search
@@ -0,0 +1,64 @@
|
||||
import { getCaseMedia } from "@/app/cases/_components/case-media";
|
||||
import {
|
||||
type CaseStudyContent,
|
||||
caseStudies,
|
||||
getRelatedCases,
|
||||
type HeroDevice,
|
||||
type ServiceDiagramKind,
|
||||
type ServicePageContent,
|
||||
} from "@/lib/site-content";
|
||||
|
||||
/** O que ocupa a coluna ao lado do título do serviço, e se há "Onde já apliquei isso" para o botão do topo levar até lá. */
|
||||
export interface ServiceHeroData {
|
||||
/** Case da capa: o escolhido para o serviço, quando tem captura gravada do aparelho pedido. */
|
||||
heroCase?: CaseStudyContent;
|
||||
heroDevice: HeroDevice;
|
||||
/** Esquema de fluxo no lugar da capa; só existe quando não há case com captura. */
|
||||
diagram?: ServiceDiagramKind;
|
||||
/** Há coluna ao lado do título (capa ou esquema): sem ela, o topo é uma coluna só e mais baixo. */
|
||||
hasHeroSide: boolean;
|
||||
/** Algum case ganha cartão em "Onde já apliquei isso" (o da capa não ganha: a legenda dela o cita). */
|
||||
hasCaseCards: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Os cases do serviço, em dois grupos: os cartões de "Onde já apliquei isso" e os do bloco menor `alsoCases`
|
||||
* (sem capa), que o serviço pode declarar. Sem `alsoCases`, `also` é nulo.
|
||||
*/
|
||||
export function splitServiceCases(service: ServicePageContent) {
|
||||
const related = getRelatedCases(service.relatedCaseIds);
|
||||
const alsoIds = new Set(service.alsoCases?.caseIds);
|
||||
const alsoCases = related.filter(({ id }) => alsoIds.has(id));
|
||||
|
||||
return {
|
||||
cards: related.filter(({ id }) => !alsoIds.has(id)),
|
||||
also:
|
||||
service.alsoCases && alsoCases.length > 0
|
||||
? { title: service.alsoCases.title, cases: alsoCases }
|
||||
: null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Capa do topo: o case escolhido para o serviço, se tiver captura gravada do aparelho pedido; senão, o esquema de fluxo.
|
||||
* O case da capa é citado pela legenda dela e não ganha cartão em "Onde já apliquei isso".
|
||||
*/
|
||||
export function resolveServiceHero(
|
||||
service: ServicePageContent,
|
||||
): ServiceHeroData {
|
||||
const heroDevice = service.heroCase?.device ?? "desktop";
|
||||
const heroCase = caseStudies.find(
|
||||
({ id }) =>
|
||||
id === service.heroCase?.id && Boolean(getCaseMedia(id, heroDevice)),
|
||||
);
|
||||
const diagram = heroCase ? undefined : service.diagram;
|
||||
const { cards } = splitServiceCases(service);
|
||||
|
||||
return {
|
||||
heroCase,
|
||||
heroDevice,
|
||||
diagram,
|
||||
hasHeroSide: Boolean(heroCase || diagram),
|
||||
hasCaseCards: cards.some(({ id }) => id !== heroCase?.id),
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user