summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/pages
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-09-24 12:40:54 -0500
committerAdam <[email protected]>2025-09-24 12:40:54 -0500
commitf589fc2327dd807a82ce6f756231fdb8eb43dd59 (patch)
tree0adc4c7fb38e5b41bba95e3de6e84f2c46cbc7f6 /packages/app/src/pages
parentd3b6545e7c6069c9db031634b7890e6b8eb4de2a (diff)
downloadopencode-f589fc2327dd807a82ce6f756231fdb8eb43dd59.tar.gz
opencode-f589fc2327dd807a82ce6f756231fdb8eb43dd59.zip
feat: fuzzy file open
Diffstat (limited to 'packages/app/src/pages')
-rw-r--r--packages/app/src/pages/index.tsx30
1 files changed, 25 insertions, 5 deletions
diff --git a/packages/app/src/pages/index.tsx b/packages/app/src/pages/index.tsx
index 9133f40d8..acb756621 100644
--- a/packages/app/src/pages/index.tsx
+++ b/packages/app/src/pages/index.tsx
@@ -20,6 +20,7 @@ import type { LocalFile } from "@/context/local"
import SessionList from "@/components/session-list"
import SessionTimeline from "@/components/session-timeline"
import { createStore } from "solid-js/store"
+import { getDirectory, getFilename } from "@/utils"
export default function Page() {
const sdk = useSDK()
@@ -30,6 +31,7 @@ export default function Page() {
prompt: "",
dragging: undefined as "left" | "right" | undefined,
modelSelectOpen: false,
+ fileSelectOpen: false,
})
let inputRef: HTMLInputElement | undefined = undefined
@@ -47,12 +49,12 @@ export default function Page() {
const handleKeyDown = (e: KeyboardEvent) => {
if (e.getModifierState(MOD) && e.shiftKey && e.key.toLowerCase() === "p") {
e.preventDefault()
- setStore("modelSelectOpen", true)
+ // TODO: command palette
return
}
if (e.getModifierState(MOD) && e.key.toLowerCase() === "p") {
e.preventDefault()
- setStore("modelSelectOpen", true)
+ setStore("fileSelectOpen", true)
return
}
@@ -554,14 +556,32 @@ export default function Page() {
</div>
</div>
)}
- filter={{
- keys: ["provider.name", "name", "id"],
- }}
+ filter={["provider.name", "name", "id"]}
groupBy={(x) => x.provider.name}
onClose={() => setStore("modelSelectOpen", false)}
onSelect={(x) => local.model.set(x ? { modelID: x.id, providerID: x.provider.id } : undefined)}
/>
</Show>
+ <Show when={store.fileSelectOpen}>
+ <SelectDialog
+ items={local.file.search}
+ key={(x) => x}
+ render={(i) => (
+ <div class="w-full flex items-center justify-between">
+ <div class="flex items-center gap-x-2 text-text-muted grow min-w-0">
+ <FileIcon node={{ path: i, type: "file" }} class="shrink-0 size-4" />
+ <span class="text-xs text-text whitespace-nowrap">{getFilename(i)}</span>
+ <span class="text-xs text-text-muted/80 whitespace-nowrap overflow-hidden overflow-ellipsis truncate min-w-0">
+ {getDirectory(i)}
+ </span>
+ </div>
+ <div class="flex items-center gap-x-1 text-text-muted/40 shrink-0"></div>
+ </div>
+ )}
+ onClose={() => setStore("fileSelectOpen", false)}
+ onSelect={(x) => (x ? local.file.open(x, { pin: true }) : undefined)}
+ />
+ </Show>
</div>
)
}