fix(desktop): show the file browser default in Appearance settings

Settings > Appearance > Window & layout gets a File Browser toggle bound to the same persisted state as the titlebar toggle and Cmd+J, so the open/closed default is a visible, searchable preference.
This commit is contained in:
Brooklyn Nicholson
2026-09-25 01:20:38 -05:00
committed by brooklyn!
parent 9adc38974c
commit 70b5725989
3 changed files with 73 additions and 0 deletions

View File

@@ -26,6 +26,7 @@ import {
setInterfaceMode
} from '@/store/interface-mode'
import { $introSplash, setIntroSplash } from '@/store/intro-splash'
import { $fileBrowserOpen, setFileBrowserOpen } from '@/store/layout'
import { notifyError } from '@/store/notifications'
import { $activeGatewayProfile, $profiles, normalizeProfileKey } from '@/store/profile'
import { $reactionsEnabled, setReactionsEnabled } from '@/store/reactions-enabled'
@@ -430,6 +431,7 @@ export function AppearanceSettings({ subpage }: AppearanceSettingsProps = {}) {
const embedMode = useStore($embedMode)
const embedAllowed = useStore($embedAllowed)
const composerPopoutGesturesEnabled = useStore($composerPopoutGesturesEnabled)
const fileBrowserOpen = useStore($fileBrowserOpen)
const translucency = useStore($translucency)
const glassMode = translucency.mode === 'glass' && GLASS_SUPPORTED
const userBubbleTransparency = useStore($userBubbleTransparency)
@@ -924,6 +926,18 @@ export function AppearanceSettings({ subpage }: AppearanceSettingsProps = {}) {
/>
)}
{/* The same state as the titlebar toggle / ⌘J, which persists across
launches — so this is the file browser's standing default. */}
{show('window-layout') && (
<ToggleRow
checked={fileBrowserOpen}
description={a.fileBrowserDesc}
id={settingElementId(ids.fileBrowser)}
label={a.fileBrowserTitle}
onChange={setFileBrowserOpen}
/>
)}
{show('window-layout') && (
<ToggleRow
checked={composerPopoutGesturesEnabled}

View File

@@ -0,0 +1,54 @@
// @vitest-environment jsdom
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'
import { afterEach, describe, expect, it } from 'vitest'
import { $fileBrowserOpen, FILE_BROWSER_PANE_ID, setFileBrowserOpen, toggleFileBrowserOpen } from '@/store/layout'
import { $paneStates } from '@/store/panes'
import { AppearanceSettings } from './appearance-settings'
// #65173: the file browser's open/closed default was only reachable through
// ⌘J and a persistence chain nobody could see. Settings now states it, and it
// is the same state the titlebar toggle writes — two views, one answer.
afterEach(() => {
cleanup()
act(() => setFileBrowserOpen(false))
})
function fileBrowserSwitch() {
render(
<QueryClientProvider client={new QueryClient()}>
<AppearanceSettings subpage="window-layout" />
</QueryClientProvider>
)
return screen.getByRole('switch', { name: 'File Browser' })
}
describe('File Browser setting', () => {
it('turns the file browser on and off, and persists the choice', () => {
const toggle = fileBrowserSwitch()
expect(toggle.getAttribute('aria-checked')).toBe('false')
fireEvent.click(toggle)
expect($fileBrowserOpen.get()).toBe(true)
expect($paneStates.get()[FILE_BROWSER_PANE_ID]?.open).toBe(true)
fireEvent.click(toggle)
expect($fileBrowserOpen.get()).toBe(false)
expect($paneStates.get()[FILE_BROWSER_PANE_ID]?.open).toBe(false)
})
it('follows the titlebar toggle', () => {
const toggle = fileBrowserSwitch()
act(() => toggleFileBrowserOpen())
expect(toggle.getAttribute('aria-checked')).toBe('true')
})
})

View File

@@ -101,6 +101,11 @@ export const SETTINGS_MANIFEST = {
available: () => TRANSLUCENCY_SUPPORTED
},
backdrop: appearanceSetting('window-layout', ['background', 'blur'], 'backdrop'),
fileBrowser: appearanceSetting(
'window-layout',
['file browser', 'files', 'file tree', 'explorer', 'right sidebar', 'panel', 'startup'],
'fileBrowser'
),
composerPopout: appearanceSetting(
'window-layout',
['composer', 'floating', 'drag', 'popout', 'dock', 'input'],