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} /> setShowDueDate(!showDueDate)} className={`p-3 text-slate-500 dark:text-slate-400 rounded-md transition-colors ${showDueDate ? 'bg-indigo-100 dark:bg-indigo-500/20 text-indigo-600 dark:text-indigo-300' : 'hover:bg-slate-100 dark:hover:bg-slate-700'}`} aria-label="Set due date" disabled={isFetching} > {isFetching ? ( <> Analyzing... > ) : ( <> Add Link > )} {showDueDate && ( Due Date (Optional) 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;
{error}