openreplay/frontend/app/components/ui/CodeBlock/CodeBlock.tsx
Delirium 1d6fb0ae9e ui: shrink icons when no space, adjust player area for events export … (#3217)
* ui: shrink icons when no space, adjust player area for events export panel, fix panel size

* ui: rm log
2025-03-26 16:38:48 +01:00

60 lines
1.5 KiB
TypeScript

import React, { useEffect } from 'react';
import copyFn from 'copy-to-clipboard';
import { Files } from 'lucide-react';
import { Tooltip } from 'antd';
import cn from 'classnames';
import { useTranslation } from 'react-i18next';
interface Props {
code?: string;
extra?: string;
language?: string;
copy?: boolean;
width?: string;
height?: string;
}
export default function CodeBlock({
code = '',
extra = '',
language = 'javascript',
copy = false,
width = undefined,
height = undefined,
}: Props) {
const { t } = useTranslation();
useEffect(() => {
setTimeout(() => {
if (window.Prism) {
Prism.highlightAll();
}
}, 0);
}, [code, language]);
return (
<div className={'relative'}>
{extra || copy ? (
<div className={'w-full flex items-center justify-between mb-2'}>
{extra && <div className="text-sm text-disabled-text">{extra}</div>}
{copy && (
<div className="cursor-pointer" onClick={() => copyFn(code)}>
<Tooltip title={t('Copy code')} placement={'bottomLeft'}>
<Files size={14} />
</Tooltip>
</div>
)}
</div>
) : null}
<pre
className={cn(
'rounded-lg relative',
width ? 'overflow-x-auto' : '',
height ? 'overflow-y-auto' : '',
)}
style={{ maxWidth: width, maxHeight: height }}
>
<code className={`language-${language}`}>{code}</code>
</pre>
</div>
);
}