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