fix: restore portfolio loader and safe consent revocation
This commit is contained in:
1 parent
bff3e4d735
commit
a4e5e5c048
4 files changed
+315
-13
No files matched your search
+55
-12
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user