Skip to content

Commit 6fd8712

Browse files
waleedlatif1claude
andcommitted
fix(settings): navigate back to origin page instead of always going home
Use sessionStorage to store the return URL when entering settings, and use router.replace for tab switches so history doesn't accumulate. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 26d62fc commit 6fd8712

File tree

3 files changed

+49
-14
lines changed

3 files changed

+49
-14
lines changed

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import { useCallback, useMemo } from 'react'
44
import { useQueryClient } from '@tanstack/react-query'
5-
import Link from 'next/link'
65
import { useParams, usePathname, useRouter } from 'next/navigation'
76
import { ChevronDown, Skeleton, Tooltip } from '@/components/emcn'
87
import { useSession } from '@/lib/auth/auth-client'
@@ -23,6 +22,7 @@ import { useOrganizations } from '@/hooks/queries/organization'
2322
import { prefetchSubscriptionData, useSubscriptionData } from '@/hooks/queries/subscription'
2423
import { useSuperUserStatus } from '@/hooks/queries/user-profile'
2524
import { usePermissionConfig } from '@/hooks/use-permission-config'
25+
import { useSettingsNavigation } from '@/hooks/use-settings-navigation'
2626

2727
interface SettingsSidebarProps {
2828
isCollapsed?: boolean
@@ -167,9 +167,11 @@ export function SettingsSidebar({
167167
[queryClient, workspaceId]
168168
)
169169

170-
const handleBack = () => {
171-
router.push(`/workspace/${workspaceId}/home`)
172-
}
170+
const { popSettingsReturnUrl, getSettingsHref } = useSettingsNavigation()
171+
172+
const handleBack = useCallback(() => {
173+
router.push(popSettingsReturnUrl(`/workspace/${workspaceId}/home`))
174+
}, [router, popSettingsReturnUrl, workspaceId])
173175

174176
return (
175177
<>
@@ -256,14 +258,20 @@ export function SettingsSidebar({
256258
{content}
257259
</a>
258260
) : (
259-
<Link
260-
href={`/workspace/${workspaceId}/settings/${item.id}`}
261+
<button
262+
type='button'
261263
className={itemClassName}
262264
onMouseEnter={() => handlePrefetch(item.id)}
263265
onFocus={() => handlePrefetch(item.id)}
266+
onClick={() =>
267+
router.replace(
268+
getSettingsHref({ section: item.id as SettingsSection }),
269+
{ scroll: false }
270+
)
271+
}
264272
>
265273
{content}
266-
</Link>
274+
</button>
267275
)
268276

269277
return (

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import {
6262
} from '@/app/workspace/[workspaceId]/w/hooks'
6363
import { useDeleteTask, useDeleteTasks, useRenameTask, useTasks } from '@/hooks/queries/tasks'
6464
import { usePermissionConfig } from '@/hooks/use-permission-config'
65+
import { useSettingsNavigation } from '@/hooks/use-settings-navigation'
6566
import { SIDEBAR_WIDTH } from '@/stores/constants'
6667
import { useFolderStore } from '@/stores/folders/store'
6768
import { useSearchModalStore } from '@/stores/modals/search/store'
@@ -218,6 +219,7 @@ export const Sidebar = memo(function Sidebar() {
218219
const { data: sessionData, isPending: sessionLoading } = useSession()
219220
const { canEdit } = useUserPermissionsContext()
220221
const { config: permissionConfig, filterBlocks } = usePermissionConfig()
222+
const { navigateToSettings } = useSettingsNavigation()
221223
const initializeSearchData = useSearchModalStore((state) => state.initializeData)
222224

223225
useEffect(() => {
@@ -497,10 +499,10 @@ export const Sidebar = memo(function Sidebar() {
497499
id: 'settings',
498500
label: 'Settings',
499501
icon: Settings,
500-
href: `/workspace/${workspaceId}/settings/general`,
502+
onClick: () => navigateToSettings(),
501503
},
502504
],
503-
[workspaceId]
505+
[workspaceId, navigateToSettings]
504506
)
505507

506508
const { data: fetchedTasks = [], isLoading: tasksLoading } = useTasks(workspaceId)

apps/sim/hooks/use-settings-navigation.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { useCallback } from 'react'
44
import { useParams, useRouter } from 'next/navigation'
55
import type { SettingsSection } from '@/app/workspace/[workspaceId]/settings/navigation'
66

7+
const SETTINGS_RETURN_URL_KEY = 'settings-return-url'
8+
79
interface SettingsNavigationOptions {
810
section?: SettingsSection
911
mcpServerId?: string
@@ -12,28 +14,51 @@ interface SettingsNavigationOptions {
1214
interface UseSettingsNavigationReturn {
1315
navigateToSettings: (options?: SettingsNavigationOptions) => void
1416
getSettingsHref: (options?: SettingsNavigationOptions) => string
17+
popSettingsReturnUrl: (fallback: string) => string
1518
}
1619

1720
export function useSettingsNavigation(): UseSettingsNavigationReturn {
1821
const router = useRouter()
1922
const params = useParams()
2023
const workspaceId = params.workspaceId as string
2124

25+
const settingsPrefix = `/workspace/${workspaceId}/settings/`
26+
2227
const getSettingsHref = useCallback(
2328
(options?: SettingsNavigationOptions): string => {
2429
const section = options?.section || 'general'
2530
const searchParams = options?.mcpServerId ? `?mcpServerId=${options.mcpServerId}` : ''
26-
return `/workspace/${workspaceId}/settings/${section}${searchParams}`
31+
return `${settingsPrefix}${section}${searchParams}`
2732
},
28-
[workspaceId]
33+
[settingsPrefix]
2934
)
3035

36+
const popSettingsReturnUrl = useCallback((fallback: string): string => {
37+
try {
38+
const url = sessionStorage.getItem(SETTINGS_RETURN_URL_KEY)
39+
sessionStorage.removeItem(SETTINGS_RETURN_URL_KEY)
40+
return url ?? fallback
41+
} catch {
42+
return fallback
43+
}
44+
}, [])
45+
3146
const navigateToSettings = useCallback(
3247
(options?: SettingsNavigationOptions) => {
33-
router.push(getSettingsHref(options))
48+
const currentPath = window.location.pathname
49+
if (currentPath.startsWith(settingsPrefix)) {
50+
router.replace(getSettingsHref(options), { scroll: false })
51+
} else {
52+
try {
53+
sessionStorage.setItem(SETTINGS_RETURN_URL_KEY, currentPath)
54+
} catch {
55+
// Ignore storage errors
56+
}
57+
router.push(getSettingsHref(options))
58+
}
3459
},
35-
[router, getSettingsHref]
60+
[router, settingsPrefix, getSettingsHref]
3661
)
3762

38-
return { navigateToSettings, getSettingsHref }
63+
return { navigateToSettings, getSettingsHref, popSettingsReturnUrl }
3964
}

0 commit comments

Comments
 (0)