Implement public audit pages
This commit is contained in:
51
lib/audits/public-audit-presenter.ts
Normal file
51
lib/audits/public-audit-presenter.ts
Normal 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,
|
||||
},
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user