mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-27 09:46:25 +02:00
- Added UX strategy: Extension for Quick Actions, Frontend for Management - Organized features into 4 phases (Phase 1 completed) - Added 14 new extension features (FR-EXT-07 to FR-EXT-17): * Smart Monitoring: Price alerts, whale tracking, rug pull detection * Trading Intelligence: Token analysis, entry/exit suggestions, portfolio tracker * Content Creation: Chart screenshots, AI thread generator * Productivity: Quick actions, notifications, keyboard shortcuts - Added Feature Responsibility Matrix showing Extension vs Frontend roles - Added Settings Sync strategy (FR-EXT-06) with deep links to frontend - Documented state sync architecture: Extension ↔ Backend API ↔ Frontend
75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
import { Storage } from "@plasmohq/storage";
|
|
import { getRenderedHtml, initQueues, initWebHistory } from "~utils/commons";
|
|
import type { WebHistory } from "~utils/interfaces";
|
|
|
|
// Configure side panel to open when extension icon is clicked
|
|
chrome.sidePanel
|
|
.setPanelBehavior({ openPanelOnActionClick: true })
|
|
.catch((error) => console.error("Failed to set side panel behavior:", error));
|
|
|
|
chrome.tabs.onCreated.addListener(async (tab: any) => {
|
|
try {
|
|
await initWebHistory(tab.id);
|
|
await initQueues(tab.id);
|
|
} catch (error) {
|
|
console.log(error);
|
|
}
|
|
});
|
|
|
|
chrome.tabs.onUpdated.addListener(async (tabId: number, changeInfo: any, tab: any) => {
|
|
if (changeInfo.status === "complete" && tab.url) {
|
|
const storage = new Storage({ area: "local" });
|
|
await initWebHistory(tab.id);
|
|
await initQueues(tab.id);
|
|
|
|
const result = await chrome.scripting.executeScript({
|
|
// @ts-ignore
|
|
target: { tabId: tab.id },
|
|
// @ts-ignore
|
|
func: getRenderedHtml,
|
|
});
|
|
|
|
const toPushInTabHistory: any = result[0].result; // const { renderedHtml, title, url, entryTime } = result[0].result;
|
|
|
|
const urlQueueListObj: any = await storage.get("urlQueueList");
|
|
const timeQueueListObj: any = await storage.get("timeQueueList");
|
|
|
|
urlQueueListObj.urlQueueList
|
|
.find((data: WebHistory) => data.tabsessionId === tabId)
|
|
.urlQueue.push(toPushInTabHistory.url);
|
|
timeQueueListObj.timeQueueList
|
|
.find((data: WebHistory) => data.tabsessionId === tabId)
|
|
.timeQueue.push(toPushInTabHistory.entryTime);
|
|
|
|
await storage.set("urlQueueList", {
|
|
urlQueueList: urlQueueListObj.urlQueueList,
|
|
});
|
|
await storage.set("timeQueueList", {
|
|
timeQueueList: timeQueueListObj.timeQueueList,
|
|
});
|
|
}
|
|
});
|
|
|
|
chrome.tabs.onRemoved.addListener(async (tabId: number, removeInfo: object) => {
|
|
const storage = new Storage({ area: "local" });
|
|
const urlQueueListObj: any = await storage.get("urlQueueList");
|
|
const timeQueueListObj: any = await storage.get("timeQueueList");
|
|
if (urlQueueListObj.urlQueueList && timeQueueListObj.timeQueueList) {
|
|
const urlQueueListToSave = urlQueueListObj.urlQueueList.map((element: WebHistory) => {
|
|
if (element.tabsessionId !== tabId) {
|
|
return element;
|
|
}
|
|
});
|
|
const timeQueueListSave = timeQueueListObj.timeQueueList.map((element: WebHistory) => {
|
|
if (element.tabsessionId !== tabId) {
|
|
return element;
|
|
}
|
|
});
|
|
await storage.set("urlQueueList", {
|
|
urlQueueList: urlQueueListToSave.filter((item: any) => item),
|
|
});
|
|
await storage.set("timeQueueList", {
|
|
timeQueueList: timeQueueListSave.filter((item: any) => item),
|
|
});
|
|
}
|
|
});
|