diff --git a/package-lock.json b/package-lock.json index b7c7550..f32b6fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "blog-backup", "version": "0.1.0", "dependencies": { + "date-fns": "^4.1.0", "next": "16.1.6", "react": "19.2.3", "react-dom": "19.2.3" @@ -2706,6 +2707,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", diff --git a/package.json b/package.json index 758fa39..6126718 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "eslint" }, "dependencies": { + "date-fns": "^4.1.0", "next": "16.1.6", "react": "19.2.3", "react-dom": "19.2.3" diff --git a/src/app/page.tsx b/src/app/page.tsx index 237a55c..d8b85f5 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,7 @@ "use client"; import { useState, useEffect } from "react"; +import { format } from "date-fns"; interface Message { id: string; @@ -9,6 +10,50 @@ interface Message { timestamp: number; } +interface DigestEntry { + category: string; + title: string; + url?: string; + summary: string; +} + +interface ParsedDigest { + title: string; + entries: DigestEntry[]; + raw: string; +} + +function parseDigest(content: string): ParsedDigest { + const lines = content.split('\n'); + const entries: DigestEntry[] = []; + let currentCategory = ""; + let title = ""; + + for (const line of lines) { + if (line.startsWith('# ') && !title) { + title = line.replace('# ', ''); + } else if (line.startsWith('## ')) { + currentCategory = line.replace('## ', ''); + } else if (line.startsWith('- **')) { + const match = line.match(/- \*\*(.+?)\*\*:\s*(.+)/); + if (match) { + entries.push({ + category: currentCategory, + title: match[1], + summary: match[2], + }); + } + } else if (line.startsWith(' - ')) { + const urlMatch = line.match(/\[.+?\]\((.+?)\)/); + if (urlMatch && entries.length > 0) { + entries[entries.length - 1].url = urlMatch[1]; + } + } + } + + return { title, entries, raw: content }; +} + export default function Home() { const [messages, setMessages] = useState([]); const [newMessage, setNewMessage] = useState(""); @@ -17,6 +62,7 @@ export default function Home() { return today.toISOString().split("T")[0]; }); const [loading, setLoading] = useState(false); + const [expandedId, setExpandedId] = useState(null); useEffect(() => { fetchMessages(); @@ -84,12 +130,15 @@ export default function Home() { new Date(b).getTime() - new Date(a).getTime() ); + // Check if message is a digest + const isDigest = (content: string) => content.includes("## Daily Digest"); + return (
-

📓 Daily Blog Backup

-

Backup of your daily messages and thoughts

+

📓 Daily Blog & Digest

+

Daily digests and notes backup

{/* Add new message */} @@ -133,32 +182,76 @@ export default function Home() {

- {new Date(date).toLocaleDateString("en-US", { - weekday: "long", - year: "numeric", - month: "long", - day: "numeric", - })} + {format(new Date(date), "EEEE, MMMM d, yyyy")}

- {groupedMessages[date].map((msg) => ( -
-
-

{msg.content}

- + {groupedMessages[date].map((msg) => { + const isDailyDigest = isDigest(msg.content); + const parsed = isDailyDigest ? parseDigest(msg.content) : null; + + return ( +
+ {isDailyDigest && ( +
+ 🤖 AI Digest + Daily Research +
+ )} + +
+ {isDailyDigest && parsed ? ( +
+

+ {parsed.title} +

+ + {parsed.entries.length > 0 ? ( +
+ {Array.from(new Set(parsed.entries.map(e => e.category))).map(cat => ( +
+

{cat}

+
    + {parsed.entries.filter(e => e.category === cat).map((entry, i) => ( +
  • + {entry.title}: {entry.summary} + {entry.url && ( + + [link] + + )} +
  • + ))} +
+
+ ))} +
+ ) : ( +
+                                  {msg.content}
+                                
+ )} +
+ ) : ( +

{msg.content}

+ )} + + +
+ +

+ {format(new Date(msg.timestamp), "h:mm a")} +

-

- {new Date(msg.timestamp).toLocaleTimeString()} -

-
- ))} + ); + })}
))