import { isCsvFile } from "@/lib/csv-preview"; import { useEffect, useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { Check, Copy, Download, Eye, Code2 } from "lucide-react"; import { fileResourcesApi } from "@/api/file-resources"; import { FileViewerBody, FileViewerMetadataRow } from "@/components/FileViewerSheet"; import { Button } from "@/components/ui/button"; import type { FileViewerUrlState } from "@/context/FileViewerContext"; import { copyTextToClipboard } from "@/lib/clipboard"; import { queryKeys } from "@/lib/queryKeys"; import type { TaskSidePanelTabPayload } from "@/lib/task-side-panel-state"; type WorkspaceFilePayload = Extract; export function TaskWorkspaceFilePanel({ issueId, payload, onFallbackToProject, }: { issueId: string; payload: WorkspaceFilePayload; onFallbackToProject?: () => void; }) { const [previewMode, setPreviewMode] = useState<"raw" | "rendered">("rendered"); useEffect(() => setPreviewMode("rendered"), [payload.path]); const [copied, setCopied] = useState(false); const [announcement, setAnnouncement] = useState(""); const state: FileViewerUrlState = { path: payload.path, workspace: payload.workspace, projectId: payload.projectId, workspaceId: payload.workspaceId, line: payload.line, column: payload.column, }; const resourceQuery = useQuery({ queryKey: queryKeys.issues.fileResource(issueId, state), queryFn: () => fileResourcesApi.resolve(issueId, state), retry: false, }); const resource = resourceQuery.data; const contentQuery = useQuery({ queryKey: queryKeys.issues.fileResourceContent(issueId, state), queryFn: () => fileResourcesApi.content(issueId, state), enabled: resource?.capabilities.preview === true, retry: false, }); const downloadUrl = resource?.capabilities.download ? fileResourcesApi.downloadUrl(issueId, state) : null; const renderedPreview = resource && (isCsvFile(resource.displayPath || resource.title, resource.contentType ?? "") || /\.(md|markdown|mdown|mkdn|mkd)$/i.test(resource.displayPath || resource.title) || resource.contentType?.includes("markdown")); return (

{resource?.title ?? payload.path}

{payload.path}

{contentQuery.data ? ( ) : null} {renderedPreview && contentQuery.data ?
: null} {downloadUrl ? ( ) : null}
{announcement}
{ void resourceQuery.refetch(); if (resource?.capabilities.preview) void contentQuery.refetch(); }} onSetAnnouncement={setAnnouncement} onFallbackToProject={onFallbackToProject ?? null} />
); }