diff --git a/package.json b/package.json index 3febb587..232a5bb8 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.14.8", + "version": "4.14.9", "description": "FrankerFaceZ is a Twitch enhancement suite.", "license": "Apache-2.0", "scripts": { diff --git a/src/modules/main_menu/index.js b/src/modules/main_menu/index.js index 481dfc38..5dcf121a 100644 --- a/src/modules/main_menu/index.js +++ b/src/modules/main_menu/index.js @@ -794,7 +794,16 @@ export default class MainMenu extends Module { this.settings.provider.set('cfg-collapsed', collapsed); }, - resize: e => ! this.dialog.exclusive && this.dialog.toggleSize(e), + resize: e => { + if ( this.dialog.exclusive || this.site?.router?.current_name === 'squad' ) + return; + + if ( this.settings.get('context.ui.theatreModeEnabled') ) + return; + + this.dialog.toggleSize(e); + }, + close: e => ! this.dialog.exclusive && this.dialog.toggleVisible(e), popout: e => { diff --git a/src/modules/metadata.jsx b/src/modules/metadata.jsx index 547ced89..5aff9382 100644 --- a/src/modules/metadata.jsx +++ b/src/modules/metadata.jsx @@ -126,7 +126,7 @@ export default class Metadata extends Module { async popup(data, tip) { const [permission, broadcast_id] = await Promise.all([ - navigator.permissions.query({name: 'clipboard-write'}), + navigator.permissions.query({name: 'clipboard-write'}).then(perm => perm?.state).catch(() => null), data.getBroadcastID() ]); if ( ! broadcast_id ) @@ -135,7 +135,7 @@ export default class Metadata extends Module { ); const url = `https://www.twitch.tv/videos/${broadcast_id}${data.uptime > 0 ? `?t=${durationForURL(data.uptime)}` : ''}`, - can_copy = permission?.state === 'granted' || permission?.state === 'prompt'; + can_copy = permission === 'granted' || permission === 'prompt'; const copy = can_copy ? e => { navigator.clipboard.writeText(url); @@ -954,8 +954,10 @@ export default class Metadata extends Module { } } - if ( old_color !== color ) - el.dataset.color = el.style.color = color; + if ( old_color !== color ) { + el.dataset.color = color; + el.style.setProperty('color', color, 'important'); + } el._ffz_data = data; stat.innerHTML = label; diff --git a/src/sites/twitch-twilight/index.js b/src/sites/twitch-twilight/index.js index a5b11c67..97c3a201 100644 --- a/src/sites/twitch-twilight/index.js +++ b/src/sites/twitch-twilight/index.js @@ -203,7 +203,8 @@ Twilight.CHAT_ROUTES = [ 'user-following', 'user', 'dash', - 'embed-chat' + 'embed-chat', + 'squad' ]; diff --git a/src/sites/twitch-twilight/modules/menu_button.jsx b/src/sites/twitch-twilight/modules/menu_button.jsx index 42163d55..54b4d78b 100644 --- a/src/sites/twitch-twilight/modules/menu_button.jsx +++ b/src/sites/twitch-twilight/modules/menu_button.jsx @@ -7,7 +7,6 @@ import {DEBUG} from 'utilities/constants'; import {SiteModule} from 'utilities/module'; import {createElement, ClickOutside, setChildren} from 'utilities/dom'; -import { timeout, sleep } from 'src/utilities/object'; export default class MenuButton extends SiteModule { constructor(...args) { @@ -40,6 +39,12 @@ export default class MenuButton extends SiteModule { 'nav-bar', n => n.renderOnsiteNotifications && n.renderTwitchPrimeCrown ); + + this.SquadBar = this.fine.define( + 'squad-nav-bar', + n => n.exitSquadMode && n.props && n.props.squadID, + ['squad'] + ); } get loading() { @@ -154,6 +159,9 @@ export default class MenuButton extends SiteModule { _update() { for(const inst of this.NavBar.instances) this.updateButton(inst); + + for(const inst of this.SquadBar.instances) + this.updateButton(inst); } @@ -163,6 +171,10 @@ export default class MenuButton extends SiteModule { this.NavBar.on('mount', this.updateButton, this); this.NavBar.on('update', this.updateButton, this); + this.SquadBar.ready(() => this.update()); + this.SquadBar.on('mount', this.updateButton, this); + this.SquadBar.on('update', this.updateButton, this); + this.on(':clicked', () => this.important_update = false); this.once(':clicked', this.loadMenu); @@ -175,20 +187,33 @@ export default class MenuButton extends SiteModule { updateButton(inst) { const root = this.fine.getChildNode(inst); - let container = root && root.querySelector('.top-nav__menu'); + let is_squad = false, + container = root && root.querySelector('.top-nav__menu'); + + if ( ! container ) { + if ( root && root.classList.contains('squad-stream-top-bar__container') ) + container = root; + else + container = root && root.querySelector('.squad-stream-top-bar__container'); + + if ( container ) + is_squad = true; + } if ( ! container ) return; - let user_stuff = null; - try { - user_stuff = container.querySelector(':scope > .tw-justify-content-end:last-child'); - } catch(err) { /* dumb browsers with no :scope are dumb */ } + if ( ! is_squad ) { + let user_stuff = null; + try { + user_stuff = container.querySelector(':scope > .tw-justify-content-end:last-child'); + } catch(err) { /* dumb browsers with no :scope are dumb */ } - if ( user_stuff ) - container = user_stuff; - else - container = container.lastElementChild; + if ( user_stuff ) + container = user_stuff; + else + container = container.lastElementChild; + } let btn, el = container.querySelector('.ffz-top-nav'); if ( el ) @@ -367,7 +392,21 @@ export default class MenuButton extends SiteModule { ctx = (
-
+
+
+ +
+ { this.i18n.t('player.reset_button.all', 'Reset All Players (Double-Click)') } +
+
+
{ this.i18n.t('site.menu_button.profiles', 'Profiles') } diff --git a/src/sites/twitch-twilight/modules/player.jsx b/src/sites/twitch-twilight/modules/player.jsx index cd55ea74..4ff32a4e 100644 --- a/src/sites/twitch-twilight/modules/player.jsx +++ b/src/sites/twitch-twilight/modules/player.jsx @@ -373,6 +373,8 @@ export default class Player extends Module { this.updateHideExtensions(); this.installVisibilityHook(); + this.on(':reset', () => this.resetPlayer()); + const t = this; @@ -775,7 +777,7 @@ export default class Player extends Module { if ( tries < 5 ) return setTimeout(this.addPiPButton.bind(this, inst, (tries || 0) + 1), 250); - return this.log.warn('Unable to find container element for PiP button.'); + return; // this.log.warn('Unable to find container element for PiP button.'); } let icon, tip, btn, cont = container.querySelector('.ffz--player-pip'); @@ -864,7 +866,7 @@ export default class Player extends Module { if ( tries < 5 ) return setTimeout(this.addResetButton.bind(this, inst, (tries || 0) + 1), 250); - return this.log.warn('Unable to find container element for Reset button.'); + return; // this.log.warn('Unable to find container element for Reset button.'); } let tip, btn, cont = container.querySelector('.ffz--player-reset'); diff --git a/src/sites/twitch-twilight/styles/color_normalizer.scss b/src/sites/twitch-twilight/styles/color_normalizer.scss index dffbb61d..c7e70ecc 100644 --- a/src/sites/twitch-twilight/styles/color_normalizer.scss +++ b/src/sites/twitch-twilight/styles/color_normalizer.scss @@ -3,6 +3,7 @@ .channel-header, .channel-root__right-column, .chat-room, + .multi-stream-player-layout, .carousel-player-nav-arrow__container { background-color: var(--color-background-body) !important; }