diff --git a/package.json b/package.json index 21cbc66e..1d2f0c6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jellytau", - "version": "0.2.5", + "version": "0.2.6", "description": "", "type": "module", "packageManager": "bun@1.3.5", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 0588c06c..e1c68c6b 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1994,7 +1994,7 @@ dependencies = [ [[package]] name = "jellytau" -version = "0.2.5" +version = "0.2.6" dependencies = [ "aes-gcm", "async-trait", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index f47a2556..4f588f8c 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "jellytau" -version = "0.2.5" +version = "0.2.6" description = "A Tauri App" authors = ["you"] edition = "2021" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index dd7d84ef..eb2bfc48 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "jellytau", - "version": "0.2.5", + "version": "0.2.6", "identifier": "com.dtourolle.jellytau", "build": { "beforeDevCommand": "bun run dev", diff --git a/src/lib/components/player/VideoPlayer.svelte b/src/lib/components/player/VideoPlayer.svelte index 93c2386a..7e95be49 100644 --- a/src/lib/components/player/VideoPlayer.svelte +++ b/src/lib/components/player/VideoPlayer.svelte @@ -26,6 +26,7 @@ resolveSeekTarget, clampSeekTarget, isSynthesizedTouchClick, + isControlSurfaceTouch, SEEK_FORWARD_SECONDS, SEEK_BACKWARD_SECONDS, type TapFeedback, @@ -1442,8 +1443,33 @@ } } + /** + * Walk up from the touch target collecting the tag/attribute pairs + * `isControlSurfaceTouch` needs, so the rule itself stays DOM-free and testable. + */ + function ancestorChain(target: EventTarget | null) { + const chain: Array<{ tag: string; isPlayerControls?: boolean }> = []; + let node = target as HTMLElement | null; + // Bounded walk: controls live a few levels below the player root, and + // stopping at
keeps this cheap and avoids depending on a bound ref. + while (node && node.tagName !== "BODY") { + chain.push({ + tag: node.tagName ?? "", + isPlayerControls: node.dataset?.playerControls !== undefined, + }); + node = node.parentElement; + } + return chain; + } + // Touch gesture handlers function handleTouchStart(e: TouchEvent) { + // Taps on the controls belong to those controls. This listener is on the + // container and touch events bubble, so without this a tap on the bottom + // play button would toggle here AND again via the button's own click — the + // two cancelling out and leaving the control apparently dead (DR-098). + if (isControlSurfaceTouch(ancestorChain(e.target))) return; + const touch = e.touches[0]; touchStartX = touch.clientX; touchStartY = touch.clientY; @@ -1834,8 +1860,10 @@ {/if} - +