feat: allow control over displaying hidden/dotfiles and .gitignore matches (#179)

* feat: add chat setting to toggle hidden files (dotfiles)

* feat: add toggle to show/hide gitignored files in file browser

* refactor: don't reuse visibility setting for dotfiles toggle

* fix: honor hidden/gitignored toggles across runtimes

---------

Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
syntext
2026-01-20 15:20:17 +02:00
committed by GitHub
co-authored by Bohdan Triapitsyn
parent 6544b12e78
commit 2de0d9d3dd
19 changed files with 639 additions and 157 deletions
@@ -0,0 +1,61 @@
import React from 'react';
import { getSafeStorage } from '@/stores/utils/safeStorage';
const SHOW_GITIGNORED_STORAGE_KEY = 'filesViewShowGitignored';
const SHOW_GITIGNORED_EVENT = 'files-view-show-gitignored-change';
const readStoredShowGitignored = (): boolean => {
if (typeof window === 'undefined') {
return false;
}
try {
const stored = getSafeStorage().getItem(SHOW_GITIGNORED_STORAGE_KEY);
return stored === 'true';
} catch {
return false;
}
};
export const notifyFilesViewShowGitignoredChanged = () => {
if (typeof window === 'undefined') {
return;
}
window.dispatchEvent(new Event(SHOW_GITIGNORED_EVENT));
};
export const setFilesViewShowGitignored = (value: boolean) => {
if (typeof window === 'undefined') {
return;
}
try {
getSafeStorage().setItem(SHOW_GITIGNORED_STORAGE_KEY, value ? 'true' : 'false');
notifyFilesViewShowGitignoredChanged();
} catch {
// ignore storage errors
}
};
export const useFilesViewShowGitignored = (): boolean => {
const [showGitignored, setShowGitignored] = React.useState(readStoredShowGitignored);
React.useEffect(() => {
if (typeof window === 'undefined') {
return;
}
const handleChange = () => {
setShowGitignored(readStoredShowGitignored());
};
window.addEventListener('storage', handleChange);
window.addEventListener(SHOW_GITIGNORED_EVENT, handleChange);
return () => {
window.removeEventListener('storage', handleChange);
window.removeEventListener(SHOW_GITIGNORED_EVENT, handleChange);
};
}, []);
return showGitignored;
};
export const FILES_VIEW_SHOW_GITIGNORED_STORAGE_KEY = SHOW_GITIGNORED_STORAGE_KEY;