diff --git a/assets/public/custom/pushMessages.js b/assets/public/custom/pushMessages.js index 15b4e346..5afc54e1 100644 --- a/assets/public/custom/pushMessages.js +++ b/assets/public/custom/pushMessages.js @@ -3,21 +3,46 @@ function checkServiceWorkerSupport() { throw new Error("Your browser does not have Service Worker support") } +async function isPushRegistered() { + checkServiceWorkerSupport(); + try { + const registrations = await navigator.serviceWorker.getRegistrations(); + if (!registrations?.length) return false; + + return await Promise.any( + registrations.map(async (reg) => !!(await reg.pushManager.getSubscription())) + ).catch(() => false); + } catch { + return false; + } +} + async function unregisterPush() { checkServiceWorkerSupport(); + try { + const registrations = await navigator.serviceWorker.getRegistrations(); + if (!registrations?.length) return; - const registrations = await navigator.serviceWorker.getRegistrations(); - - for (const reg of registrations) { - const sub = await reg.pushManager.getSubscription(); - if (sub) await sub.unsubscribe(); - await reg.unregister(); + await Promise.all( + registrations.map(async (reg) => { + const sub = await reg.pushManager.getSubscription(); + if (sub) await sub.unsubscribe(); + await reg.unregister(); + }) + ); + } catch (err) { + console.error("Failed to unregister push:", err); } } async function registerPush(publicKey) { checkServiceWorkerSupport(); + const permission = await Notification.requestPermission(); + if (permission !== "granted") { + throw new Error("Notification permission not granted"); + } + const registration = await navigator.serviceWorker.register("/assets/custom/serviceWorker.js"); console.log("Service Worker registered"); @@ -36,7 +61,7 @@ async function registerPush(publicKey) { method: "POST", headers: { "Content-Type": "application/json", - "Authorization": getToken() + "Authorization": window.AUTH_TOKEN }, body: JSON.stringify({ provider: "webpush", @@ -50,20 +75,4 @@ async function registerPush(publicKey) { const text = await response.text(); throw new Error("Failed to register: ", text) } -} - -async function isPushRegistered() { - checkServiceWorkerSupport(); - - const registrations = await navigator.serviceWorker.getRegistrations(); - if (!registrations || registrations.length === 0) { - return false; - } - - for (const reg of registrations) { - const sub = await reg.pushManager.getSubscription(); - if (sub) return true; - } - - return false; } \ No newline at end of file diff --git a/assets/public/custom/utils.js b/assets/public/custom/utils.js index 74004a16..ca28bc74 100644 --- a/assets/public/custom/utils.js +++ b/assets/public/custom/utils.js @@ -1,9 +1,3 @@ -let authToken = null; - -function getToken() { - return authToken; -} - function urlBase64ToUint8Array(base64String) { const padding = "=".repeat((4 - (base64String.length % 4)) % 4); const base64 = (base64String + padding) @@ -23,7 +17,33 @@ function urlBase64ToUint8Array(base64String) { let proxied = window.XMLHttpRequest.prototype.setRequestHeader; window.XMLHttpRequest.prototype.setRequestHeader = function() { if (arguments[0] === "Authorization") { - authToken = arguments[1]; + window.AUTH_TOKEN = arguments[1]; } return proxied.apply(this, [].slice.call(arguments)); -}; \ No newline at end of file +}; + +window.CSS_CLASSES = { + container: "container-1zDvAE", + labelRow: "labelRow-2jl9gK", + label: "title-2dsDLn", + control: "control-1fl03-", + switchControl: "container-2nx-BQ", + switchControlChecked: "checked-25WXMf", + input: "input-2XRLou", + slider: "slider-32CRPX", + note: "note-2C4pGr", + description: "colorStandard-1Xxp1s size14-k_3Hy4 description-30xx7u formText-2ngGjI modeDefault-2fEh7a", + divider: "divider-_0um2u dividerDefault-3C2-ws", + tabItem: "item-3XjbnG", + selected: "selected-g-kMVV", + contentColumn: "contentColumn-1C7as6", + settingsRegion: "sidebarRegion-1VBisG", + contentRegion: "contentRegion-3HkfJJ", + settingsSidebar: "standardSidebarView-E9Pc3j", + title: "colorStandard-1Xxp1s size14-k_3Hy4 h1-34Txb0 title-3hptVQ defaultColor-2cKwKo defaultMarginh1-EURXsm", + hidden: "hidden-27eifz", + hamburger: "btnHamburger-3GF0_5", +}; + +window.AUTH_TOKEN = null; +window.localStorage_ = localStorage; \ No newline at end of file diff --git a/assets/public/custom/web/main.js b/assets/public/custom/web/main.js index 17e40fd5..1e6147c7 100644 --- a/assets/public/custom/web/main.js +++ b/assets/public/custom/web/main.js @@ -2,18 +2,35 @@ const BUTTON_ID = "rscord-settings-btn"; const CONTENT_CONTAINER_ID = "custom-content"; const SWITCH_CONTAINER_ID = "switch-container"; + + const CUSTOM_CSS_ID = "custom-css"; + const CUSTOM_CSS_STORAGE = "custom_css"; + const CUSTOM_CSS_INPUT_ID = "custom-css-input"; const CSS_CLASSES = { tabItem: "item-3XjbnG", selected: "selected-g-kMVV", contentColumn: "contentColumn-1C7as6", + settingsRegion: "sidebarRegion-1VBisG", + contentRegion: "contentRegion-3HkfJJ", settingsSidebar: "standardSidebarView-E9Pc3j", - title: "colorStandard-1Xxp1s size14-k_3Hy4 h1-34Txb0 title-3hptVQ defaultColor-2cKwKo defaultMarginh1-EURXsm" + title: "colorStandard-1Xxp1s size14-k_3Hy4 h1-34Txb0 title-3hptVQ defaultColor-2cKwKo defaultMarginh1-EURXsm", + miniTitle: "colorStandard-1Xxp1s size14-k_3Hy4 h5-2RwDNl title-3hptVQ title-1HgbhV", + hidden: "hidden-27eifz", + hamburger: "btnHamburger-3GF0_5", + textInput: "inputDefault-3FGxgL input-2g-os5" }; + const IS_MOBILE = window + .matchMedia("(pointer: coarse)") + .matches; + const TAB_CONTENT = `