Files
yaak/apps/yaak-client/components/CopyIconButton.tsx
2026-03-12 08:31:05 -07:00

32 lines
915 B
TypeScript

import { IconButton, type IconButtonProps, useTimedBoolean } from '@yaakapp-internal/ui';
import { copyToClipboard } from '../lib/copy';
import { showToast } from '../lib/toast';
interface Props extends Omit<IconButtonProps, 'onClick' | 'icon'> {
text: string | (() => Promise<string | null>);
}
export function CopyIconButton({ text, ...props }: Props) {
const [copied, setCopied] = useTimedBoolean();
return (
<IconButton
{...props}
icon={copied ? 'check' : 'copy'}
showConfirm
onClick={async () => {
const content = typeof text === 'function' ? await text() : text;
if (content == null) {
showToast({
id: 'failed-to-copy',
color: 'danger',
message: 'Failed to copy',
});
} else {
copyToClipboard(content, { disableToast: true });
setCopied();
}
}}
/>
);
}