diff --git a/app/api/search/route.ts b/app/api/search/route.ts new file mode 100644 index 0000000..1ba603b --- /dev/null +++ b/app/api/search/route.ts @@ -0,0 +1,40 @@ +import { NextRequest, NextResponse } from "next/server"; + +export async function POST(req: NextRequest) { + try { + const body = await req.json() as { query: string; region: string; count: number }; + const { query, region, count } = body; + + if (!query || typeof query !== "string") { + return NextResponse.json({ error: "query is required" }, { status: 400 }); + } + + const searchQuery = region ? `${query} ${region}` : query; + + const baseUrl = req.nextUrl.origin; + const res = await fetch(`${baseUrl}/api/jobs/serp-enrich`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + query: searchQuery, + maxPages: Math.ceil((count || 50) / 10), + countryCode: "de", + languageCode: "de", + filterSocial: true, + categories: ["ceo"], + enrichEmails: true, + }), + }); + + if (!res.ok) { + const err = await res.json() as { error?: string }; + return NextResponse.json({ error: err.error || "Failed to start job" }, { status: 500 }); + } + + const data = await res.json() as { jobId: string }; + return NextResponse.json({ jobId: data.jobId }); + } catch (err) { + console.error("POST /api/search error:", err); + return NextResponse.json({ error: "Failed to start search" }, { status: 500 }); + } +} diff --git a/app/layout.tsx b/app/layout.tsx index 8960110..3e54b3b 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,29 +1,22 @@ import type { Metadata } from "next"; -import { Inter } from "next/font/google"; import "./globals.css"; -import { Sidebar } from "@/components/layout/Sidebar"; -import { TopBar } from "@/components/layout/TopBar"; +import { Topbar } from "@/components/layout/Topbar"; import { Toaster } from "@/components/ui/sonner"; -const inter = Inter({ subsets: ["latin"], variable: "--font-inter" }); - export const metadata: Metadata = { - title: "OnyvaLeads — Lead Generation Platform", - description: "Unified lead generation and email enrichment platform", + title: "OnyvaLeads", + description: "Leads finden und verwalten", }; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( - -
-+ Suchbegriff eingeben — wir finden passende Unternehmen mit Kontaktdaten. +
+| + 0} + onChange={onToggleAll} + style={{ cursor: "pointer", accentColor: "#3b82f6" }} + /> + | +Unternehmen | +Branche | +Region | +Status | +Gefunden am | +Aktionen | +|
|---|---|---|---|---|---|---|---|
| + onToggleSelect(lead.id)} + style={{ cursor: "pointer", accentColor: "#3b82f6" }} + /> + | + + {/* Unternehmen */} +
+
+ {lead.companyName || lead.domain || "—"}
+
+ {lead.domain && lead.companyName && (
+ {lead.domain}
+ )}
+ |
+
+ {/* Email */}
+
+ {lead.email ? (
+
+
+ {lead.email}
+
+
+
+ ) : (
+ — nicht gefunden
+ )}
+ |
+
+ {/* Branche */}
+ + + {lead.industry || "—"} + + | + + {/* Region */} ++ + {lead.address ?? lead.sourceTerm ?? "—"} + + | + + {/* Status */} +
+ |
+
+ {/* Gefunden am */}
+ + + {relativeDate(lead.capturedAt)} + + | + + {/* Aktionen */} +
+
+ {/* Primary action */}
+
+ {/* Notiz */}
+
+
+ |
+
+ E-Mail-Suche kann einen Moment dauern. +
+ )} + + {/* Warning banner */} +