diff options
Diffstat (limited to 'apps')
| -rw-r--r-- | apps/browser-extension/entrypoints/background.ts | 32 | ||||
| -rw-r--r-- | apps/browser-extension/entrypoints/content/shared.ts | 64 | ||||
| -rw-r--r-- | apps/browser-extension/package.json | 4 | ||||
| -rw-r--r-- | apps/browser-extension/utils/types.ts | 3 | ||||
| -rw-r--r-- | apps/web/components/masonry-memory-list.tsx | 21 | ||||
| -rw-r--r-- | apps/web/components/memories-utils/index.tsx | 3 | ||||
| -rw-r--r-- | apps/web/components/memories-utils/memory-detail.tsx | 2 |
7 files changed, 112 insertions, 17 deletions
diff --git a/apps/browser-extension/entrypoints/background.ts b/apps/browser-extension/entrypoints/background.ts index 7461af37..131207c2 100644 --- a/apps/browser-extension/entrypoints/background.ts +++ b/apps/browser-extension/entrypoints/background.ts @@ -117,12 +117,36 @@ export default defineBackground(() => { console.warn("Failed to get default project, using fallback:", error) } + let content: string + if (data.content) { + content = data.content + } else if (data.highlightedText) { + content = `${data.highlightedText}\n\n${data?.url || ""}` + } else if (data.markdown) { + content = `${data.markdown}\n\n${data?.url || ""}` + } else if (data.html) { + content = `${data.html}\n\n${data?.url || ""}` + } else { + content = data?.url || "" + } + + const metadata: MemoryPayload["metadata"] = { + sm_source: "consumer", + website_url: data.url, + } + + if (data.ogImage) { + metadata.website_og_image = data.ogImage + } + + if (data.title) { + metadata.website_title = data.title + } + const payload: MemoryPayload = { containerTags: [containerTag], - content: - data.content || - `${data.highlightedText}\n\n${data.html}\n\n${data?.url}`, - metadata: { sm_source: "consumer" }, + content, + metadata, } const responseData = await saveMemory(payload) diff --git a/apps/browser-extension/entrypoints/content/shared.ts b/apps/browser-extension/entrypoints/content/shared.ts index d8b665c5..8c3688e0 100644 --- a/apps/browser-extension/entrypoints/content/shared.ts +++ b/apps/browser-extension/entrypoints/content/shared.ts @@ -1,5 +1,6 @@ import { MESSAGE_TYPES, STORAGE_KEYS } from "../../utils/constants" import { DOMUtils } from "../../utils/ui-components" +import { default as TurndownService } from "turndown" export async function saveMemory() { try { @@ -7,15 +8,64 @@ export async function saveMemory() { const highlightedText = window.getSelection()?.toString() || "" const url = window.location.href - const html = document.documentElement.outerHTML + + const ogImage = + document + .querySelector('meta[property="og:image"]') + ?.getAttribute("content") || + document + .querySelector('meta[name="og:image"]') + ?.getAttribute("content") || + undefined + + const title = + document + .querySelector('meta[property="og:title"]') + ?.getAttribute("content") || + document + .querySelector('meta[name="og:title"]') + ?.getAttribute("content") || + document.title || + undefined + + const data: { + html?: string + markdown?: string + highlightedText?: string + url: string + ogImage?: string + title?: string + } = { + url, + } + + if (ogImage) { + data.ogImage = ogImage + } + + if (title) { + data.title = title + } + + if (highlightedText) { + data.highlightedText = highlightedText + } else { + const bodyClone = document.body.cloneNode(true) as HTMLElement + const scripts = bodyClone.querySelectorAll("script") + for (const script of scripts) { + script.remove() + } + const html = bodyClone.innerHTML + + // Convert HTML to markdown + const turndownService = new TurndownService() + const markdown = turndownService.turndown(html) + data.markdown = markdown + } const response = await browser.runtime.sendMessage({ action: MESSAGE_TYPES.SAVE_MEMORY, - data: { - html, - highlightedText, - url, - }, + data, actionSource: "context_menu", }) @@ -74,4 +124,4 @@ export function setupStorageListener() { ) } }) -}
\ No newline at end of file +} diff --git a/apps/browser-extension/package.json b/apps/browser-extension/package.json index 0644ec24..a2b72865 100644 --- a/apps/browser-extension/package.json +++ b/apps/browser-extension/package.json @@ -20,12 +20,14 @@ "posthog-js": "^1.261.7", "react": "^19.1.0", "react-dom": "^19.1.0", - "tailwindcss": "^4.1.12" + "tailwindcss": "^4.1.12", + "turndown": "^7.1.3" }, "devDependencies": { "@types/chrome": "^0.1.4", "@types/react": "^19.1.2", "@types/react-dom": "^19.1.3", + "@types/turndown": "^5.0.5", "@wxt-dev/module-react": "^1.1.3", "typescript": "^5.8.3", "wxt": "^0.20.6" diff --git a/apps/browser-extension/utils/types.ts b/apps/browser-extension/utils/types.ts index f8d9efd8..8cec2241 100644 --- a/apps/browser-extension/utils/types.ts +++ b/apps/browser-extension/utils/types.ts @@ -32,9 +32,12 @@ export interface ExtensionMessage { */ export interface MemoryData { html?: string + markdown?: string content?: string highlightedText?: string url?: string + ogImage?: string + title?: string } /** diff --git a/apps/web/components/masonry-memory-list.tsx b/apps/web/components/masonry-memory-list.tsx index 16cd65c9..1a29093f 100644 --- a/apps/web/components/masonry-memory-list.tsx +++ b/apps/web/components/masonry-memory-list.tsx @@ -83,12 +83,25 @@ const DocumentCard = memo( ) } - if (document.url?.includes("https://")) { + // Check if this is a website document saved from the Chrome extension + const websiteUrl = + (document.metadata?.website_url as string | undefined) || + (document.url?.includes("https://") ? document.url : undefined) + + if (websiteUrl) { return ( <WebsiteCard - url={document.url} - title={document.title || "Untitled Document"} - image={document.ogImage} + url={websiteUrl} + title={ + (document.metadata?.website_title as string | undefined) || + document.title || + "Untitled Document" + } + image={ + (document.metadata?.website_og_image as string | undefined) || + document.ogImage + } + description={document.content && typeof document.content === "string" ? document.content : undefined} onOpenDetails={() => onOpenDetails(document)} onDelete={() => onDelete(document)} /> diff --git a/apps/web/components/memories-utils/index.tsx b/apps/web/components/memories-utils/index.tsx index 3052f3c7..fca4d367 100644 --- a/apps/web/components/memories-utils/index.tsx +++ b/apps/web/components/memories-utils/index.tsx @@ -48,6 +48,9 @@ export const getSourceUrl = (document: DocumentWithMemories) => { if (document.type === "google_slide" && document.customId) { return `https://docs.google.com/presentation/d/${document.customId}` } + if(document.metadata?.website_url) { + return document.metadata?.website_url as string + } // Fallback to existing URL for all other document types return document.url } diff --git a/apps/web/components/memories-utils/memory-detail.tsx b/apps/web/components/memories-utils/memory-detail.tsx index 378d3f79..dbbc51cb 100644 --- a/apps/web/components/memories-utils/memory-detail.tsx +++ b/apps/web/components/memories-utils/memory-detail.tsx @@ -161,7 +161,7 @@ export const MemoryDetail = memo( <span>{formatDate(document.createdAt)}</span> </div> </div> - {document.url && ( + {(document.url || document.metadata?.website_url) && ( <div className="flex items-end"> <Button onClick={() => { |