import React, { useEffect, useState } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; // @ts-expect-error: we need to make package have type: module import copy from "copy-text-to-clipboard"; import { PyPIData } from "./types"; import Tag from "@/components/Resource/Tag"; import type { Resource } from "@/libs/store"; 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 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 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) || "无"; return ( <>
{resource.name} {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) || "无"}
{" "} {moduleName}
{" "} {projectLink}
); }