round14: Uebernehmen-Bug und Suggestion-Debounce fixen, Read-Later-Verwaltungsseite, konfigurierbares Read-Later-Limit

This commit is contained in:
2026-07-23 09:17:50 +02:00
parent 2772c29036
commit 70edeeed38
11 changed files with 333 additions and 37 deletions

View File

@@ -6,6 +6,7 @@ import { rankServices, type SearchResult } from "@launchpad/shared";
import { useServices } from "../hooks/useServices.js";
import { useBookmarks } from "../hooks/useBookmarks.js";
import { useDevices } from "../hooks/useDevices.js";
import { useSettings } from "../hooks/useSettings.js";
import { useBackendHealth } from "../hooks/useBackendHealth.js";
import { useTheme } from "../hooks/useTheme.js";
import { useCategories } from "../hooks/useCategories.js";
@@ -94,6 +95,7 @@ export function HomePage() {
const { data: services, isLoading: servicesLoading, isError: servicesError } = useServices();
const { data: bookmarks, isLoading: bookmarksLoading } = useBookmarks();
const { data: devices } = useDevices();
const { data: settings } = useSettings();
const { data: categories } = useCategories();
const { data: recentVisits } = useRecentVisits();
const { data: readLaterItems } = useReadLater();
@@ -317,23 +319,27 @@ export function HomePage() {
<div className="mt-3 flex flex-col gap-3">
<ReadLaterBox />
{readLaterItems && readLaterItems.length > 0 ? (
<div className="flex flex-wrap items-center justify-center gap-2">
{readLaterItems.slice(0, 6).map((item) => (
<button
key={item.id}
onClick={() => window.open(item.url, "_blank", "noopener,noreferrer")}
title={item.displayName}
className="flex items-center gap-1.5 rounded-full border border-black/10
bg-white/50 px-2.5 py-1 text-xs text-black/60 hover:bg-black/5
dark:border-white/10 dark:bg-white/5 dark:text-white/60 dark:hover:bg-white/10"
>
<Favicon src={item.favicon} fallbackLetter={item.displayName} size="sm" />
<span className="max-w-[8rem] truncate">{item.displayName}</span>
</button>
))}
</div>
) : null}
{(() => {
const readLaterLimit = settings?.readLaterLimit ?? 5;
if (!readLaterItems || readLaterItems.length === 0 || readLaterLimit <= 0) return null;
return (
<div className="flex flex-wrap items-center justify-center gap-2">
{readLaterItems.slice(0, readLaterLimit).map((item) => (
<button
key={item.id}
onClick={() => window.open(item.url, "_blank", "noopener,noreferrer")}
title={item.displayName}
className="flex items-center gap-1.5 rounded-full border border-black/10
bg-white/50 px-2.5 py-1 text-xs text-black/60 hover:bg-black/5
dark:border-white/10 dark:bg-white/5 dark:text-white/60 dark:hover:bg-white/10"
>
<Favicon src={item.favicon} fallbackLetter={item.displayName} size="sm" />
<span className="max-w-[8rem] truncate">{item.displayName}</span>
</button>
))}
</div>
);
})()}
{recentVisits && recentVisits.length > 0 ? (
<FavoritesBar