import { useQueryClient } from "@tanstack/react-query"; import { useEffect, useState } from "react"; import "./App.css"; import { MESSAGE_TYPES, STORAGE_KEYS } from "../../utils/constants"; import { 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 [showProjectSelector, setShowProjectSelector] = useState(false); const [currentUrl, setCurrentUrl] = useState(""); const [currentTitle, setCurrentTitle] = useState(""); const [saving, setSaving] = useState(false); const [activeTab, setActiveTab] = useState<"save" | "imports" | "settings">( "save", ); const [autoSearchEnabled, setAutoSearchEnabled] = useState(false); 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([ STORAGE_KEYS.BEARER_TOKEN, STORAGE_KEYS.AUTO_SEARCH_ENABLED, ]); const isSignedIn = !!result[STORAGE_KEYS.BEARER_TOKEN]; setUserSignedIn(isSignedIn); const autoSearchSetting = result[STORAGE_KEYS.AUTO_SEARCH_ENABLED] ?? false; setAutoSearchEnabled(autoSearchSetting); } catch (error) { console.error("Error checking auth status:", error); setUserSignedIn(false); } finally { setLoading(false); } }; const getCurrentTab = async () => { try { const tabs = await chrome.tabs.query({ active: true, currentWindow: true, }); if (tabs.length > 0 && tabs[0].url && tabs[0].title) { setCurrentUrl(tabs[0].url); setCurrentTitle(tabs[0].title); } } catch (error) { console.error("Error getting current tab:", error); } }; checkAuthStatus(); getCurrentTab(); }, []); const handleProjectSelect = (project: Project) => { setDefaultProjectMutation.mutate(project, { onSuccess: () => { setShowProjectSelector(false); }, onError: (error) => { console.error("Error setting default project:", error); }, }); }; const handleShowProjectSelector = () => { setShowProjectSelector(true); }; useEffect(() => { if (!defaultProject && projects.length > 0) { const firstProject = projects[0]; setDefaultProjectMutation.mutate(firstProject); } }, [defaultProject, projects, setDefaultProjectMutation]); const handleSaveCurrentPage = async () => { setSaving(true); try { const tabs = await chrome.tabs.query({ active: true, currentWindow: true, }); if (tabs.length > 0 && tabs[0].id) { const response = await chrome.tabs.sendMessage(tabs[0].id, { action: MESSAGE_TYPES.SAVE_MEMORY, actionSource: "popup", }); if (response?.success) { await chrome.tabs.sendMessage(tabs[0].id, { action: MESSAGE_TYPES.SHOW_TOAST, state: "success", }); } window.close(); } } catch (error) { console.error("Failed to save current page:", error); try { const tabs = await chrome.tabs.query({ active: true, currentWindow: true, }); if (tabs.length > 0 && tabs[0].id) { await chrome.tabs.sendMessage(tabs[0].id, { action: MESSAGE_TYPES.SHOW_TOAST, state: "error", }); } } catch (toastError) { console.error("Failed to show error toast:", toastError); } window.close(); } finally { setSaving(false); } }; const handleAutoSearchToggle = async (enabled: boolean) => { try { await chrome.storage.local.set({ [STORAGE_KEYS.AUTO_SEARCH_ENABLED]: enabled, }); setAutoSearchEnabled(enabled); } catch (error) { console.error("Error updating auto search setting:", error); } }; const handleSignOut = async () => { try { await chrome.storage.local.remove([STORAGE_KEYS.BEARER_TOKEN]); await chrome.storage.local.remove([STORAGE_KEYS.USER_DATA]); await chrome.storage.local.remove([STORAGE_KEYS.DEFAULT_PROJECT]); setUserSignedIn(false); queryClient.clear(); } catch (error) { console.error("Error signing out:", error); } }; if (loading) { return (
supermemory

supermemory

Loading...
); } return (
supermemory {userSignedIn && ( )}
{userSignedIn ? (
{/* Tab Navigation */}
{/* Tab Content */} {activeTab === "save" ? (
{/* Current Page Info */}

{currentTitle || "Current Page"}

{currentUrl}

{/* Project Selection */}
{/* Save Button at Bottom */}
) : activeTab === "imports" ? (
{/* Import Actions */}
) : (

Chat Integration

Auto Search Memories Automatically search your memories while typing in chat apps
)} {showProjectSelector && (
Select the Project
{loadingProjects ? (
Loading projects...
) : (
{projects.map((project) => ( ))}
)}
)}
) : (

Login to unlock all chrome extension features

  • Save any page to your supermemory
  • Import all your Twitter / X Bookmarks
  • Import your ChatGPT Memories

Having trouble logging in?{" "}

)}
); } export default App;