Lightcord/BetterDiscordApp/src/modules/popoutWindow.js

130 lines
3.8 KiB
JavaScript

import { themeCookie } from "../0globals"
import bdEvents from "./bdEvents"
import DOM from "./domtools"
export default new class popoutWindow {
constructor(){
/**
* @type {Map<string, Window>}
*/
this.windows = new Map()
this.enabled = false
this.init()
}
async init(){
let popoutModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getWindow)
window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_OPEN", (ev) => {
setImmediate(() => {
/**
* @type {Window}
*/
const window = popoutModule.default.getWindow(ev.key)
this.windows.set(ev.key, window)
let classList = window.document.body.classList
classList.add("window-popout")
classList.add("lightcord")
classList.add("lightcord")
this.update(ev.key)
})
})
window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_CLOSE", (ev) => {
setImmediate(() => {
this.windows.delete(ev.key)
})
})
bdEvents.on("theme-enabled", () => {
this.update()
})
bdEvents.on("theme-disabled", () => {
this.update()
})
bdEvents.on("theme-reloaded", () => {
this.update()
})
bdEvents.on("theme-unloaded", () => {
this.update()
})
bdEvents.on("theme-loaded", () => {
this.update()
})
}
enable(){
this.enabled = true
this.update()
}
disable(){
this.enabled = false
this.update()
}
update(key){
if(!this.windows.size)return
if(!this.enabled){
return this.removeThemes(key)
}else{
return this.applyThemes(key)
}
}
removeThemes(key){
if(this.enabled)return
if(key){
let window = this.windows.get(key)
if(!window)return
let document = window.document
for(let style of document.querySelectorAll("style[data-lightcord-theme=true]")){
style.remove()
}
}else{
for(let key of this.windows.keys()){
this.removeThemes(key)
}
}
}
applyThemes(key){
if(!this.enabled)return
if(key){
let window = this.windows.get(key)
if(!window)return
let document = window.document
for(let style of document.querySelectorAll("style[data-lightcord-theme=true]")){
style.setAttribute("will-remove", "true")
}
Object.keys(bdthemes)
.forEach(themeName => {
if(!themeCookie[themeName])return // theme disabled
const theme = bdthemes[themeName]
if(!theme)return //:shrug:
let existing = document.querySelector("style[data-lightcord-theme=true]#"+DOM.escapeID(theme.id))
if(existing){
existing.innerHTML = unescape(theme.css)
existing.removeAttribute("will-remove")
}else{
const style = document.createElement("style")
style.id = DOM.escapeID(theme.id)
style.innerHTML = unescape(theme.css)
style.setAttribute("data-lightcord-theme", "true")
document.head.append(style)
}
})
for(let style of document.querySelectorAll("style[will-remove=true]")){
style.remove()
}
}else{
for(let key of this.windows.keys()){
this.applyThemes(key)
}
}
}
}