file-trigger-directory

PreviousNext
Docs
takiexample

Preview

Loading preview…
registry/new-york/examples/file-trigger-directory.tsx
"use client"

import { useState } from "react"
import { FolderIcon } from "lucide-react"

import { Button } from "@/registry/new-york/ui/button"
import { FileTrigger } from "@/registry/new-york/ui/file-trigger"

export default function FileTriggerDirectory() {
  const [files, setFiles] = useState<string[]>([])

  return (
    <div className="flex flex-col gap-4">
      <FileTrigger
        acceptDirectory
        onSelect={(e) => {
          if (e) {
            const fileList = Array.from(e).map((file) =>
              file.webkitRelativePath !== ""
                ? file.webkitRelativePath
                : file.name
            )
            setFiles(fileList)
          }
        }}
      >
        <Button variant="outline">
          <FolderIcon />
          Select a directory
        </Button>
      </FileTrigger>
      {files.length > 0 && (
        <div className="text-muted-foreground text-sm">
          <p className="font-medium">
            Directory contents ({files.length} files):
          </p>
          <ul className="mt-2 max-h-32 space-y-1 overflow-y-auto">
            {files.slice(0, 10).map((file, index) => (
              <li key={index} className="truncate text-xs">
                {file}
              </li>
            ))}
            {files.length > 10 && (
              <li className="text-xs italic">
                ...and {files.length - 10} more files
              </li>
            )}
          </ul>
        </div>
      )}
    </div>
  )
}

Installation

npx shadcn@latest add @taki/file-trigger-directory

Usage

import { FileTriggerDirectory } from "@/components/file-trigger-directory"
<FileTriggerDirectory />