import {Button, InlineCode, Link} from '@remotion/design';
import React, {useEffect, useState} from 'react';
import {codeToHtml} from 'shikiji';
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
} from '~/components/ui/dialog';
import {copyText} from './copy-text';
import {generateCode} from './generate-code';
import type {TimingComponent} from './types';
const CodeBlock: React.FC<{
readonly code: string;
readonly highlightedHtml: string;
}> = ({code, highlightedHtml}) => {
return (
{highlightedHtml ? (
) : (
{code}
)}
);
};
export const CodeModal: React.FC<{
readonly open: boolean;
readonly onOpenChange: (open: boolean) => void;
readonly components: TimingComponent[];
}> = ({open, onOpenChange, components}) => {
const [highlightedImports, setHighlightedImports] = useState('');
const [highlightedCode, setHighlightedCode] = useState('');
const [copied, setCopied] = useState<'imports' | 'code' | null>(null);
const generated = generateCode(components);
useEffect(() => {
if (!open) return;
if (generated.imports) {
codeToHtml(generated.imports, {
lang: 'typescript',
theme: 'github-dark',
}).then((html) => {
setHighlightedImports(html);
});
}
codeToHtml(generated.code, {
lang: 'typescript',
theme: 'github-dark',
}).then((html) => {
setHighlightedCode(html);
});
}, [generated.imports, generated.code, open]);
const handleCopy = async (type: 'imports' | 'code') => {
const textToCopy = type === 'imports' ? generated.imports : generated.code;
try {
await copyText(textToCopy);
setCopied(type);
setTimeout(() => setCopied(null), 2000);
} catch {
// Fallback using clipboard API directly
await navigator.clipboard.writeText(textToCopy);
setCopied(type);
setTimeout(() => setCopied(null), 2000);
}
};
return (
);
};