@@ -27,13 +27,26 @@ import { TextLink } from "./primitives/TextLink";
2727import { DialogClose } from "@radix-ui/react-dialog" ;
2828
2929type FeedbackProps = {
30- button : ReactNode ;
30+ button ? : ReactNode ;
3131 defaultValue ?: FeedbackType ;
3232 onOpenChange ?: ( open : boolean ) => void ;
33+ // Controlled mode — pass both to host the dialog outside a popover so the popover closing can't
34+ // unmount the form mid-submit (that teardown was intermittently canceling the feedback POST).
35+ open ?: boolean ;
36+ setOpen ?: ( open : boolean ) => void ;
3337} ;
3438
35- export function Feedback ( { button, defaultValue = "bug" , onOpenChange } : FeedbackProps ) {
36- const [ open , setOpen ] = useState ( false ) ;
39+ export function Feedback ( {
40+ button,
41+ defaultValue = "bug" ,
42+ onOpenChange,
43+ open : openProp ,
44+ setOpen : setOpenProp ,
45+ } : FeedbackProps ) {
46+ const [ openState , setOpenState ] = useState ( false ) ;
47+ // Controlled when the caller passes open/setOpen (hosted outside a popover); otherwise self-managed.
48+ const open = openProp ?? openState ;
49+ const setOpen = setOpenProp ?? setOpenState ;
3750 const [ searchParams , setSearchParams ] = useSearchParams ( ) ;
3851 const location = useLocation ( ) ;
3952 const lastSubmission = useActionData ( ) ;
@@ -79,7 +92,7 @@ export function Feedback({ button, defaultValue = "bug", onOpenChange }: Feedbac
7992
8093 return (
8194 < Dialog open = { open } onOpenChange = { handleOpenChange } >
82- < DialogTrigger asChild > { button } </ DialogTrigger >
95+ { button ? < DialogTrigger asChild > { button } </ DialogTrigger > : null }
8396 < DialogContent >
8497 < DialogHeader > Contact us</ DialogHeader >
8598 < div className = "mt-2 flex flex-col gap-4" >
0 commit comments