Allow heading tags (h1-h6) in ContentSanitizer so news editor headings render

This commit is contained in:
2026-06-04 07:52:57 +02:00
parent 0b33a1b074
commit 15870ddb1f
191 changed files with 15453 additions and 1786 deletions

View File

@@ -199,6 +199,30 @@ function contentViewEventType(contentType) {
return 'academy_content_view'
}
function analyticsMetadata(analytics, extra = {}) {
const metadata = analytics?.metadata && typeof analytics.metadata === 'object' ? analytics.metadata : {}
return {
page_name: analytics?.pageName,
...metadata,
...extra,
}
}
function analyticsTrackingKey(analytics) {
if (analytics?.trackingKey) {
return String(analytics.trackingKey)
}
const metadata = analytics?.metadata && typeof analytics.metadata === 'object' ? analytics.metadata : {}
const pairs = Object.entries(metadata)
.filter(([, value]) => value !== undefined && value !== null && value !== '')
.sort(([left], [right]) => left.localeCompare(right))
.map(([key, value]) => `${key}:${String(value)}`)
return pairs.join('|')
}
export function trackUpgradeClick(analytics, metadata = {}) {
if (!analytics?.eventUrl) {
return
@@ -217,20 +241,17 @@ export function useAcademyPageAnalytics(analytics) {
return undefined
}
const baseKey = `${analytics.pageName || window.location.pathname}:${analytics.contentType || 'page'}:${analytics.contentId || 'none'}`
const trackingKey = analyticsTrackingKey(analytics)
const baseKey = `${analytics.pageName || window.location.pathname}:${analytics.contentType || 'page'}:${analytics.contentId || 'none'}:${trackingKey || 'default'}`
void trackAcademyEvent('academy_page_view', analytics.contentType || null, analytics.contentId || null, {
page_name: analytics.pageName,
}, {
void trackAcademyEvent('academy_page_view', analytics.contentType || null, analytics.contentId || null, analyticsMetadata(analytics), {
url: analytics.eventUrl,
pageName: analytics.pageName,
onceKey: `${baseKey}:page-view`,
})
if (analytics.contentType || analytics.contentId) {
void trackAcademyEvent(contentViewEventType(analytics.contentType), analytics.contentType || null, analytics.contentId || null, {
page_name: analytics.pageName,
}, {
void trackAcademyEvent(contentViewEventType(analytics.contentType), analytics.contentType || null, analytics.contentId || null, analyticsMetadata(analytics), {
url: analytics.eventUrl,
pageName: analytics.pageName,
onceKey: `${baseKey}:content-view`,
@@ -238,9 +259,7 @@ export function useAcademyPageAnalytics(analytics) {
}
if (analytics.isPremium && analytics.isLocked) {
void trackAcademyEvent('academy_premium_preview_view', analytics.contentType || null, analytics.contentId || null, {
page_name: analytics.pageName,
}, {
void trackAcademyEvent('academy_premium_preview_view', analytics.contentType || null, analytics.contentId || null, analyticsMetadata(analytics), {
url: analytics.eventUrl,
pageName: analytics.pageName,
onceKey: `${baseKey}:premium-preview`,
@@ -248,10 +267,9 @@ export function useAcademyPageAnalytics(analytics) {
}
const engagedTimer = window.setTimeout(() => {
void trackAcademyEvent('academy_engaged_view', analytics.contentType || null, analytics.contentId || null, {
page_name: analytics.pageName,
void trackAcademyEvent('academy_engaged_view', analytics.contentType || null, analytics.contentId || null, analyticsMetadata(analytics, {
engaged_seconds: 15,
}, {
}), {
url: analytics.eventUrl,
pageName: analytics.pageName,
onceKey: `${baseKey}:engaged`,
@@ -275,10 +293,9 @@ export function useAcademyPageAnalytics(analytics) {
}
sentMilestones.add(milestone.threshold)
void trackAcademyEvent(milestone.eventType, analytics.contentType || null, analytics.contentId || null, {
page_name: analytics.pageName,
void trackAcademyEvent(milestone.eventType, analytics.contentType || null, analytics.contentId || null, analyticsMetadata(analytics, {
scroll_percent: milestone.threshold,
}, {
}), {
url: analytics.eventUrl,
pageName: analytics.pageName,
onceKey: `${baseKey}:scroll-${milestone.threshold}`,
@@ -292,5 +309,5 @@ export function useAcademyPageAnalytics(analytics) {
window.clearTimeout(engagedTimer)
window.removeEventListener('scroll', onScroll)
}
}, [analytics?.contentId, analytics?.contentType, analytics?.enabled, analytics?.eventUrl, analytics?.isLocked, analytics?.isPremium, analytics?.pageName])
}, [analytics?.contentId, analytics?.contentType, analytics?.enabled, analytics?.eventUrl, analytics?.isLocked, analytics?.isPremium, analytics?.pageName, analytics?.trackingKey, JSON.stringify(analytics?.metadata || {})])
}