import { Collections } from "./constants"; import { EndpointAudioPreview, EndpointImagePreview, EndpointVideoPreview, } from "./endpoint-types"; import { GenericBlock, SectionBlock, TranscriptBlock, BreakBlock, isBlockTranscriptBlock, isBlockBreakBlock, } from "./blocks"; export type RichTextContent = { root: { children: RichTextNode[]; direction: ("ltr" | "rtl") | null; format: "left" | "start" | "center" | "right" | "end" | "justify" | ""; indent: number; type: string; version: number; }; [k: string]: unknown; }; export type RichTextNode = { type: string; version: number; [k: string]: unknown; }; export interface RichTextNodeWithChildren extends RichTextNode { children: RichTextNode[]; } export interface RichTextParagraphNode extends RichTextNodeWithChildren { type: "paragraph"; format: "left" | "start" | "center" | "right" | "end" | "justify" | ""; } export interface RichTextListNode extends RichTextNode { type: "list"; children: RichTextNodeWithChildren[]; listType: string; } export interface RichTextListNumberNode extends RichTextListNode { listType: "number"; } export interface RichTextListBulletNode extends RichTextListNode { listType: "bullet"; } export interface RichTextListCheckNode extends RichTextListNode { listType: "check"; } export interface RichTextLinebreakNode extends RichTextNode { type: "linebreak"; } export interface RichTextUploadNode extends RichTextNode { type: "upload"; relationTo: string; } export interface RichTextUploadImageNode extends RichTextUploadNode { relationTo: Collections.Images; value: EndpointImagePreview; } export interface RichTextUploadVideoNode extends RichTextUploadNode { relationTo: Collections.Videos; value: EndpointVideoPreview; } export interface RichTextUploadAudioNode extends RichTextUploadNode { relationTo: Collections.Audios; value: EndpointAudioPreview; } export interface RichTextTextNode extends RichTextNode { type: "text"; format: number; text: string; } export interface RichTextTabNode extends RichTextNode { type: "tab"; format: number; } export interface RichTextLinkNode extends RichTextNodeWithChildren { type: "link"; fields: { linkType: "internal" | "custom"; }; } export interface RichTextLinkInternalNode extends RichTextLinkNode { fields: { linkType: "internal"; newTab: boolean; doc: { relationTo: string; value: any; }; }; } export interface RichTextLinkCustomNode extends RichTextLinkNode { fields: { linkType: "custom"; newTab: boolean; url: string; }; } export interface RichTextBlockNode extends RichTextNode { type: "block"; fields: GenericBlock; } export interface RichTextSectionBlock extends RichTextBlockNode { fields: SectionBlock; anchorHash: string; } export interface RichTextTranscriptBlock extends RichTextBlockNode { fields: TranscriptBlock; } export interface RichTextBreakBlock extends RichTextBlockNode { fields: BreakBlock; anchorHash: string; } export const isNodeParagraphNode = ( node: RichTextNode ): node is RichTextParagraphNode => node.type === "paragraph"; export const isNodeUploadNode = ( node: RichTextNode ): node is RichTextUploadNode => node.type === "upload"; export const isUploadNodeImageNode = ( node: RichTextUploadNode ): node is RichTextUploadImageNode => node.relationTo === Collections.Images; export const isUploadNodeVideoNode = ( node: RichTextUploadNode ): node is RichTextUploadVideoNode => node.relationTo === Collections.Videos; export const isUploadNodeAudioNode = ( node: RichTextUploadNode ): node is RichTextUploadAudioNode => node.relationTo === Collections.Audios; export const isNodeListNode = (node: RichTextNode): node is RichTextListNode => node.type === "list"; export const isListNodeNumberListNode = ( node: RichTextListNode ): node is RichTextListNumberNode => node.listType === "number"; export const isListNodeBulletListNode = ( node: RichTextListNode ): node is RichTextListBulletNode => node.listType === "bullet"; export const isListNodeCheckListNode = ( node: RichTextListNode ): node is RichTextListCheckNode => node.listType === "check"; export const isNodeLinebreakNode = ( node: RichTextNode ): node is RichTextLinebreakNode => node.type === "linebreak"; export const isNodeTextNode = (node: RichTextNode): node is RichTextTextNode => node.type === "text"; export const isNodeTabNode = (node: RichTextNode): node is RichTextTabNode => node.type === "tab"; export const isNodeLinkNode = (node: RichTextNode): node is RichTextLinkNode => node.type === "link"; export const isLinkNodeInternalLinkNode = ( node: RichTextLinkNode ): node is RichTextLinkInternalNode => node.fields.linkType === "internal"; export const isLinkNodeCustomLinkNode = ( node: RichTextLinkNode ): node is RichTextLinkCustomNode => node.fields.linkType === "custom"; export const isNodeBlockNode = ( node: RichTextNode ): node is RichTextBlockNode => node.type === "block"; export const isBlockNodeSectionBlock = ( node: RichTextBlockNode ): node is RichTextSectionBlock => node.fields.blockType === "sectionBlock"; export const isBlockNodeTranscriptBlock = ( node: RichTextBlockNode ): node is RichTextTranscriptBlock => isBlockTranscriptBlock(node.fields); export const isBlockNodeBreakBlock = ( node: RichTextBlockNode ): node is RichTextBreakBlock => isBlockBreakBlock(node.fields);