diff --git a/package.json b/package.json index ff0ce6b..e7b73e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ui", - "version": "6.1.11", + "version": "6.1.12", "license": "BUSL-1.1", "private": true, "packageManager": "pnpm@9.14.4", diff --git a/src/app.d.ts b/src/app.d.ts index f998075..6b5abb2 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -101,6 +101,7 @@ export interface Native { updateProgress: (cb: (progress: number) => void) => Promise spawnPlayer: (url: string) => Promise setHideToTray: (enabled: boolean) => Promise + transparency: (enabled: boolean) => Promise isApp: boolean version: () => Promise } diff --git a/src/lib/components/ui/banner/banner.svelte b/src/lib/components/ui/banner/banner.svelte index 9279776..7aa145a 100644 --- a/src/lib/components/ui/banner/banner.svelte +++ b/src/lib/components/ui/banner/banner.svelte @@ -1,7 +1,7 @@ diff --git a/src/lib/components/ui/player/keybinds.svelte b/src/lib/components/ui/player/keybinds.svelte index 96982de..18347f5 100644 --- a/src/lib/components/ui/player/keybinds.svelte +++ b/src/lib/components/ui/player/keybinds.svelte @@ -71,28 +71,29 @@ let dragged: HTMLDivElement | null = null function draggable (node: HTMLDivElement, code: KeyCode) { + const ctrl = new AbortController() let drag = false node.addEventListener('dragstart', ({ target: _target }) => { const target = _target as HTMLDivElement dragged = target target.classList.add('transparent') drag = true - }) + }, { signal: ctrl.signal }) node.addEventListener('dragend', ({ target: _target }) => { const target = _target as HTMLDivElement target.classList.remove('transparent') drag = false - }) + }, { signal: ctrl.signal }) node.addEventListener('dragover', (e) => { const target = e.target as HTMLDivElement e.dataTransfer!.dropEffect = 'move' e.preventDefault() if (!drag) target.classList.add('transparent') - }) + }, { signal: ctrl.signal }) node.addEventListener('dragleave', ({ target: _target }) => { const target = _target as HTMLDivElement if (!drag) target.classList.remove('transparent') - }) + }, { signal: ctrl.signal }) node.addEventListener('drop', ({ target: _target }) => { const target = _target as HTMLDivElement target.style.opacity = '' @@ -106,7 +107,9 @@ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete $binds[targetcode] } - }) + }, { signal: ctrl.signal }) + + return { destroy: () => ctrl.abort() } } diff --git a/src/lib/modules/native.ts b/src/lib/modules/native.ts index 4adc192..5e614d2 100644 --- a/src/lib/modules/native.ts +++ b/src/lib/modules/native.ts @@ -84,6 +84,7 @@ export default Object.assign>({ cachedTorrents: async () => ['40a9047de61859035659e449d7b84286934486b0'], spawnPlayer: () => sleep(rnd(100_000)), setHideToTray: async () => undefined, + transparency: async () => undefined, updateProgress: async (cb: (progress: number) => void) => undefined, torrentStats: async (): Promise => ({ peers: rnd(), seeders: rnd(), leechers: rnd(), progress: Math.random(), down: rnd(100000000), up: rnd(100000000), name: 'Amebku.webm', downloaded: rnd(100000), hash: '1234567890abcdef', size: 1234567890, eta: rnd() }), torrents: async (): Promise => [{ peers: rnd(), seeders: rnd(), leechers: rnd(), progress: Math.random(), down: rnd(100000000), up: rnd(100000000), name: 'Amebku.webm', downloaded: rnd(100000), hash: '1234567890abcdef', size: 1234567890, eta: rnd() }] diff --git a/src/lib/modules/navigate.ts b/src/lib/modules/navigate.ts index d90e3f9..701d291 100644 --- a/src/lib/modules/navigate.ts +++ b/src/lib/modules/navigate.ts @@ -50,6 +50,7 @@ export function keywrap (cb: (_: KeyboardEvent) => unknown = noop) { * Adds click event listener to the specified node. */ export function click (node: HTMLElement, cb: (_: Event) => unknown = noop) { + const ctrl = new AbortController() node.tabIndex = 0 node.role = 'button' node.addEventListener('click', e => { @@ -57,20 +58,23 @@ export function click (node: HTMLElement, cb: (_: Event) => unknown = noop) { e.preventDefault() navigator.vibrate(15) cb(e) - }) + }, { signal: ctrl.signal }) node.addEventListener('keydown', e => { if (e.key === 'Enter' && intputType.value === 'dpad') { e.stopPropagation() e.preventDefault() cb(e) } - }) + }, { signal: ctrl.signal }) + + return { destroy: () => ctrl.abort() } } /** * Adds hover and click event listeners to the specified node. */ export function hover (node: HTMLElement, [cb = noop, hoverUpdate = noop]: [typeof noop, (_: boolean) => void]) { + const ctrl = new AbortController() node.addEventListener('wheel', e => { // cheap way to update hover state on scroll if (document.elementsFromPoint(e.clientX, e.clientY).includes(node)) { @@ -80,14 +84,14 @@ export function hover (node: HTMLElement, [cb = noop, hoverUpdate = noop]: [type } else { hoverUpdate(false) } - }, { passive: true }) + }, { passive: true, signal: ctrl.signal }) node.tabIndex = 0 node.role = 'button' node.addEventListener('pointerenter', () => { lastHoverElement?.(false) hoverUpdate(true) if (intputType.value === 'mouse') lastHoverElement = hoverUpdate - }) + }, { signal: ctrl.signal }) node.addEventListener('click', e => { e.stopPropagation() if (intputType.value === 'dpad') return @@ -100,7 +104,7 @@ export function hover (node: HTMLElement, [cb = noop, hoverUpdate = noop]: [type } else { lastHoverElement = hoverUpdate } - }) + }, { signal: ctrl.signal }) node.addEventListener('keydown', (e: KeyboardEvent) => { if (e.key === 'Enter' && intputType.value === 'dpad') { e.stopPropagation() @@ -113,16 +117,18 @@ export function hover (node: HTMLElement, [cb = noop, hoverUpdate = noop]: [type lastHoverElement = hoverUpdate } } - }) + }, { signal: ctrl.signal }) node.addEventListener('pointerleave', () => { if (intputType.value !== 'touch') hoverUpdate(false) - }) + }, { signal: ctrl.signal }) node.addEventListener('pointermove', () => { if (intputType.value === 'touch') hoverUpdate(false) - }) + }, { signal: ctrl.signal }) node.addEventListener('drag', () => { if (intputType.value === 'mouse') hoverUpdate(false) - }) + }, { signal: ctrl.signal }) + + return { destroy: () => ctrl.abort() } } interface ElementPosition { element: HTMLElement, x: number, y: number, inViewport: boolean } @@ -275,16 +281,18 @@ export function dragScroll (node: HTMLElement) { let deltaX = 0 let deltaY = 0 + const ctrl = new AbortController() + node.addEventListener('mousedown', e => { isDragging = true x = e.clientX y = e.clientY deltaX = 0 deltaY = 0 - }) + }, { signal: ctrl.signal }) node.addEventListener('click', e => { isDragging = false - }) + }, { signal: ctrl.signal }) node.addEventListener('mousemove', e => { if (!isDragging) return true @@ -296,13 +304,15 @@ export function dragScroll (node: HTMLElement) { if (deltaX > 15 || deltaY > 15) { e.target?.dispatchEvent(new MouseEvent('drag', { bubbles: true })) } - }) + }, { signal: ctrl.signal }) node.addEventListener('mouseleave', () => { isDragging = false - }) + }, { signal: ctrl.signal }) node.addEventListener('mouseup', () => { isDragging = false - }) + }, { signal: ctrl.signal }) + + return { destroy: () => ctrl.abort() } } diff --git a/src/lib/modules/settings/settings.ts b/src/lib/modules/settings/settings.ts index 5f2a70c..32a35ae 100644 --- a/src/lib/modules/settings/settings.ts +++ b/src/lib/modules/settings/settings.ts @@ -10,5 +10,6 @@ settings.subscribe(settings => { const { torrentPersist, torrentDHT, torrentStreamedDownload, torrentSpeed, maxConns, torrentPort, dhtPort, torrentPeX } = settings native.updateSettings({ torrentPersist, torrentDHT, torrentStreamedDownload, torrentSpeed, maxConns, torrentPort, dhtPort, torrentPeX }) native.setHideToTray(settings.hideToTray) + native.transparency(settings.idleAnimation) if (settings.enableDoH) native.setDOH(settings.doHURL) }) diff --git a/src/patches/empty.cjs b/src/patches/empty.cjs new file mode 100644 index 0000000..4ba52ba --- /dev/null +++ b/src/patches/empty.cjs @@ -0,0 +1 @@ +module.exports = {} diff --git a/src/routes/app/settings/interface/+page.svelte b/src/routes/app/settings/interface/+page.svelte index f8c281e..25ba353 100644 --- a/src/routes/app/settings/interface/+page.svelte +++ b/src/routes/app/settings/interface/+page.svelte @@ -58,8 +58,8 @@
UI Settings
- - + + {/if} diff --git a/tsconfig.json b/tsconfig.json index 8c03afc..772b527 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -33,6 +33,7 @@ "include": [ "src/service-worker/index.ts", "src/**/*.js", + "src/**/*.cjs", "src/**/*.ts", "src/**/*.d.ts", "src/**/*.svelte", diff --git a/vite.config.ts b/vite.config.ts index 1089126..13c8686 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -15,6 +15,16 @@ export default defineConfig({ } }) ], + resolve: { + alias: { + // thank you bottleneck for importing useless modules + './RedisConnection': resolve(__dirname, 'src/patches/empty.cjs'), + './RedisConnection.js': resolve(__dirname, 'src/patches/empty.cjs'), + './RedisDatastore': resolve(__dirname, 'src/patches/empty.cjs'), + './IORedisConnection': resolve(__dirname, 'src/patches/empty.cjs'), + './Scripts': resolve(__dirname, 'src/patches/empty.cjs') + } + }, server: { port: 7344 }, build: { target: 'esnext'