diff options
author | metamuffin <metamuffin@disroot.org> | 2024-01-27 16:27:29 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-01-27 16:27:29 +0100 |
commit | efcbc7b810acfe6f84b9b114d8a5735781753ac0 (patch) | |
tree | d4663bc808b193187086dc63fe4bd3d56e753ef2 /web/script/player | |
parent | 2affa0fc842013b7ed1fd86cb8bd68f71fa6555c (diff) | |
download | jellything-efcbc7b810acfe6f84b9b114d8a5735781753ac0.tar jellything-efcbc7b810acfe6f84b9b114d8a5735781753ac0.tar.bz2 jellything-efcbc7b810acfe6f84b9b114d8a5735781753ac0.tar.zst |
fix some double-free bugs in the DOM
Diffstat (limited to 'web/script/player')
-rw-r--r-- | web/script/player/mod.ts | 94 | ||||
-rw-r--r-- | web/script/player/popup.ts | 3 | ||||
-rw-r--r-- | web/script/player/sync.ts | 6 |
3 files changed, 58 insertions, 45 deletions
diff --git a/web/script/player/mod.ts b/web/script/player/mod.ts index 9457288..c4f4473 100644 --- a/web/script/player/mod.ts +++ b/web/script/player/mod.ts @@ -76,21 +76,23 @@ function initialize_player(el: HTMLElement, node_id: string) { ...(kind == "audio" ? volume() : []), - ...(player.tracks ?? []) - .map((track, index) => ({ index, track })) - .filter(({ track }) => get_track_kind(track.kind) == kind) - .map(({ track, index }): HTMLElement => { - const active = player.active_tracks.value.find(ts => ts.track_index == index) !== undefined - const onclick = (button: HTMLElement) => { - button.textContent = "…" - player.set_track_enabled(index, !active) - } - return e("div", - e("button", { class: "jsp-track-state", onclick }, active ? "-" : "+"), " ", - e("span", { class: "jsp-track-name" }, track.name), " ", - e("span", { class: "jsp-track-lang" }, track.language) - ) - }) + player.active_tracks.map(_ => + e("div", ...(player.tracks ?? []) + .map((track, index) => ({ index, track })) + .filter(({ track }) => get_track_kind(track.kind) == kind) + .map(({ track, index }): HTMLElement => { + const active = player.active_tracks.value.find(ts => ts.track_index == index) !== undefined + const onclick = () => { + player.set_track_enabled(index, !active) + // TODO show loading indicator + } + return e("div", + e("button", { class: "jsp-track-state", onclick }, active ? "-" : "+"), " ", + e("span", { class: "jsp-track-name" }, track.name), " ", + e("span", { class: "jsp-track-lang" }, track.language) + ) + }) + )) ) ) return button @@ -103,38 +105,40 @@ function initialize_player(el: HTMLElement, node_id: string) { e("h2", "Settings"), e("div", { class: ["jsp-controlgroup", "jsp-playersync-controls"] }, e("h3", "Playersync"), - sync_state.map(sync => sync - ? e("div", - e("span", "Sync enabled."), - e("button", "Disable", { - onclick: () => { sync_state.value?.destroy(); sync_state.value = undefined } - }), - e("p", "Session ID: ", - channel_name_copy = e("input", { type: "text", disabled: true, value: sync.name }), - e("button", "content_paste_go", { - class: "icon", + sync_state.map(sync => { + console.log("aaaaa", sync); + return sync + ? e("div", + e("span", "Sync enabled."), + e("button", "Disable", { + onclick: () => { sync_state.value?.destroy(); sync_state.value = undefined } + }), + e("p", "Session ID: ", + channel_name_copy = e("input", { type: "text", disabled: true, value: sync.name }), + e("button", "content_paste_go", { + class: "icon", + onclick: () => { + logger.log("Session ID copied to clipboard.") + navigator.clipboard.writeText(channel_name_copy.value) + } + }) + )) + : e("div", + channel_name = e("input", { type: "text", placeholder: "someroom:example.org" }), + e("button", "Join", { onclick: () => { - logger.log("Session ID copied to clipboard.") - navigator.clipboard.writeText(channel_name_copy.value) + if (!channel_name.value.length) return + sync_state.value?.destroy() + sync_state.value = new Playersync(player, logger, channel_name.value) } - }) - )) - : e("div", - channel_name = e("input", { type: "text", placeholder: "someroom:example.org" }), - e("button", "Join", { - onclick: () => { - if (!channel_name.value.length) return - sync_state.value?.destroy() - sync_state.value = new Playersync(player, logger, channel_name.value) - } - }), e("br"), - e("button", "Create new session", { - onclick: () => { - sync_state.value?.destroy() - sync_state.value = new Playersync(player, logger) - } - })) - ) + }), e("br"), + e("button", "Create new session", { + onclick: () => { + sync_state.value?.destroy() + sync_state.value = new Playersync(player, logger) + } + })) + }) ) )) return button; diff --git a/web/script/player/popup.ts b/web/script/player/popup.ts index d300a5c..dde7ed6 100644 --- a/web/script/player/popup.ts +++ b/web/script/player/popup.ts @@ -44,6 +44,9 @@ export class Popup { const content = this.content! content.classList.add("jsp-popup-out") setTimeout(() => { + //@ts-ignore i know + const child_undo: undefined | (() => void) = content["jsh_undo"] + if (child_undo) child_undo() this.container.removeChild(content) }, 100) this.content = undefined diff --git a/web/script/player/sync.ts b/web/script/player/sync.ts index 6f2b86f..34a46e3 100644 --- a/web/script/player/sync.ts +++ b/web/script/player/sync.ts @@ -1,3 +1,9 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2024 metamuffin <metamuffin.org> +*/ +/// <reference lib="dom" /> import { Logger } from "../jshelper/src/log.ts"; import { Player } from "./player.ts" |