import type { SearchResult } from "@/routes/search"; import { z } from "zod"; interface SearchResultsProps { results: SearchResult; query: string; } export const formatDateTime = (date: Date): string => { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); // 月份从0开始,补0 const day = String(date.getDate()).padStart(2, "0"); const hour = String(date.getHours()).padStart(2, "0"); const minute = String(date.getMinutes()).padStart(2, "0"); const second = String(date.getSeconds()).padStart(2, "0"); return `${year}-${month}-${day} ${hour}:${minute}:${second}`; }; const biliIDSchema = z.union([z.string().regex(/BV1[0-9A-Za-z]{9}/), z.string().regex(/av[0-9]+/)]); export function SearchResults({ results, query }: SearchResultsProps) { if (!results || results.data.length === 0) { if (!biliIDSchema.safeParse(query).success) { return (

没有找到相关结果

); } return (

没有找到相关结果。 尝试 收录 ?

); } const SearchResultItem = ({ result }: { result: Exclude["data"][number] }) => { switch (result.type) { case "song": return ; case "bili-video": return ; case "bili-video-db": return ; default: return null; } }; return (

找到 {results.data.length} 个结果({(results.elapsedMs / 1000).toFixed(3)}秒):

{results.data.map((result, index) => (
))}
); } function SongResult({ result }: { result: Exclude["data"][number] }) { if (result.type !== "song") return null; const { data } = result; return (
{data.image && ( 歌曲封面 )}

{data.name}

{data.producer &&

{data.producer}

}
{data.duration && ( {Math.floor(data.duration / 60)}:{(data.duration % 60).toString().padStart(2, "0")} )} {data.publishedAt && {formatDateTime(new Date(data.publishedAt))}}
); } function BiliVideoResult({ result }: { result: Exclude["data"][number] }) { if (result.type !== "bili-video") return null; const { data } = result; return (
{data.pic && ( 视频封面 )}

{data.title}

{data.desc && (
						{data.desc}
					
)}
{data.duration && ( {Math.floor(data.duration / 60)}:{(data.duration % 60).toString().padStart(2, "0")} )} {data.pubdate && {formatDateTime(new Date(data.pubdate * 1000))}} {data.bvid && {data.bvid}} {data.stat.view && {data.stat.view.toLocaleString()} 播放} {data.tname && {data.tname}}
{data.bvid && ( 观看视频 )} {data.bvid && ( 查看视频详情 )}
); } function BiliVideoDBResult({ result }: { result: Exclude["data"][number] }) { if (result.type !== "bili-video-db") return null; const { data } = result; return (
{data.coverUrl && ( 视频封面 )}

{data.title}

{data.description && (
						{data.description}
					
)}
{data.duration && ( {Math.floor(data.duration / 60)}:{(data.duration % 60).toString().padStart(2, "0")} )} {data.publishedAt && {formatDateTime(new Date(data.publishedAt))}} {data.bvid && {data.bvid}} {data.views && {data.views.toLocaleString()} 播放}
{data.bvid && ( 观看视频 )} {data.bvid && ( 查看曲目详情 )}
); }