import React, { useRef, useEffect, useState, useCallback } from 'react'; import UsernameAutocomplete from './UsernameAutocomplete'; interface SubmissionFormProps { username: string; setUsername: (value: string) => void; geIdAndLang: string; setGeIdAndLang: (value: string) => void; handleSubmit: (e: React.FormEvent) => void; onManageUserClick: () => void; onViewInfoClick?: () => void; } const SubmissionForm: React.FC = ({ username, setUsername, geIdAndLang, setGeIdAndLang, handleSubmit, onManageUserClick, onViewInfoClick, }) => { const geIdAndLangRef = useRef(null); const [usernameHeight, setUsernameHeight] = useState(null); // Memoize callbacks to prevent unnecessary re-renders const handleUsernameChange = useCallback((value: string) => { setUsername(value); }, [setUsername]); const handleUserSelect = useCallback((user: string) => { setUsername(user); }, [setUsername]); const handleHeightChange = useCallback((h: number) => { setUsernameHeight(h); }, []); const handleGeIdAndLangChange = useCallback((e: React.ChangeEvent) => { setGeIdAndLang(e.target.value); }, [setGeIdAndLang]); useEffect(() => { const geIdAndLangEl = geIdAndLangRef.current; if (!geIdAndLangEl) return; const observer = new ResizeObserver(entries => { window.requestAnimationFrame(() => { if (!entries.length) return; const newHeightPx = `${(entries[0].target as HTMLElement).offsetHeight}px`; if (geIdAndLangEl.style.height !== newHeightPx) { geIdAndLangEl.style.height = newHeightPx; } }); }); observer.observe(geIdAndLangEl); return () => observer.disconnect(); }, []); return (