Add recent folders feature with localStorage persistence

- Create FolderSelectionView component showing recent folders and browse option
- Store up to 10 recent folders in localStorage with timestamps
- Show folder selection view on app start when no instances exist
- Display folder selection modal when creating new instance from existing instance
- Add keyboard navigation (arrows, page up/down, home/end, enter, delete)
- Add ability to remove folders from recent list
- Track folder access time and display relative timestamps
- Close modal with Escape key or close button
- Update preferences store with recent folders management
This commit is contained in:
Shantur Rathore
2025-10-24 18:36:11 +01:00
parent 14b8270471
commit b0e636d781
4 changed files with 394 additions and 12 deletions

View File

@@ -1,11 +1,18 @@
import { createSignal } from "solid-js"
const STORAGE_KEY = "opencode-preferences"
const RECENT_FOLDERS_KEY = "opencode-recent-folders"
const MAX_RECENT_FOLDERS = 10
interface Preferences {
showThinkingBlocks: boolean
}
interface RecentFolder {
path: string
lastAccessed: number
}
const defaultPreferences: Preferences = {
showThinkingBlocks: false,
}
@@ -30,7 +37,28 @@ function savePreferences(prefs: Preferences): void {
}
}
function loadRecentFolders(): RecentFolder[] {
try {
const stored = localStorage.getItem(RECENT_FOLDERS_KEY)
if (stored) {
return JSON.parse(stored)
}
} catch (error) {
console.error("Failed to load recent folders:", error)
}
return []
}
function saveRecentFolders(folders: RecentFolder[]): void {
try {
localStorage.setItem(RECENT_FOLDERS_KEY, JSON.stringify(folders))
} catch (error) {
console.error("Failed to save recent folders:", error)
}
}
const [preferences, setPreferences] = createSignal<Preferences>(loadPreferences())
const [recentFolders, setRecentFolders] = createSignal<RecentFolder[]>(loadRecentFolders())
function updatePreferences(updates: Partial<Preferences>): void {
const updated = { ...preferences(), ...updates }
@@ -42,4 +70,19 @@ function toggleShowThinkingBlocks(): void {
updatePreferences({ showThinkingBlocks: !preferences().showThinkingBlocks })
}
export { preferences, updatePreferences, toggleShowThinkingBlocks }
function addRecentFolder(path: string): void {
const folders = recentFolders().filter((f) => f.path !== path)
folders.unshift({ path, lastAccessed: Date.now() })
const trimmed = folders.slice(0, MAX_RECENT_FOLDERS)
setRecentFolders(trimmed)
saveRecentFolders(trimmed)
}
function removeRecentFolder(path: string): void {
const folders = recentFolders().filter((f) => f.path !== path)
setRecentFolders(folders)
saveRecentFolders(folders)
}
export { preferences, updatePreferences, toggleShowThinkingBlocks, recentFolders, addRecentFolder, removeRecentFolder }

View File

@@ -3,6 +3,7 @@ import { createSignal } from "solid-js"
const [hasInstances, setHasInstances] = createSignal(false)
const [selectedFolder, setSelectedFolder] = createSignal<string | null>(null)
const [isSelectingFolder, setIsSelectingFolder] = createSignal(false)
const [showFolderSelection, setShowFolderSelection] = createSignal(false)
const [instanceTabOrder, setInstanceTabOrder] = createSignal<string[]>([])
const [sessionTabOrder, setSessionTabOrder] = createSignal<Map<string, string[]>>(new Map())
@@ -26,6 +27,8 @@ export {
setSelectedFolder,
isSelectingFolder,
setIsSelectingFolder,
showFolderSelection,
setShowFolderSelection,
instanceTabOrder,
setInstanceTabOrder,
sessionTabOrder,