cursor done.
This commit is contained in:
166
public/js/serverManager.js
Normal file
166
public/js/serverManager.js
Normal file
@@ -0,0 +1,166 @@
|
||||
import state from './state.js';
|
||||
import {
|
||||
getServers,
|
||||
saveServers,
|
||||
getCurrentServer,
|
||||
setCurrentServer as persistCurrentServer,
|
||||
clearAuth
|
||||
} from './storage.js';
|
||||
import { showToast } from './toast.js';
|
||||
|
||||
export default class ServerManager {
|
||||
constructor() {
|
||||
this.serverInput = document.getElementById('serverInput');
|
||||
this.addBtn = document.getElementById('addServerBtn');
|
||||
this.removeBtn = document.getElementById('removeServerBtn');
|
||||
this.selectEl = document.getElementById('serverSelect');
|
||||
this.servers = [];
|
||||
this.changeHandler = null;
|
||||
}
|
||||
|
||||
init() {
|
||||
this.servers = getServers();
|
||||
this.renderOptions();
|
||||
|
||||
const storedCurrent = getCurrentServer();
|
||||
if (storedCurrent) {
|
||||
this.setCurrentServer(storedCurrent);
|
||||
state.currentServer = storedCurrent;
|
||||
}
|
||||
|
||||
if (this.addBtn) {
|
||||
this.addBtn.addEventListener('click', () => this.handleAdd());
|
||||
}
|
||||
|
||||
if (this.removeBtn) {
|
||||
this.removeBtn.addEventListener('click', () => this.handleRemove());
|
||||
}
|
||||
|
||||
if (this.selectEl) {
|
||||
this.selectEl.addEventListener('change', () => this.handleSelect());
|
||||
}
|
||||
}
|
||||
|
||||
onChange(handler) {
|
||||
this.changeHandler = handler;
|
||||
}
|
||||
|
||||
handleAdd() {
|
||||
const server = (this.serverInput?.value || '').trim();
|
||||
|
||||
if (!server) {
|
||||
showToast('请输入服务器地址', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.isValidUrl(server)) {
|
||||
showToast('无效的服务器地址格式', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.servers.includes(server)) {
|
||||
showToast('服务器已存在', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
this.servers.push(server);
|
||||
saveServers(this.servers);
|
||||
this.renderOptions();
|
||||
this.setCurrentServer(server);
|
||||
persistCurrentServer(server);
|
||||
showToast('服务器已添加', 'success');
|
||||
|
||||
if (this.changeHandler) {
|
||||
this.changeHandler(server);
|
||||
}
|
||||
if (this.serverInput) {
|
||||
this.serverInput.value = '';
|
||||
}
|
||||
}
|
||||
|
||||
handleRemove() {
|
||||
const server = this.selectEl?.value;
|
||||
if (!server) {
|
||||
showToast('请选择要删除的服务器', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!confirm(`确定要删除服务器 "${server}" 吗?`)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.servers = this.servers.filter(item => item !== server);
|
||||
saveServers(this.servers);
|
||||
clearAuth(server);
|
||||
|
||||
if (state.currentServer === server) {
|
||||
state.currentServer = '';
|
||||
}
|
||||
|
||||
persistCurrentServer('');
|
||||
this.renderOptions();
|
||||
showToast('服务器已删除', 'success');
|
||||
|
||||
if (this.changeHandler) {
|
||||
this.changeHandler('');
|
||||
}
|
||||
}
|
||||
|
||||
handleSelect() {
|
||||
const server = this.selectEl?.value || '';
|
||||
persistCurrentServer(server);
|
||||
state.currentServer = server;
|
||||
|
||||
if (this.changeHandler) {
|
||||
this.changeHandler(server);
|
||||
}
|
||||
}
|
||||
|
||||
ensureServerInList(server) {
|
||||
if (!server) return;
|
||||
if (!this.servers.includes(server)) {
|
||||
this.servers.push(server);
|
||||
saveServers(this.servers);
|
||||
this.renderOptions();
|
||||
}
|
||||
this.setCurrentServer(server);
|
||||
}
|
||||
|
||||
setCurrentServer(server) {
|
||||
if (!this.selectEl) return;
|
||||
const optionExists = Array.from(this.selectEl.options).some(opt => opt.value === server);
|
||||
if (!optionExists && server) {
|
||||
const option = document.createElement('option');
|
||||
option.value = server;
|
||||
option.textContent = server;
|
||||
this.selectEl.appendChild(option);
|
||||
}
|
||||
this.selectEl.value = server || '';
|
||||
}
|
||||
|
||||
renderOptions() {
|
||||
if (!this.selectEl) return;
|
||||
|
||||
this.selectEl.innerHTML = '';
|
||||
const placeholder = document.createElement('option');
|
||||
placeholder.value = '';
|
||||
placeholder.textContent = '选择服务器';
|
||||
this.selectEl.appendChild(placeholder);
|
||||
|
||||
this.servers.forEach(server => {
|
||||
const option = document.createElement('option');
|
||||
option.value = server;
|
||||
option.textContent = server;
|
||||
this.selectEl.appendChild(option);
|
||||
});
|
||||
}
|
||||
|
||||
isValidUrl(value) {
|
||||
try {
|
||||
new URL(value);
|
||||
return true;
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user