This commit is contained in:
lolka1333 2026-01-12 12:32:37 +03:00 committed by GitHub
commit 9cd91c3aa0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 70 additions and 27 deletions

View file

@ -14,10 +14,12 @@ class WebSocketClient {
} }
connect() { connect() {
if (this.ws && this.ws.readyState === WebSocket.OPEN) { if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {
return; return;
} }
this.shouldReconnect = true;
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
// Ensure basePath ends with '/' for proper URL construction // Ensure basePath ends with '/' for proper URL construction
let basePath = this.basePath || ''; let basePath = this.basePath || '';
@ -97,7 +99,10 @@ class WebSocketClient {
if (!this.listeners.has(event)) { if (!this.listeners.has(event)) {
this.listeners.set(event, []); this.listeners.set(event, []);
} }
this.listeners.get(event).push(callback); const callbacks = this.listeners.get(event);
if (!callbacks.includes(callback)) {
callbacks.push(callback);
}
} }
off(event, callback) { off(event, callback) {

View file

@ -1602,7 +1602,6 @@
if (payload && Array.isArray(payload)) { if (payload && Array.isArray(payload)) {
// Use setInbounds to properly convert to DBInbound objects with methods // Use setInbounds to properly convert to DBInbound objects with methods
this.setInbounds(payload); this.setInbounds(payload);
this.searchInbounds(this.searchKey);
} }
}); });
@ -1614,14 +1613,31 @@
// Update online clients list in real-time // Update online clients list in real-time
if (payload && Array.isArray(payload.onlineClients)) { if (payload && Array.isArray(payload.onlineClients)) {
this.onlineClients = payload.onlineClients; const nextOnlineClients = payload.onlineClients;
// Recalculate client counts to update online status let onlineChanged = this.onlineClients.length !== nextOnlineClients.length;
this.dbInbounds.forEach(dbInbound => { if (!onlineChanged) {
const inbound = this.inbounds.find(ib => ib.id === dbInbound.id); const prevSet = new Set(this.onlineClients);
if (inbound && this.clientCount[dbInbound.id]) { for (const email of nextOnlineClients) {
this.clientCount[dbInbound.id] = this.getClientCounts(dbInbound, inbound); if (!prevSet.has(email)) {
onlineChanged = true;
break;
}
} }
}); }
this.onlineClients = nextOnlineClients;
if (onlineChanged) {
// Recalculate client counts to update online status
this.dbInbounds.forEach(dbInbound => {
const inbound = this.inbounds.find(ib => ib.id === dbInbound.id);
if (inbound && this.clientCount[dbInbound.id]) {
this.clientCount[dbInbound.id] = this.getClientCounts(dbInbound, inbound);
}
});
if (this.enableFilter) {
this.filterInbounds();
}
}
} }
// Update last online map in real-time // Update last online map in real-time

View file

@ -5,6 +5,43 @@
<script src="{{ .base_path }}assets/ant-design-vue/antd.min.js"></script> <script src="{{ .base_path }}assets/ant-design-vue/antd.min.js"></script>
<script src="{{ .base_path }}assets/js/util/index.js?{{ .cur_ver }}"></script> <script src="{{ .base_path }}assets/js/util/index.js?{{ .cur_ver }}"></script>
<script src="{{ .base_path }}assets/qrcode/qrious2.min.js?{{ .cur_ver }}"></script> <script src="{{ .base_path }}assets/qrcode/qrious2.min.js?{{ .cur_ver }}"></script>
<style>
.subscription-page .subscription-link-box {
cursor: pointer;
border-radius: 12px;
padding: 25px 20px 15px 20px;
margin-top: -12px;
word-break: break-all;
font-size: 13px;
line-height: 1.5;
text-align: left;
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
transition: all 0.3s;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.dark.subscription-page .subscription-link-box {
background: rgba(0, 0, 0, 0.2);
border: 1px solid rgba(255, 255, 255, 0.1);
color: #fff;
}
.dark.subscription-page .subscription-link-box:hover {
background: rgba(0, 0, 0, 0.3);
border-color: rgba(255, 255, 255, 0.2);
}
.light.subscription-page .subscription-link-box {
background: rgba(0, 0, 0, 0.03);
border: 1px solid rgba(0, 0, 0, 0.08);
color: rgba(0, 0, 0, 0.85);
}
.light.subscription-page .subscription-link-box:hover {
background: rgba(0, 0, 0, 0.05);
border-color: rgba(0, 0, 0, 0.14);
}
</style>
{{ template "page/head_end" .}} {{ template "page/head_end" .}}
{{ template "page/body_start" .}} {{ template "page/body_start" .}}
@ -138,27 +175,12 @@
style="margin-bottom: -10px; position: relative; z-index: 2; box-shadow: 0 2px 4px rgba(0,0,0,0.2);"> style="margin-bottom: -10px; position: relative; z-index: 2; box-shadow: 0 2px 4px rgba(0,0,0,0.2);">
<span>[[ linkName(link, idx) ]]</span> <span>[[ linkName(link, idx) ]]</span>
</a-tag> </a-tag>
<div @click="copy(link)" style=" <div @click="copy(link)" class="subscription-link-box">
cursor: pointer;
background: rgba(0, 0, 0, 0.2);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 25px 20px 15px 20px;
margin-top: -12px;
word-break: break-all;
color: #fff;
font-size: 13px;
line-height: 1.5;
text-align: left;
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
transition: all 0.3s;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
" onmouseover="this.style.background='rgba(0, 0, 0, 0.3)'; this.style.borderColor='rgba(255, 255, 255, 0.2)'"
onmouseout="this.style.background='rgba(0, 0, 0, 0.2)'; this.style.borderColor='rgba(255, 255, 255, 0.1)'">
[[ link ]] [[ link ]]
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<br /> <br />