Skip to content

Commit 3724fe3

Browse files
committed
fix(webapp): stop the sidebar feedback popover from canceling the submit
1 parent fc69101 commit 3724fe3

3 files changed

Lines changed: 37 additions & 12 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
area: webapp
3+
type: fix
4+
---
5+
6+
Fix the sidebar "Help & Feedback → Contact us" form sometimes not sending your message. It now sends reliably every time.

apps/webapp/app/components/Feedback.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,26 @@ import { TextLink } from "./primitives/TextLink";
2727
import { DialogClose } from "@radix-ui/react-dialog";
2828

2929
type 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">

apps/webapp/app/components/navigation/HelpAndFeedbackPopover.tsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ export function HelpAndFeedback({
3535
projectId?: string;
3636
}) {
3737
const [isHelpMenuOpen, setHelpMenuOpen] = useState(false);
38+
// Hosted outside the popover (below) and opened from the menu item, so the popover closing never
39+
// unmounts the feedback form mid-submit — that teardown was intermittently canceling the POST to
40+
// /resources/feedback, so messages sent from the sidebar were silently lost.
41+
const [isFeedbackOpen, setFeedbackOpen] = useState(false);
3842
const _currentPlan = useCurrentPlan();
3943
const { changelogs } = useRecentChangelogs(organizationId, projectId);
4044

@@ -164,14 +168,14 @@ export function HelpAndFeedback({
164168
target="_blank"
165169
/>
166170
<Shortcuts />
167-
<Feedback
168-
button={
169-
<SideMenuItemButton
170-
icon={EnvelopeIcon}
171-
name="Contact us…"
172-
data-action="contact-us"
173-
/>
174-
}
171+
<SideMenuItemButton
172+
icon={EnvelopeIcon}
173+
name="Contact us…"
174+
data-action="contact-us"
175+
onClick={() => {
176+
setHelpMenuOpen(false);
177+
setFeedbackOpen(true);
178+
}}
175179
/>
176180
</div>
177181
<div className="flex flex-col gap-1 p-1">
@@ -206,6 +210,8 @@ export function HelpAndFeedback({
206210
</Popover>
207211
)}
208212
</AskAIRoot>
213+
{/* Hosted outside the popover so closing the menu can't unmount the form mid-submit. */}
214+
<Feedback open={isFeedbackOpen} setOpen={setFeedbackOpen} />
209215
</motion.div>
210216
);
211217
}

0 commit comments

Comments
 (0)