UNPKG

@venuecms/sdk-next

Version:

This is a work in progress and is heavily in flux until we launch 1.0 in February.

1 lines 18.7 kB
{"version":3,"sources":["../src/components/VenueContent/index.tsx"],"sourcesContent":["// @ts-nocheck\n/*\n * Content Renderer with defaults\n * Adapted from tiptap-react-render: https://github.com/troop-dev/tiptap-react-render\n */\nimport { LocalizedContent } from \"@venuecms/sdk\";\nimport { VenueImage } from \"../VenueImage\";\nimport { EmbedResize } from \"../EmbedResize\";\nimport Markdown from \"markdown-to-jsx\";\nimport React, { JSX, ReactNode } from \"react\";\n\ntype ElementClasses = {\n text?: string;\n p?: string;\n ul?: string;\n ol?: string;\n li?: string;\n code?: string;\n heading?: string;\n hardBreak?: string;\n img?: string;\n image?: string;\n iframe?: string;\n linkCard?: string;\n h1?: string;\n h2?: string;\n h3?: string;\n a?: string;\n};\n\nconst marks = {\n bold: \"font-bold\",\n italic: \"italic\",\n underline: \"underline\",\n strike: \"line-through\",\n link: \"underline underline-offset-[3px] cursor-pointer\",\n} as const;\n\nconst getDefaultHandlers = (classes: ElementClasses = {}) => {\n const elMarks = {\n link: (props: any): ReactNode => {\n const { class: attrClass, className: outerClassName, ...rest } = props;\n const className =\n [outerClassName, classes.a ?? marks.link, attrClass]\n .filter(Boolean)\n .join(\" \") || undefined;\n return <a {...rest} className={className} />;\n },\n } as const;\n\n const defaultHandlers: NodeHandlers = {\n text: (props) => {\n if (props.node.marks) {\n const className = props.node.marks\n .reduce((accum, mark) => {\n if (elMarks[mark.type as keyof typeof elMarks]) {\n // elMarks are handled separately\n return accum;\n }\n return `${marks[mark.type as keyof typeof marks] ?? \"\"} ${accum}`;\n }, \"\")\n .trim();\n\n let hasWrappers = false;\n const elWrappers = props.node.marks.reduce((accum, mark) => {\n if (mark.type in elMarks) {\n hasWrappers = true;\n const el = elMarks[mark.type as keyof typeof elMarks];\n\n return el({ ...mark.attrs, className, children: accum });\n }\n\n return accum;\n }, props.node.text);\n\n if (hasWrappers) {\n return elWrappers;\n }\n\n return <span className={`${className}`}>{props.node.text}</span>;\n }\n\n if (classes.text) {\n <span className={classes.text}>{props.node.text}</span>;\n }\n\n return <>{props.node.text}</>;\n },\n paragraph: (props) => <p className={classes.p}>{props.children}</p>,\n bulletList: (props) => <ul className={classes.ul}>{props.children}</ul>,\n orderedList: (props) => <ol className={classes.ol}>{props.children}</ol>,\n listItem: (props) => <li className={classes.li}>{props.children}</li>,\n codeBlock: (props) => (\n <pre>\n <code className={classes.code}>{props.children}</code>\n </pre>\n ),\n heading: (props) => {\n switch (props.node.attrs?.level) {\n case 1:\n return <h1 className={classes.h1}>{props.children}</h1>;\n case 2:\n return <h2 className={classes.h2}>{props.children}</h2>;\n case 3:\n return <h3 className={classes.h3}>{props.children}</h3>;\n default:\n return <>{props.children}</>;\n }\n },\n hardBreak: () => <br />,\n image: (props) => {\n const { src, alt } = props.node.attrs ?? {};\n\n const image = {\n url: src.split(/^\\/media\\//).join(\"\"),\n metadata: {\n altText: alt,\n },\n };\n\n return <VenueImage className={classes.image} image={image} />;\n },\n img: (props) => {\n const { src, alt } = props.node;\n const image = {\n url: src.split(/^\\/media\\//).join(\"\"),\n metadata: {\n altText: alt,\n },\n };\n return <VenueImage className={classes.img} image={image} />;\n },\n youtube: (props) => {\n //@ts-ignore\n const { src, start } = props.node.attrs;\n const key = src.split(\"v=\")[1];\n\n return (\n <iframe\n src={`https://www.youtube.com/embed/${key}?modestbranding=1${start ? `&amp;start=${start}` : \"\"}`}\n frameBorder=\"0\"\n allowFullScreen={true}\n width=\"100%\"\n height=\"auto\"\n style={{\n aspectRatio: \"4 / 3\",\n maxWidth: \"100%\",\n }}\n ></iframe>\n );\n },\n iframe: (props) => {\n const {\n // @ts-ignore\n src,\n // @ts-ignore\n style,\n // @ts-ignore\n frameborder,\n // @ts-ignore\n allowfullscreen,\n // @ts-ignore\n referrerpolicy,\n // @ts-ignore\n aspectRatio,\n ...rest\n } = props.node?.attrs ?? props; // TODO: why do we need to do this? we are getting different shapes at times and not sure why\n\n const styles =\n typeof style === \"string\"\n ? style\n ?.split(\";\")\n .reduce((accum: Record<string, string>, style: string) => {\n const [key, value] = style.split(\":\");\n if (value !== undefined) {\n return { ...accum, [key]: value.trim() };\n }\n return accum;\n }, {})\n : style;\n\n // Native iframely embeds carry aspectRatio (width / height). Prefer it:\n // render a fluid, ratio-correct iframe with no per-provider guessing.\n if (aspectRatio) {\n return (\n <iframe\n src={src}\n style={{\n ...styles,\n width: \"100%\",\n aspectRatio: String(aspectRatio),\n height: \"auto\",\n }}\n frameBorder={frameborder}\n allowFullScreen={allowfullscreen}\n referrerPolicy={referrerpolicy}\n {...rest}\n />\n );\n }\n\n // TODO: We need iframely. A hack for now to check and iron out some common quirks\n const isVideo = (() => {\n return !!(src.match(/youtube.com/) || src.match(/vimeo.com/));\n })();\n\n const isBandcamp = (() => {\n return !!src.match(/bandcamp.com/);\n })();\n\n const isVimeo = (() => {\n return !!src.match(/vimeo.com/);\n })();\n\n return (\n <iframe\n src={src}\n style={{\n ...styles,\n ...(isVideo\n ? { maxWidth: \"100%\", aspectRatio: \"4 / 3\", height: \"auto\" }\n : {}),\n ...(isBandcamp && !styles?.height\n ? { width: \"100%\", maxWidth: \"700px\", height: \"42px\" }\n : {}),\n\n ...(isVimeo && !styles?.height\n ? {\n width: \"100%\",\n aspectRatio: (rest as any).width / (rest as any).height,\n }\n : {}),\n }}\n frameBorder={frameborder}\n allowFullScreen={allowfullscreen}\n referrerPolicy={referrerpolicy}\n {...rest}\n />\n );\n },\n // Rich link-preview card for non-embeddable URLs (metadata only).\n linkCard: (props) => {\n const {\n // @ts-ignore\n href,\n // @ts-ignore\n title,\n // @ts-ignore\n description,\n // @ts-ignore\n site,\n // @ts-ignore\n image,\n } = props.node?.attrs ?? props;\n\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={\n classes.linkCard ??\n \"my-4 block overflow-hidden bg-card no-underline transition-opacity hover:opacity-80\"\n }\n >\n {image ? (\n <img\n src={image}\n alt={title ?? \"\"}\n className=\"aspect-video w-full object-cover\"\n />\n ) : null}\n <div className=\"p-4\">\n {title ? (\n <h3 className=\"mb-2 text-base font-semibold text-primary\">\n {title}\n </h3>\n ) : null}\n {site ? (\n <span className=\"text-xs text-secondary\">{site}</span>\n ) : null}\n {description ? (\n <p className=\"mt-2 text-sm text-secondary\">{description}</p>\n ) : null}\n </div>\n </a>\n );\n },\n } as const;\n return defaultHandlers;\n};\n\nconst getMarkdownHandlers = (classes: ElementClasses = {}) => {\n const handlers = getDefaultHandlers(classes);\n // the markdown renderer uses a more standard format for overriding styles, so we map it here\n return {\n ...handlers,\n p: handlers.paragraph,\n ul: handlers.bulletList,\n ol: handlers.orderedList,\n li: handlers.listItem,\n code: handlers.codeBlock,\n h1: (props: any) =>\n handlers.heading({ ...props, node: { attrs: { level: 1 } } }),\n h2: (props: any) =>\n handlers.heading({ ...props, node: { attrs: { level: 2 } } }),\n h3: (props: any) =>\n handlers.heading({ ...props, node: { attrs: { level: 3 } } }),\n img: (props: any) =>\n handlers.image({\n ...props,\n node: { attrs: { src: props.src, alt: props.alt } },\n }),\n hr: (props: any) => <hr {...props} />,\n a: (props: any) => (\n <a href={props.href} className={classes.a}>\n {props.children}\n </a>\n ),\n span: ({ children }: { children: ReactNode }) => <span>{children}</span>, // strip out custom colors and all that (since they are usually pasted in accidentally)\n };\n};\n\nexport type ContentStyles = Partial<\n Record<keyof ReturnType<typeof getDefaultHandlers>, string>\n>;\n\nconst ContentRender = (props: {\n node: RenderNode;\n handlers?: NodeHandlers;\n classes?: ContentStyles;\n}): JSX.Element => {\n const { node, handlers: handlerOverrides = {} } = props;\n const handlers = {\n ...getDefaultHandlers(props.classes),\n ...handlerOverrides,\n };\n\n // recursively render child content\n const children: JSX.Element[] = [];\n node.content &&\n node.content.forEach((child, ix) => {\n children.push(\n <ContentRender\n node={child}\n handlers={handlers}\n key={`${child.type}- ${ix} `}\n />,\n );\n });\n\n // return empty if we are missing a handler for this type\n if (!(node.type in handlers)) {\n console.warn(`missing type`, node);\n return <></>;\n }\n // render the handler for this type\n const Handler = handlers[node.type];\n return <Handler node={node}>{children}</Handler>;\n};\n\n\n\ninterface Attrs {\n readonly [attr: string]: any;\n}\n\nexport interface RenderNode {\n type: string;\n attrs?: Attrs;\n marks?: Attrs[];\n content?: RenderNode[];\n readonly [attr: string]: any;\n}\n\nexport interface NodeProps {\n children?: React.ReactNode;\n node: RenderNode;\n}\n\nexport type NodeHandler = (props: NodeProps) => JSX.Element;\n\nexport interface NodeHandlers {\n readonly [attr: string]: NodeHandler;\n}\n\nexport const VenueContent = ({\n content,\n contentStyles,\n className,\n components,\n}: {\n content: LocalizedContent;\n contentStyles?: ContentStyles;\n className?: string;\n components?: NodeHandlers;\n}) => {\n const { contentJSON } = content;\n\n if (contentJSON) {\n return (\n <div className={className}>\n <EmbedResize />\n {(contentJSON.content as Array<RenderNode>).map((node, i) => (\n <ContentRender\n key={i}\n classes={contentStyles}\n node={node}\n handlers={components}\n />\n ))}\n </div>\n );\n }\n\n if (content.content) {\n return (\n <>\n <EmbedResize />\n <Markdown\n className={className}\n options={{\n overrides: {\n ...getMarkdownHandlers(contentStyles),\n },\n }}\n >\n {\n /* There are issues with <hr> tags in the parsing so we fix that with a regex */\n // @ts-ignore\n content.content.replaceAll(\n /(?:\\n|\\r\\n)\\*\\*\\*(?:\\n|\\r\\n)/g,\n \"\\n\\n***\\n\\n\",\n )\n }\n </Markdown>\n </>\n );\n }\n\n return null;\n};\n"],"mappings":"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","names":["Markdown","Fragment","jsx","jsxs","marks","getDefaultHandlers","classes","elMarks","props","attrClass","outerClassName","rest","className","accum","mark","hasWrappers","elWrappers","el","src","alt","image","VenueImage","start","key","style","frameborder","allowfullscreen","referrerpolicy","aspectRatio","styles","value","isVideo","isBandcamp","isVimeo","href","title","description","site","getMarkdownHandlers","handlers","children","ContentRender","node","handlerOverrides","child","ix","Handler","VenueContent","content","contentStyles","components","contentJSON","EmbedResize","i"]}