import { useEffect, useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import copy from "copy-text-to-clipboard"; import Tag from "@/components/Resource/Tag"; import ValidStatus from "@/components/Resource/ValidStatus"; import type { Resource } from "@/libs/store"; import type { PyPIData } from "./types"; import Avatar from "../Avatar"; import "./styles.css"; export type Props = { resource: Resource; }; export default function ResourceDetailCard({ resource }: Props) { const [pypiData, setPypiData] = useState(null); const [copied, setCopied] = useState(false); const authorLink = `https://github.com/${resource.author}`; const authorAvatar = `${authorLink}.png?size=100`; const isPlugin = resource.resourceType === "plugin"; const registryLink = isPlugin && `https://registry.nonebot.dev/plugin/${resource.project_link}:${resource.module_name}`; const getProjectLink = (resource: Resource) => { switch (resource.resourceType) { case "plugin": case "adapter": case "driver": return resource.project_link; default: return null; } }; const getModuleName = (resource: Resource) => { switch (resource.resourceType) { case "plugin": case "adapter": return resource.module_name; case "driver": return resource.module_name.replace(/~/, "nonebot.drivers."); default: return null; } }; const getHomepageLink = (resource: Resource) => { switch (resource.resourceType) { case "plugin": case "adapter": case "driver": return resource.homepage; default: return null; } }; const getPypiProjectLink = (resource: Resource) => { switch (resource.resourceType) { case "plugin": case "adapter": return `https://pypi.org/project/${resource.project_link}`; default: return null; } }; const getPluginStatusUpdatedTime = (resource: Resource) => { switch (resource.resourceType) { case "plugin": return new Date(resource.time).toLocaleString(); default: return null; } }; const fetchPypiProject = (projectName: string) => fetch(`https://pypi.org/pypi/${projectName}/json`) .then((response) => response.json()) .then((data) => setPypiData(data)); const copyCommand = (resource: Resource) => { const projectLink = getProjectLink(resource); if (projectLink) { copy(`nb ${resource.resourceType} install ${projectLink}`); setCopied(true); setTimeout(() => setCopied(false), 2000); } }; useEffect(() => { const fetchingTasks: Promise[] = []; if (resource.resourceType === "bot" || resource.resourceType === "driver") { return; } if (resource.project_link) { fetchingTasks.push(fetchPypiProject(resource.project_link)); } Promise.all(fetchingTasks); }, [resource]); const projectLink = getProjectLink(resource) || "无"; const moduleName = getModuleName(resource) || "无"; const homepageLink = getHomepageLink(resource); const pypiProjectLink = getPypiProjectLink(resource); const updatedTime = getPluginStatusUpdatedTime(resource); return ( <>
{resource.name} {resource.is_official && (
官方
)}
{resource.author}
{resource.desc}
{resource.tags.map((tag, index) => ( ))}
{" "} {(pypiData && pypiData.info.requires_python) || "无"}
{" "} {(pypiData && pypiData.releases[pypiData.info.version] && `${ pypiData.releases[pypiData.info.version].reduce( (acc, curr) => acc + curr.size, 0 ) / 1000 }K`) || "无"}
{" "} {(pypiData && pypiData.info.license) || "无"}
{" "} {(pypiData && pypiData.info.version) || "无"}
{homepageLink && ( )} {pypiProjectLink && ( )}
{" "} {updatedTime}
); }