feat: SwipeRow integrated into Leads Finder review queue

Pending leads now render as SwipeableLeadCard (ReactBits SwipeRow):
- Swipe right: approve (green action)
- Swipe right (second action): snooze (gray)
- Swipe left: reject (dismiss action)
- Full swipe with commit at 55% threshold
- Score badge + company name + website + city + score label
- Selecting a lead opens the detail panel

Non-pending leads (approved/rejected/converted) keep the simple
button card for review history.

0 TS errors, ESLint clean, 0 console errors.
This commit is contained in:
Z User committed 2026-10-28 03:08:54 +00:00
1 parent 4618d96201
commit 7eba4cfaeb
1 file changed
+23
+23
View File
@@ -17,6 +17,7 @@ import {
Filter,
ArrowRight,
} from 'lucide-react'
import { SwipeableLeadCard } from '../swipeable-lead-card'
import { useFetch } from '@/hooks/use-fetch'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
@@ -207,6 +208,28 @@ export function LeadsView() {
<div className="space-y-1.5 p-2">
{filtered.map((l) => {
const meta = STATUS_META[l.status] ?? STATUS_META.pending
// Pending leads get SwipeRow (swipe to approve/reject/snooze)
if (l.status === 'pending') {
return (
<div key={l.id} className={cn('rounded-md border overflow-hidden', selected?.id === l.id && 'ring-1 ring-foreground/40')}>
<SwipeableLeadCard
lead={{
id: l.id,
companyName: l.companyName,
website: l.website,
city: l.city,
score: l.score,
scoreLabel: l.scoreLabel,
createdAt: l.createdAt,
}}
onApprove={(id) => { setSelectedId(id); review(id, 'approved') }}
onReject={(id) => { setSelectedId(id); review(id, 'rejected', 'Nicht zur Zielgruppe') }}
onSnooze={(id) => { setSelectedId(id); review(id, 'snoozed', 'Später erneut prüfen') }}
/>
</div>
)
}
// Non-pending leads keep the simple button card
return (
<button
key={l.id}