feat: Add Chat Widget and Init Service Chooser components
- Implemented ChatWidget component for real-time chat functionality with socket integration. - Added InitServiceChooser component for selecting services with manual token input and auto-authorization. - Updated settings and data provider to support local development with localhost. - Enhanced settings page with Classworks KV card and improved styles. - Introduced debug socket page for monitoring connection status and device interactions. - Refactored socket client utility for better connection management and event handling. - Added glow highlight effect in styles for UI enhancements.
This commit is contained in:
@@ -183,7 +183,7 @@ export default {
|
||||
if (autoConfigureCloud) {
|
||||
// 使用classworksCloudDefaults配置
|
||||
const classworksCloudDefaults = {
|
||||
"server.domain": "https://kv.wuyuan.dev",
|
||||
"server.domain": "http://localhost:3030",
|
||||
"server.siteKey": "",
|
||||
};
|
||||
|
||||
|
||||
@@ -68,8 +68,8 @@ const SETTINGS_STORAGE_KEY = "Classworks_settings";
|
||||
|
||||
// 新增: Classworks云端存储的默认设置
|
||||
const classworksCloudDefaults = {
|
||||
"server.domain": "https://kv.wuyuan.dev",
|
||||
//"server.domain": "http://localhost:3030",
|
||||
//"server.domain": "https://kv.wuyuan.dev",
|
||||
"server.domain": "http://localhost:3030",
|
||||
"server.siteKey": "",
|
||||
};
|
||||
|
||||
@@ -206,7 +206,7 @@ const settingsDefinitions = {
|
||||
},
|
||||
"server.authDomain": {
|
||||
type: "string",
|
||||
default: "https://kv.houlang.cloud",
|
||||
default: "http://localhost:5173",
|
||||
description: "授权服务器域名",
|
||||
icon: "mdi-shield-account",
|
||||
validate: (value) => {
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
// Lightweight reusable Socket.IO client singleton
|
||||
// - Uses server domain from settings when available
|
||||
// - Exposes join/leave helpers and event on/off wrappers
|
||||
|
||||
import { io } from 'socket.io-client';
|
||||
import { getSetting } from '@/utils/settings';
|
||||
|
||||
let socket = null;
|
||||
let connectedDomain = null;
|
||||
const listeners = new Set();
|
||||
|
||||
export function getServerUrl() {
|
||||
// Prefer configured server domain; fallback to env; then current origin
|
||||
const cfg = getSetting('server.domain');
|
||||
const envUrl = import.meta?.env?.VITE_SERVER_URL;
|
||||
return cfg || envUrl || window.location.origin;
|
||||
}
|
||||
|
||||
export function getSocket() {
|
||||
const serverUrl = getServerUrl();
|
||||
if (!socket || connectedDomain !== serverUrl) {
|
||||
if (socket) {
|
||||
try { socket.disconnect(); } catch (e) {
|
||||
void e; // ignore
|
||||
}
|
||||
socket = null;
|
||||
}
|
||||
connectedDomain = serverUrl;
|
||||
socket = io(serverUrl, { transports: ['websocket'] });
|
||||
|
||||
// Re-attach previously registered event handlers on new socket instance
|
||||
listeners.forEach(({ event, handler }) => {
|
||||
socket.on(event, handler);
|
||||
});
|
||||
}
|
||||
return socket;
|
||||
}
|
||||
|
||||
export function on(event, handler) {
|
||||
const s = getSocket();
|
||||
s.on(event, handler);
|
||||
listeners.add({ event, handler });
|
||||
return () => off(event, handler);
|
||||
}
|
||||
|
||||
export function off(event, handler) {
|
||||
if (!socket) return;
|
||||
socket.off(event, handler);
|
||||
// Remove only matching entry
|
||||
for (const item of Array.from(listeners)) {
|
||||
if (item.event === event && item.handler === handler) {
|
||||
listeners.delete(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function joinToken(token) {
|
||||
const s = getSocket();
|
||||
if (!token) return;
|
||||
s.emit('join-token', { token });
|
||||
}
|
||||
|
||||
export function leaveToken(token) {
|
||||
if (!socket) return;
|
||||
socket.emit('leave-token', { token });
|
||||
}
|
||||
|
||||
export function leaveAll() {
|
||||
if (!socket) return;
|
||||
socket.emit('leave-all');
|
||||
}
|
||||
|
||||
export function onConnect(handler) {
|
||||
const s = getSocket();
|
||||
s.on('connect', handler);
|
||||
return () => s.off('connect', handler);
|
||||
}
|
||||
|
||||
export function disconnect() {
|
||||
if (!socket) return;
|
||||
try { socket.disconnect(); } catch (e) {
|
||||
void e; // ignore
|
||||
}
|
||||
socket = null;
|
||||
connectedDomain = null;
|
||||
listeners.clear();
|
||||
}
|
||||
Reference in New Issue
Block a user