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;