From d7dca478d68d78bf3059ee590c5beab94955cfa7 Mon Sep 17 00:00:00 2001 From: Idrees Hassan Date: Thu, 13 Nov 2025 17:46:03 -0500 Subject: [PATCH] Move sticky note path checking to context --- dist/birb.js | 106 ++++++++++++++++++---------------- dist/extension.zip | Bin 148744 -> 148897 bytes dist/extension/birb.js | 106 ++++++++++++++++++---------------- dist/extension/manifest.json | 2 +- dist/obsidian/main.js | 106 ++++++++++++++++++---------------- dist/obsidian/manifest.json | 2 +- dist/userscript/birb.user.js | 108 +++++++++++++++++++---------------- src/application.js | 10 ++-- src/context.js | 50 +++++++++++++++- src/stickyNotes.js | 46 ++------------- 10 files changed, 293 insertions(+), 243 deletions(-) diff --git a/dist/birb.js b/dist/birb.js index 7180c24..3436801 100644 --- a/dist/birb.js +++ b/dist/birb.js @@ -880,6 +880,40 @@ resetSaveData() { throw new Error("Method not implemented"); } + + /** + * @returns {string} The current path of the active page in this context + */ + getPath() { + // Default to website URL + return window.location.href; + } + + /** + * Checks if a path is applicable given the context + * @param {string} path Can be a site URL or another context-specific path + * @returns {boolean} Whether the path matches the current context state + */ + isPathApplicable(path) { + // Default to website URL matching + const currentUrl = window.location.href; + const stickyNoteWebsite = path.split("?")[0]; + const currentWebsite = currentUrl.split("?")[0]; + + if (stickyNoteWebsite !== currentWebsite) { + return false; + } + + const pathParams = parseUrlParams(path); + const currentParams = parseUrlParams(currentUrl); + + if (window.location.hostname === "www.youtube.com") { + if (currentParams.v !== undefined && currentParams.v !== pathParams.v) { + return false; + } + } + return true; + } } class LocalContext extends Context { @@ -1063,6 +1097,21 @@ return new LocalContext(); } + /** + * Parse URL parameters into a key-value map + * @param {string} url + * @returns {Record} + */ + function parseUrlParams(url) { + const queryString = url.split("?")[1]; + if (!queryString) return {}; + + return queryString.split("&").reduce((params, param) => { + const [key, value] = param.split("="); + return { ...params, [key]: value }; + }, {}); + } + /** * @typedef {Object} SavedStickyNote * @property {string} id @@ -1089,46 +1138,6 @@ } } - /** - * Parse URL parameters into a key-value map - * @param {string} url - * @returns {Record} - */ - function parseUrlParams(url) { - const queryString = url.split("?")[1]; - if (!queryString) return {}; - - return queryString.split("&").reduce((params, param) => { - const [key, value] = param.split("="); - return { ...params, [key]: value }; - }, {}); - } - - /** - * @param {StickyNote} stickyNote - * @returns {boolean} Whether the given sticky note is applicable to the current site/page - */ - function isStickyNoteApplicable(stickyNote) { - const stickyNoteUrl = stickyNote.site; - const currentUrl = window.location.href; - const stickyNoteWebsite = stickyNoteUrl.split("?")[0]; - const currentWebsite = currentUrl.split("?")[0]; - - if (stickyNoteWebsite !== currentWebsite) { - return false; - } - - const stickyNoteParams = parseUrlParams(stickyNoteUrl); - const currentParams = parseUrlParams(currentUrl); - - if (window.location.hostname === "www.youtube.com") { - if (currentParams.v !== undefined && currentParams.v !== stickyNoteParams.v) { - return false; - } - } - return true; - } - /** * @param {StickyNote} stickyNote * @param {() => void} onSave @@ -1211,8 +1220,9 @@ const existingNotes = document.querySelectorAll(".birb-sticky-note"); existingNotes.forEach(note => note.remove()); // Render all sticky notes + const context = getContext(); for (let stickyNote of stickyNotes) { - if (isStickyNoteApplicable(stickyNote)) { + if (context.isPathApplicable(stickyNote.site)) { renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); } } @@ -1225,7 +1235,7 @@ */ function createNewStickyNote(stickyNotes, onSave, onDelete) { const id = Date.now().toString(); - const site = window.location.href; + const site = getContext().getPath(); const stickyNote = new StickyNote(id, site, ""); const element = renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); element.style.left = `${window.innerWidth / 2 - element.offsetWidth / 2}px`; @@ -1902,7 +1912,7 @@ insertModal(`${birdBirb()} Mode`, message); }), new Separator(), - new MenuItem("2025.11.13.2", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.2"); }, false), + new MenuItem("2025.11.13.6", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.6"); }, false), ]; const styleElement = document.createElement("style"); @@ -2097,12 +2107,12 @@ drawStickyNotes(stickyNotes, save, deleteStickyNote); - let lastUrl = (window.location.href ?? "").split("?")[0]; + let lastPath = getContext().getPath().split("?")[0]; setInterval(() => { - const currentUrl = (window.location.href ?? "").split("?")[0]; - if (currentUrl !== lastUrl) { - log("URL changed, updating sticky notes"); - lastUrl = currentUrl; + const currentPath = getContext().getPath().split("?")[0]; + if (currentPath !== lastPath) { + log("Path changed, updating sticky notes"); + lastPath = currentPath; drawStickyNotes(stickyNotes, save, deleteStickyNote); } }, URL_CHECK_INTERVAL); diff --git a/dist/extension.zip b/dist/extension.zip index 91981101c06868ec720553eb73a4066393754961..9374412749c0713c2ca13da899dfb911f3f4b8e5 100644 GIT binary patch delta 26469 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 z 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 delta 26381 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%0A$z)rjrzd>G*0Mb)?X7F%Ud7 zKnz6iJAt3A+QDiF0KgDF0Ko9C1jHKu@`)b<>_0kLd;bTd69*AJf)X%~AomY{Kpz-L z@mTv0OzfsW5CGr@J81vqR2TYA999g>a##vx$uRI}Nd={q0D=FyYyS)_kc1`bGzLV1 zdjCh$BMqZxfBCCH|KA!{C13>h=|2S6_JaDq1TL6Q(9GOl!tebD{JRM`b<3nsH~=6C zcKkcvuS<`7?%%9}lRSrCFviXQV|`qGWKlu!V52;LQ~S|qBRpX=*Z)T)*m|s(I3uW9dIOE{~d^^FNxm z(tkqyZXM^(-ym$C!(jdQ>Toi$3wC0whphoN5&(eyUq4sx-9J{yP(7JHF&t!IF$O_U zDmhpgg))C)v_FF9h=0I~|9}{>Fwh3=4=6ADhiUc*)?xht)Bgk3J%aRje?Zs} diff --git a/dist/extension/birb.js b/dist/extension/birb.js index 7180c24..3436801 100644 --- a/dist/extension/birb.js +++ b/dist/extension/birb.js @@ -880,6 +880,40 @@ resetSaveData() { throw new Error("Method not implemented"); } + + /** + * @returns {string} The current path of the active page in this context + */ + getPath() { + // Default to website URL + return window.location.href; + } + + /** + * Checks if a path is applicable given the context + * @param {string} path Can be a site URL or another context-specific path + * @returns {boolean} Whether the path matches the current context state + */ + isPathApplicable(path) { + // Default to website URL matching + const currentUrl = window.location.href; + const stickyNoteWebsite = path.split("?")[0]; + const currentWebsite = currentUrl.split("?")[0]; + + if (stickyNoteWebsite !== currentWebsite) { + return false; + } + + const pathParams = parseUrlParams(path); + const currentParams = parseUrlParams(currentUrl); + + if (window.location.hostname === "www.youtube.com") { + if (currentParams.v !== undefined && currentParams.v !== pathParams.v) { + return false; + } + } + return true; + } } class LocalContext extends Context { @@ -1063,6 +1097,21 @@ return new LocalContext(); } + /** + * Parse URL parameters into a key-value map + * @param {string} url + * @returns {Record} + */ + function parseUrlParams(url) { + const queryString = url.split("?")[1]; + if (!queryString) return {}; + + return queryString.split("&").reduce((params, param) => { + const [key, value] = param.split("="); + return { ...params, [key]: value }; + }, {}); + } + /** * @typedef {Object} SavedStickyNote * @property {string} id @@ -1089,46 +1138,6 @@ } } - /** - * Parse URL parameters into a key-value map - * @param {string} url - * @returns {Record} - */ - function parseUrlParams(url) { - const queryString = url.split("?")[1]; - if (!queryString) return {}; - - return queryString.split("&").reduce((params, param) => { - const [key, value] = param.split("="); - return { ...params, [key]: value }; - }, {}); - } - - /** - * @param {StickyNote} stickyNote - * @returns {boolean} Whether the given sticky note is applicable to the current site/page - */ - function isStickyNoteApplicable(stickyNote) { - const stickyNoteUrl = stickyNote.site; - const currentUrl = window.location.href; - const stickyNoteWebsite = stickyNoteUrl.split("?")[0]; - const currentWebsite = currentUrl.split("?")[0]; - - if (stickyNoteWebsite !== currentWebsite) { - return false; - } - - const stickyNoteParams = parseUrlParams(stickyNoteUrl); - const currentParams = parseUrlParams(currentUrl); - - if (window.location.hostname === "www.youtube.com") { - if (currentParams.v !== undefined && currentParams.v !== stickyNoteParams.v) { - return false; - } - } - return true; - } - /** * @param {StickyNote} stickyNote * @param {() => void} onSave @@ -1211,8 +1220,9 @@ const existingNotes = document.querySelectorAll(".birb-sticky-note"); existingNotes.forEach(note => note.remove()); // Render all sticky notes + const context = getContext(); for (let stickyNote of stickyNotes) { - if (isStickyNoteApplicable(stickyNote)) { + if (context.isPathApplicable(stickyNote.site)) { renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); } } @@ -1225,7 +1235,7 @@ */ function createNewStickyNote(stickyNotes, onSave, onDelete) { const id = Date.now().toString(); - const site = window.location.href; + const site = getContext().getPath(); const stickyNote = new StickyNote(id, site, ""); const element = renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); element.style.left = `${window.innerWidth / 2 - element.offsetWidth / 2}px`; @@ -1902,7 +1912,7 @@ insertModal(`${birdBirb()} Mode`, message); }), new Separator(), - new MenuItem("2025.11.13.2", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.2"); }, false), + new MenuItem("2025.11.13.6", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.6"); }, false), ]; const styleElement = document.createElement("style"); @@ -2097,12 +2107,12 @@ drawStickyNotes(stickyNotes, save, deleteStickyNote); - let lastUrl = (window.location.href ?? "").split("?")[0]; + let lastPath = getContext().getPath().split("?")[0]; setInterval(() => { - const currentUrl = (window.location.href ?? "").split("?")[0]; - if (currentUrl !== lastUrl) { - log("URL changed, updating sticky notes"); - lastUrl = currentUrl; + const currentPath = getContext().getPath().split("?")[0]; + if (currentPath !== lastPath) { + log("Path changed, updating sticky notes"); + lastPath = currentPath; drawStickyNotes(stickyNotes, save, deleteStickyNote); } }, URL_CHECK_INTERVAL); diff --git a/dist/extension/manifest.json b/dist/extension/manifest.json index 6afbae5..cc12b0a 100644 --- a/dist/extension/manifest.json +++ b/dist/extension/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Pocket Bird", "description": "It's a pet bird in your browser, what more could you want?", - "version": "2025.11.13.2", + "version": "2025.11.13.6", "homepage_url": "https://idreesinc.com", "icons": { "48": "images/icons/transparent/48x48x1.png", diff --git a/dist/obsidian/main.js b/dist/obsidian/main.js index c63c8bc..91d0ecb 100644 --- a/dist/obsidian/main.js +++ b/dist/obsidian/main.js @@ -884,6 +884,40 @@ module.exports = class MyPlugin extends Plugin { resetSaveData() { throw new Error("Method not implemented"); } + + /** + * @returns {string} The current path of the active page in this context + */ + getPath() { + // Default to website URL + return window.location.href; + } + + /** + * Checks if a path is applicable given the context + * @param {string} path Can be a site URL or another context-specific path + * @returns {boolean} Whether the path matches the current context state + */ + isPathApplicable(path) { + // Default to website URL matching + const currentUrl = window.location.href; + const stickyNoteWebsite = path.split("?")[0]; + const currentWebsite = currentUrl.split("?")[0]; + + if (stickyNoteWebsite !== currentWebsite) { + return false; + } + + const pathParams = parseUrlParams(path); + const currentParams = parseUrlParams(currentUrl); + + if (window.location.hostname === "www.youtube.com") { + if (currentParams.v !== undefined && currentParams.v !== pathParams.v) { + return false; + } + } + return true; + } } class LocalContext extends Context { @@ -1067,6 +1101,21 @@ module.exports = class MyPlugin extends Plugin { return new LocalContext(); } + /** + * Parse URL parameters into a key-value map + * @param {string} url + * @returns {Record} + */ + function parseUrlParams(url) { + const queryString = url.split("?")[1]; + if (!queryString) return {}; + + return queryString.split("&").reduce((params, param) => { + const [key, value] = param.split("="); + return { ...params, [key]: value }; + }, {}); + } + /** * @typedef {Object} SavedStickyNote * @property {string} id @@ -1093,46 +1142,6 @@ module.exports = class MyPlugin extends Plugin { } } - /** - * Parse URL parameters into a key-value map - * @param {string} url - * @returns {Record} - */ - function parseUrlParams(url) { - const queryString = url.split("?")[1]; - if (!queryString) return {}; - - return queryString.split("&").reduce((params, param) => { - const [key, value] = param.split("="); - return { ...params, [key]: value }; - }, {}); - } - - /** - * @param {StickyNote} stickyNote - * @returns {boolean} Whether the given sticky note is applicable to the current site/page - */ - function isStickyNoteApplicable(stickyNote) { - const stickyNoteUrl = stickyNote.site; - const currentUrl = window.location.href; - const stickyNoteWebsite = stickyNoteUrl.split("?")[0]; - const currentWebsite = currentUrl.split("?")[0]; - - if (stickyNoteWebsite !== currentWebsite) { - return false; - } - - const stickyNoteParams = parseUrlParams(stickyNoteUrl); - const currentParams = parseUrlParams(currentUrl); - - if (window.location.hostname === "www.youtube.com") { - if (currentParams.v !== undefined && currentParams.v !== stickyNoteParams.v) { - return false; - } - } - return true; - } - /** * @param {StickyNote} stickyNote * @param {() => void} onSave @@ -1215,8 +1224,9 @@ module.exports = class MyPlugin extends Plugin { const existingNotes = document.querySelectorAll(".birb-sticky-note"); existingNotes.forEach(note => note.remove()); // Render all sticky notes + const context = getContext(); for (let stickyNote of stickyNotes) { - if (isStickyNoteApplicable(stickyNote)) { + if (context.isPathApplicable(stickyNote.site)) { renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); } } @@ -1229,7 +1239,7 @@ module.exports = class MyPlugin extends Plugin { */ function createNewStickyNote(stickyNotes, onSave, onDelete) { const id = Date.now().toString(); - const site = window.location.href; + const site = getContext().getPath(); const stickyNote = new StickyNote(id, site, ""); const element = renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); element.style.left = `${window.innerWidth / 2 - element.offsetWidth / 2}px`; @@ -1906,7 +1916,7 @@ module.exports = class MyPlugin extends Plugin { insertModal(`${birdBirb()} Mode`, message); }), new Separator(), - new MenuItem("2025.11.13.2", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.2"); }, false), + new MenuItem("2025.11.13.6", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.6"); }, false), ]; const styleElement = document.createElement("style"); @@ -2101,12 +2111,12 @@ module.exports = class MyPlugin extends Plugin { drawStickyNotes(stickyNotes, save, deleteStickyNote); - let lastUrl = (window.location.href ?? "").split("?")[0]; + let lastPath = getContext().getPath().split("?")[0]; setInterval(() => { - const currentUrl = (window.location.href ?? "").split("?")[0]; - if (currentUrl !== lastUrl) { - log("URL changed, updating sticky notes"); - lastUrl = currentUrl; + const currentPath = getContext().getPath().split("?")[0]; + if (currentPath !== lastPath) { + log("Path changed, updating sticky notes"); + lastPath = currentPath; drawStickyNotes(stickyNotes, save, deleteStickyNote); } }, URL_CHECK_INTERVAL); diff --git a/dist/obsidian/manifest.json b/dist/obsidian/manifest.json index a55a7fa..c2d4666 100644 --- a/dist/obsidian/manifest.json +++ b/dist/obsidian/manifest.json @@ -1,7 +1,7 @@ { "id": "pocket-bird", "name": "Pocket Bird", - "version": "2025.11.13.2", + "version": "2025.11.13.6", "minAppVersion": "0.15.0", "description": "It's a pet bird in your Obsidian, what more could you want?", "author": "Idrees Hassan", diff --git a/dist/userscript/birb.user.js b/dist/userscript/birb.user.js index c05ddb3..6201bbe 100644 --- a/dist/userscript/birb.user.js +++ b/dist/userscript/birb.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Pocket Bird // @namespace https://idreesinc.com -// @version 2025.11.13.2 +// @version 2025.11.13.6 // @description It's a bird that hops around your web browser, the future is here // @author Idrees // @downloadURL https://github.com/IdreesInc/Pocket-Bird/raw/refs/heads/main/dist/userscript/birb.user.js @@ -894,6 +894,40 @@ resetSaveData() { throw new Error("Method not implemented"); } + + /** + * @returns {string} The current path of the active page in this context + */ + getPath() { + // Default to website URL + return window.location.href; + } + + /** + * Checks if a path is applicable given the context + * @param {string} path Can be a site URL or another context-specific path + * @returns {boolean} Whether the path matches the current context state + */ + isPathApplicable(path) { + // Default to website URL matching + const currentUrl = window.location.href; + const stickyNoteWebsite = path.split("?")[0]; + const currentWebsite = currentUrl.split("?")[0]; + + if (stickyNoteWebsite !== currentWebsite) { + return false; + } + + const pathParams = parseUrlParams(path); + const currentParams = parseUrlParams(currentUrl); + + if (window.location.hostname === "www.youtube.com") { + if (currentParams.v !== undefined && currentParams.v !== pathParams.v) { + return false; + } + } + return true; + } } class LocalContext extends Context { @@ -1077,6 +1111,21 @@ return new LocalContext(); } + /** + * Parse URL parameters into a key-value map + * @param {string} url + * @returns {Record} + */ + function parseUrlParams(url) { + const queryString = url.split("?")[1]; + if (!queryString) return {}; + + return queryString.split("&").reduce((params, param) => { + const [key, value] = param.split("="); + return { ...params, [key]: value }; + }, {}); + } + /** * @typedef {Object} SavedStickyNote * @property {string} id @@ -1103,46 +1152,6 @@ } } - /** - * Parse URL parameters into a key-value map - * @param {string} url - * @returns {Record} - */ - function parseUrlParams(url) { - const queryString = url.split("?")[1]; - if (!queryString) return {}; - - return queryString.split("&").reduce((params, param) => { - const [key, value] = param.split("="); - return { ...params, [key]: value }; - }, {}); - } - - /** - * @param {StickyNote} stickyNote - * @returns {boolean} Whether the given sticky note is applicable to the current site/page - */ - function isStickyNoteApplicable(stickyNote) { - const stickyNoteUrl = stickyNote.site; - const currentUrl = window.location.href; - const stickyNoteWebsite = stickyNoteUrl.split("?")[0]; - const currentWebsite = currentUrl.split("?")[0]; - - if (stickyNoteWebsite !== currentWebsite) { - return false; - } - - const stickyNoteParams = parseUrlParams(stickyNoteUrl); - const currentParams = parseUrlParams(currentUrl); - - if (window.location.hostname === "www.youtube.com") { - if (currentParams.v !== undefined && currentParams.v !== stickyNoteParams.v) { - return false; - } - } - return true; - } - /** * @param {StickyNote} stickyNote * @param {() => void} onSave @@ -1225,8 +1234,9 @@ const existingNotes = document.querySelectorAll(".birb-sticky-note"); existingNotes.forEach(note => note.remove()); // Render all sticky notes + const context = getContext(); for (let stickyNote of stickyNotes) { - if (isStickyNoteApplicable(stickyNote)) { + if (context.isPathApplicable(stickyNote.site)) { renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); } } @@ -1239,7 +1249,7 @@ */ function createNewStickyNote(stickyNotes, onSave, onDelete) { const id = Date.now().toString(); - const site = window.location.href; + const site = getContext().getPath(); const stickyNote = new StickyNote(id, site, ""); const element = renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); element.style.left = `${window.innerWidth / 2 - element.offsetWidth / 2}px`; @@ -1916,7 +1926,7 @@ insertModal(`${birdBirb()} Mode`, message); }), new Separator(), - new MenuItem("2025.11.13.2", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.2"); }, false), + new MenuItem("2025.11.13.6", () => { alert("Thank you for using Pocket Bird! You are on version: 2025.11.13.6"); }, false), ]; const styleElement = document.createElement("style"); @@ -2111,12 +2121,12 @@ drawStickyNotes(stickyNotes, save, deleteStickyNote); - let lastUrl = (window.location.href ?? "").split("?")[0]; + let lastPath = getContext().getPath().split("?")[0]; setInterval(() => { - const currentUrl = (window.location.href ?? "").split("?")[0]; - if (currentUrl !== lastUrl) { - log("URL changed, updating sticky notes"); - lastUrl = currentUrl; + const currentPath = getContext().getPath().split("?")[0]; + if (currentPath !== lastPath) { + log("Path changed, updating sticky notes"); + lastPath = currentPath; drawStickyNotes(stickyNotes, save, deleteStickyNote); } }, URL_CHECK_INTERVAL); diff --git a/src/application.js b/src/application.js index 5ab3814..9ce19c4 100644 --- a/src/application.js +++ b/src/application.js @@ -426,12 +426,12 @@ Promise.all([ drawStickyNotes(stickyNotes, save, deleteStickyNote); - let lastUrl = (window.location.href ?? "").split("?")[0]; + let lastPath = getContext().getPath().split("?")[0]; setInterval(() => { - const currentUrl = (window.location.href ?? "").split("?")[0]; - if (currentUrl !== lastUrl) { - log("URL changed, updating sticky notes"); - lastUrl = currentUrl; + const currentPath = getContext().getPath().split("?")[0]; + if (currentPath !== lastPath) { + log("Path changed, updating sticky notes"); + lastPath = currentPath; drawStickyNotes(stickyNotes, save, deleteStickyNote); } }, URL_CHECK_INTERVAL); diff --git a/src/context.js b/src/context.js index d3ada8e..ddc8de3 100644 --- a/src/context.js +++ b/src/context.js @@ -1,4 +1,3 @@ - import { debug, log, error } from "./shared.js"; const SAVE_KEY = "birbSaveData"; @@ -42,6 +41,40 @@ export class Context { resetSaveData() { throw new Error("Method not implemented"); } + + /** + * @returns {string} The current path of the active page in this context + */ + getPath() { + // Default to website URL + return window.location.href; + } + + /** + * Checks if a path is applicable given the context + * @param {string} path Can be a site URL or another context-specific path + * @returns {boolean} Whether the path matches the current context state + */ + isPathApplicable(path) { + // Default to website URL matching + const currentUrl = window.location.href; + const stickyNoteWebsite = path.split("?")[0]; + const currentWebsite = currentUrl.split("?")[0]; + + if (stickyNoteWebsite !== currentWebsite) { + return false; + } + + const pathParams = parseUrlParams(path); + const currentParams = parseUrlParams(currentUrl); + + if (window.location.hostname === "www.youtube.com") { + if (currentParams.v !== undefined && currentParams.v !== pathParams.v) { + return false; + } + } + return true; + } } export class LocalContext extends Context { @@ -223,4 +256,19 @@ export function getContext() { } error("No applicable context found, defaulting to LocalContext"); return new LocalContext(); +} + +/** + * Parse URL parameters into a key-value map + * @param {string} url + * @returns {Record} + */ +function parseUrlParams(url) { + const queryString = url.split("?")[1]; + if (!queryString) return {}; + + return queryString.split("&").reduce((params, param) => { + const [key, value] = param.split("="); + return { ...params, [key]: value }; + }, {}); } \ No newline at end of file diff --git a/src/stickyNotes.js b/src/stickyNotes.js index 29e7d8e..8e9c523 100644 --- a/src/stickyNotes.js +++ b/src/stickyNotes.js @@ -3,6 +3,7 @@ import { makeDraggable, makeClosable } from './shared.js'; +import { getContext } from './context.js'; /** * @typedef {Object} SavedStickyNote @@ -30,46 +31,6 @@ export class StickyNote { } } -/** - * Parse URL parameters into a key-value map - * @param {string} url - * @returns {Record} - */ -export function parseUrlParams(url) { - const queryString = url.split("?")[1]; - if (!queryString) return {}; - - return queryString.split("&").reduce((params, param) => { - const [key, value] = param.split("="); - return { ...params, [key]: value }; - }, {}); -} - -/** - * @param {StickyNote} stickyNote - * @returns {boolean} Whether the given sticky note is applicable to the current site/page - */ -export function isStickyNoteApplicable(stickyNote) { - const stickyNoteUrl = stickyNote.site; - const currentUrl = window.location.href; - const stickyNoteWebsite = stickyNoteUrl.split("?")[0]; - const currentWebsite = currentUrl.split("?")[0]; - - if (stickyNoteWebsite !== currentWebsite) { - return false; - } - - const stickyNoteParams = parseUrlParams(stickyNoteUrl); - const currentParams = parseUrlParams(currentUrl); - - if (window.location.hostname === "www.youtube.com") { - if (currentParams.v !== undefined && currentParams.v !== stickyNoteParams.v) { - return false; - } - } - return true; -} - /** * @param {StickyNote} stickyNote * @param {() => void} onSave @@ -152,8 +113,9 @@ export function drawStickyNotes(stickyNotes, onSave, onDelete) { const existingNotes = document.querySelectorAll(".birb-sticky-note"); existingNotes.forEach(note => note.remove()); // Render all sticky notes + const context = getContext(); for (let stickyNote of stickyNotes) { - if (isStickyNoteApplicable(stickyNote)) { + if (context.isPathApplicable(stickyNote.site)) { renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); } } @@ -166,7 +128,7 @@ export function drawStickyNotes(stickyNotes, onSave, onDelete) { */ export function createNewStickyNote(stickyNotes, onSave, onDelete) { const id = Date.now().toString(); - const site = window.location.href; + const site = getContext().getPath(); const stickyNote = new StickyNote(id, site, ""); const element = renderStickyNote(stickyNote, onSave, () => onDelete(stickyNote)); element.style.left = `${window.innerWidth / 2 - element.offsetWidth / 2}px`;