forked from laantungir/super_ball
Working on ui
This commit is contained in:
104
web/thrower.html
104
web/thrower.html
@@ -48,7 +48,7 @@
|
||||
<div><strong>Events in Queue:</strong> <span id="events-queued">0</span></div>
|
||||
<div><strong>Info Status:</strong> <span id="thrower-info-status">Loading...</span></div>
|
||||
<div><strong>Last Updated:</strong> <span id="thrower-info-updated">Never</span></div>
|
||||
<div><strong>Refresh Rate:</strong> <span id="thrower-info-refresh">60 seconds</span></div>
|
||||
<div><strong>Refresh Rate:</strong> <span id="thrower-info-refresh">300 seconds</span></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -71,7 +71,7 @@
|
||||
<div class="input-group">
|
||||
<label>Add New Relay:</label>
|
||||
<div class="add-relay-form">
|
||||
<input type="url" id="new-relay-url" placeholder="wss://relay.example.com">
|
||||
<input type="url" id="new-relay-url" placeholder="wss://relay.example.com (or comma-separated list)">
|
||||
<select id="new-relay-type">
|
||||
<option value="">Both</option>
|
||||
<option value="read">Read</option>
|
||||
@@ -151,7 +151,7 @@
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<label for="edit-refresh-rate">Refresh Rate (seconds):</label>
|
||||
<input type="number" id="edit-refresh-rate" placeholder="60" value="60" min="10" max="3600">
|
||||
<input type="number" id="edit-refresh-rate" placeholder="300" value="300" min="10" max="3600">
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<label for="edit-thrower-content">Additional Content (optional):</label>
|
||||
@@ -616,35 +616,95 @@
|
||||
}
|
||||
|
||||
|
||||
// Add new relay
|
||||
// Add new relay (supports comma-separated list)
|
||||
function addRelay() {
|
||||
const url = document.getElementById('new-relay-url').value.trim();
|
||||
const input = document.getElementById('new-relay-url').value.trim();
|
||||
const type = document.getElementById('new-relay-type').value;
|
||||
|
||||
if (!url) {
|
||||
if (!input) {
|
||||
showStatus('relay-status', 'Please enter a relay URL', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!url.startsWith('wss://') && !url.startsWith('ws://')) {
|
||||
showStatus('relay-status', 'Relay URL must start with wss:// or ws://', 'error');
|
||||
return;
|
||||
}
|
||||
// Check if input contains commas (multiple URLs)
|
||||
const urls = input.includes(',') ?
|
||||
input.split(',').map(url => url.trim()).filter(url => url.length > 0) :
|
||||
[input];
|
||||
|
||||
// Check for duplicates
|
||||
if (currentRelays.some(r => r.url === url)) {
|
||||
showStatus('relay-status', 'Relay already exists', 'error');
|
||||
return;
|
||||
}
|
||||
const results = {
|
||||
added: [],
|
||||
failed: [],
|
||||
duplicates: []
|
||||
};
|
||||
|
||||
currentRelays.push({ url, type });
|
||||
// Process each URL
|
||||
urls.forEach(url => {
|
||||
// Validate URL format
|
||||
if (!url.startsWith('wss://') && !url.startsWith('ws://')) {
|
||||
results.failed.push({ url, reason: 'Must start with wss:// or ws://' });
|
||||
return;
|
||||
}
|
||||
|
||||
// Check for duplicates
|
||||
if (currentRelays.some(r => r.url === url)) {
|
||||
results.duplicates.push(url);
|
||||
return;
|
||||
}
|
||||
|
||||
// Add relay
|
||||
currentRelays.push({ url, type, authStatus: 'unknown', lastTested: null });
|
||||
results.added.push(url);
|
||||
});
|
||||
|
||||
// Update display
|
||||
displayRelayList();
|
||||
|
||||
// Clear form
|
||||
document.getElementById('new-relay-url').value = '';
|
||||
document.getElementById('new-relay-type').value = '';
|
||||
|
||||
showStatus('relay-status', 'Relay added (remember to save)', 'info');
|
||||
// Provide detailed feedback
|
||||
const messages = [];
|
||||
|
||||
if (results.added.length > 0) {
|
||||
const typeText = type ? ` (${type === 'read' ? 'Read only' : type === 'write' ? 'Write only' : 'Both'})` : ' (Both)';
|
||||
if (results.added.length === 1) {
|
||||
messages.push(`✅ Added: ${results.added[0]}${typeText}`);
|
||||
} else {
|
||||
messages.push(`✅ Added ${results.added.length} relays${typeText}:`);
|
||||
results.added.forEach(url => messages.push(` • ${url}`));
|
||||
}
|
||||
}
|
||||
|
||||
if (results.duplicates.length > 0) {
|
||||
if (results.duplicates.length === 1) {
|
||||
messages.push(`⚠️ Duplicate skipped: ${results.duplicates[0]}`);
|
||||
} else {
|
||||
messages.push(`⚠️ ${results.duplicates.length} duplicates skipped:`);
|
||||
results.duplicates.forEach(url => messages.push(` • ${url}`));
|
||||
}
|
||||
}
|
||||
|
||||
if (results.failed.length > 0) {
|
||||
if (results.failed.length === 1) {
|
||||
messages.push(`❌ Failed: ${results.failed[0].url} (${results.failed[0].reason})`);
|
||||
} else {
|
||||
messages.push(`❌ ${results.failed.length} failed:`);
|
||||
results.failed.forEach(item => messages.push(` • ${item.url} (${item.reason})`));
|
||||
}
|
||||
}
|
||||
|
||||
// Show comprehensive status
|
||||
const statusMessage = messages.join('\n');
|
||||
const statusType = results.added.length > 0 ? 'info' :
|
||||
results.failed.length > 0 ? 'error' : 'info';
|
||||
|
||||
// Add reminder to save if any were added
|
||||
const finalMessage = results.added.length > 0 ?
|
||||
statusMessage + '\n\n💾 Remember to save your relay configuration!' :
|
||||
statusMessage;
|
||||
|
||||
showStatus('relay-status', finalMessage, statusType);
|
||||
}
|
||||
|
||||
// Remove relay
|
||||
@@ -1067,7 +1127,7 @@
|
||||
version: '1.0.0',
|
||||
privacyPolicy: '',
|
||||
termsOfService: '',
|
||||
refreshRate: 60,
|
||||
refreshRate: 300,
|
||||
content: event.content || ''
|
||||
};
|
||||
|
||||
@@ -1084,7 +1144,7 @@
|
||||
else if (tag[0] === 'version') currentThrowerInfo.version = tag[1] || '1.0.0';
|
||||
else if (tag[0] === 'privacy_policy') currentThrowerInfo.privacyPolicy = tag[1] || '';
|
||||
else if (tag[0] === 'terms_of_service') currentThrowerInfo.termsOfService = tag[1] || '';
|
||||
else if (tag[0] === 'refresh_rate') currentThrowerInfo.refreshRate = parseInt(tag[1]) || 60;
|
||||
else if (tag[0] === 'refresh_rate') currentThrowerInfo.refreshRate = parseInt(tag[1]) || 300;
|
||||
});
|
||||
|
||||
lastThrowerInfoPublish = event.created_at;
|
||||
@@ -1103,7 +1163,7 @@
|
||||
version: '1.0.0',
|
||||
privacyPolicy: '',
|
||||
termsOfService: '',
|
||||
refreshRate: 60,
|
||||
refreshRate: 300,
|
||||
content: ''
|
||||
};
|
||||
displayThrowerInfo(currentThrowerInfo);
|
||||
@@ -1148,7 +1208,7 @@
|
||||
document.getElementById('edit-version').value = currentThrowerInfo.version || '1.0.0';
|
||||
document.getElementById('edit-privacy-policy').value = currentThrowerInfo.privacyPolicy || '';
|
||||
document.getElementById('edit-terms-service').value = currentThrowerInfo.termsOfService || '';
|
||||
document.getElementById('edit-refresh-rate').value = currentThrowerInfo.refreshRate || 60;
|
||||
document.getElementById('edit-refresh-rate').value = currentThrowerInfo.refreshRate || 300;
|
||||
document.getElementById('edit-thrower-content').value = currentThrowerInfo.content || '';
|
||||
}
|
||||
|
||||
@@ -1172,7 +1232,7 @@
|
||||
const version = document.getElementById('edit-version').value.trim();
|
||||
const privacyPolicy = document.getElementById('edit-privacy-policy').value.trim();
|
||||
const termsOfService = document.getElementById('edit-terms-service').value.trim();
|
||||
const refreshRate = parseInt(document.getElementById('edit-refresh-rate').value) || 60;
|
||||
const refreshRate = parseInt(document.getElementById('edit-refresh-rate').value) || 300;
|
||||
const content = document.getElementById('edit-thrower-content').value.trim();
|
||||
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user