fix(files): scope preview defaults to previewable files

This commit is contained in:
Bohdan Triapitsyn
2026-07-13 02:07:46 +03:00
parent d4b75b268a
commit fd66e8c112
11 changed files with 57 additions and 52 deletions
+37 -32
View File
@@ -2322,10 +2322,14 @@ export const FilesView: React.FC<FilesViewProps> = ({ mode = 'full' }) => {
const canEdit = Boolean(selectedFile && !selectedFileIsOutsideWorkspace && !isSelectedImage && !isSelectedPdf && files.writeFile && fileContent.length <= MAX_VIEW_CHARS);
const isMarkdown = Boolean(selectedFile?.path && isMarkdownFile(selectedFile.path));
const isJson = Boolean(selectedFile?.path && isJsonFile(selectedFile.path));
const isHtml = Boolean(selectedFile?.path && isHtmlFile(selectedFile.path));
const isDrawio = Boolean(selectedFile?.path && isDrawioFile(selectedFile.path));
const isTextFile = Boolean(selectedFile && !isSelectedImage && !isSelectedPdf);
const canUseShikiFileView = isTextFile && !isMarkdown && !isDrawio && !(isHtml && htmlViewMode === 'preview');
const isHtml = Boolean(selectedFile?.path && isHtmlFile(selectedFile.path));
const isDrawio = Boolean(selectedFile?.path && isDrawioFile(selectedFile.path));
const isTextFile = Boolean(selectedFile && !isSelectedImage && !isSelectedPdf);
const canUseShikiFileView = isTextFile && !isMarkdown && !isDrawio && !(isHtml && htmlViewMode === 'preview');
const isEditingFile = (isMarkdown && mdViewMode === 'edit')
|| (isHtml && htmlViewMode === 'edit')
|| (isJson && jsonViewMode === 'text')
|| (!isMarkdown && !isHtml && !isJson && textViewMode === 'edit');
const staticLanguageExtension = React.useMemo(
() => (selectedFilePath ? languageByExtension(selectedFilePath) : null),
[selectedFilePath],
@@ -2369,8 +2373,7 @@ export const FilesView: React.FC<FilesViewProps> = ({ mode = 'full' }) => {
return;
}
const defaultMode: TextViewMode = settingsDefaultFileViewerPreview ? 'view' : 'edit';
setTextViewMode(textViewModeByPathRef.current[selectedPath] ?? defaultMode);
setTextViewMode(textViewModeByPathRef.current[selectedPath] ?? 'edit');
// Respect per-type localStorage preference when available,
// falling back to the setting-derived default when nothing is stored.
@@ -2395,7 +2398,7 @@ export const FilesView: React.FC<FilesViewProps> = ({ mode = 'full' }) => {
// Ignore localStorage errors
}
setHtmlViewMode(htmlViewModeByPathRef.current[selectedPath] ?? htmlDefault);
setDrawioViewMode(drawioViewModeByPathRef.current[selectedPath] ?? 'preview');
setDrawioViewMode(drawioViewModeByPathRef.current[selectedPath] ?? (settingsDefaultFileViewerPreview ? 'preview' : 'edit'));
let jsonDefault: 'tree' | 'text' = settingsDefaultFileViewerPreview ? 'tree' : 'text';
try {
@@ -2559,25 +2562,28 @@ export const FilesView: React.FC<FilesViewProps> = ({ mode = 'full' }) => {
}, [htmlViewMode]);
React.useEffect(() => {
const applyDefaultFileViewerMode = (enabled: boolean) => {
const textMode: TextViewMode = enabled ? 'view' : 'edit';
const previewMode: PreviewViewMode = enabled ? 'preview' : 'edit';
const nextJsonMode: 'tree' | 'text' = enabled ? 'tree' : 'text';
for (const path of openPaths) {
textViewModeByPathRef.current[path] = textMode;
if (isMarkdownFile(path)) {
mdViewModeByPathRef.current[path] = previewMode;
}
if (isHtmlFile(path)) {
htmlViewModeByPathRef.current[path] = previewMode;
}
}
setTextViewMode(textMode);
setMdViewMode(previewMode);
setHtmlViewMode(previewMode);
setJsonViewMode(nextJsonMode);
const applyDefaultFileViewerMode = (enabled: boolean) => {
const previewMode: PreviewViewMode = enabled ? 'preview' : 'edit';
const nextJsonMode: 'tree' | 'text' = enabled ? 'tree' : 'text';
for (const path of openPaths) {
textViewModeByPathRef.current[path] = 'edit';
if (isMarkdownFile(path)) {
mdViewModeByPathRef.current[path] = previewMode;
}
if (isHtmlFile(path)) {
htmlViewModeByPathRef.current[path] = previewMode;
}
if (isDrawioFile(path)) {
drawioViewModeByPathRef.current[path] = previewMode;
}
}
setTextViewMode('edit');
setMdViewMode(previewMode);
setHtmlViewMode(previewMode);
setDrawioViewMode(previewMode);
setJsonViewMode(nextJsonMode);
try {
localStorage.setItem(MD_VIEWER_MODE_KEY, previewMode);
@@ -3152,7 +3158,7 @@ export const FilesView: React.FC<FilesViewProps> = ({ mode = 'full' }) => {
return (
<div className={wrapperCls}>
{canEdit && textViewMode === 'edit' && (
{canEdit && isEditingFile && (
<>
{isSaving ? (
<span className="flex items-center gap-1 px-1 text-muted-foreground typography-meta">
@@ -3733,10 +3739,6 @@ export const FilesView: React.FC<FilesViewProps> = ({ mode = 'full' }) => {
<div
ref={floatingToolbarRef}
className="absolute right-3 top-3 z-30"
onMouseEnter={() => {
if (isMarkdown) return;
setIsFloatingToolbarOpen(true);
}}
onMouseLeave={() => {
if (toolbarDropdownOpenCountRef.current > 0) return;
setIsFloatingToolbarOpen(false);
@@ -3774,7 +3776,10 @@ export const FilesView: React.FC<FilesViewProps> = ({ mode = 'full' }) => {
) : null}
<Tooltip>
<TooltipTrigger asChild>
<span className="inline-flex">
<span
className="inline-flex"
onMouseEnter={() => setIsFloatingToolbarOpen(true)}
>
<Button
variant="ghost"
size="sm"
@@ -1484,8 +1484,8 @@ export const settingsDict = {
'settings.openchamber.defaults.smallModel.useDefault': 'Use default small model',
'settings.openchamber.defaults.smallModel.useDefaultAria': 'Use default small model',
'settings.openchamber.defaults.smallModel.overrideModel': 'Override model',
'settings.openchamber.defaults.field.openFilesPreviewAria': 'Open files in preview mode',
'settings.openchamber.defaults.field.openFilesPreview': 'Open files in preview mode',
'settings.openchamber.defaults.field.openFilesPreviewAria': 'Open previewable files in preview mode',
'settings.openchamber.defaults.field.openFilesPreview': 'Open previewable files in preview mode',
'settings.openchamber.defaults.option.default': 'Default',
'settings.openchamber.defaults.option.defaultLowercase': 'default',
'settings.openchamber.git.title': 'Git Preferences',
@@ -1451,8 +1451,8 @@ export const settingsDict = {
"settings.openchamber.defaults.smallModel.useDefaultAria": "Usar el modelo pequeño predeterminado",
"settings.openchamber.defaults.smallModel.overrideModel": "Modelo de anulación",
"settings.openchamber.defaults.field.showDeletionDialog": "Mostrar diálogo de eliminación",
"settings.openchamber.defaults.field.openFilesPreviewAria": "Abrir archivos en modo vista previa",
"settings.openchamber.defaults.field.openFilesPreview": "Abrir archivos en modo vista previa",
"settings.openchamber.defaults.field.openFilesPreviewAria": "Abrir archivos previsualizables en modo vista previa",
"settings.openchamber.defaults.field.openFilesPreview": "Abrir archivos previsualizables en modo vista previa",
"settings.openchamber.defaults.option.default": "Predeterminado",
"settings.openchamber.defaults.option.defaultLowercase": "default",
"settings.openchamber.git.title": "Preferencias de Git",
@@ -1376,8 +1376,8 @@ export const settingsDict = {
'settings.openchamber.defaults.smallModel.useDefaultAria': 'Utiliser le petit modèle par défaut',
'settings.openchamber.defaults.smallModel.overrideModel': 'Modèle de remplacement',
'settings.openchamber.defaults.field.showDeletionDialog': 'Afficher la boîte de dialogue de suppression',
'settings.openchamber.defaults.field.openFilesPreviewAria': 'Ouvrir les fichiers en mode aperçu',
'settings.openchamber.defaults.field.openFilesPreview': 'Ouvrir les fichiers en mode aperçu',
'settings.openchamber.defaults.field.openFilesPreviewAria': 'Ouvrir les fichiers prévisualisables en mode aperçu',
'settings.openchamber.defaults.field.openFilesPreview': 'Ouvrir les fichiers prévisualisables en mode aperçu',
'settings.openchamber.defaults.option.default': 'Défaut',
'settings.openchamber.defaults.option.defaultLowercase': 'défaut',
'settings.openchamber.git.title': 'Préférences Git',
@@ -1484,8 +1484,8 @@ export const settingsDict = {
'settings.openchamber.defaults.smallModel.useDefaultAria': 'デフォルトの小型モデルを使用',
'settings.openchamber.defaults.smallModel.overrideModel': '上書きモデル',
'settings.openchamber.defaults.field.showDeletionDialog': '削除ダイアログを表示',
'settings.openchamber.defaults.field.openFilesPreviewAria': 'ファイルをプレビューモードで開く',
'settings.openchamber.defaults.field.openFilesPreview': 'ファイルをプレビューモードで開く',
'settings.openchamber.defaults.field.openFilesPreviewAria': 'プレビュー可能なファイルをプレビューモードで開く',
'settings.openchamber.defaults.field.openFilesPreview': 'プレビュー可能なファイルをプレビューモードで開く',
'settings.openchamber.defaults.option.default': 'デフォルト',
'settings.openchamber.defaults.option.defaultLowercase': 'デフォルト',
'settings.openchamber.git.title': 'Git 設定',
@@ -1451,8 +1451,8 @@ export const settingsDict = {
'settings.openchamber.defaults.smallModel.useDefaultAria': '기본 소형 모델 사용',
'settings.openchamber.defaults.smallModel.overrideModel': '재정의 모델',
'settings.openchamber.defaults.field.showDeletionDialog': '삭제 확인 대화상자 표시',
'settings.openchamber.defaults.field.openFilesPreviewAria': '파일을 미리보기 모드로 열기',
'settings.openchamber.defaults.field.openFilesPreview': '파일을 미리보기 모드로 열기',
'settings.openchamber.defaults.field.openFilesPreviewAria': '미리보기 가능한 파일을 미리보기 모드로 열기',
'settings.openchamber.defaults.field.openFilesPreview': '미리보기 가능한 파일을 미리보기 모드로 열기',
'settings.openchamber.defaults.option.default': '기본값',
'settings.openchamber.defaults.option.defaultLowercase': '기본값',
'settings.openchamber.git.title': 'Git',
@@ -692,8 +692,8 @@ export const settingsDict = {
'settings.openchamber.defaults.field.defaultAgent': 'Domyślny Agent',
'settings.openchamber.defaults.field.defaultModel': 'Domyślny Model',
'settings.openchamber.defaults.field.defaultThinking': 'Domyślne Myślenie',
'settings.openchamber.defaults.field.openFilesPreview': 'Otwieraj pliki w trybie podglądu',
'settings.openchamber.defaults.field.openFilesPreviewAria': 'Otwieraj pliki w trybie podglądu',
'settings.openchamber.defaults.field.openFilesPreview': 'Otwieraj pliki z podglądem w trybie podglądu',
'settings.openchamber.defaults.field.openFilesPreviewAria': 'Otwieraj pliki z podglądem w trybie podglądu',
'settings.openchamber.defaults.field.showDeletionDialog': 'Pokaż dialog usuwania',
'settings.openchamber.defaults.field.showDeletionDialogAria': 'Pokaż dialog usuwania',
'settings.openchamber.defaults.smallModel.title': 'Mały model',
@@ -1451,8 +1451,8 @@ export const settingsDict = {
"settings.openchamber.defaults.smallModel.useDefaultAria": "Usar o modelo pequeno padrão",
"settings.openchamber.defaults.smallModel.overrideModel": "Modelo de substituição",
"settings.openchamber.defaults.field.showDeletionDialog": "Mostrar diálogo de eliminación",
"settings.openchamber.defaults.field.openFilesPreviewAria": "Abrir arquivos em modo prévia",
"settings.openchamber.defaults.field.openFilesPreview": "Abrir arquivos em modo prévia",
"settings.openchamber.defaults.field.openFilesPreviewAria": "Abrir arquivos com visualização em modo de prévia",
"settings.openchamber.defaults.field.openFilesPreview": "Abrir arquivos com visualização em modo de prévia",
"settings.openchamber.defaults.option.default": "Padrão",
"settings.openchamber.defaults.option.defaultLowercase": "default",
"settings.openchamber.git.title": "Preferencias de Git",
@@ -1451,8 +1451,8 @@ export const settingsDict = {
"settings.openchamber.defaults.smallModel.useDefaultAria": "Використовувати типову малу модель",
"settings.openchamber.defaults.smallModel.overrideModel": "Модель заміни",
"settings.openchamber.defaults.field.showDeletionDialog": "Показати діалогове вікно видалення",
"settings.openchamber.defaults.field.openFilesPreviewAria": "Відкривати файли в режимі попереднього перегляду",
"settings.openchamber.defaults.field.openFilesPreview": "Відкривати файли в режимі попереднього перегляду",
"settings.openchamber.defaults.field.openFilesPreviewAria": "Відкривати файли з підтримкою перегляду в режимі попереднього перегляду",
"settings.openchamber.defaults.field.openFilesPreview": "Відкривати файли з підтримкою перегляду в режимі попереднього перегляду",
"settings.openchamber.defaults.option.default": "За замовчуванням",
"settings.openchamber.defaults.option.defaultLowercase": "за замовчуванням",
"settings.openchamber.git.title": "Налаштування Git",
@@ -1451,8 +1451,8 @@ export const settingsDict = {
'settings.openchamber.defaults.smallModel.useDefaultAria': '使用默认小模型',
'settings.openchamber.defaults.smallModel.overrideModel': '覆盖模型',
'settings.openchamber.defaults.field.showDeletionDialog': '显示删除对话框',
'settings.openchamber.defaults.field.openFilesPreviewAria': '以预览模式打开文件',
'settings.openchamber.defaults.field.openFilesPreview': '以预览模式打开文件',
'settings.openchamber.defaults.field.openFilesPreviewAria': '以预览模式打开可预览文件',
'settings.openchamber.defaults.field.openFilesPreview': '以预览模式打开可预览文件',
'settings.openchamber.defaults.option.default': '默认',
'settings.openchamber.defaults.option.defaultLowercase': '默认',
'settings.openchamber.git.title': 'Git 偏好设置',
@@ -1362,8 +1362,8 @@
'settings.openchamber.defaults.smallModel.useDefaultAria': '使用預設小模型',
'settings.openchamber.defaults.smallModel.overrideModel': '覆寫模型',
'settings.openchamber.defaults.field.showDeletionDialog': '顯示刪除對話方塊',
'settings.openchamber.defaults.field.openFilesPreviewAria': '以預覽模式開啟檔案',
'settings.openchamber.defaults.field.openFilesPreview': '以預覽模式開啟檔案',
'settings.openchamber.defaults.field.openFilesPreviewAria': '以預覽模式開啟可預覽檔案',
'settings.openchamber.defaults.field.openFilesPreview': '以預覽模式開啟可預覽檔案',
'settings.openchamber.defaults.option.default': '預設',
'settings.openchamber.defaults.option.defaultLowercase': '預設',
'settings.openchamber.git.title': 'Git 偏好設定',