From 2ed39d68656be302a63c37e4a7fe3f49f0a21cde Mon Sep 17 00:00:00 2001 From: Dicken Date: Sun, 26 Jul 2026 22:20:04 +0200 Subject: [PATCH] round68: Spaeter-lesen als Liste mit Datum/Uhrzeit statt Icon-Raster, Suche im Android-Design nutzt jetzt dieselbe Rangierfunktion wie das klassische Design --- .../src/components/MobileAndroidHome.tsx | 59 ++++++++++++------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/apps/frontend/src/components/MobileAndroidHome.tsx b/apps/frontend/src/components/MobileAndroidHome.tsx index 7e09f87..dd6b765 100644 --- a/apps/frontend/src/components/MobileAndroidHome.tsx +++ b/apps/frontend/src/components/MobileAndroidHome.tsx @@ -10,6 +10,7 @@ import { faPen, } from "@fortawesome/free-solid-svg-icons"; import type { Category, Service, Bookmark, SearchResult } from "@launchpad/shared"; +import { rankSearchResults } from "@launchpad/shared"; import { ResultsList, Button } from "@launchpad/ui"; import { useHomeLayout, type HomeSlot, type ItemRef } from "../hooks/useHomeLayout.js"; @@ -83,6 +84,14 @@ function slotId(): string { return `slot-${Math.random().toString(36).slice(2, 10)}-${Date.now().toString(36)}`; } +function formatSavedAt(iso: string): string { + const date = new Date(iso); + if (Number.isNaN(date.getTime())) return ""; + const datePart = date.toLocaleDateString("de-DE", { day: "2-digit", month: "2-digit", year: "2-digit" }); + const timePart = date.toLocaleTimeString("de-DE", { hour: "2-digit", minute: "2-digit" }); + return `${datePart}, ${timePart}`; +} + /** * Reine Funktion, die aus dem Ist-Zustand (Layout) + der abgeschlossenen * Ziehgeste das NEUE Layout berechnet - bewusst ohne React-State-Zugriff, @@ -221,7 +230,7 @@ export interface MobileAndroidHomeProps { categoryColors: Record; allSearchItems: SearchResult[]; recentVisits: MinimalVisitItem[]; - readLaterItems: Array<{ id: string; url: string; displayName: string; favicon: string | null }>; + readLaterItems: Array<{ id: string; url: string; displayName: string; favicon: string | null; savedAt: string }>; onOpen: (item: OpenTarget) => void; onToggleFavorite: (item: SearchResult) => void; onAddReadLater: (url: string) => void; @@ -383,12 +392,15 @@ export function MobileAndroidHome({ } const searchResults = useMemo(() => { - if (query.trim().length === 0) return []; - const q = query.toLowerCase(); - return allSearchItems - .filter((i) => i.kind !== "device") - .filter((i) => i.displayName.toLowerCase().includes(q) || i.alias?.some((a) => a.toLowerCase().includes(q))) - .slice(0, 30); + // WICHTIG (Bugfix): vorher stand hier ein eigener, simpler + // .includes()-Filter, der zusätzlich Geräte komplett ausgeschlossen hat + // - dadurch fand die Suche im Android-Design weniger als im normalen + // Design (siehe Bugreport). Jetzt exakt dieselbe Rangier-Funktion wie im + // klassischen Design (siehe HomePage.tsx), inklusive Geräten - ein Klick + // auf ein Gerät bleibt trotzdem ohne Wirkung (kein eigenes Ziel, siehe + // onOpen/openItem in HomePage.tsx), aber es taucht wie gewohnt als + // Treffer auf. + return rankSearchResults(allSearchItems, query); }, [query, allSearchItems]); const closeSearch = () => { @@ -702,20 +714,25 @@ export function MobileAndroidHome({ {readLaterItems.length > 0 ? ( -
- {readLaterItems.map((item) => ( - - ))} +
+ {[...readLaterItems] + .sort((a, b) => new Date(b.savedAt).getTime() - new Date(a.savedAt).getTime()) + .map((item) => ( + + ))}
) : (

Noch nichts gemerkt.