GuoRuqiang 1 год назад
Родитель
Сommit
27eb358497
4 измененных файлов с 119 добавлено и 78 удалено
  1. 12 0
      web/src/App.js
  2. 68 0
      web/src/components/fetchTokenKeys.js
  3. 13 78
      web/src/pages/Chat/index.js
  4. 26 0
      web/src/pages/Chat2Link/index.js

+ 12 - 0
web/src/App.js

@@ -20,6 +20,7 @@ import Redemption from './pages/Redemption';
 import TopUp from './pages/TopUp';
 import Log from './pages/Log';
 import Chat from './pages/Chat';
+import Chat2Link from './pages/Chat2Link'; //新增
 import { Layout } from '@douyinfe/semi-ui';
 import Midjourney from './pages/Midjourney';
 import Pricing from './pages/Pricing/index.js';
@@ -255,6 +256,17 @@ function App() {
               </Suspense>
             }
           />
+          {/* 方便使用外链... */}
+          <Route
+            path='/chat2link'
+            element={
+              <PrivateRoute>
+                <Suspense fallback={<Loading></Loading>}>
+                    <Chat2Link />
+                </Suspense>
+              </PrivateRoute>
+            }
+          />
           <Route path='*' element={<NotFound />} />
         </Routes>
       </Layout.Content>

+ 68 - 0
web/src/components/fetchTokenKeys.js

@@ -0,0 +1,68 @@
+// src/hooks/useTokenKeys.js
+import { useEffect, useState } from 'react';
+import { API, showError } from '../helpers';
+
+async function fetchTokenKeys() {
+  try {
+    const response = await API.get('/api/token/?p=0&size=999');
+    const { success, data } = response.data;
+    if (success) {
+      const activeTokens = data.filter((token) => token.status === 1);
+      return activeTokens.map((token) => token.key);
+    } else {
+      throw new Error('Failed to fetch token keys');
+    }
+  } catch (error) {
+    console.error("Error fetching token keys:", error);
+    return [];
+  }
+}
+
+function getServerAddress() {
+  let status = localStorage.getItem('status');
+  let serverAddress = '';
+
+  if (status) {
+    try {
+      status = JSON.parse(status);
+      serverAddress = status.server_address || '';
+    } catch (error) {
+      console.error("Failed to parse status from localStorage:", error);
+    }
+  }
+
+  if (!serverAddress) {
+    serverAddress = window.location.origin;
+  }
+
+  return serverAddress;
+}
+
+export function useTokenKeys() {
+  const [keys, setKeys] = useState([]);
+  const [chatLink, setChatLink] = useState('');
+  const [serverAddress, setServerAddress] = useState('');
+  const [isLoading, setIsLoading] = useState(true);
+
+  useEffect(() => {
+    const loadAllData = async () => {
+      const fetchedKeys = await fetchTokenKeys();
+      if (fetchedKeys.length === 0) {
+        showError('当前没有可用的启用令牌,请确认是否有令牌处于启用状态!');
+        window.location.href = '/token';
+      }
+      setKeys(fetchedKeys);
+      setIsLoading(false);
+
+      const link = localStorage.getItem('chat_link');
+      setChatLink(link);
+
+      const address = getServerAddress();
+      setServerAddress(address);
+    };
+
+    loadAllData();
+  }, []);
+
+  return { keys, chatLink, serverAddress, isLoading };
+}

+ 13 - 78
web/src/pages/Chat/index.js

@@ -1,72 +1,9 @@
-import React, { useEffect, useState } from 'react';
-import { API, showError } from '../../helpers';
+import React from 'react';
+import { useTokenKeys } from '../../components/fetchTokenKeys';
 import {  Layout } from '@douyinfe/semi-ui';
 
