import { useState } from 'react' import { useParams, useSearchParams, Link, useNavigate } from 'react-router-dom' import ReactMarkdown from 'react-markdown' import remarkGfm from 'remark-gfm' import { useRepo, useRepoBlob, useUpdateBlob } from '../api/queries/repos' import { RepoListSkeleton } from '../ui/Skeleton' export default function BlobPage() { const { owner = '', repo: repoName = '' } = useParams<{ owner: string; repo: string }>() const [searchParams] = useSearchParams() const navigate = useNavigate() const [editing, setEditing] = useState(false) const [editContent, setEditContent] = useState('') const [commitMsg, setCommitMsg] = useState('') const [preview, setPreview] = useState(false) const ref = searchParams.get('ref') ?? '' const filePath = searchParams.get('path') ?? '' const fileName = filePath.split('/').pop() ?? filePath const { data: repo } = useRepo(owner, repoName) const { data: blob, isLoading, isError } = useRepoBlob(owner, repoName, ref, filePath) const updateBlob = useUpdateBlob(owner, repoName) const branch = ref || repo?.defaultBranch || 'main' const isMarkdown = fileName.toLowerCase().endsWith('.md') function startEdit() { setEditContent(blob?.content ?? '') setCommitMsg(`Update ${fileName}`) setEditing(true) setPreview(false) } function cancelEdit() { setEditing(false) setPreview(false) } async function handleCommit() { if (!commitMsg.trim() || !filePath) return await updateBlob.mutateAsync({ path: filePath, content: editContent, message: commitMsg.trim(), branch, }) setEditing(false) navigate(`/repos/${owner}/${repoName}/blob?ref=${encodeURIComponent(branch)}&path=${encodeURIComponent(filePath)}`, { replace: true }) } if (isLoading) return
| {i + 1} | {line || ' '} |