dialog-select-file.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { useDialog } from "@opencode-ai/ui/context/dialog"
  2. import { Dialog } from "@opencode-ai/ui/dialog"
  3. import { FileIcon } from "@opencode-ai/ui/file-icon"
  4. import { List } from "@opencode-ai/ui/list"
  5. import { getDirectory, getFilename } from "@opencode-ai/util/path"
  6. import { useParams } from "@solidjs/router"
  7. import { createMemo } from "solid-js"
  8. import { useLayout } from "@/context/layout"
  9. import { useLocal } from "@/context/local"
  10. export function DialogSelectFile() {
  11. const layout = useLayout()
  12. const local = useLocal()
  13. const dialog = useDialog()
  14. const params = useParams()
  15. const sessionKey = createMemo(() => `${params.dir}${params.id ? "/" + params.id : ""}`)
  16. const tabs = createMemo(() => layout.tabs(sessionKey()))
  17. return (
  18. <Dialog title="Select file">
  19. <List
  20. search={{ placeholder: "Search files", autofocus: true }}
  21. emptyMessage="No files found"
  22. items={local.file.searchFiles}
  23. key={(x) => x}
  24. onSelect={(path) => {
  25. if (path) {
  26. tabs().open("file://" + path)
  27. }
  28. dialog.close()
  29. }}
  30. >
  31. {(i) => (
  32. <div class="w-full flex items-center justify-between rounded-md">
  33. <div class="flex items-center gap-x-3 grow min-w-0">
  34. <FileIcon node={{ path: i, type: "file" }} class="shrink-0 size-4" />
  35. <div class="flex items-center text-14-regular">
  36. <span class="text-text-weak whitespace-nowrap overflow-hidden overflow-ellipsis truncate min-w-0">
  37. {getDirectory(i)}
  38. </span>
  39. <span class="text-text-strong whitespace-nowrap">{getFilename(i)}</span>
  40. </div>
  41. </div>
  42. </div>
  43. )}
  44. </List>
  45. </Dialog>
  46. )
  47. }