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:
@@ -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 }
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user