diff --git a/src/web/pages/Sites.tsx b/src/web/pages/Sites.tsx
index b5a7b79..a4d93a3 100644
--- a/src/web/pages/Sites.tsx
+++ b/src/web/pages/Sites.tsx
@@ -1,3 +1,8 @@
+/**
+ * @Author: 橘子
+ * @Project_description: Metapi 站点管理页
+ * @Description: 代码是我抄的,不会也是真的
+ */
import { useEffect, useMemo, useRef, useState } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import { api } from '../api.js';
@@ -105,6 +110,23 @@ function resolveSiteCreatedSessionLabel(platform?: string | null): string {
return '添加账号(用户名密码登录)';
}
+/**
+ * 跳转到站点对应的连接补全流程。
+ */
+function buildSiteConnectionSearchParams(input: {
+ siteId: number;
+ initializationPresetId?: string | null;
+}) {
+ const params = new URLSearchParams({
+ create: '1',
+ siteId: String(input.siteId),
+ });
+ if (input.initializationPresetId) {
+ params.set('initPreset', input.initializationPresetId);
+ }
+ return params;
+}
+
function formatSubscriptionDate(value?: string | null): string {
if (!value) return '';
const parsed = Date.parse(value);
@@ -875,32 +897,45 @@ export default function Sites() {
});
};
- const handleSiteCreatedChoice = (choice: 'session' | 'apikey' | 'later') => {
- if (!createdSiteForChoice) return;
-
- const siteId = createdSiteForChoice.id;
- const platform = createdSiteForChoice.platform?.toLowerCase().trim();
- const params = new URLSearchParams({
- create: '1',
- siteId: String(siteId),
+ /**
+ * 从站点页进入账号/API Key 连接创建流程。
+ */
+ const openSiteConnectionFlow = (input: {
+ siteId: number;
+ platform?: string | null;
+ initializationPresetId?: string | null;
+ choice: 'session' | 'apikey';
+ }) => {
+ const platform = input.platform?.toLowerCase().trim();
+ const params = buildSiteConnectionSearchParams({
+ siteId: input.siteId,
+ initializationPresetId: input.initializationPresetId,
});
- if (createdSiteForChoice.initializationPresetId) {
- params.set('initPreset', createdSiteForChoice.initializationPresetId);
- }
- if (choice === 'session') {
- // codex平台使用OAuth流程
+ if (input.choice === 'session') {
if (platform === 'codex') {
params.set('provider', 'codex');
navigate(`/oauth?${params.toString()}`);
- } else {
- // 其他平台跳转到账号创建页面(session模式)
- navigate(`/accounts?${params.toString()}`);
+ return;
}
- } else if (choice === 'apikey') {
- // 跳转到账号创建页面(apikey模式)
- params.set('segment', 'apikey');
navigate(`/accounts?${params.toString()}`);
+ return;
+ }
+
+ params.set('segment', 'apikey');
+ navigate(`/accounts?${params.toString()}`);
+ };
+
+ const handleSiteCreatedChoice = (choice: 'session' | 'apikey' | 'later') => {
+ if (!createdSiteForChoice) return;
+
+ if (choice === 'session' || choice === 'apikey') {
+ openSiteConnectionFlow({
+ siteId: createdSiteForChoice.id,
+ platform: createdSiteForChoice.platform,
+ initializationPresetId: createdSiteForChoice.initializationPresetId,
+ choice,
+ });
}
// choice === 'later': 不跳转,留在当前页面
@@ -985,6 +1020,18 @@ export default function Sites() {
}
};
+ /**
+ * 从站点列表直接进入 API Key 批量添加入口。
+ */
+ const handleOpenSiteApiKey = (site: SiteRow) => {
+ openSiteConnectionFlow({
+ siteId: site.id,
+ platform: site.platform,
+ initializationPresetId: detectSiteInitializationPreset(site.url, site.platform)?.id || null,
+ choice: 'apikey',
+ });
+ };
+
const handleTogglePin = async (site: SiteRow) => {
const nextPinned = !site.isPinned;
setPinningSiteId(site.id);
@@ -1938,6 +1985,12 @@ export default function Sites() {
>
{isExpanded ? '收起' : '详情'}
+
>
)}
+