event.stopPropagation()}
@dblclick=${(event: Event) => event.stopPropagation()}
@pointerdown=${(event: Event) => event.stopPropagation()}
>
${this.open && !this.floating ? this.renderContent() : nothing}
`;
}
private renderContent() {
const value = this.value;
const transcript = value?.transcript;
const metadata = [
value?.author?.name,
value?.publishedAt?.split('T')[0],
value?.durationSeconds === undefined
? undefined
: timestamp(value.durationSeconds),
].filter(Boolean);
let chapterIndex = 0;
const chapters = transcript?.chapters ?? [];
return html` event.stopPropagation()}
@dblclick=${(event: Event) => event.stopPropagation()}
@pointerdown=${(event: Event) => event.stopPropagation()}
@wheel=${(event: Event) => event.stopPropagation()}
>
${
this.loading
? html`
Loading details…`
: html`
${metadata.length ? html`
${metadata.join(' · ')}
` : nothing}
${value?.description ? html`
${value.description}
` : nothing}
${
transcript?.segments.length
? html`
Transcript
${transcript.segments.map(segment => {
const headings = [];
while (
chapterIndex < chapters.length &&
chapters[chapterIndex].startSeconds <=
(segment.startSeconds ?? 0)
) {
headings.push(
html`
${chapters[chapterIndex++].title}
`
);
}
return html`${headings}
${segment.startSeconds === undefined ? nothing : html``}${segment.speaker ? html`${segment.speaker}: ` : nothing}${segment.text}
`;
})}
${transcript.truncated ? html`
Transcript truncated by the preview service.
` : nothing}
`
: html`
No transcript available.
`
}
`
}
`;
}
}
function timestamp(seconds: number) {
const minutes = Math.floor(seconds / 60);
return `${minutes}:${Math.floor(seconds % 60)
.toString()
.padStart(2, '0')}`;
}
declare global {
interface HTMLElementTagNameMap {
'affine-link-preview-details': LinkPreviewDetails;
}
}