Files
yaak/src-web/components/ImportCurlButton.tsx
2024-08-10 07:53:26 -07:00

54 lines
1.5 KiB
TypeScript

import { clear, readText } from '@tauri-apps/plugin-clipboard-manager';
import { motion } from 'framer-motion';
import React, { useEffect, useState } from 'react';
import { useImportCurl } from '../hooks/useImportCurl';
import { useWindowFocus } from '../hooks/useWindowFocus';
import { Button } from './core/Button';
import { Icon } from './core/Icon';
export function ImportCurlButton() {
const focused = useWindowFocus();
const [clipboardText, setClipboardText] = useState('');
const importCurl = useImportCurl();
const [isLoading, setIsLoading] = useState(false);
useEffect(() => {
readText().then(setClipboardText);
}, [focused]);
if (!clipboardText?.trim().startsWith('curl ')) {
return null;
}
return (
<motion.div
initial={{ opacity: 0, scale: 0 }}
animate={{ opacity: 1, scale: 1 }}
transition={{ delay: 0.5 }}
>
<Button
size="xs"
variant="border"
color="primary"
leftSlot={<Icon icon="paste" size="sm" />}
isLoading={isLoading}
onClick={async () => {
setIsLoading(true);
try {
await importCurl.mutateAsync({ command: clipboardText });
await clear(); // Clear the clipboard so the button goes away
setClipboardText('');
} catch (e) {
// Nothing
} finally {
setIsLoading(false);
}
}}
>
Import Curl
</Button>
</motion.div>
);
}