diff --git a/src/app/search/page.tsx b/src/app/search/page.tsx index d598015..f700a77 100644 --- a/src/app/search/page.tsx +++ b/src/app/search/page.tsx @@ -3,7 +3,8 @@ import { useState, useCallback, useEffect, useRef } from "react"; import { useRouter } from "next/navigation"; import { useAuth } from "@/hooks/useAuth"; -import { searchEmails, exportMailsZIP, exportEDiscovery, uploadMailFilesUser, getUploadProgressUser, listSavedSearches, createSavedSearch, deleteSavedSearch, type SearchHit, type UploadJob, type SavedSearch } from "@/lib/api"; +import { searchEmails, exportMailsZIP, exportEDiscovery, uploadMailFilesUser, getUploadProgressUser, listSavedSearches, createSavedSearch, deleteSavedSearch, type SearchHit, type SearchMatchField, type UploadJob, type SavedSearch } from "@/lib/api"; +import { sanitizeSnippet } from "@/lib/sanitize"; import { Navbar } from "@/components/navbar"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; @@ -51,6 +52,36 @@ function formatBytes(bytes: number): string { return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; } +const MATCH_FIELD_LABEL: Record = { + subject: "📨 Subject", + body: "✉️ Body", + attachment_text: "📄 PDF-Anhang", + attachment_names: "📎 Dateiname", + from_addr: "👤 Absender", + to_addr: "📧 Empfänger", +}; + +function MatchSourceBadge({ field }: { field: SearchMatchField }) { + return ( + + {MATCH_FIELD_LABEL[field]} + + ); +} + +function SnippetLine({ hit }: { hit: SearchHit }) { + if (!hit.snippet) return null; + return ( +
+ {hit.match_field && } + +
+ ); +} + export default function SearchPage() { const { user, loading: authLoading } = useAuth(); const router = useRouter(); @@ -621,12 +652,15 @@ export default function SearchPage() { {hit.from || "-"} - {hit.subject || "(kein Betreff)"} - {hit.thread_size && hit.thread_size > 1 && ( - - {hit.thread_size} - - )} +
+ {hit.subject || "(kein Betreff)"} + {hit.thread_size && hit.thread_size > 1 && ( + + {hit.thread_size} + + )} +
+
{hit.to || "-"}