mirror of
https://github.com/stablyai/orca.git
synced 2026-09-29 16:02:50 +00:00
fix(renderer): latch the lazy dialog mounts in state instead of during render
React Doctor's ref-mutated-during-render rule failed static analysis on both sticky-mount latches. Use the useState mount-flag idiom already in NewWorkspaceComposerModal (addProjectMounted), set from the open handler.
This commit is contained in:
@@ -100,10 +100,7 @@ export default function NewWorkspaceComposerCard(
|
||||
)
|
||||
// Why sticky: the dialog animates itself closed off its own `option` prop, so unmounting it
|
||||
// when the option clears would cut that animation short.
|
||||
const setLocationDialogRequested = React.useRef(false)
|
||||
if (setLocationOption !== null) {
|
||||
setLocationDialogRequested.current = true
|
||||
}
|
||||
const [setLocationDialogMounted, setSetLocationDialogMounted] = React.useState(false)
|
||||
|
||||
const selectedRepo = eligibleRepos.find((candidate) => candidate.id === repoId)
|
||||
const selectedRepoName = selectedRepo?.displayName ?? selectedRepo?.path ?? 'This project'
|
||||
@@ -208,6 +205,7 @@ export default function NewWorkspaceComposerCard(
|
||||
}, [onAddProjectOverride, openModal])
|
||||
const handleSetLocation = React.useCallback(
|
||||
(option: NeedsProjectHostOption): void => {
|
||||
setSetLocationDialogMounted(true)
|
||||
setSetLocationOption(option)
|
||||
onNestedDialogOpenChange?.(true)
|
||||
},
|
||||
@@ -350,7 +348,7 @@ export default function NewWorkspaceComposerCard(
|
||||
submitShortcutModifierLabel={getScreenSubmitModifierLabel()}
|
||||
/>
|
||||
<AddRemoteHostDialog mode={addRemoteHostMode} onOpenChange={setAddRemoteHostMode} />
|
||||
{setLocationDialogRequested.current ? (
|
||||
{setLocationDialogMounted ? (
|
||||
<React.Suspense fallback={null}>
|
||||
<SetProjectLocationDialog
|
||||
option={setLocationOption}
|
||||
|
||||
@@ -108,10 +108,7 @@ export function SidebarSettingsHelpMenu(): React.JSX.Element {
|
||||
const [menuOpen, setMenuOpen] = useState(false)
|
||||
const [feedbackOpen, setFeedbackOpen] = useState(false)
|
||||
// Why sticky: the dialog animates itself closed off `open`, so unmounting on close cuts that short.
|
||||
const feedbackDialogRequested = React.useRef(false)
|
||||
if (feedbackOpen) {
|
||||
feedbackDialogRequested.current = true
|
||||
}
|
||||
const [feedbackDialogMounted, setFeedbackDialogMounted] = useState(false)
|
||||
const [isRestartingOrca, setIsRestartingOrca] = useState(false)
|
||||
const lastShowOnboardingAtRef = React.useRef(0)
|
||||
const updateCheckModifiersRef = React.useRef(NO_UPDATE_CHECK_MODIFIERS)
|
||||
@@ -131,6 +128,11 @@ export function SidebarSettingsHelpMenu(): React.JSX.Element {
|
||||
}
|
||||
}
|
||||
|
||||
const handleOpenFeedback = (): void => {
|
||||
setFeedbackDialogMounted(true)
|
||||
setFeedbackOpen(true)
|
||||
}
|
||||
|
||||
const handleShowOnboarding = (): void => {
|
||||
const now = Date.now()
|
||||
if (now - lastShowOnboardingAtRef.current < 500) {
|
||||
@@ -251,7 +253,7 @@ export function SidebarSettingsHelpMenu(): React.JSX.Element {
|
||||
)}
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuSeparator />
|
||||
<DropdownMenuItem onSelect={() => setFeedbackOpen(true)}>
|
||||
<DropdownMenuItem onSelect={handleOpenFeedback}>
|
||||
<MessageSquareText className="size-3.5" />
|
||||
{translate(
|
||||
'auto.components.sidebar.SidebarSettingsHelpMenu.4cf5b868d7',
|
||||
@@ -352,7 +354,7 @@ export function SidebarSettingsHelpMenu(): React.JSX.Element {
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
</div>
|
||||
{feedbackDialogRequested.current ? (
|
||||
{feedbackDialogMounted ? (
|
||||
<React.Suspense fallback={null}>
|
||||
<SidebarFeedbackDialog open={feedbackOpen} onOpenChange={setFeedbackOpen} />
|
||||
</React.Suspense>
|
||||
|
||||
Reference in New Issue
Block a user