From b41ef4bb4bf552d71680763b872afb1acf84118e Mon Sep 17 00:00:00 2001 From: Mahesh Sanikommmu Date: Thu, 28 Aug 2025 01:20:45 -0700 Subject: [PATCH] updated few more issues --- apps/browser-extension/entrypoints/content.ts | 23 +++-- .../entrypoints/popup/App.tsx | 92 +++++++----------- .../entrypoints/popup/main.tsx | 6 +- .../entrypoints/welcome/main.tsx | 6 +- apps/browser-extension/package.json | 1 + .../public/dark-mode-icon.png | Bin 2528 -> 0 bytes .../public/light-mode-icon.png | Bin 2736 -> 0 bytes .../public/logo-trademark.svg | 15 --- apps/browser-extension/utils/api.ts | 43 +------- apps/browser-extension/utils/constants.ts | 51 +++++----- apps/browser-extension/utils/query-client.ts | 24 +++++ apps/browser-extension/utils/query-hooks.ts | 64 ++++++++++++ apps/browser-extension/utils/twitter-auth.ts | 31 +++--- apps/browser-extension/utils/ui-components.ts | 2 +- apps/browser-extension/wxt.config.ts | 5 +- bun.lockb | Bin 806360 -> 806392 bytes 16 files changed, 196 insertions(+), 167 deletions(-) delete mode 100644 apps/browser-extension/public/dark-mode-icon.png delete mode 100644 apps/browser-extension/public/light-mode-icon.png delete mode 100644 apps/browser-extension/public/logo-trademark.svg create mode 100644 apps/browser-extension/utils/query-client.ts create mode 100644 apps/browser-extension/utils/query-hooks.ts diff --git a/apps/browser-extension/entrypoints/content.ts b/apps/browser-extension/entrypoints/content.ts index 385beaec..97f5fc44 100644 --- a/apps/browser-extension/entrypoints/content.ts +++ b/apps/browser-extension/entrypoints/content.ts @@ -1,4 +1,9 @@ -import { DOMAINS, ELEMENT_IDS, MESSAGE_TYPES } from "../utils/constants" +import { + DOMAINS, + ELEMENT_IDS, + MESSAGE_TYPES, + STORAGE_KEYS, +} from "../utils/constants" import { createChatGPTInputBarElement, createSaveTweetElement, @@ -261,8 +266,8 @@ export default defineContentScript({ isTwitterImportOpen = true // Check if user is authenticated - browser.storage.local.get(["bearerToken"], ({ bearerToken }) => { - const isAuthenticated = !!bearerToken + browser.storage.local.get([STORAGE_KEYS.BEARER_TOKEN], (result) => { + const isAuthenticated = !!result[STORAGE_KEYS.BEARER_TOKEN] twitterImportUI = createTwitterImportUI( hideTwitterImportUI, @@ -297,10 +302,10 @@ export default defineContentScript({ }) { if (!isTwitterImportOpen || !twitterImportUI) return - const statusDiv = twitterImportUI.querySelector("#twitter-import-status") - const button = twitterImportUI.querySelector("#twitter-import-button") + const statusDiv = twitterImportUI.querySelector(`#${ELEMENT_IDS.TWITTER_IMPORT_STATUS}`) + const button = twitterImportUI.querySelector(`#${ELEMENT_IDS.TWITTER_IMPORT_BTN}`) - if (message.type === "import-update") { + if (message.type === MESSAGE_TYPES.IMPORT_UPDATE) { if (statusDiv) { statusDiv.innerHTML = `
@@ -315,7 +320,7 @@ export default defineContentScript({ } } - if (message.type === "import-done") { + if (message.type === MESSAGE_TYPES.IMPORT_DONE) { if (statusDiv) { statusDiv.innerHTML = `
@@ -449,7 +454,9 @@ export default defineContentScript({ return } - chrome.storage.local.set({ bearerToken }, () => {}) + chrome.storage.local.set({ + [STORAGE_KEYS.BEARER_TOKEN]: bearerToken, + }, () => {}) } }) }, diff --git a/apps/browser-extension/entrypoints/popup/App.tsx b/apps/browser-extension/entrypoints/popup/App.tsx index 4d533a47..2f42747a 100644 --- a/apps/browser-extension/entrypoints/popup/App.tsx +++ b/apps/browser-extension/entrypoints/popup/App.tsx @@ -1,41 +1,40 @@ +import { useQueryClient } from "@tanstack/react-query" import { useEffect, useState } from "react" import "./App.css" +import { STORAGE_KEYS } from "../../utils/constants" import { - getDefaultProject, - getProjects, - setDefaultProject, -} from "../../utils/api" + useDefaultProject, + useProjects, + useSetDefaultProject, +} from "../../utils/query-hooks" import type { Project } from "../../utils/types" function App() { const [userSignedIn, setUserSignedIn] = useState(false) const [loading, setLoading] = useState(true) - const [projects, setProjects] = useState([]) - const [defaultProject, setDefaultProjectState] = useState( - null, - ) - const [loadingProjects, setLoadingProjects] = useState(false) const [showProjectSelector, setShowProjectSelector] = useState(false) const [currentUrl, setCurrentUrl] = useState("") const [currentTitle, setCurrentTitle] = useState("") const [saving, setSaving] = useState(false) const [activeTab, setActiveTab] = useState<"save" | "imports">("save") + const queryClient = useQueryClient() + const { data: projects = [], isLoading: loadingProjects } = useProjects({ + enabled: userSignedIn, + }) + const { data: defaultProject } = useDefaultProject({ + enabled: userSignedIn, + }) + const setDefaultProjectMutation = useSetDefaultProject() + useEffect(() => { const checkAuthStatus = async () => { try { - const result = await chrome.storage.local.get(["bearerToken"]) - const isSignedIn = !!result.bearerToken + const result = await chrome.storage.local.get([ + STORAGE_KEYS.BEARER_TOKEN, + ]) + const isSignedIn = !!result[STORAGE_KEYS.BEARER_TOKEN] setUserSignedIn(isSignedIn) - - if (isSignedIn) { - try { - const defaultProj = await getDefaultProject() - setDefaultProjectState(defaultProj) - } catch (error) { - console.error("Error loading default project:", error) - } - } } catch (error) { console.error("Error checking auth status:", error) setUserSignedIn(false) @@ -63,44 +62,28 @@ function App() { getCurrentTab() }, []) - const loadProjects = async () => { - setLoadingProjects(true) - try { - const projectsList = await getProjects() - setProjects(projectsList) - console.log("Projects:", projectsList) - console.log("Default project:", defaultProject) - // If no default project is set and projects are available, set first as default - if (!defaultProject && projectsList.length > 0) { - const firstProject = projectsList[0] - await setDefaultProject(firstProject) - setDefaultProjectState(firstProject) - } - } catch (error) { - console.error("Error loading projects:", error) - } finally { - setLoadingProjects(false) - } - } - - const handleProjectSelect = async (project: Project) => { - try { - await setDefaultProject(project) - setDefaultProjectState(project) - setShowProjectSelector(false) - } catch (error) { - console.error("Error setting default project:", error) - } + const handleProjectSelect = (project: Project) => { + setDefaultProjectMutation.mutate(project, { + onSuccess: () => { + setShowProjectSelector(false) + }, + onError: (error) => { + console.error("Error setting default project:", error) + }, + }) } const handleShowProjectSelector = () => { - console.log("handleShowProjectSelector, projects.length:", projects.length) - if (projects.length === 0) { - loadProjects() - } setShowProjectSelector(true) } + useEffect(() => { + if (!defaultProject && projects.length > 0) { + const firstProject = projects[0] + setDefaultProjectMutation.mutate(firstProject) + } + }, [defaultProject, projects, setDefaultProjectMutation]) + const handleSaveCurrentPage = async () => { setSaving(true) try { @@ -122,10 +105,9 @@ function App() { const handleSignOut = async () => { try { - await chrome.storage.local.remove(["bearerToken"]) + await chrome.storage.local.remove([STORAGE_KEYS.BEARER_TOKEN]) setUserSignedIn(false) - setDefaultProjectState(null) - setProjects([]) + queryClient.clear() } catch (error) { console.error("Error signing out:", error) } diff --git a/apps/browser-extension/entrypoints/popup/main.tsx b/apps/browser-extension/entrypoints/popup/main.tsx index bfa6ad76..746e1018 100644 --- a/apps/browser-extension/entrypoints/popup/main.tsx +++ b/apps/browser-extension/entrypoints/popup/main.tsx @@ -1,5 +1,7 @@ +import { QueryClientProvider } from "@tanstack/react-query" import React from "react" import ReactDOM from "react-dom/client" +import { queryClient } from "../../utils/query-client" import App from "./App.js" import "./style.css" @@ -7,7 +9,9 @@ const rootElement = document.getElementById("root") if (rootElement) { ReactDOM.createRoot(rootElement).render( - + + + , ) } diff --git a/apps/browser-extension/entrypoints/welcome/main.tsx b/apps/browser-extension/entrypoints/welcome/main.tsx index 0b54490a..2df8dbf1 100644 --- a/apps/browser-extension/entrypoints/welcome/main.tsx +++ b/apps/browser-extension/entrypoints/welcome/main.tsx @@ -1,5 +1,7 @@ +import { QueryClientProvider } from "@tanstack/react-query" import React from "react" import ReactDOM from "react-dom/client" +import { queryClient } from "../../utils/query-client" import Welcome from "./Welcome" import "./welcome.css" @@ -7,7 +9,9 @@ const rootElement = document.getElementById("root") if (rootElement) { ReactDOM.createRoot(rootElement).render( - + + + , ) } diff --git a/apps/browser-extension/package.json b/apps/browser-extension/package.json index 4c9d1402..9d5b3b51 100644 --- a/apps/browser-extension/package.json +++ b/apps/browser-extension/package.json @@ -15,6 +15,7 @@ "postinstall": "wxt prepare" }, "dependencies": { + "@tanstack/react-query": "^5.85.5", "react": "^19.1.0", "react-dom": "^19.1.0" }, diff --git a/apps/browser-extension/public/dark-mode-icon.png b/apps/browser-extension/public/dark-mode-icon.png deleted file mode 100644 index 6c9dd28a16bddd92235de05bc556de07c8499636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2528 zcmbVO|36dvAK#*8YBN-n=F1j73YET0Ti=|GseDP_#j+-m%RWoTp-^sHY+2b4@93$tQx_8xtF4y>SLkDgjUj2vt;!y03te1F z+uG2l5(rvkxpRqiS$M%~HTtwAJ6x+CEcnf}`;9kK7FWT;ykPprxf%&Fv= zdQ3RvZX23UPQ`!mTA3Nq0jxF-!*%VaB6W#zXL}YR_xO@6KaU|5Tvg&W-kt@KU{|p z*By`BJp;D5u;3MxD-Zsjh+C@<;k(T6V`kE018%7=@x=qIKPCxE zmOzCTNYqPQU4MzY$-O||M&lq+V>mHTZ4M9IG=~RnRG7)@b!NEMYz7#MzCwOD*2?Lb zvF-SDZw|NJWjer8r;RRk6&e#mLw#mf=L1V`%S;ns=?R(1Nkkg8()(zrDYkVVX`Ci5 zYI22sdvLBRY$4=sJ!}|gigi%;8b;KU>Ql0^?s)A#9v?8>=D?l9tbYP~4he=;Gp;`r zI~Au9lPSJ}k;9{Yi(D70I4fQtB}MH|i3+m**WVjW(Z;3_ROt#;c>`%PVX1*uXOF!S zQr*d5FEX{VMR-Pbr%Cf+Veqp4!;fR1crFcdA5=@v4ekypMR zuFwKckfP9U&B<<*Rl*whn^)t|-Rwr^5|;62%N~14*(SrC-I2h)M9sjl^yQWdw)3=J zzRR-4z{K--L|Ggy5Zv)%szYad%vuo(XfO49aPB&*J6pfD4&-L%$dvP*yLX0nhIij3 zQpoh!J*oFwBkzu1FcZx0E9Zwb8wS4p-8C0iDx3yyAL{;Yr<3dERd?{;lu1Tc%?Gqd zVh`21J$X*dThano@W$VNGWn^U7n=VftIi#qUi;Z!2d!sW=7*pO2A5qk&as0$!5g29 zWxf5)<)-8^uX{~0<&l4;X-DS?c>sSk|7y~Es&}kCd&}O;`!}jew^ds*ZP{Bm{hw~; z_vc7r4-{F^ul`u7TrV2=FgEt``P?uM@W$6K$j$zWTpO1ckyE)1WSP=yNdYt2;X|f# z{h!^Ih2vgcR%N*GE8cdLM7+!U^hwaO&S5@nsM`0S@R66TvTkQ-s=fHUK*EC z<)!^R*i;e}UH2@yR#m02O^Oe_ogdwwFrxQ*8=JCR6>ELmQGx85gk7B5m;F%5CDYeA z{&=7+5L7RQMIG49QP{I;>o;Vb@&EMX6iq!rrVN}7tF7Q}XF&U2K_9VYucdKJ4Dh@g zlv$`NI)v>cEdgkkv#2H$AZ5_harSJa81X69-6LwmM`cv%OsItkN@NKPy>j~;~#h&4<55?G=1q%Il85KJkpY7OXa^wjg6#^ob zjY_Ie=)cIQJ6xeQOi&=9m=GjlQB=~S3PA=yqSMsXGAi2*8nmK=JmX6m8_h=w!qGEa z5zAL4#lBtXnCt;{W5NmKWEd(WCK{XjvU>a?jWX(y?!d*%c)rCNjCX5oZS`&G+auTC zlToMgj7lb0HCL48uab_pQ$Mhxd#`_woGe9_Ds9Ph@6GoSiXpxJ$DJU|B~gf2n$jl9 zJU^Ax(oQ3m2NhkGQGeeoG3F#V)~-Tbi^eyK<&9=Ca*Z*k%r&J%7XVC@>uL6Zm3Hjl zif)85Z(GkSl~lvd$4EX-R-VI1E>2ECT_Nt{$ygAB5?fi>6^+ALB(geh9)k z{UWC_Hj(L9be6Ew+2W=R0BQEkf;D*v<*x{HkzZ(PH+EjMJ6M&%#KxgAG4ot3h%UgU zA)Y>o%Sudca8b$ycQU@6?Zs#_PG)z7f0gS+cpu4Sj;N;GZ0YcU zqoT1M7ABAhEfnYFMGyanV1f(uZ$+wnG#h(-!QuZBp04d5on%ON`B6Km?9oU6n0_$1 TFuE1{AtS5|4C7S-!UO*YFD9-Q diff --git a/apps/browser-extension/public/light-mode-icon.png b/apps/browser-extension/public/light-mode-icon.png deleted file mode 100644 index 66df9ad749cc239f71b67a341a878528b1937d63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2736 zcmbVO`#)6aAD>AzGh!ICVy@V=LFqSVnf6FmBTjZK)Zd5Z`i-nwPF( z>a1P2p_*;nDmAj2vuR{E>EL8bat+^e`V;nt=k_$})?hH|UcP%g0@JV`R1XStm6V5{-oTQTz@EJ<65*b;*GnH;#^b=#Ha^e` zgKE<`f@whH)auTF$eVs^j;k5&EBnsC;DGlJ*ORxwy~e{deS3Ja{qrpKO2Ce$))#EY zAAcHs>UvXM-CBzENePJUDn9|SNG(o)T7lD;qRI?q zeeFK%+2k?uQcj#Z?R%DYzPmn`^0B=qOCtQXdwq?ODqenflj6nmhcm}SlP7*jOwk?4 zhpIu@AO7ZitK<)V2TwEMNSU{m3R855Ob@-a-;)}N3hEvCO_8sSloMtdSn(~q5rs&P zwOXpx=1taud)mUYJjORdri?+Aq17y@K9IFBN|2{(sWi~E!oa)Y%KfOC&iGdTj=a~e zmRToez1Tn2sriUY6}>LW&+E;{e@^0uz^2*HJgKv&&PX2@8gJ!YNeWV$69AzxO_Sa4 zm@VDU=0+>`=x}hKmGkwn$i>NtW&evbUn?9~k``j)b=e{l?eRBmIP1`z-|zL)Ws?4#Jt+HSS+(1+kt+F)7A?+F8d}f@}^> zBj!)dx(=fLAGgGtP~yGYe~Ba;fmki21ql!?_io~M)QtXJ8U*K15|1{l zV}H7JJdp`!_E*H960F!plaaM-#Dg{due z-(p+PW5|-XIP<-7Rjj}(d+a#4yJ39jTtda&gr@9WOwj|3P3Adt z@^q8@;ch?3*;KI2p3!6m2^GlAwr?j9V zMPKfEAvva@(jPu)ps*0vcrveat~H@*O%{h>R;8Qs`C~6y7HW)u(=+Eje$K4MQ>tn? z$5I+j6PoT$Ga={)y87Z|`Q7oyA7U$eGO%viw1tm1dnMzwaT%iyBnETC%!Bi@k`9A* z{Y$qhG7AWl_9M*wr#2WR1uHrV~l220VQr3c3U z_G>OFwAGqF%{|r6jmp^1rXD&Y!BgA@;hEpLCXU6Y2{d#5bln0w4yqiT7`%f&_z0{} z^fm3Plmvyekpp;XO$G5t%?!hT6WZqe!^%>qwVSJzKz@5>bv-ADk!tT8SgrhBXc&UL zLEf~1(xAFMZ6O0TwK6X9z&aH81 zce&I4j%Q!G-@WKho1JuizTLGPVcN}V>d~Fe_|rVyzA?fU!R2DbcG0tdAsuPetzUa{ zb*0Ed6oNlpoS@p;f7g^9*I*-;;22$XZakAAb>Qu4Mi-n*u_4h8Xw!$hAsU+am^4n;gs9+>ydZ=?;pS3e8O);`CJ^HG# zx}4IB3R$e&Zi84Dox`?c;1Wy)$MKZ5EbyHvKXDaMxl1fOs4YECrny)FmG)xc4#d!* zxmW;|2t^Ya(D?<^foj882F_@2YwtLPo&kG>3R#Jqw;&?YOa;hHDo8-3omfcB zRXGwUd_VXG6S|7C=QJ(s8*vx}36$xPq|XFB9E z;_K|ujOGn38ai~bu>45HXrg^}I02yV5DN`R(q25}X&zWrrI2als{TTZz?UHMbsujX zxn77b?qa zL-@PX8MtdU{}Fz+{c^Y#o0!(5cSY!8P|NZs{}usj{bsTe7#tEB#g*2{|ATm B3q=3` diff --git a/apps/browser-extension/public/logo-trademark.svg b/apps/browser-extension/public/logo-trademark.svg deleted file mode 100644 index 8407cbd4..00000000 --- a/apps/browser-extension/public/logo-trademark.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/browser-extension/utils/api.ts b/apps/browser-extension/utils/api.ts index 1b544c9a..858e81b1 100644 --- a/apps/browser-extension/utils/api.ts +++ b/apps/browser-extension/utils/api.ts @@ -1,5 +1,5 @@ /** - * API service for Supermemory browser extension + * API service for supermemory browser extension */ import { API_ENDPOINTS, STORAGE_KEYS } from "./constants" import { @@ -70,47 +70,6 @@ export async function fetchProjects(): Promise { } } -/** - * Get projects from cache or fetch fresh - */ -export async function getProjects(useCache = true): Promise { - if (useCache) { - try { - const cached = await chrome.storage.local.get([ - STORAGE_KEYS.PROJECTS_CACHE, - ]) - const cachedData = cached[STORAGE_KEYS.PROJECTS_CACHE] - - if (cachedData?.timestamp && cachedData.projects) { - // Cache for 5 minutes - const cacheAge = Date.now() - cachedData.timestamp - if (cacheAge < 5 * 60 * 1000) { - return cachedData.projects - } - } - } catch (error) { - console.warn("Failed to read projects cache:", error) - } - } - - // Fetch fresh data - const projects = await fetchProjects() - - // Cache the results - try { - await chrome.storage.local.set({ - [STORAGE_KEYS.PROJECTS_CACHE]: { - projects, - timestamp: Date.now(), - }, - }) - } catch (error) { - console.warn("Failed to cache projects:", error) - } - - return projects -} - /** * Get default project from storage */ diff --git a/apps/browser-extension/utils/constants.ts b/apps/browser-extension/utils/constants.ts index d21db8a4..b499a359 100644 --- a/apps/browser-extension/utils/constants.ts +++ b/apps/browser-extension/utils/constants.ts @@ -14,29 +14,27 @@ export const API_ENDPOINTS = { * Storage Keys */ export const STORAGE_KEYS = { - BEARER_TOKEN: "bearerToken", - TWITTER_AUTH: "twitterAuth", - TOKENS_LOGGED: "tokens_logged", - TWITTER_COOKIE: "cookie", - TWITTER_CSRF: "csrf", - TWITTER_AUTH_TOKEN: "auth", - DEFAULT_PROJECT: "defaultProject", - PROJECTS_CACHE: "projectsCache", + BEARER_TOKEN: "bearer-token", + TOKENS_LOGGED: "tokens-logged", + TWITTER_COOKIE: "twitter-cookie", + TWITTER_CSRF: "twitter-csrf", + TWITTER_AUTH_TOKEN: "twitter-auth-token", + DEFAULT_PROJECT: "sm-default-project", } as const /** * DOM Element IDs */ export const ELEMENT_IDS = { - TWITTER_IMPORT_BUTTON: "supermemory-twitter-import-button", - TWITTER_IMPORT_STATUS: "twitter-import-status", - TWITTER_CLOSE_BTN: "twitter-close-btn", - TWITTER_IMPORT_BTN: "twitter-import-button", - TWITTER_SIGNIN_BTN: "twitter-signin-btn", - SUPERMEMORY_TOAST: "supermemory-toast", - SUPERMEMORY_SAVE_BUTTON: "supermemory-save-button", - SAVE_TWEET_ELEMENT: "supermemory-save-tweet-element", - CHATGPT_INPUT_BAR_ELEMENT: "supermemory-chatgpt-input-bar-element", + TWITTER_IMPORT_BUTTON: "sm-twitter-import-button", + TWITTER_IMPORT_STATUS: "sm-twitter-import-status", + TWITTER_CLOSE_BTN: "sm-twitter-close-btn", + TWITTER_IMPORT_BTN: "sm-twitter-import-btn", + TWITTER_SIGNIN_BTN: "sm-twitter-signin-btn", + SUPERMEMORY_TOAST: "sm-toast", + SUPERMEMORY_SAVE_BUTTON: "sm-save-button", + SAVE_TWEET_ELEMENT: "sm-save-tweet-element", + CHATGPT_INPUT_BAR_ELEMENT: "sm-chatgpt-input-bar-element", } as const /** @@ -70,19 +68,14 @@ export const CONTAINER_TAGS = { * Message Types for extension communication */ export const MESSAGE_TYPES = { - SAVE_MEMORY: "saveMemory", - SHOW_TOAST: "showToast", - BATCH_IMPORT_ALL: "batchImportAll", - IMPORT_UPDATE: "import-update", - IMPORT_DONE: "import-done", - GET_RELATED_MEMORIES: "getRelatedMemories", + SAVE_MEMORY: "sm-save-memory", + SHOW_TOAST: "sm-show-toast", + BATCH_IMPORT_ALL: "sm-batch-import-all", + IMPORT_UPDATE: "sm-import-update", + IMPORT_DONE: "sm-import-done", + GET_RELATED_MEMORIES: "sm-get-related-memories", } as const export const CONTEXT_MENU_IDS = { - SAVE_TO_SUPERMEMORY: "save-to-supermemory", -} as const - -export const CSS_CLASSES = { - TOAST_STYLES_ID: "supermemory-toast-styles", - SPINNER_STYLES_ID: "supermemory-spinner-styles", + SAVE_TO_SUPERMEMORY: "sm-save-to-supermemory", } as const diff --git a/apps/browser-extension/utils/query-client.ts b/apps/browser-extension/utils/query-client.ts new file mode 100644 index 00000000..c1839691 --- /dev/null +++ b/apps/browser-extension/utils/query-client.ts @@ -0,0 +1,24 @@ +/** + * React Query configuration for supermemory browser extension + */ +import { QueryClient } from "@tanstack/react-query" + +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: 5 * 60 * 1000, // 5 minutes + gcTime: 10 * 60 * 1000, // 10 minutes (previously cacheTime) + retry: (failureCount, error) => { + // Don't retry on authentication errors + if (error?.constructor?.name === "AuthenticationError") { + return false + } + return failureCount < 3 + }, + refetchOnWindowFocus: false, + }, + mutations: { + retry: 1, + }, + }, +}) diff --git a/apps/browser-extension/utils/query-hooks.ts b/apps/browser-extension/utils/query-hooks.ts new file mode 100644 index 00000000..721a68ad --- /dev/null +++ b/apps/browser-extension/utils/query-hooks.ts @@ -0,0 +1,64 @@ +/** + * React Query hooks for supermemory API + */ +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" +import { + fetchProjects, + getDefaultProject, + saveMemory, + searchMemories, + setDefaultProject, +} from "./api" +import type { MemoryPayload } from "./types" + +// Query Keys +export const queryKeys = { + projects: ["projects"] as const, + defaultProject: ["defaultProject"] as const, +} + +// Projects Query +export function useProjects(options?: { enabled?: boolean }) { + return useQuery({ + queryKey: queryKeys.projects, + queryFn: fetchProjects, + staleTime: 5 * 60 * 1000, // 5 minutes + enabled: options?.enabled ?? true, + }) +} + +// Default Project Query +export function useDefaultProject(options?: { enabled?: boolean }) { + return useQuery({ + queryKey: queryKeys.defaultProject, + queryFn: getDefaultProject, + staleTime: 2 * 60 * 1000, // 2 minutes + enabled: options?.enabled ?? true, + }) +} + +// Set Default Project Mutation +export function useSetDefaultProject() { + const queryClient = useQueryClient() + + return useMutation({ + mutationFn: setDefaultProject, + onSuccess: (_, project) => { + queryClient.setQueryData(queryKeys.defaultProject, project) + }, + }) +} + +// Save Memory Mutation +export function useSaveMemory() { + return useMutation({ + mutationFn: (payload: MemoryPayload) => saveMemory(payload), + }) +} + +// Search Memories Mutation +export function useSearchMemories() { + return useMutation({ + mutationFn: (query: string) => searchMemories(query), + }) +} diff --git a/apps/browser-extension/utils/twitter-auth.ts b/apps/browser-extension/utils/twitter-auth.ts index 8734d144..3dfc50f6 100644 --- a/apps/browser-extension/utils/twitter-auth.ts +++ b/apps/browser-extension/utils/twitter-auth.ts @@ -2,6 +2,7 @@ * Twitter Authentication Module * Handles token capture and storage for Twitter API access */ +import { STORAGE_KEYS } from "./constants" export interface TwitterAuthTokens { cookie: string @@ -34,17 +35,17 @@ export function captureTwitterTokens( ) if (authHeader?.value && cookieHeader?.value && csrfHeader?.value) { - chrome.storage.session.get(["tokens_logged"], (result) => { - if (!result.tokens_logged) { + chrome.storage.session.get([STORAGE_KEYS.TOKENS_LOGGED], (result) => { + if (!result[STORAGE_KEYS.TOKENS_LOGGED]) { console.log("Twitter auth tokens captured successfully") - chrome.storage.session.set({ tokens_logged: true }) + chrome.storage.session.set({ [STORAGE_KEYS.TOKENS_LOGGED]: true }) } }) chrome.storage.session.set({ - cookie: cookieHeader.value, - csrf: csrfHeader.value, - auth: authHeader.value, + [STORAGE_KEYS.TWITTER_COOKIE]: cookieHeader.value, + [STORAGE_KEYS.TWITTER_CSRF]: csrfHeader.value, + [STORAGE_KEYS.TWITTER_AUTH_TOKEN]: authHeader.value, }) return true @@ -58,16 +59,24 @@ export function captureTwitterTokens( * @returns Promise resolving to tokens or null if not available */ export async function getTwitterTokens(): Promise { - const result = await chrome.storage.session.get(["cookie", "csrf", "auth"]) + const result = await chrome.storage.session.get([ + STORAGE_KEYS.TWITTER_COOKIE, + STORAGE_KEYS.TWITTER_CSRF, + STORAGE_KEYS.TWITTER_AUTH_TOKEN, + ]) - if (!result.cookie || !result.csrf || !result.auth) { + if ( + !result[STORAGE_KEYS.TWITTER_COOKIE] || + !result[STORAGE_KEYS.TWITTER_CSRF] || + !result[STORAGE_KEYS.TWITTER_AUTH_TOKEN] + ) { return null } return { - cookie: result.cookie, - csrf: result.csrf, - auth: result.auth, + cookie: result[STORAGE_KEYS.TWITTER_COOKIE], + csrf: result[STORAGE_KEYS.TWITTER_CSRF], + auth: result[STORAGE_KEYS.TWITTER_AUTH_TOKEN], } } diff --git a/apps/browser-extension/utils/ui-components.ts b/apps/browser-extension/utils/ui-components.ts index 917e0ca9..7fbf098d 100644 --- a/apps/browser-extension/utils/ui-components.ts +++ b/apps/browser-extension/utils/ui-components.ts @@ -165,7 +165,7 @@ export function createTwitterImportButton(onClick: () => void): HTMLElement { transition: all 0.2s ease; ` - const iconUrl = browser.runtime.getURL("/light-mode-icon.png") + const iconUrl = browser.runtime.getURL("/icon-16.png") button.innerHTML = ` Save to Memory ` diff --git a/apps/browser-extension/wxt.config.ts b/apps/browser-extension/wxt.config.ts index 9143866a..579f2485 100644 --- a/apps/browser-extension/wxt.config.ts +++ b/apps/browser-extension/wxt.config.ts @@ -24,10 +24,7 @@ export default defineConfig({ ], web_accessible_resources: [ { - resources: [ - "icon-16.png", - "fonts/*.ttf", - ], + resources: ["icon-16.png", "fonts/*.ttf"], matches: [""], }, ], diff --git a/bun.lockb b/bun.lockb index 8454fa3db1424a08466259ed56683fd9cf4cda87..322ea574a8b95997f3852de854d0b4e5c3769365 100755 GIT binary patch delta 67051 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 delta 67681 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 z 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 MZI=Ex+SZ`|AHXPA%K!iX