fix: restore portfolio loader and safe consent revocation

This commit is contained in:
Evandro Fonseca Junior committed 2026-09-04 21:40:35 -03:00
1 parent bff3e4d735
commit a4e5e5c048
4 files changed
+315 -13

No files matched your search

+55 -12
View File
@@ -3,7 +3,9 @@ import { resolve } from "node:path";
import portfolioData from "@/public/portfolio-data.json";
import {
createProjectHealthSnapshot,
filterLiveProjects,
type DemoAvailability,
getDemoAvailability,
PROJECT_HEALTH_MAX_AGE_MS,
type ProjectHealthSnapshot,
} from "./project-health";
@@ -13,16 +15,37 @@ export type PortfolioExperience = PortfolioData["experiences"][number];
export type PortfolioSkillCategory =
PortfolioData["skills"]["technical"][number];
export type PortfolioProjectView = PortfolioProject & {
demoAvailability: DemoAvailability;
demoCheckedAt: string | null;
};
export const portfolio = portfolioData;
export function getLiveFeaturedProjects(
export function getFeaturedProjects(
snapshot: ProjectHealthSnapshot | null,
): PortfolioProjectView[] {
return portfolio.projects
.filter(({ featured }) => featured !== false)
.map((project) => {
const check = snapshot?.projects[project.id];
return {
...project,
demoAvailability: getDemoAvailability(project.demoUrl, check),
demoCheckedAt: check?.checkedAt ?? null,
};
});
}
function isSnapshotFresh(
snapshot: ProjectHealthSnapshot | null,
now = new Date(),
) {
return filterLiveProjects<PortfolioProject>(
portfolio.projects,
snapshot,
now,
if (!snapshot) return false;
const checkedAt = Date.parse(snapshot.checkedAt);
return (
Number.isFinite(checkedAt) &&
now.getTime() - checkedAt <= PROJECT_HEALTH_MAX_AGE_MS
);
}
@@ -35,16 +58,36 @@ export async function loadProjectHealthSnapshot(): Promise<ProjectHealthSnapshot
}
}
export async function loadLiveFeaturedProjects() {
const fromSnapshot = getLiveFeaturedProjects(await loadProjectHealthSnapshot());
if (fromSnapshot.length > 0) return fromSnapshot;
export async function loadFeaturedProjects(): Promise<PortfolioProjectView[]> {
const snapshot = await loadProjectHealthSnapshot();
if (process.env.NODE_ENV !== "development" || isSnapshotFresh(snapshot)) {
return getFeaturedProjects(snapshot);
}
const projectDemos = portfolio.projects.reduce<
Array<{ id: string; demoUrl: string }>
>((demos, project) => {
if (project.demoUrl) demos.push({ id: project.id, demoUrl: project.demoUrl });
if (project.demoUrl)
demos.push({ id: project.id, demoUrl: project.demoUrl });
return demos;
}, []);
const freshSnapshot = await createProjectHealthSnapshot(projectDemos);
return getLiveFeaturedProjects(freshSnapshot);
try {
const refreshed = await createProjectHealthSnapshot(projectDemos);
const projects = { ...refreshed.projects };
for (const [id, check] of Object.entries(projects)) {
if (!check.error && check.status !== null) continue;
const previous = snapshot?.projects[id];
if (previous && !previous.error && previous.status !== null) {
projects[id] = previous;
} else {
delete projects[id];
}
}
return getFeaturedProjects({ ...refreshed, projects });
} catch {
return getFeaturedProjects(snapshot);
}
}