PHP 8.2.30
Preview: ReactRenderer.tsx Size: 2.19 KB
/home/byroehnu/.trash/node_modules11/@adminjs/design-system/node_modules/@tiptap/react/src/ReactRenderer.tsx

import { Editor } from '@tiptap/core'
import React from 'react'

import { Editor as ExtendedEditor } from './Editor.js'

function isClassComponent(Component: any) {
  return !!(
    typeof Component === 'function'
    && Component.prototype
    && Component.prototype.isReactComponent
  )
}

function isForwardRefComponent(Component: any) {
  return !!(
    typeof Component === 'object'
    && Component.$$typeof?.toString() === 'Symbol(react.forward_ref)'
  )
}

export interface ReactRendererOptions {
  editor: Editor,
  props?: Record<string, any>,
  as?: string,
  className?: string,
  attrs?: Record<string, string>,
}

type ComponentType<R, P> =
  React.ComponentClass<P> |
  React.FunctionComponent<P> |
  React.ForwardRefExoticComponent<React.PropsWithoutRef<P> & React.RefAttributes<R>>;

export class ReactRenderer<R = unknown, P = unknown> {
  id: string

  editor: ExtendedEditor

  component: any

  element: Element

  props: Record<string, any>

  reactElement: React.ReactNode

  ref: R | null = null

  constructor(component: ComponentType<R, P>, {
    editor,
    props = {},
    as = 'div',
    className = '',
    attrs,
  }: ReactRendererOptions) {
    this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString()
    this.component = component
    this.editor = editor as ExtendedEditor
    this.props = props
    this.element = document.createElement(as)
    this.element.classList.add('react-renderer')

    if (className) {
      this.element.classList.add(...className.split(' '))
    }

    if (attrs) {
      Object.keys(attrs).forEach(key => {
        this.element.setAttribute(key, attrs[key])
      })
    }

    this.render()
  }

  render(): void {
    const Component = this.component
    const props = this.props

    if (isClassComponent(Component) || isForwardRefComponent(Component)) {
      props.ref = (ref: R) => {
        this.ref = ref
      }
    }

    this.reactElement = <Component {...props } />

    this.editor?.contentComponent?.setRenderer(this.id, this)
  }

  updateProps(props: Record<string, any> = {}): void {
    this.props = {
      ...this.props,
      ...props,
    }

    this.render()
  }

  destroy(): void {
    this.editor?.contentComponent?.removeRenderer(this.id)
  }
}

Directory Contents

Dirs: 0 × Files: 12

Name Size Perms Modified Actions
1.51 KB lrw-r--r-- 2026-02-28 11:47:04
Edit Download
1.12 KB lrw-r--r-- 2026-02-28 11:47:04
Edit Download
489 B lrw-r--r-- 2026-02-28 11:47:04
Edit Download
3.52 KB lrw-r--r-- 2026-02-28 11:47:04
Edit Download
1.51 KB lrw-r--r-- 2026-02-28 11:47:04
Edit Download
379 B lrw-r--r-- 2026-02-28 11:47:04
Edit Download
528 B lrw-r--r-- 2026-02-28 11:47:04
Edit Download
561 B lrw-r--r-- 2026-02-28 11:47:04
Edit Download
5.92 KB lrw-r--r-- 2026-02-28 11:47:04
Edit Download
2.19 KB lrw-r--r-- 2026-02-28 11:47:04
Edit Download
2.96 KB lrw-r--r-- 2026-02-28 11:47:04
Edit Download
392 B lrw-r--r-- 2026-02-28 11:47:04
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).