From c0a6f0adc2de65794a67f7d867e4b27df596f6e7 Mon Sep 17 00:00:00 2001 From: Koala <6156589+Shik3i@users.noreply.github.com> Date: Mon, 25 May 2026 23:49:32 +0200 Subject: [PATCH] ui: clipboard emoji for invite button, movie emoji for audible tab indicator --- extension/manifest.base.json | 2 +- extension/popup.html | 2 +- extension/popup.js | 27 ++++++++++++++++++++++----- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/extension/manifest.base.json b/extension/manifest.base.json index 6cd069e..cf8c23b 100644 --- a/extension/manifest.base.json +++ b/extension/manifest.base.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "KoalaSync", - "version": "1.8.3", + "version": "1.8.4", "description": "Watch party extension to synchronize video playback on YouTube, Twitch, Netflix, and HTML5 sites in real-time with friends.", "permissions": [ "storage", diff --git a/extension/popup.html b/extension/popup.html index 9543a91..0a42a92 100644 --- a/extension/popup.html +++ b/extension/popup.html @@ -378,7 +378,7 @@
- +
diff --git a/extension/popup.js b/extension/popup.js index 4909818..0de417d 100644 --- a/extension/popup.js +++ b/extension/popup.js @@ -47,7 +47,8 @@ const elements = { lobbyTitle: document.getElementById('lobbyTitle'), lobbyPeerStatus: document.getElementById('lobbyPeerStatus'), browserNotifications: document.getElementById('browserNotifications'), - autoCopyInvite: document.getElementById('autoCopyInvite') + autoCopyInvite: document.getElementById('autoCopyInvite'), + syncTabCopyInvite: document.getElementById('syncTabCopyInvite') }; let localPeerId = null; @@ -608,7 +609,7 @@ async function populateTabs(providedPeers = null, providedTargetTabId = null) { } if (tab.audible) { - label = `[🔊] ${label}`; + label = `[🎬] ${label}`; } option.textContent = label; @@ -1067,13 +1068,15 @@ elements.forceSyncBtn.addEventListener('click', async () => { elements.forceSyncBtn.disabled = true; elements.forceSyncBtn.textContent = mode === 'jump-to-others' ? `Syncing to group (${formatTime(targetTime)})...` : 'Syncing...'; forceSyncDone = false; + const peerCount = (status.peers || []).filter(p => (typeof p === 'object' ? p.peerId : p) !== localPeerId).length; + const syncTimeoutMs = peerCount === 0 ? 3000 : 12000; const forceSyncReset = () => { if (!forceSyncDone) { elements.forceSyncBtn.disabled = false; elements.forceSyncBtn.textContent = originalText; } }; - forceSyncResetTimer = setTimeout(forceSyncReset, 12000); + forceSyncResetTimer = setTimeout(forceSyncReset, syncTimeoutMs); const tabId = parseInt(status.targetTabId); const sendForceSync = (time) => { @@ -1119,13 +1122,20 @@ elements.playBtn.addEventListener('click', () => { showToast('Please select a video first!', 'warning'); return; } - elements.playBtn.textContent = 'Playing...'; + elements.playBtn.textContent = '▶ Playing...'; elements.playBtn.disabled = true; chrome.runtime.sendMessage({ type: 'CONTENT_EVENT', action: EVENTS.PLAY, payload: {} }); + // Safety reset: restore button after 2.5s in case no peers respond + setTimeout(() => { + if (elements.playBtn.disabled) { + elements.playBtn.textContent = '▶ Play'; + elements.playBtn.disabled = false; + } + }, 2500); }); elements.pauseBtn.addEventListener('click', () => { @@ -1133,13 +1143,20 @@ elements.pauseBtn.addEventListener('click', () => { showToast('Please select a video first!', 'warning'); return; } - elements.pauseBtn.textContent = 'Pausing...'; + elements.pauseBtn.textContent = '⏸ Pausing...'; elements.pauseBtn.disabled = true; chrome.runtime.sendMessage({ type: 'CONTENT_EVENT', action: EVENTS.PAUSE, payload: {} }); + // Safety reset: restore button after 2.5s in case no peers respond + setTimeout(() => { + if (elements.pauseBtn.disabled) { + elements.pauseBtn.textContent = '⏸ Pause'; + elements.pauseBtn.disabled = false; + } + }, 2500); }); elements.clearLogs.addEventListener('click', () => {