fix(dashboard): prevent unhandled promise rejections and CodeMirror crash#10576
Draft
cursor[bot] wants to merge 1 commit intonextfrom
Draft
fix(dashboard): prevent unhandled promise rejections and CodeMirror crash#10576cursor[bot] wants to merge 1 commit intonextfrom
cursor[bot] wants to merge 1 commit intonextfrom
Conversation
… sites Addresses DASHBOARD-282 and similar unhandled rejection errors across the dashboard. When TanStack Query's mutateAsync is awaited and the mutation fails, the onError callback runs but the promise still rejects. Without a try-catch at the call site, this produces an unhandled rejection that Sentry captures. Fixed call sites: - create-subscriber.tsx (DASHBOARD-282: 23 events, 11 users) - create-topic-form.tsx - create-context-form.tsx - subscriber-row.tsx (delete subscriber) - subscriber-overview-form.tsx (delete subscriber) Also coerces Editor component value to string to prevent CodeMirror crash when react-hook-form passes a non-string value (DASHBOARD-2M8). Co-authored-by: Dima Grossman <dima@grossman.io>
✅ Deploy Preview for dashboard-v2-novu-staging ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Contributor
|
Hey there and thank you for opening this pull request! 👋 We require pull request titles to follow specific formatting rules and it looks like your proposed title needs to be adjusted. Your PR title is: Requirements:
Expected format: Details: PR title must end with 'fixes TICKET-ID' (e.g., 'fixes NOV-123') or include ticket ID in branch name |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
Fixes two categories of production Sentry errors in the dashboard:
1. Unhandled promise rejections at
mutateAsynccall sitesError signatures: DASHBOARD-282, plus similar patterns in topic/context creation and subscriber deletion.
Root cause: TanStack Query's
mutateAsyncre-throws errors after theonErrorcallback runs. When the calling code usesawait mutateAsync()without atry-catch, the re-thrown error becomes an unhandled promise rejection that Sentry captures.Fix: Added
try-catchblocks at all affected call sites:create-subscriber.tsx— subscriber creation (DASHBOARD-282: 23 events, 11 users)create-topic-form.tsx— topic creationcreate-context-form.tsx— context creationsubscriber-row.tsx— subscriber deletionsubscriber-overview-form.tsx— subscriber deletion from overviewThis follows the same pattern already used in
upsert-variable-form.tsxand other existing call sites.2. CodeMirror crash on non-string value
Error signature: DASHBOARD-2M8 —
value must be typeof string but got objectRoot cause: The
Editorcomponent passes itsvalueprop directly to@uiw/react-codemirror, which throws at runtime if the value is not a string. When react-hook-form provides an object value (e.g., from a step control schema with nested types), this crashes the editor.Fix: Added safe string coercion (
typeof value === 'string' ? value : String(value ?? '')) in theEditorcomponent before passing to CodeMirror. This is the single choke point for all CodeMirror usage in the dashboard.Remaining risk
upsert-variable-form.tsxalready uses this exact try-catch pattern successfully