From f10ee669724044646278134958a527314ea9cb21 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 24 Sep 2025 14:05:19 -0400 Subject: [PATCH] Working on ui --- web/superball-shared.css | 6 +++ web/superball.html | 42 +++++++--------- web/thrower.html | 104 ++++++++++++++++++++++++++++++--------- 3 files changed, 105 insertions(+), 47 deletions(-) diff --git a/web/superball-shared.css b/web/superball-shared.css index f0417ee..0891859 100644 --- a/web/superball-shared.css +++ b/web/superball-shared.css @@ -418,6 +418,8 @@ small { border-radius: var(--border-radius); filter: grayscale(100%); transition: filter 0.3s ease; + object-fit: cover; + object-position: center; } #thrower-banner:hover { @@ -431,6 +433,8 @@ small { border: var(--border-width) solid var(--primary-color); filter: grayscale(100%); transition: filter 0.3s ease; + object-fit: cover; + object-position: center; } #thrower-icon:hover { @@ -449,6 +453,8 @@ small { border: var(--border-width) solid var(--primary-color); filter: grayscale(100%); transition: filter 0.3s ease; + object-fit: cover; + object-position: center; } #profile-picture:hover { diff --git a/web/superball.html b/web/superball.html index 0a621aa..0d0dc4c 100644 --- a/web/superball.html +++ b/web/superball.html @@ -542,7 +542,7 @@
- + + +
@@ -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 {