feat: impl image preview dialog

This commit is contained in:
2025-09-20 19:55:20 +00:00
parent ddd2afb879
commit 367e248062
7 changed files with 345 additions and 101 deletions

View File

@@ -3,6 +3,7 @@ import type { DirectoryItem } from "@fileone/convex/model/directories"
import { createContext } from "react"
type DirectoryPageContextType = {
rootDirectory: Doc<"directories">
directory: Doc<"directories">
directoryContent: DirectoryItem[]
}

View File

@@ -41,6 +41,7 @@ import {
contextMenuTargeItemAtom,
itemBeingRenamedAtom,
newItemKindAtom,
openedFileAtom,
optimisticDeletedItemsAtom,
} from "./state"
@@ -83,7 +84,7 @@ const columns: ColumnDef<DirectoryItem>[] = [
cell: ({ row }) => {
switch (row.original.kind) {
case "file":
return <FileNameCell initialName={row.original.doc.name} />
return <FileNameCell file={row.original.doc} />
case "directory":
return <DirectoryNameCell directory={row.original.doc} />
}
@@ -413,11 +414,20 @@ function DirectoryNameCell({ directory }: { directory: Doc<"directories"> }) {
)
}
function FileNameCell({ initialName }: { initialName: string }) {
function FileNameCell({ file }: { file: Doc<"files"> }) {
const setOpenedFile = useSetAtom(openedFileAtom)
return (
<div className="flex w-full items-center gap-2">
<TextFileIcon className="size-4" />
{initialName}
<button
type="button"
className="hover:underline cursor-pointer"
onClick={() => {
setOpenedFile(file)
}}
>
{file.name}
</button>
</div>
)
}

View File

@@ -3,7 +3,7 @@ import { baseName, splitPath } from "@fileone/path"
import { useMutation } from "@tanstack/react-query"
import { Link } from "@tanstack/react-router"
import { useMutation as useConvexMutation } from "convex/react"
import { useSetAtom } from "jotai"
import { useAtom, useSetAtom } from "jotai"
import {
ChevronDownIcon,
Loader2Icon,
@@ -12,6 +12,7 @@ import {
} from "lucide-react"
import { type ChangeEvent, Fragment, useContext, useRef } from "react"
import { toast } from "sonner"
import { ImagePreviewDialog } from "@/components/image-preview-dialog"
import {
DropdownMenu,
DropdownMenuContent,
@@ -32,7 +33,7 @@ import { Button } from "../../components/ui/button"
import { DirectoryPageContext } from "./context"
import { DirectoryContentTable } from "./directory-content-table"
import { RenameFileDialog } from "./rename-file-dialog"
import { newItemKindAtom } from "./state"
import { newItemKindAtom, openedFileAtom } from "./state"
export function DirectoryPage() {
const { directory } = useContext(DirectoryPageContext)
@@ -49,6 +50,7 @@ export function DirectoryPage() {
<DirectoryContentTable />
</div>
<RenameFileDialog />
<PreviewDialog />
</>
)
}
@@ -184,3 +186,25 @@ function NewDirectoryItemDropdown() {
</DropdownMenu>
)
}
function PreviewDialog() {
const [openedFile, setOpenedFile] = useAtom(openedFileAtom)
if (!openedFile) return null
console.log("openedFile", openedFile)
switch (openedFile.mimeType) {
case "image/jpeg":
case "image/png":
case "image/gif":
return (
<ImagePreviewDialog
file={openedFile}
onClose={() => setOpenedFile(null)}
/>
)
default:
return null
}
}

View File

@@ -1,4 +1,4 @@
import type { Id } from "@fileone/convex/_generated/dataModel"
import type { Doc, Id } from "@fileone/convex/_generated/dataModel"
import type {
DirectoryItem,
DirectoryItemKind,
@@ -20,3 +20,5 @@ export const itemBeingRenamedAtom = atom<{
originalItem: DirectoryItem
name: string
} | null>(null)
export const openedFileAtom = atom<Doc<"files"> | null>(null)