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:
1 parent
4618d96201
commit
7eba4cfaeb
1 file changed
+23
@@ -17,6 +17,7 @@ import {
|
|||||||
Filter,
|
Filter,
|
||||||
ArrowRight,
|
ArrowRight,
|
||||||
} from 'lucide-react'
|
} from 'lucide-react'
|
||||||
|
import { SwipeableLeadCard } from '../swipeable-lead-card'
|
||||||
import { useFetch } from '@/hooks/use-fetch'
|
import { useFetch } from '@/hooks/use-fetch'
|
||||||
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
|
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
|
||||||
import { Badge } from '@/components/ui/badge'
|
import { Badge } from '@/components/ui/badge'
|
||||||
@@ -207,6 +208,28 @@ export function LeadsView() {
|
|||||||
<div className="space-y-1.5 p-2">
|
<div className="space-y-1.5 p-2">
|
||||||
{filtered.map((l) => {
|
{filtered.map((l) => {
|
||||||
const meta = STATUS_META[l.status] ?? STATUS_META.pending
|
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 (
|
return (
|
||||||
<button
|
<button
|
||||||
key={l.id}
|
key={l.id}
|
||||||
|
|||||||
Reference in new issue
Block a user