Files

65 lines
2.3 KiB
TypeScript

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),
};
}