import { createRef } from 'preact' import React, { useLayoutEffect, useMemo, useRef } from 'react' interface DataAttributes { [key: string]: string | boolean | undefined } const insertScript = ( src: string, id: string, dataAttributes: DataAttributes, onload = () => {} ) => { const script = window.document.createElement('script') script.async = true script.src = src script.id = id if (document.getElementById(id)) { return } script.addEventListener('load', onload, { capture: true, once: true }) Object.entries(dataAttributes).forEach(([key, value]) => { if (value === undefined) { return } script.setAttribute(`data-${key}`, value.toString()) }) document.body.appendChild(script) return () => { script.remove() } } const ReactCommento = ({ url, cssOverride, autoInit, noFonts, hideDeleted, pageId, }: { url: string cssOverride?: string autoInit?: boolean noFonts?: boolean hideDeleted?: boolean pageId?: string }) => { const containerId = useMemo(() => `commento-${Math.random().toString().slice(2, 8)}`, []) const container = createRef() useLayoutEffect(() => { if (!window) { return } window['commento'] = container.current const removeScript = insertScript( url, `${containerId}-script`, { 'css-override': cssOverride, 'auto-init': autoInit, 'no-fonts': noFonts, 'hide-deleted': hideDeleted, 'page-id': pageId, 'id-root': containerId, }, () => { removeScript() } ) }, [autoInit, cssOverride, hideDeleted, noFonts, pageId, url, containerId, container]) return
} export default ReactCommento