diff --git a/src/html/settings.html b/src/html/settings.html index cec24c1..5d3a0d9 100644 --- a/src/html/settings.html +++ b/src/html/settings.html @@ -53,6 +53,8 @@

Watch2gether


+ +

diff --git a/src/javascript/configuration/configuration.ts b/src/javascript/configuration/configuration.ts index c95749b..8f5f926 100644 --- a/src/javascript/configuration/configuration.ts +++ b/src/javascript/configuration/configuration.ts @@ -19,6 +19,8 @@ export const SETTINGS_playerAutoplayAfterFocusGain = 'playerAutoplayAfterFocusGa // w2g export const SETTINGS_w2gDisplayCharacterCounter = 'w2gDisplayCharacterCounter'; export const SETTINGS_w2gAutotoggleHide = 'w2gAutotoggleHide'; +export const SETTINGS_w2gAutoscrollToUnseen = 'w2gAutoscrollToUnseen'; + class Configuration { settingsCache: Map; diff --git a/src/javascript/enhancements/watch2gether.ts b/src/javascript/enhancements/watch2gether.ts index b4e9590..2088d8a 100644 --- a/src/javascript/enhancements/watch2gether.ts +++ b/src/javascript/enhancements/watch2gether.ts @@ -1,6 +1,6 @@ import * as core from '../utils/aniwatchCore'; import { v4 as uuidv4 } from 'uuid'; -import { getGlobalConfiguration, SETTINGS_w2gDisplayCharacterCounter, SETTINGS_w2gAutotoggleHide } from '../configuration/configuration'; +import { getGlobalConfiguration, SETTINGS_w2gDisplayCharacterCounter, SETTINGS_w2gAutotoggleHide, SETTINGS_w2gAutoscrollToUnseen } from '../configuration/configuration'; import { assigned } from '../utils/helpers'; import { findPlayerElement } from "../enhancements/anilyr"; @@ -13,21 +13,42 @@ export function init(): void { core.runAfterLoad(() => { manipulateChatInput(); }, "^/watch2gether/.*$"); + core.runAfterLocationChange(() => { manipulateChatInput(); }, "^/watch2gether/.*$"); } }); + getGlobalConfiguration().getProperty(SETTINGS_w2gAutotoggleHide, value => { if (value) { core.runAfterLoad(() => { addAutohideListener(); }, "^/watch2gether/.*$"); + core.runAfterLocationChange(() => { addAutohideListener(); }, "^/watch2gether/.*$"); } }); + + getGlobalConfiguration().getProperty(SETTINGS_w2gAutoscrollToUnseen, value => { + if (value) { + core.runAfterLoad(() => { + let element = findSearchResults(); + if (assigned(element)) { + scrollSearchResults(element); + } + }, "^/watch2gether/.*$"); + + core.runAfterLocationChange(() => { + let element = findSearchResults(); + if (assigned(element)) { + scrollSearchResults(element); + } + }, "^/watch2gether/.*$"); + } + }); } function manipulateChatInput(): void { @@ -104,3 +125,29 @@ function addAutohideListener(): void { }) } } + +function scrollSearchResults(searchRes: Element): void { + let observer = new MutationObserver(mutations => { + let scrollTarget = searchRes.querySelector('md-list-item:not(.animelist-completed):not(.animelist-completed-add)') as HTMLElement; + + if (assigned(scrollTarget)) { + // The node isn´t in its correct position directly when it´s added so we wait a small bit of time before we start scrolling. + // Also works for long loading lists which need more time to load than we wait (for example One Piece). + window.setTimeout(() => { + // scroll container to episode first + searchRes.scrollTop = scrollTarget.offsetTop; + + // then scroll page to episode if neccessarry + scrollTarget.scrollIntoView({ behavior: "smooth", block: "nearest" }); + }, 500); + } + }); + + observer.observe(searchRes, { + childList: true, + }); +} + +function findSearchResults(): Element { + return document.querySelector('.search-results .ep-view'); +}