-// 获取 Token Keys 的异步函数,过滤掉非启用状态的令牌
-async function fetchTokenKeys() {
-  try {
-    const response = await API.get('/api/token/?p=0&size=999');
-    const { success, data } = response.data;
-    if (success) {
-      // 过滤已启用状态的令牌
-      const activeTokens = data.filter((token) => token.status === 1);
-      return activeTokens.map((token) => token.key);
-    } else {
-      throw new Error('Failed to fetch token keys');
-    }
-  } catch (error) {
-    console.error("Error fetching token keys:", error);
-    return [];
-  }
-}
-
-function getServerAddress() {
-  let status = localStorage.getItem('status');
-  let serverAddress = '';
-
-  if (status) {
-    try {
-      status = JSON.parse(status);
-      serverAddress = status.server_address || '';
-    } catch (error) {
-      console.error("Failed to parse status from localStorage:", error);
-    }
-  }
-
-  if (!serverAddress) {
-    serverAddress = window.location.origin;
-  }
-
-  return serverAddress;
-}
-
-const TokenKeysPage = () => {
-  const [keys, setKeys] = useState([]);
-  const [chatLink, setChatLink] = useState('');
-  const [serverAddress, setServerAddress] = useState('');
-  const [isLoading, setIsLoading] = useState(true);
-  
-  useEffect(() => {
-    const loadAllData = async () => {
-      const fetchedKeys = await fetchTokenKeys();
-      if (fetchedKeys.length === 0) {
-        // showError('当前没有可用的启用令牌,请确认是否有令牌处于启用状态!');
-        setTimeout(() => {
-          window.location.href = '/token';
-        }, 1500); // 延迟 1.5 秒后跳转
-      }
-      setKeys(fetchedKeys);
-      setIsLoading(false); 
-
-      const link = localStorage.getItem('chat_link');
-      setChatLink(link);
-
-      const address = getServerAddress();
-      setServerAddress(address);
-    };
-
-    loadAllData();
-  }, []);
+const ChatPage = () => {
+  const { keys, chatLink, serverAddress, isLoading } = useTokenKeys();
 
   const comLink = (key) => {
     if (!chatLink || !serverAddress || !key) return '';
@@ -75,7 +12,6 @@ const TokenKeysPage = () => {
 
   const iframeSrc = keys.length > 0 ? comLink(keys[0]) : '';
 
-  // 生成链接
   return !isLoading && iframeSrc ? (
     <iframe
       src={iframeSrc}
@@ -84,17 +20,16 @@ const TokenKeysPage = () => {
     />
   ) : (
     <div>
-    <Layout>
-    <Layout.Header>
-      <h3 style={{ color: 'red'}}>
-        当前没有可用的已启用令牌,请确认是否有令牌处于启用状态!<br />
-        正在跳转......
-      </h3>
-    </Layout.Header>
-    </Layout>
+      <Layout>
+        <Layout.Header>
+          <h3 style={{ color: 'red'}}>
+            当前没有可用的已启用令牌,请确认是否有令牌处于启用状态!<br />
+            正在跳转......
+          </h3>
+        </Layout.Header>
+      </Layout>
     </div>
   );
-
 };
 
-export default TokenKeysPage;
+export default ChatPage;

+ 26 - 0
web/src/pages/Chat2Link/index.js

@@ -0,0 +1,26 @@
+import React from 'react';
+import { useTokenKeys } from '../../components/fetchTokenKeys';
+
+const chat2page = () => {
+  const { keys, chatLink, serverAddress, isLoading } = useTokenKeys();
+
+  const comLink = (key) => {
+    if (!chatLink || !serverAddress || !key) return '';
+    return `${chatLink}/#/?settings={"key":"sk-${key}","url":"${encodeURIComponent(serverAddress)}"}`;
+  };
+
+  if (keys.length > 0) {
+    const redirectLink = comLink(keys[0]);
+    if (redirectLink) {
+      window.location.href = redirectLink;
+    }
+  }
+
+  return (
+    <div>
+        <h3>正在加载,请稍候...</h3>
+    </div>
+  );
+};
+
+export default chat2page;