import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Card } from '@/components/ui/card' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover' import { Star, GitFork, FileText, Edit, FolderGit2, MoreVertical, FileText as IssueIcon, Settings, Play, Trash2, RefreshCw, BookOpen, Copy, Clock, Info, Eye, Square, LinkIcon, ExternalLink, ArrowLeft } from 'lucide-react' import { useRepoStore } from '../store' import { useMemo, useState } from 'react' import { useShallow } from 'zustand/shallow' import { myOrgs } from '../store/build' import { app } from '@/agents/app' import { toast } from 'sonner' import { useNavigate } from '@tanstack/react-router' import clsx from 'clsx' interface RepoCardProps { repo: any showReturn?: boolean } export function RepoCard({ showReturn = false, repo }: RepoCardProps) { const [deletePopoverOpen, setDeletePopoverOpen] = useState(false) const store = useRepoStore(useShallow((state) => ({ workspaceList: state.workspaceList, getWorkspaceDetail: state.getWorkspaceDetail, getList: state.getList, buildUpdate: state.buildUpdate, stopWorkspace: state.stopWorkspace, setSelectedSyncRepo: state.setSelectedSyncRepo, setSyncDialogOpen: state.setSyncDialogOpen, startWorkspace: state.startWorkspace, setEditRepo: state.setEditRepo, setShowEditDialog: state.setShowEditDialog, deleteItem: state.deleteItem, }))); const workspace = useMemo(() => { return store.workspaceList.find(ws => ws.slug === repo.path) }, [store.workspaceList, repo.path]) const isWorkspaceActive = !!workspace const navigate = useNavigate(); const isKnowledge = repo?.flags === "KnowledgeBase" const createKnow = async () => { const res = await app.run({ path: 'cnb', key: 'build-knowledge-base', payload: { repo: repo.path } }) if (res.code === 200) { toast.success("知识库创建中") store.getList({}, true) } } const onClone = async () => { const url = `git clone https://cnb.cool/${repo.path}` navigator.clipboard.writeText(url).then(() => { toast.success('克隆地址已复制到剪贴板') }).catch(() => { toast.error('复制失败') }) } const onUpdate = async () => { await store.buildUpdate({ path: repo.path }); } const handleIssue = (repo: any) => { window.open(`https://cnb.cool/${repo.path}/-/issues`) } const handleSettings = (repo: any) => { window.open(`https://cnb.cool/${repo.path}/-/settings`) } const openInCNB = (isDetail = true) => { if (!showReturn && isDetail) { navigate({ to: `/repo?repo=${repo.path}` }) } else { window.open(`https://cnb.cool/${repo.path}`, '_blank') } } return ( <>
{showReturn && ( )}
{ openInCNB() }} > {repo.path}
{isKnowledge && (
} />

知识库

)} {isWorkspaceActive && ( )}
{isWorkspaceActive && ( { store.stopWorkspace(workspace) }} className="h-8 w-8 p-0 border-neutral-200 hover:border-red-600 hover:bg-red-600 hover:text-white transition-all cursor-pointer" > } />

停止工作区

)} { if (!isWorkspaceActive) { store.startWorkspace(repo) } else { store.getWorkspaceDetail(workspace) } }} className="h-8 w-8 p-0 border-neutral-200 hover:border-neutral-900 hover:bg-neutral-900 hover:text-white transition-all cursor-pointer" > {isWorkspaceActive ? : } } />

{isWorkspaceActive ? '查看工作区' : '启动工作区'}

} /> { window.open(repo.web_url, '_blank') }} className="cursor-pointer"> 访问仓库 { store.setEditRepo(repo) store.setShowEditDialog(true) }} className="cursor-pointer"> 编辑 { createKnow() }} className="cursor-pointer"> 知识库创建 { onUpdate() }} className="cursor-pointer"> 更新时间

给仓库添加一个空白 commit 的提交,保证在仓库列表中顺序活跃在前面

Clone URL handleIssue(repo)} className="cursor-pointer"> 访问问题 handleSettings(repo)} className="cursor-pointer"> 访问设置 { e.preventDefault() setDeletePopoverOpen(true) }} className="cursor-pointer text-red-600 focus:text-red-600 focus:bg-red-50" > 删除

确认删除

确定要删除仓库 {repo.path} 吗?此操作无法撤销。

{repo.topics && (<> { repo.topics.split(',').map((topic: string, idx: number) => ( {topic.trim()} )) } )} {repo.visibility_level}
{ { !showReturn && openInCNB(false) } }}> {repo.site && (
{ window.open(repo.site, '_blank') e.stopPropagation() }} >
{repo.site}
)} {repo.description && (

{repo.description}

)}
{repo.star_count} {repo.fork_count} {repo.open_issue_count} {isWorkspaceActive && { store.getWorkspaceDetail(workspace) }}> 运行中 }
) }