import { useState } from "react";
import { Check, Copy, KeyRound, AlertTriangle } from "lucide-react";
import { api, type AccountInfo, type KeyResponse } from "../api";
function KeyReveal({ data }: { data: KeyResponse }) {
const [copied, setCopied] = useState(false);
return (
请立即复制保存此密钥,它只显示这一次,无法再次查看。
{data.api_key}
配额:每分钟 {data.rate_limit_per_min} 次 · 累计{" "}
{data.quota_total.toLocaleString()} 次
调用时通过请求头携带:
X-API-Key: {data.api_key.slice(0, 12)}…
);
}
export default function Account() {
const [mode, setMode] = useState<"register" | "manage">("register");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const [issued, setIssued] = useState(null);
const [info, setInfo] = useState(null);
const reset = () => {
setError(null);
setIssued(null);
setInfo(null);
};
async function submit(e: React.FormEvent) {
e.preventDefault();
reset();
if (password.length < 8) {
setError("密码至少需要 8 位");
return;
}
setLoading(true);
try {
if (mode === "register") {
setIssued(await api.register(email, password));
} else {
setInfo(await api.account(email, password));
}
} catch (err) {
setError(err instanceof Error ? err.message : "操作失败");
} finally {
setLoading(false);
}
}
async function regenerate() {
reset();
setLoading(true);
try {
setIssued(await api.regenerate(email, password));
} catch (err) {
setError(err instanceof Error ? err.message : "操作失败");
} finally {
setLoading(false);
}
}
return (
API 密钥
匿名调用免费,但每个来源 IP 累计共 1000 次。注册一个账号即可自助领取专属 API
密钥,获得更高的每分钟频率与累计调用配额。
{issued &&
}
{info && (
邮箱:{info.email}
密钥前缀:{info.key_prefix}…
每分钟频率:{info.rate_limit_per_min} 次
累计配额:已用 {info.quota_used.toLocaleString()} /{" "}
{info.quota_total.toLocaleString()} 次(剩余{" "}
{info.quota_remaining.toLocaleString()})
)}
);
}