• Will Chen's avatar
    Fix refresh to preserve current route (#253) (#2336) · eb9f9162
    Will Chen 提交于
    ## Summary
    - When clicking the refresh button in the preview panel, the app now
    preserves the current route instead of defaulting to the root path (/)
    - Store the current URL in a ref when refresh is clicked, then use it as
    the iframe src during reload
    - Added E2E test to verify route preservation on refresh
    
    Fixes #253
    
    ## Test plan
    - E2E test `refresh preserves current route` verifies the fix:
      1. Create an app
    2. Navigate to a different route using JavaScript (simulating
    client-side navigation)
      3. Click refresh
      4. Verify the address bar still shows the navigated route (not /)
    - Existing `refresh app` test continues to pass
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    <!-- devin-review-badge-begin -->
    
    ---
    
    <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2336">
      <picture>
    <source media="(prefers-color-scheme: dark)"
    srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
    <img
    src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
    alt="Open with Devin">
      </picture>
    </a>
    <!-- devin-review-badge-end -->
    
    <!-- CURSOR_SUMMARY -->
    ---
    
    > [!NOTE]
    > Ensures the preview iframe keeps the current client-side route on
    refresh and after HMR remounts.
    > 
    > - Track route changes (`pushState`/`replaceState`) and persist per-app
    URL via `previewCurrentUrlAtom`; initialize navigation from preserved
    URL
    > - Use `currentIframeUrlRef` and validated same-origin URL as iframe
    `src` on reload; reset history on app change
    > - Update `PreviewIframe` navigation history, address bar
    (`data-testid="preview-address-bar-path"`), and reload logic; avoid
    unintended src resets on re-render
    > - Add E2E test `refresh preserves current route` with a multi-page
    React Router fixture to verify behavior
    > 
    > <sup>Written by [Cursor
    Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
    d715ec38b8fb94383eafe3a31b901d407468ab4e. This will update automatically
    on new commits. Configure
    [here](https://cursor.com/dashboard?tab=bugbot).</sup>
    <!-- /CURSOR_SUMMARY -->
    
    <!-- This is an auto-generated description by cubic. -->
    ---
    ## Summary by cubic
    Refresh in the preview panel now preserves the current route instead of
    resetting to /. Routes are also restored after HMR remounts; adds an E2E
    test to confirm this; fixes #253.
    
    - **Bug Fixes**
    - Track route changes (pushState/replaceState) and persist the current
    URL per app via previewCurrentUrlAtom; on reload, validate same-origin
    and use it as the iframe src; reset on app change.
    - Add a data-testid to the address bar and a Playwright test that
    navigates via a react-router link in a multi-page app, refreshes, waits,
    and asserts the route remains.
    
    <sup>Written for commit d715ec38b8fb94383eafe3a31b901d407468ab4e.
    Summary will update on new commits.</sup>
    
    <!-- End of auto-generated description by cubic. -->
    
    ---------
    Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
    Co-authored-by: 's avatarclaude[bot] <41898282+claude[bot]@users.noreply.github.com>
    eb9f9162
名称
最后提交
最后更新
..
chat 正在载入提交数据...
home 正在载入提交数据...
preview_panel 正在载入提交数据...
settings 正在载入提交数据...
ui 正在载入提交数据...
AIGeneratorTab.tsx 正在载入提交数据...
AppList.tsx 正在载入提交数据...
AppSearchDialog.tsx 正在载入提交数据...
AppUpgrades.tsx 正在载入提交数据...
AutoApproveSwitch.tsx 正在载入提交数据...
AutoFixProblemsSwitch.tsx 正在载入提交数据...
AutoUpdateSwitch.tsx 正在载入提交数据...
BugScreenshotDialog.tsx 正在载入提交数据...
CapacitorControls.tsx 正在载入提交数据...
ChatInputControls.tsx 正在载入提交数据...
ChatList.tsx 正在载入提交数据...
ChatModeSelector.tsx 正在载入提交数据...
ChatPanel.tsx 正在载入提交数据...
ChatSearchDialog.tsx 正在载入提交数据...
CommunityCodeConsentDialog.tsx 正在载入提交数据...
ConfirmationDialog.tsx 正在载入提交数据...
ContextFilesPicker.tsx 正在载入提交数据...
CopyErrorMessage.tsx 正在载入提交数据...
CreateAppDialog.tsx 正在载入提交数据...
CreateCustomModelDialog.tsx 正在载入提交数据...
CreateCustomProviderDialog.tsx 正在载入提交数据...
CreatePromptDialog.tsx 正在载入提交数据...
CustomErrorToast.tsx 正在载入提交数据...
CustomThemeDialog.tsx 正在载入提交数据...
DefaultChatModeSelector.tsx 正在载入提交数据...
DeleteConfirmationDialog.tsx 正在载入提交数据...
DyadProSuccessDialog.tsx 正在载入提交数据...
EditCustomModelDialog.tsx 正在载入提交数据...
EditThemeDialog.tsx 正在载入提交数据...
ErrorBoundary.tsx 正在载入提交数据...
ForceCloseDialog.tsx 正在载入提交数据...
GitHubConnector.tsx 正在载入提交数据...
GitHubIntegration.tsx 正在载入提交数据...
GithubBranchManager.tsx 正在载入提交数据...
GithubCollaboratorManager.tsx 正在载入提交数据...
HelpBotDialog.tsx 正在载入提交数据...
HelpDialog.tsx 正在载入提交数据...
ImportAppButton.tsx 正在载入提交数据...
ImportAppDialog.tsx 正在载入提交数据...
InputRequestToast.tsx 正在载入提交数据...
LibraryList.tsx 正在载入提交数据...
LoadingBlock.tsx 正在载入提交数据...
LocalAgentNewChatToast.tsx 正在载入提交数据...
MaxChatTurnsSelector.tsx 正在载入提交数据...
McpConsentToast.tsx 正在载入提交数据...
McpToolsPicker.tsx 正在载入提交数据...
ModelPicker.tsx 正在载入提交数据...
NeonConnector.tsx 正在载入提交数据...
NeonDisconnectButton.tsx 正在载入提交数据...
NeonIntegration.tsx 正在载入提交数据...
NodePathSelector.tsx 正在载入提交数据...
PortalMigrate.tsx 正在载入提交数据...
PriceBadge.tsx 正在载入提交数据...
ProBanner.tsx 正在载入提交数据...
ProModeSelector.tsx 正在载入提交数据...
ProviderSettings.tsx 正在载入提交数据...
ReleaseChannelSelector.tsx 正在载入提交数据...
RuntimeModeSelector.tsx 正在载入提交数据...
ScreenshotSuccessDialog.tsx 正在载入提交数据...
SettingsList.tsx 正在载入提交数据...
SetupBanner.tsx 正在载入提交数据...
SetupProviderCard.tsx 正在载入提交数据...
SupabaseConnector.tsx 正在载入提交数据...
SupabaseIntegration.tsx 正在载入提交数据...
TelemetryBanner.tsx 正在载入提交数据...
TelemetrySwitch.tsx 正在载入提交数据...
TemplateCard.tsx 正在载入提交数据...
ThinkingBudgetSelector.tsx 正在载入提交数据...
VercelConnector.tsx 正在载入提交数据...
VercelIntegration.tsx 正在载入提交数据...
ZoomSelector.tsx 正在载入提交数据...
app-sidebar.tsx 正在载入提交数据...
appItem.tsx 正在载入提交数据...