From b326603acca4c04018a62ebc4c29073f7b801551 Mon Sep 17 00:00:00 2001 From: mindfreq <144544047+mindfreq@users.noreply.github.com> Date: Mon, 4 May 2026 18:26:01 +0200 Subject: [PATCH] Revert "Some improvment and fixes" This reverts commit 6bd7b54d7f19421a39395b40f4938701f6216f74. --- src/App.css | 5 +- src/App.tsx | 129 ++++++++-------------------------------------------- 2 files changed, 23 insertions(+), 111 deletions(-) diff --git a/src/App.css b/src/App.css index f096d91..57e295b 100644 --- a/src/App.css +++ b/src/App.css @@ -179,7 +179,8 @@ margin-top: 1.2rem; } - .reader-content { + .reader-content, + .reader-content * { -webkit-user-select: text; user-select: text; } @@ -198,7 +199,7 @@ } .reader-content img { - @apply my-4 h-auto w-full rounded-lg border; + @apply my-4 w-full rounded-lg border; } .reader-content pre { diff --git a/src/App.tsx b/src/App.tsx index a4c9b49..b68040e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from "react"; +import { useEffect, useState } from "react"; import { commands, Feed, FeedEntry, FeedItem, Person } from "./bindings"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Separator } from "@/components/ui/separator"; @@ -31,14 +31,7 @@ import { type View = | { type: "empty" } | { type: "items"; feed: Feed; items: FeedItem[] } - | { - type: "entry"; - feed: Feed; - items: FeedItem[]; - entry: FeedEntry; - articleHtml: string; - summaryMatchesContent: boolean; - }; + | { type: "entry"; feed: Feed; entry: FeedEntry }; type UiError = { id: number; @@ -92,20 +85,6 @@ const getRenderableHtml = (content: string): string => { return /<[a-z][\s\S]*>/i.test(decoded) ? decoded : value; }; -const getArticleHtml = (content: string): string => { - const html = getRenderableHtml(content); - if (!/]/i.test(html)) return html; - - const template = document.createElement("template"); - template.innerHTML = html; - template.content.querySelectorAll("img").forEach((image) => { - if (!image.hasAttribute("loading")) image.setAttribute("loading", "lazy"); - if (!image.hasAttribute("decoding")) image.setAttribute("decoding", "async"); - }); - - return template.innerHTML; -}; - const isSummarySameAsContent = (summary: string | null, content: string): boolean => { if (!summary) return false; @@ -176,7 +155,6 @@ const renderAuthor = (author: Person, index: number) => { export default function App() { const { resolvedTheme, setTheme } = useTheme(); - const articleScrollRef = useRef(null); const [feeds, setFeeds] = useState([]); const [loadingFeeds, setLoadingFeeds] = useState(true); const [selectedFeed, setSelectedFeed] = useState(null); @@ -188,13 +166,6 @@ export default function App() { const [uiError, setUiError] = useState(null); const [isMobileSidebarOpen, setIsMobileSidebarOpen] = useState(false); const [isDesktopSidebarOpen, setIsDesktopSidebarOpen] = useState(true); - const [feedPendingDelete, setFeedPendingDelete] = useState(null); - const [removingFeedId, setRemovingFeedId] = useState(null); - - useEffect(() => { - if (view.type !== "entry") return; - articleScrollRef.current?.scrollTo({ top: 0 }); - }, [view.type === "entry" ? view.entry.url : null]); const showError = (error: unknown, fallbackMessage: string) => { console.error(error); @@ -252,15 +223,7 @@ export default function App() { setLoadingView(true); try { const entry = await commands.getEntry(feed.url, item.url); - const items = view.type === "items" ? view.items : []; - setView({ - type: "entry", - feed, - items, - entry, - articleHtml: getArticleHtml(entry.content), - summaryMatchesContent: isSummarySameAsContent(entry.summary, entry.content), - }); + setView({ type: "entry", feed, entry }); } catch (e) { showError(e, "Unable to open this article."); } finally { @@ -268,11 +231,6 @@ export default function App() { } }; - const handleBackToItems = () => { - if (view.type !== "entry") return; - setView({ type: "items", feed: view.feed, items: view.items }); - }; - const handleAddFeed = async () => { if (!addUrl.trim()) return; setAdding(true); @@ -288,8 +246,8 @@ export default function App() { } }; - const handleRemoveFeed = async (feed: Feed) => { - setRemovingFeedId(feed.id); + const handleRemoveFeed = async (feed: Feed, e: React.MouseEvent) => { + e.stopPropagation(); try { await commands.removeFeed(feed.url); setFeeds((prev) => prev.filter((f) => f.id !== feed.id)); @@ -297,11 +255,8 @@ export default function App() { setSelectedFeed(null); setView({ type: "empty" }); } - setFeedPendingDelete(null); } catch (e) { showError(e, "Unable to remove this feed."); - } finally { - setRemovingFeedId(null); } }; @@ -332,6 +287,14 @@ export default function App() { {resolvedTheme === "dark" ? "Switch to light" : "Switch to dark"} + + + + + Refresh feeds + -
-

{view.feed.title}

-

{view.entry.title}

-
+ {view.feed.title} -
+

{view.entry.title} @@ -571,17 +528,17 @@ export default function App() { {formatPublishedDate(view.entry.published, true)} )}

- {view.entry.summary && !view.summaryMatchesContent && ( + {view.entry.summary && !isSummarySameAsContent(view.entry.summary, view.entry.content) && (

{view.entry.summary}

)}
-
+ ) : null} @@ -609,52 +566,6 @@ export default function App() { )} - - {feedPendingDelete && ( -
-
-
-
- -
-
-

Delete this feed?

-

- This removes the feed from your sidebar and clears its articles from this app view. -

-
-
- -
-

- {feedPendingDelete.title || feedPendingDelete.url} -

- {feedPendingDelete.title && ( -

- {feedPendingDelete.url} -

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