65 lines
1.6 KiB
TypeScript
65 lines
1.6 KiB
TypeScript
import type { PortfolioProjectView } from "@/lib/portfolio-data";
|
|
|
|
export type NotebookProject = {
|
|
id: string;
|
|
title: string;
|
|
subtitle: string;
|
|
demoUrl: PortfolioProjectView["demoUrl"];
|
|
demoAvailability: PortfolioProjectView["demoAvailability"];
|
|
demoCheckedAt: PortfolioProjectView["demoCheckedAt"];
|
|
technologies: string[];
|
|
screenshotSrc: string;
|
|
};
|
|
|
|
const NOTEBOOK_ORDER = [
|
|
"nutriscan",
|
|
"sc-plus",
|
|
"sev-modaintima",
|
|
"as-servicos",
|
|
] as const;
|
|
|
|
const SCREENSHOT_BY_PROJECT_ID: Record<
|
|
(typeof NOTEBOOK_ORDER)[number],
|
|
string
|
|
> = {
|
|
nutriscan: "/assets/prints/print-nutriscan.png",
|
|
"sc-plus": "/assets/prints/print-scplus.png",
|
|
"sev-modaintima": "/assets/prints/print-sev.png",
|
|
"as-servicos": "/assets/prints/print-asservicos.png",
|
|
};
|
|
|
|
function isApprovedDemoUrl(
|
|
value: PortfolioProjectView["demoUrl"],
|
|
): value is string {
|
|
return typeof value === "string" && /^https?:\/\//.test(value);
|
|
}
|
|
|
|
export function selectNotebookProjects(
|
|
projects: readonly PortfolioProjectView[],
|
|
): NotebookProject[] {
|
|
return NOTEBOOK_ORDER.flatMap((id) => {
|
|
const project = projects.find((candidate) => candidate.id === id);
|
|
const screenshotSrc = SCREENSHOT_BY_PROJECT_ID[id];
|
|
|
|
if (
|
|
!project ||
|
|
(project.demoUrl !== null && !isApprovedDemoUrl(project.demoUrl))
|
|
) {
|
|
return [];
|
|
}
|
|
|
|
return [
|
|
{
|
|
id: project.id,
|
|
title: project.title,
|
|
subtitle: project.subtitle,
|
|
demoUrl: project.demoUrl,
|
|
demoAvailability: project.demoAvailability,
|
|
demoCheckedAt: project.demoCheckedAt,
|
|
technologies: [...project.technologies],
|
|
screenshotSrc,
|
|
},
|
|
];
|
|
});
|
|
}
|