feat: add clipboard magic string for quick channel creation from token copy
When copying a token, users can now choose "Copy Connection String" which encodes both the API key and server URL as a JSON clipboard payload (type: newapi_channel_conn). When opening the channel creation form, the clipboard is auto-detected and a banner offers to fill key + base_url, eliminating repeated tab-switching when connecting to another new-api instance.
This commit is contained in:
Vendored
+38
@@ -80,3 +80,41 @@ export function getServerAddress() {
|
||||
|
||||
return serverAddress;
|
||||
}
|
||||
|
||||
export const CHANNEL_CONN_CLIPBOARD_TYPE = 'newapi_channel_conn';
|
||||
|
||||
/**
|
||||
* @param {string} key - 完整的 API key(含 sk- 前缀)
|
||||
* @param {string} url - 服务器地址
|
||||
* @returns {string} JSON 格式的连接字符串
|
||||
*/
|
||||
export function encodeChannelConnectionString(key, url) {
|
||||
return JSON.stringify({
|
||||
_type: CHANNEL_CONN_CLIPBOARD_TYPE,
|
||||
key,
|
||||
url,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} text - 剪贴板文本
|
||||
* @returns {{ key: string, url: string } | null}
|
||||
*/
|
||||
export function parseChannelConnectionString(text) {
|
||||
if (!text || typeof text !== 'string') return null;
|
||||
try {
|
||||
const parsed = JSON.parse(text.trim());
|
||||
if (
|
||||
parsed &&
|
||||
typeof parsed === 'object' &&
|
||||
parsed._type === CHANNEL_CONN_CLIPBOARD_TYPE &&
|
||||
typeof parsed.key === 'string' &&
|
||||
typeof parsed.url === 'string'
|
||||
) {
|
||||
return { key: parsed.key, url: parsed.url };
|
||||
}
|
||||
} catch {
|
||||
// not valid JSON
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user