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}}
);
}
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()} 播放}
);
}