import React, { useState, useCallback, useEffect } from 'react'; import { useURLValidation } from '../../hooks/useURLValidation'; import { ValidationFeedback, ValidationIcon } from '../ui/ValidationFeedback'; interface SummarizeFormProps { onSubmit?: (videoId: string, videoUrl: string) => void; className?: string; } // Debounce helper function useDebounce(value: T, delay: number): T { const [debouncedValue, setDebouncedValue] = useState(value); useEffect(() => { const handler = setTimeout(() => { setDebouncedValue(value); }, delay); return () => { clearTimeout(handler); }; }, [value, delay]); return debouncedValue; } export const SummarizeForm: React.FC = ({ onSubmit, className = '', }) => { const [url, setUrl] = useState(''); const [hasInteracted, setHasInteracted] = useState(false); const { validateURL, validateURLClient, resetValidation, validationState } = useURLValidation(); // Debounce the URL for validation const debouncedUrl = useDebounce(url, 500); // Validate on debounced URL change useEffect(() => { if (debouncedUrl && hasInteracted) { // First do quick client-side validation const clientResult = validateURLClient(debouncedUrl); if (clientResult.isValid) { // If client validation passes, do server validation validateURL(debouncedUrl); } } else if (!debouncedUrl && hasInteracted) { resetValidation(); } }, [debouncedUrl, hasInteracted, validateURL, validateURLClient, resetValidation]); const handleInputChange = useCallback((e: React.ChangeEvent) => { const newUrl = e.target.value; setUrl(newUrl); if (!hasInteracted) { setHasInteracted(true); } // Immediate client-side validation for instant feedback if (newUrl) { validateURLClient(newUrl); } else { resetValidation(); } }, [hasInteracted, validateURLClient, resetValidation]); const handleSubmit = useCallback(async (e: React.FormEvent) => { e.preventDefault(); if (!url) { setHasInteracted(true); return; } // Validate before submission const result = await validateURL(url); if (result.isValid && result.videoId && result.videoUrl && onSubmit) { onSubmit(result.videoId, result.videoUrl); } }, [url, validateURL, onSubmit]); const handlePaste = useCallback((e: React.ClipboardEvent) => { // Immediately validate pasted content setTimeout(() => { const pastedUrl = e.currentTarget.value; if (pastedUrl) { setHasInteracted(true); validateURL(pastedUrl); } }, 0); }, [validateURL]); const isSubmitDisabled = !url || validationState.isValidating || !validationState.isValid; return (
{hasInteracted && ( )}
Supported URL formats
  • https://youtube.com/watch?v=VIDEO_ID
  • https://youtu.be/VIDEO_ID
  • https://youtube.com/embed/VIDEO_ID
  • https://m.youtube.com/watch?v=VIDEO_ID

Note: Playlist URLs are not currently supported. Please provide individual video URLs.

); };