import { requireCloudViewer } from "../../cloud-auth"; import { DashboardShell, PageHeading, StatusPill, formatDate } from "../../components/Shells"; import { getDashboardSnapshot, getOrCreateAccount } from "@/db/repository"; import { getBillingEntitlementPresentation } from "@/db/domain"; import { deriveInvitationDisplayState } from "@/db/invitations"; import { AccessRequestForm } from "./AccessRequestForm"; export const dynamic = "force-dynamic"; export default async function BillingPage() { const viewer = await requireCloudViewer("/dashboard/billing"); const account = await getOrCreateAccount(viewer); const snapshot = await getDashboardSnapshot(account); const billingCopy = getBillingEntitlementPresentation( snapshot.entitlement.mode, snapshot.entitlement.publicBetaState, ); const now = new Date(); const nowIso = now.toISOString(); const invitations = snapshot.grants.filter((grant) => grant.source === "admin_exemption"); const pendingAccessRequest = snapshot.accessRequests.find((request) => request.status === "requested") ?? null; const endingSoon = invitations.find((invitation) => { if (deriveInvitationDisplayState(invitation, nowIso) !== "active" || !invitation.ends_at) return false; const remaining = new Date(invitation.ends_at).getTime() - now.getTime(); return remaining > 0 && remaining <= 7 * 24 * 60 * 60_000; }); const available = snapshot.entitlement.unlimited ? "当前不按槽位限额" : `${snapshot.entitlement.availableSlots ?? 0} 个`; return (
{billingCopy.status}

{billingCopy.title}

{billingCopy.description}

启用主机
{snapshot.entitlement.activeSlots}
等待配对
{snapshot.entitlement.reservedSlots}
剩余容量
{available}
下次资格变化
{formatDate(snapshot.entitlement.effectiveUntil)}
{endingSoon && (
CLOSED BETA NOTICE

闭测邀请即将到期

请留意

当前邀请将在 {formatDate(endingSoon.ends_at, true)} 到期。到期后不能新增或重新认领主机;既有主机不会被自动断开,也不会因此产生账单。

)}
当前政策

免费公测

✓ 不绑定支付方式 ✓ 不生成报价或订单 ✓ 公测结束不自动扣款 ✓ 容量限制提前明示
未来安排

收费以后再决定

当前先验证连接成功率、稳定性、资源成本和个人用户的真实使用频率。等数据足够,再单独设计并通知收费方案。

现在没有需要确认、支付或续费的项目。
CLOSED BETA / 申请测试

申请免费闭测资格

{pendingAccessRequest ? "等待处理" : snapshot.entitlement.mode === "none" ? "可申请" : "已有资格"}
{snapshot.entitlement.mode !== "none" ? (
当前账户已经具备免费测试资格,不需要重复申请。
) : ( )} {snapshot.accessRequests.length > 0 && (
{snapshot.accessRequests.map((request) => (
{request.status === "approved" ? "已批准" : request.status === "requested" ? "审核中" : request.status === "declined" ? "暂未批准" : "已撤回"}
{request.requested_slots} 台 · {request.preferred_os === "both" ? "Windows 和 Linux" : request.preferred_os === "windows" ? "Windows" : "Linux"}{request.id}
申请:{formatDate(request.requested_at, true)} {request.admin_response || "尚无处理说明"}
))}
)}
CLOSED BETA / 我的邀请

闭测邀请记录

deriveInvitationDisplayState(invitation, nowIso) === "active") ? "good" : "neutral"}>{invitations.filter((invitation) => deriveInvitationDisplayState(invitation, nowIso) === "active").length} 个有效

邀请是有期限的免费接入资格,与报价、订单或支付账户无关。

{invitations.length ? invitations.map((invitation) => { const state = deriveInvitationDisplayState(invitation, nowIso); return
{state === "active" ? "有效" : state === "expired" ? "已到期" : "已撤销"}
{invitation.capacity_slots === null ? "当前不按主机槽位限额" : `${invitation.capacity_slots} 个主机槽位`}{invitation.id}
开始:{formatDate(invitation.starts_at, true)}结束:{formatDate(invitation.ends_at, true)}
; }) :
该账户没有闭测邀请;公开公测开放状态以页面上方为准。
}
边界

公测结束会发生什么?

1. 免费资格按后台发布的政策变化 2. 新配对和未完成认领停止,既有主机不自动断开 3. 未主动确认前,不创建任何付费关系 4. 撤销设备和必要的数据退出能力继续可用
); }