feat: add 'Open files in preview mode' setting (#988)
* feat: add 'Open files in preview mode' setting - Add defaultFileViewerPreview setting to persist user preference for file viewer default mode - Add checkbox in Settings → Sessions → Session Defaults to toggle the setting - Files now open in preview mode by default when setting is enabled - Respects per-file-type localStorage persistence for markdown/HTML/JSON files - Setting persists across sessions via /api/config/settings endpoint * fix: address PR review feedback - FilesView: respect HTML localStorage preference in file-change effect, falling back to global setting only when nothing stored - DefaultsSettings: read defaultFileViewerPreview directly from config store instead of redundant local state + separate fetch - DefaultsSettings: extract duplicated toggle logic into handleToggleFileViewerPreview callback * fix: honor default preview setting for markdown files Previously mdViewMode only read localStorage on mount (deps: []), so when settingsDefaultFileViewerPreview was enabled and no MD_VIEWER_MODE_KEY was stored, markdown files silently opened in edit mode — ignoring the setting for the very file type users most want to preview. Fold md init into the per-file-change effect, mirroring the html handling: localStorage preference wins, falling back to the setting-derived default. The saveMdViewMode callback stays untouched so user-initiated toggles still persist. --------- Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
committed by
GitHub
co-authored by
Bohdan Triapitsyn
parent
bf110527a5
commit
4f60fce1e1
@@ -28,6 +28,7 @@ interface OpenChamberDefaults {
|
||||
defaultAgent?: string;
|
||||
autoCreateWorktree?: boolean;
|
||||
gitmojiEnabled?: boolean;
|
||||
defaultFileViewerPreview?: boolean;
|
||||
zenModel?: string;
|
||||
messageStreamTransport?: 'auto' | 'ws' | 'sse';
|
||||
}
|
||||
@@ -45,6 +46,7 @@ const fetchOpenChamberDefaults = async (): Promise<OpenChamberDefaults> => {
|
||||
const defaultVariant = typeof data?.defaultVariant === 'string' ? data.defaultVariant.trim() : '';
|
||||
const defaultAgent = typeof data?.defaultAgent === 'string' ? data.defaultAgent.trim() : '';
|
||||
const gitmojiEnabled = typeof data?.gitmojiEnabled === 'boolean' ? data.gitmojiEnabled : undefined;
|
||||
const defaultFileViewerPreview = typeof data?.defaultFileViewerPreview === 'boolean' ? data.defaultFileViewerPreview : undefined;
|
||||
const zenModel = typeof data?.zenModel === 'string' ? data.zenModel.trim() : '';
|
||||
const messageStreamTransport =
|
||||
data?.messageStreamTransport === 'ws' || data?.messageStreamTransport === 'sse' || data?.messageStreamTransport === 'auto'
|
||||
@@ -57,6 +59,7 @@ const fetchOpenChamberDefaults = async (): Promise<OpenChamberDefaults> => {
|
||||
defaultAgent: defaultAgent.length > 0 ? defaultAgent : undefined,
|
||||
autoCreateWorktree: typeof data?.autoCreateWorktree === 'boolean' ? data.autoCreateWorktree : undefined,
|
||||
gitmojiEnabled,
|
||||
defaultFileViewerPreview,
|
||||
zenModel: zenModel.length > 0 ? zenModel : undefined,
|
||||
messageStreamTransport,
|
||||
};
|
||||
@@ -79,6 +82,7 @@ const fetchOpenChamberDefaults = async (): Promise<OpenChamberDefaults> => {
|
||||
const defaultVariant = typeof data?.defaultVariant === 'string' ? data.defaultVariant.trim() : '';
|
||||
const defaultAgent = typeof data?.defaultAgent === 'string' ? data.defaultAgent.trim() : '';
|
||||
const gitmojiEnabled = typeof data?.gitmojiEnabled === 'boolean' ? data.gitmojiEnabled : undefined;
|
||||
const defaultFileViewerPreview = typeof data?.defaultFileViewerPreview === 'boolean' ? data.defaultFileViewerPreview : undefined;
|
||||
const zenModel = typeof data?.zenModel === 'string' ? data.zenModel.trim() : '';
|
||||
const messageStreamTransport =
|
||||
data?.messageStreamTransport === 'ws' || data?.messageStreamTransport === 'sse' || data?.messageStreamTransport === 'auto'
|
||||
@@ -91,6 +95,7 @@ const fetchOpenChamberDefaults = async (): Promise<OpenChamberDefaults> => {
|
||||
defaultAgent: defaultAgent.length > 0 ? defaultAgent : undefined,
|
||||
autoCreateWorktree: typeof data?.autoCreateWorktree === 'boolean' ? data.autoCreateWorktree : undefined,
|
||||
gitmojiEnabled,
|
||||
defaultFileViewerPreview,
|
||||
zenModel: zenModel.length > 0 ? zenModel : undefined,
|
||||
messageStreamTransport,
|
||||
};
|
||||
@@ -479,6 +484,7 @@ interface ConfigStore {
|
||||
settingsDefaultAgent: string | undefined;
|
||||
settingsAutoCreateWorktree: boolean;
|
||||
settingsGitmojiEnabled: boolean;
|
||||
settingsDefaultFileViewerPreview: boolean;
|
||||
settingsZenModel: string | undefined;
|
||||
settingsMessageStreamTransport: 'auto' | 'ws' | 'sse';
|
||||
// Voice provider preference ('browser', 'openai', 'openai-compatible', or 'say' for macOS)
|
||||
@@ -548,6 +554,7 @@ interface ConfigStore {
|
||||
setSettingsDefaultAgent: (agent: string | undefined) => void;
|
||||
setSettingsAutoCreateWorktree: (enabled: boolean) => void;
|
||||
setSettingsGitmojiEnabled: (enabled: boolean) => void;
|
||||
setSettingsDefaultFileViewerPreview: (enabled: boolean) => void;
|
||||
setSettingsZenModel: (model: string | undefined) => void;
|
||||
setSettingsMessageStreamTransport: (transport: 'auto' | 'ws' | 'sse') => void;
|
||||
getResolvedGitGenerationModel: () => { providerId: string; modelId: string } | null;
|
||||
@@ -601,6 +608,7 @@ export const useConfigStore = create<ConfigStore>()(
|
||||
settingsDefaultAgent: undefined,
|
||||
settingsAutoCreateWorktree: false,
|
||||
settingsGitmojiEnabled: false,
|
||||
settingsDefaultFileViewerPreview: false,
|
||||
settingsZenModel: undefined,
|
||||
settingsMessageStreamTransport: 'auto',
|
||||
// Voice provider preference - load from localStorage or default to 'browser'
|
||||
@@ -1275,6 +1283,7 @@ export const useConfigStore = create<ConfigStore>()(
|
||||
settingsDefaultAgent: openChamberDefaults.defaultAgent,
|
||||
settingsAutoCreateWorktree: openChamberDefaults.autoCreateWorktree ?? false,
|
||||
settingsGitmojiEnabled: openChamberDefaults.gitmojiEnabled ?? false,
|
||||
settingsDefaultFileViewerPreview: openChamberDefaults.defaultFileViewerPreview ?? false,
|
||||
settingsZenModel: resolvedZenModel,
|
||||
settingsMessageStreamTransport: openChamberDefaults.messageStreamTransport ?? state.settingsMessageStreamTransport ?? 'auto',
|
||||
directoryScoped: {
|
||||
@@ -1704,6 +1713,10 @@ export const useConfigStore = create<ConfigStore>()(
|
||||
set({ settingsGitmojiEnabled: enabled });
|
||||
},
|
||||
|
||||
setSettingsDefaultFileViewerPreview: (enabled: boolean) => {
|
||||
set({ settingsDefaultFileViewerPreview: enabled });
|
||||
},
|
||||
|
||||
setSettingsZenModel: (model: string | undefined) => {
|
||||
set({ settingsZenModel: model });
|
||||
},
|
||||
@@ -2027,6 +2040,7 @@ export const useConfigStore = create<ConfigStore>()(
|
||||
settingsDefaultAgent: state.settingsDefaultAgent,
|
||||
settingsAutoCreateWorktree: state.settingsAutoCreateWorktree,
|
||||
settingsGitmojiEnabled: state.settingsGitmojiEnabled,
|
||||
settingsDefaultFileViewerPreview: state.settingsDefaultFileViewerPreview,
|
||||
settingsZenModel: state.settingsZenModel,
|
||||
settingsMessageStreamTransport: state.settingsMessageStreamTransport,
|
||||
speechRate: state.speechRate,
|
||||
|
||||
Reference in New Issue
Block a user