65 lines
2.3 KiB
TypeScript
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),
|
|
};
|
|
}
|