+ }>
+
+
+
+ }
+ />
+ } />
+
+ >
);
}
diff --git a/web/src/components/fetchTokenKeys.js b/web/src/components/fetchTokenKeys.js
new file mode 100644
index 000000000..7c70c65f4
--- /dev/null
+++ b/web/src/components/fetchTokenKeys.js
@@ -0,0 +1,70 @@
+// 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('当前没有可用的启用令牌,请确认是否有令牌处于启用状态!');
+ 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();
+ }, []);
+
+ return { keys, chatLink, serverAddress, isLoading };
+}
\ No newline at end of file
diff --git a/web/src/pages/Chat/index.js b/web/src/pages/Chat/index.js
index 86f2fd692..b2dd414fd 100644
--- a/web/src/pages/Chat/index.js
+++ b/web/src/pages/Chat/index.js
@@ -1,14 +1,35 @@
import React from 'react';
+import { useTokenKeys } from '../../components/fetchTokenKeys';
+import { Layout } from '@douyinfe/semi-ui';
-const Chat = () => {
- const chatLink = localStorage.getItem('chat_link');
+const ChatPage = () => {
+ const { keys, chatLink, serverAddress, isLoading } = useTokenKeys();
- return (
+ const comLink = (key) => {
+ if (!chatLink || !serverAddress || !key) return '';
+ return `${chatLink}/#/?settings={"key":"sk-${key}","url":"${encodeURIComponent(serverAddress)}"}`;
+ };
+
+ const iframeSrc = keys.length > 0 ? comLink(keys[0]) : '';
+
+ return !isLoading && iframeSrc ? (
+ ) : (
+
+
+
+
+ 当前没有可用的已启用令牌,请确认是否有令牌处于启用状态!
+ 正在跳转......
+
+
+
+
);
};
-export default Chat;
+export default ChatPage;
\ No newline at end of file
diff --git a/web/src/pages/Chat2Link/index.js b/web/src/pages/Chat2Link/index.js
new file mode 100644
index 000000000..1d428a791
--- /dev/null
+++ b/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 (
+
+
正在加载,请稍候...
+
+ );
+};
+
+export default chat2page;
\ No newline at end of file