import React, { useState } from 'react'; import { fetchLinkMetadata } from '../services/geminiService'; import { Link } from '../types'; import { PlusIcon, CalendarIcon } from './icons'; import Spinner from './Spinner'; interface AddLinkFormProps { onAddLink: (newLink: Omit) => void; } const AddLinkForm: React.FC = ({ onAddLink }) => { const [url, setUrl] = useState(''); const [dueDate, setDueDate] = useState(''); const [showDueDate, setShowDueDate] = useState(false); const [isFetching, setIsFetching] = useState(false); const [error, setError] = useState(null); const isValidUrl = (urlString: string) => { try { new URL(urlString); return true; } catch (e) { return false; } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!url.trim() || !isValidUrl(url.trim())) { setError("Please enter a valid URL."); return; } setError(null); setIsFetching(true); try { const metadata = await fetchLinkMetadata(url.trim()); onAddLink({ url: url.trim(), ...metadata, dueDate: dueDate ? new Date(dueDate).getTime() : undefined }); setUrl(''); setDueDate(''); setShowDueDate(false); } catch (err) { const errorMessage = err instanceof Error ? err.message : "An unknown error occurred."; setError(`Failed to process link: ${errorMessage}`); } finally { setIsFetching(false); } }; return (
{ setUrl(e.target.value); if(error) setError(null); }} placeholder="Paste a link to save and analyze... (Ctrl+K)" className="flex-grow w-full px-4 py-3 bg-slate-100 dark:bg-slate-700 text-slate-800 dark:text-slate-200 border-2 border-transparent rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-transparent transition" disabled={isFetching} />
{showDueDate && (
setDueDate(e.target.value)} className="w-full sm:w-1/2 px-4 py-2 bg-slate-100 dark:bg-slate-700 rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-500" disabled={isFetching} min={new Date().toISOString().split('T')[0]} // Today />
)}
{error &&

{error}

}
); }; export default AddLinkForm;