Implement public audit pages

This commit is contained in:
Matthias
2026-06-05 14:14:07 +02:00
parent 03cb65fde4
commit 47ee2c2d51
25 changed files with 1039 additions and 45 deletions

View File

@@ -0,0 +1,51 @@
import type {
PublicAuditLookupResult,
PublicAuditOffer,
PublicAuditRenderState,
} from "./public-audit-types";
const isSafeCtaHref = (href: string) => {
try {
const parsed = new URL(href);
return parsed.protocol === "https:" || parsed.protocol === "mailto:" || parsed.protocol === "tel:";
} catch {
return href.startsWith("/");
}
};
const sanitizeOffer = (offer: PublicAuditOffer): PublicAuditOffer => {
if (!offer.ctaHref || isSafeCtaHref(offer.ctaHref)) {
return offer;
}
return {
body: offer.body,
ctaLabel: offer.ctaLabel,
};
};
export const toPublicAuditRenderState = (
result: PublicAuditLookupResult,
): PublicAuditRenderState => {
if (!result || result.publicationStatus === "deactivated") {
return { kind: "unavailable" };
}
if (result.publicationStatus !== "published") {
return { kind: "pending" };
}
return {
kind: "published",
audit: {
companyName: result.companyName,
domain: result.domain,
publishedAt: result.publishedAt,
headline: result.publicContent.headline,
intro: result.publicContent.intro,
observations: result.publicContent.observations,
finalOffer: sanitizeOffer(result.publicContent.finalOffer),
screenshots: result.screenshots,
},
};
};