???: ...and it doesn't work. i will look at this again later

This commit is contained in:
dragonwocky 2023-05-07 23:08:38 +10:00
parent bf07257ae8
commit d3840c5922
Signed by: dragonwocky
GPG Key ID: 7998D08F7D7BD7A8
2 changed files with 163 additions and 139 deletions

View File

@ -123,7 +123,7 @@ const initDatabase = (namespace, fallbacks = {}) => {
namespace, namespace,
fallbacks, fallbacks,
operation: type, operation: type,
...args, args,
}); });
return { return {
get: (key) => operation("get", { key }), get: (key) => operation("get", { key }),

View File

@ -8,80 +8,9 @@
const IS_ELECTRON = typeof module !== "undefined"; const IS_ELECTRON = typeof module !== "undefined";
if (IS_ELECTRON) {
const { app, ipcMain } = require("electron"),
reloadApp = () => {
const args = process.argv.slice(1).filter((arg) => arg !== "--startup");
app.relaunch({ args });
app.exit();
};
ipcMain.on("notion-enhancer", (_event, message) => {
if (message === "open-menu") {
// todo
} else if (message === "reload-app") {
reloadApp();
}
});
ipcMain.handle("notion-enhancer", (_event, message) => {
if (message === "get-user-data-folder") {
return app.getPath("userData");
}
});
} else {
const notionUrl = "https://www.notion.so/",
isNotionTab = (tab) => tab?.url?.startsWith(notionUrl);
const tabQueue = new Set(),
openEnhancerMenu = async (tab) => {
if (!isNotionTab(tab)) {
const openTabs = await chrome.tabs.query({
windowId: chrome.windows.WINDOW_ID_CURRENT,
});
tab = openTabs.find(isNotionTab);
tab ??= await chrome.tabs.create({ url: notionUrl });
}
chrome.tabs.highlight({ tabs: [tab.index] });
if (tab.status === "complete") {
chrome.tabs.sendMessage(tab.id, {
channel: "notion-enhancer",
message: "open-menu",
});
} else tabQueue.add(tab.id);
},
reloadNotionTabs = async () => {
const openTabs = await chrome.tabs.query({
windowId: chrome.windows.WINDOW_ID_CURRENT,
}),
notionTabs = openTabs.filter(isNotionTab);
notionTabs.forEach((tab) => chrome.tabs.reload(tab.id));
};
// listen for invoke: https://developer.chrome.com/docs/extensions/mv3/messaging/
chrome.action.onClicked.addListener(openEnhancerMenu);
chrome.runtime.onMessage.addListener((msg, sender) => {
if (msg?.channel !== "notion-enhancer") return;
if (sender.tab && msg.message === "load-complete") {
if (tabQueue.has(sender.tab.id)) {
chrome.tabs.sendMessage(sender.tab.id, {
channel: "notion-enhancer",
message: "open-menu",
});
tabQueue.delete(sender.tab.id);
}
} else if (msg.message === "reload-app") {
reloadNotionTabs();
}
});
}
let __db, __statements, __transactions; let __db, __statements, __transactions;
const initDatabase = (namespace, fallbacks = {}) => { const initDatabase = async () => {
if (Array.isArray(namespace)) namespace = namespace.join("__"); if (!IS_ELECTRON) return chrome.storage.local;
namespace = namespace ? namespace + "__" : "";
const namespaceify = (key) =>
key.startsWith(namespace) ? key : namespace + key;
// schema: // schema:
// - ("agreedToTerms") -> string: semver // - ("agreedToTerms") -> string: semver
@ -93,9 +22,6 @@ const initDatabase = (namespace, fallbacks = {}) => {
// - $profileId__enabledMods: ($modId) -> boolean // - $profileId__enabledMods: ($modId) -> boolean
// - $profileId__$modId: ($optionKey) -> value // - $profileId__$modId: ($optionKey) -> value
__db ??= (async () => {
if (!IS_ELECTRON) return;
const table = "kvstore", const table = "kvstore",
{ app } = require("electron"), { app } = require("electron"),
{ resolve } = require("path"), { resolve } = require("path"),
@ -127,39 +53,44 @@ const initDatabase = (namespace, fallbacks = {}) => {
}), }),
}; };
return db; return db;
})(); },
executeOperation = async (namespace, fallbacks, operation, args) => {
namespace ??= "";
if (Array.isArray(namespace)) namespace = namespace.join("__");
if (namespace?.length) namespace += "__";
const namespaceify = (key) =>
key.startsWith(namespace) ? key : namespace + key;
return { await (__db ??= initDatabase());
async get(key) { switch (operation) {
await __db; case "get": {
const key = namespaceify(args.key);
let value; let value;
const fallback = fallbacks[key];
key = namespaceify(key);
if (IS_ELECTRON) { if (IS_ELECTRON) {
try { try {
value = JSON.parse(__statements.select.get(key)?.value); value = JSON.parse(__statements.select.get(key)?.value);
} catch {} } catch {}
} else value = (await chrome.storage.local.get([key]))[key]; } else value = (await chrome.storage.local.get([key]))[key];
return value ?? fallback; return value ?? fallbacks[key];
}, }
async set(key, value) { case "set": {
await __db; const key = namespaceify(args.key),
key = namespaceify(key); value = args.value;
return IS_ELECTRON return IS_ELECTRON
? // returns true instead of transaction completion data type ? // returns true instead of transaction completion data type
(__transactions.set({ [key]: JSON.stringify(value) }), true) (__transactions.set({ [key]: JSON.stringify(value) }), true)
: chrome.storage.local.set({ [key]: value }); : chrome.storage.local.set({ [key]: value });
}, }
async remove(keys) { case "remove": {
await __db; let { keys } = args;
keys = Array.isArray(keys) ? keys : [keys]; if (!Array.isArray(args.keys)) keys = [keys];
keys = keys.map(namespaceify); keys = keys.map(namespaceify);
return IS_ELECTRON return IS_ELECTRON
? (__transactions.remove(keys), true) ? (__transactions.remove(keys), true)
: chrome.storage.local.remove(keys); : chrome.storage.local.remove(keys);
}, }
async export() {
await __db; case "export": {
// returns key/value pairs within scope w/out namespace // returns key/value pairs within scope w/out namespace
// prefix e.g. to streamline importing from one profile and // prefix e.g. to streamline importing from one profile and
// then into another (where a diff. namespace is used) // then into another (where a diff. namespace is used)
@ -170,15 +101,108 @@ const initDatabase = (namespace, fallbacks = {}) => {
.filter(([key]) => key.startsWith(namespace)) .filter(([key]) => key.startsWith(namespace))
.map(([key, value]) => [key.slice(namespace.length), value]); .map(([key, value]) => [key.slice(namespace.length), value]);
return Object.fromEntries(entries); return Object.fromEntries(entries);
}, }
async import(obj) { case "import": {
await __db; let entries = Object.entries(args.obj);
let entries = Object.entries(obj);
entries = entries.map(([key, value]) => [namespace + key, value]); entries = entries.map(([key, value]) => [namespace + key, value]);
entries = Object.fromEntries(entries); entries = Object.fromEntries(entries);
return IS_ELECTRON return IS_ELECTRON
? (__transactions.set(entries), true) ? (__transactions.set(entries), true)
: chrome.storage.local.set(entries); : chrome.storage.local.set(entries);
}
}
};
if (IS_ELECTRON) {
const { app, ipcMain } = require("electron"),
reloadApp = () => {
const args = process.argv.slice(1).filter((arg) => arg !== "--startup");
app.relaunch({ args });
app.exit();
};
ipcMain.handle("notion-enhancer:db", (_event, message) => {
return executeOperation(
message.namespace,
message.fallbacks,
message.operation,
message.args
);
});
ipcMain.on("notion-enhancer", (_event, message) => {
if (message === "open-menu") {
// todo
} else if (message === "reload-app") {
reloadApp();
}
});
} else {
const notionUrl = "https://www.notion.so/",
isNotionTab = (tab) => tab?.url?.startsWith(notionUrl);
const tabQueue = new Set(),
openEnhancerMenu = async (tab) => {
if (!isNotionTab(tab)) {
const openTabs = await chrome.tabs.query({
windowId: chrome.windows.WINDOW_ID_CURRENT,
});
tab = openTabs.find(isNotionTab);
tab ??= await chrome.tabs.create({ url: notionUrl });
}
chrome.tabs.highlight({ tabs: [tab.index] });
if (tab.status === "complete") {
chrome.tabs.sendMessage(tab.id, {
channel: "notion-enhancer",
message: "open-menu",
});
} else tabQueue.add(tab.id);
}, },
reloadNotionTabs = async () => {
const openTabs = await chrome.tabs.query({
windowId: chrome.windows.WINDOW_ID_CURRENT,
}),
notionTabs = openTabs.filter(isNotionTab);
notionTabs.forEach((tab) => chrome.tabs.reload(tab.id));
}; };
};
// listen for invoke: https://developer.chrome.com/docs/extensions/mv3/messaging/
ipcMain.handle("notion-enhancer:db", (_event, message) => {
return executeOperation(
message.namespace,
message.fallbacks,
message.operation,
message.args
);
});
chrome.action.onClicked.addListener(openEnhancerMenu);
chrome.runtime.onConnect.addListener((port) => {
port.onMessage.addListener((msg, sender) => {
if (msg?.channel === "notion-enhancer:db") {
const { invocation } = msg,
res = executeOperation(
msg.namespace,
msg.fallbacks,
msg.operation,
msg.args
);
if (invocation) port.postMessage({ invocation, message: res });
}
if (msg?.channel === "notion-enhancer") {
if (sender.tab && msg.message === "load-complete") {
if (tabQueue.has(sender.tab.id)) {
chrome.tabs.sendMessage(sender.tab.id, {
channel: "notion-enhancer",
message: "open-menu",
});
tabQueue.delete(sender.tab.id);
}
} else if (msg.message === "reload-app") {
reloadNotionTabs();
}
}
});
});
}