/** * Reusable test components for integration tests * * These components are extracted from large test files to reduce complexity * and improve reusability across test suites. */ import React, { useId } from 'react' import { createInputChangeHandler, createSelectChangeHandler, createUrlBlurHandler, type FormData, type FormErrors, validateCurrentForm } from './form-handlers' // Get mocks from global scope (set up in individual tests) // Note: Mocks are available on globalThis (mockCheckUrl, mockFetchMetadata, mockSubmitProject) /** * Simplified submit form component for testing project submission flow * * @param props - Component properties * @returns JSX component for testing form interactions */ export const TestSubmitProjectForm = () => { const urlErrorId = useId() const titleErrorId = useId() const descriptionErrorId = useId() const categoryErrorId = useId() const tagsErrorId = useId() const [formData, setFormData] = React.useState({ url: '', title: '', description: '', category: '', tags: [] }) const [errors, setErrors] = React.useState({}) const [isLoading, setIsLoading] = React.useState(false) const [isSuccess, setIsSuccess] = React.useState(false) const [submitCount, setSubmitCount] = React.useState(0) const handleUrlBlur = createUrlBlurHandler(formData, setFormData, errors, setErrors, setIsLoading) /** * Handles form submission with validation and API call * * @param e - Form submission event * @returns Promise that resolves when submission is complete */ const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setSubmitCount(prev => prev + 1) const isValid = validateCurrentForm(formData, setErrors) if (!isValid) { return } try { setIsLoading(true) await (globalThis as any).mockSubmitProject(formData) setIsSuccess(true) } catch (_error) { setErrors(prev => ({ ...prev, submit: 'Failed to submit project' })) } finally { setIsLoading(false) } } /** * Handles button click event for form submission * * @param e - Mouse click event * @returns Promise that resolves when submission is complete */ const handleButtonClick = (e: React.MouseEvent) => { e.preventDefault() setSubmitCount(prev => prev + 1) const isValid = validateCurrentForm(formData, setErrors) if (!isValid) { return } try { setIsLoading(true) ;(globalThis as any) .mockSubmitProject(formData) .then(() => setIsSuccess(true)) .catch(() => setErrors(prev => ({ ...prev, submit: 'Failed to submit project' }))) .finally(() => setIsLoading(false)) } catch (_error) { setErrors(prev => ({ ...prev, submit: 'Failed to submit project' })) } } if (isSuccess) { return (

Project submitted successfully!

Your project has been added to the hub.

) } return (
{/* Debug info */}
Submit count: {submitCount}, Errors: {JSON.stringify(errors)}
{errors.url && ( {errors.url} )}
{errors.title && ( {errors.title} )}