nitro-v36-with-renderer-v36
/
src /
components /
wired /
views /
extras /
WiredPlaceholderPreview.tsx
WiredPlaceholderPreview.tsx 1.9 Ko
Télécharger le fichier
import { FC, useEffect, useState } from 'react';
import { Text } from '../../../../common';
import { SanitizeHtml } from '../../../../api';
import { BaseButton } from '../../../../common/BaseButton';
import { NativeTextTree } from '../../../../common/native-text/NativeTextTree';
interface WiredPlaceholderPreviewProps {
previewHtml: string;
previewToken: string;
}
const copyToClipboard = async (value: string) => {
if (!value) return false;
try {
if (navigator?.clipboard?.writeText) {
await navigator.clipboard.writeText(value);
return true;
}
} catch {}
try {
const textArea = document.createElement('textarea');
textArea.value = value;
textArea.setAttribute('readonly', '');
textArea.style.position = 'fixed';
textArea.style.opacity = '0';
document.body.appendChild(textArea);
textArea.select();
const copied = document.execCommand('copy');
document.body.removeChild(textArea);
return copied;
} catch {
return false;
}
};
export const WiredPlaceholderPreview: FC<WiredPlaceholderPreviewProps> = (props) => {
const { previewHtml, previewToken } = props;
const [copied, setCopied] = useState(false);
useEffect(() => {
if (!copied) return;
const timeout = window.setTimeout(() => setCopied(false), 1200);
return () => window.clearTimeout(timeout);
}, [copied]);
const handleCopy = async () => {
const didCopy = await copyToClipboard(previewToken);
setCopied(didCopy);
};
return (
<NativeTextTree>
<BaseButton type="button" className={`octane-wired__placeholder-preview ${copied ? 'is-copied' : ''}`} onClick={handleCopy}>
<Text dangerouslySetInnerHTML={{ __html: SanitizeHtml(previewHtml) }} />
</BaseButton>
</NativeTextTree>
);
};
