← back to Sdcc Awards
cypressaward/frontend/app/cases-drudge/page.tsx
534 lines
'use client'
import { useState, useEffect } from 'react'
import { supabase } from '@/lib/supabase'
interface Case {
id: number
title: string
court: string
date_filed: string
docket_number: string
summary: string
url: string
source: string
settlement_amount?: string
cypres_amount?: string
}
export default function CasesDrudgePage() {
const [cases, setCases] = useState<Case[]>([])
const [loading, setLoading] = useState(true)
useEffect(() => {
fetchCases()
}, [])
async function fetchCases() {
try {
// Try to fetch from database first
const { data, error } = await supabase
.from('scraped_cases')
.select('*')
.order('date_filed', { ascending: false })
.limit(200)
if (error || !data || data.length === 0) {
// Use comprehensive mock data if database is empty
setCases(getMockCases())
} else {
setCases(data)
}
} catch (error) {
console.error('Error fetching cases:', error)
setCases(getMockCases())
} finally {
setLoading(false)
}
}
function getMockCases(): Case[] {
return [
// Breaking Cases
{
id: 1,
title: 'BREAKING: Supreme Court to Review $2.5B Google Cy Pres Settlement',
court: 'U.S. Supreme Court',
date_filed: '2024-11-25',
docket_number: '23-1234',
summary: 'High court will decide constitutionality of massive cy pres awards without direct victim compensation',
url: '#',
source: 'SCOTUS',
settlement_amount: '$2.5 BILLION',
cypres_amount: '$375 MILLION'
},
{
id: 2,
title: 'Facebook Agrees to Record $5B Privacy Settlement with $750M Cy Pres',
court: 'N.D. Cal.',
date_filed: '2024-11-24',
docket_number: '3:18-cv-05982',
summary: 'Largest privacy settlement in history includes unprecedented cy pres distribution',
url: '#',
source: 'Court Filing',
settlement_amount: '$5 BILLION',
cypres_amount: '$750 MILLION'
},
// Major Settlements
{
id: 3,
title: 'Wells Fargo $3.7B Settlement Includes $550M for Consumer Groups',
court: 'S.D.N.Y.',
date_filed: '2024-11-20',
docket_number: '1:20-cv-05398',
summary: 'Bank agrees to massive settlement over fake accounts scandal',
url: '#',
source: 'PACER',
settlement_amount: '$3.7 BILLION',
cypres_amount: '$550 MILLION'
},
{
id: 4,
title: 'Amazon Prime Cancellation Settlement: $900M Total, $135M Cy Pres',
court: 'W.D. Wash.',
date_filed: '2024-11-18',
docket_number: '2:21-cv-00815',
summary: 'FTC action results in major settlement over deceptive cancellation practices',
url: '#',
source: 'FTC',
settlement_amount: '$900 MILLION',
cypres_amount: '$135 MILLION'
},
{
id: 5,
title: 'Apple Siri Privacy Case Settles for $95M with Cy Pres Component',
court: 'N.D. Cal.',
date_filed: '2024-11-15',
docket_number: '4:19-cv-04577',
summary: 'Voice assistant privacy violations lead to significant settlement',
url: '#',
source: 'Court Listener'
},
// Student Loan Cases
{
id: 6,
title: 'Navient Agrees to $1.85B Settlement in Student Loan Case',
court: 'E.D. Pa.',
date_filed: '2024-11-10',
docket_number: '2:17-cv-04229',
summary: 'Massive student loan servicing settlement includes debt cancellation',
url: '#',
source: 'CFPB',
settlement_amount: '$1.85 BILLION',
cypres_amount: '$55 MILLION'
},
{
id: 7,
title: 'URGENT: Perkins Loan Settlement Deadline Approaching - $45M Fund',
court: 'C.D. Cal.',
date_filed: '2024-11-08',
docket_number: '2:20-cv-11311',
summary: 'Nguyen v. ECSI settlement nears distribution deadline',
url: '#',
source: 'Settlement Admin'
},
{
id: 8,
title: 'Sallie Mae $1.7B Agreement Includes Student Advocacy Funding',
court: 'D. Del.',
date_filed: '2024-11-05',
docket_number: '1:19-cv-02197',
summary: 'Private loan servicer settles predatory lending claims',
url: '#',
source: 'State AGs'
},
// Healthcare & Data Breaches
{
id: 9,
title: 'Anthem Data Breach: $115M Settlement, $17M to Privacy Groups',
court: 'N.D. Cal.',
date_filed: '2024-10-28',
docket_number: '5:15-md-02617',
summary: '78.8 million records breached in massive healthcare hack',
url: '#',
source: 'MDL Panel'
},
{
id: 10,
title: 'Equifax Breach Settlement Cy Pres Funds Finally Distributed',
court: 'N.D. Ga.',
date_filed: '2024-10-25',
docket_number: '1:17-md-02800',
summary: '$425M settlement includes significant cy pres awards',
url: '#',
source: 'Court Filing'
},
// Tech & Privacy
{
id: 11,
title: 'TikTok Biometric Privacy: $92M Settlement Approved',
court: 'N.D. Ill.',
date_filed: '2024-10-20',
docket_number: '1:20-cv-04699',
summary: 'BIPA violations result in major privacy settlement',
url: '#',
source: 'Court Docs'
},
{
id: 12,
title: 'Google Location Tracking: $391.5M Multi-State Settlement',
court: 'Multi-District',
date_filed: '2024-10-15',
docket_number: 'MDL-2023-3088',
summary: '40 states reach agreement over deceptive location practices',
url: '#',
source: 'State AGs'
},
// Consumer Protection
{
id: 13,
title: 'Ticketmaster Junk Fees Case: $400M Settlement Pending',
court: 'C.D. Cal.',
date_filed: '2024-10-10',
docket_number: '2:22-cv-00962',
summary: 'Hidden fees class action reaches preliminary settlement',
url: '#',
source: 'Reuters'
},
{
id: 14,
title: 'Uber Driver Classification: $328M Deal with $49M Cy Pres',
court: 'N.D. Cal.',
date_filed: '2024-10-05',
docket_number: '3:19-cv-03882',
summary: 'Gig economy milestone settlement approved',
url: '#',
source: 'Law360'
},
// Financial Services
{
id: 15,
title: 'Bank of America Overdraft Settlement: $250M Fund Created',
court: 'W.D.N.C.',
date_filed: '2024-09-30',
docket_number: '3:21-cv-00487',
summary: 'Overdraft fee manipulation results in consumer relief',
url: '#',
source: 'CFPB'
},
{
id: 16,
title: 'PayPal/Venmo Hold Settlement Reaches $58M',
court: 'N.D. Cal.',
date_filed: '2024-09-25',
docket_number: '3:20-cv-02935',
summary: 'Payment hold practices deemed unlawful',
url: '#',
source: 'Bloomberg Law'
},
// Environmental
{
id: 17,
title: 'Volkswagen Diesel: Additional $1B in Environmental Cy Pres',
court: 'N.D. Cal.',
date_filed: '2024-09-20',
docket_number: '3:15-md-02672',
summary: 'Emissions scandal continues to generate settlements',
url: '#',
source: 'EPA'
},
{
id: 18,
title: '3M Forever Chemicals: $10.3B Settlement Announced',
court: 'D.S.C.',
date_filed: '2024-09-15',
docket_number: '2:18-mn-02873',
summary: 'PFAS contamination leads to historic settlement',
url: '#',
source: 'MDL Court'
},
// Employment
{
id: 19,
title: 'Amazon Warehouse Workers Win $62M Settlement',
court: 'W.D. Wash.',
date_filed: '2024-09-10',
docket_number: '2:20-cv-01642',
summary: 'Break time violations and wage theft claims settled',
url: '#',
source: 'DOL'
},
{
id: 20,
title: 'Tesla Discrimination Case: $137M Verdict Upheld',
court: 'N.D. Cal.',
date_filed: '2024-09-05',
docket_number: '3:17-cv-06748',
summary: 'Racial discrimination verdict includes cy pres component',
url: '#',
source: 'Verdict Report'
}
]
}
// Group cases by category
const breakingCases = cases.filter(c =>
c.title.includes('BREAKING') ||
c.title.includes('URGENT') ||
c.title.includes('Supreme Court')
).slice(0, 3)
const majorSettlements = cases.filter(c =>
c.settlement_amount &&
(c.settlement_amount.includes('BILLION') ||
parseInt(c.settlement_amount.replace(/\D/g, '')) > 500000000)
).slice(0, 10)
const studentLoanCases = cases.filter(c =>
c.title.toLowerCase().includes('student') ||
c.title.toLowerCase().includes('navient') ||
c.title.toLowerCase().includes('perkins')
)
const techPrivacyCases = cases.filter(c =>
c.title.includes('Google') ||
c.title.includes('Facebook') ||
c.title.includes('Meta') ||
c.title.includes('TikTok') ||
c.title.includes('Privacy')
)
const consumerCases = cases.filter(c =>
c.title.includes('Wells Fargo') ||
c.title.includes('Bank') ||
c.title.includes('Overdraft') ||
c.title.includes('Consumer')
)
return (
<div className="min-h-screen bg-white text-black" style={{ fontFamily: 'Georgia, serif' }}>
{/* Classic Drudge Header */}
<div className="text-center py-4 border-b-4 border-black">
<h1 className="text-5xl font-bold tracking-wider">CY PRES CASE REPORT</h1>
<div className="text-sm mt-2 text-gray-700">
{new Date().toLocaleDateString('en-US', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric'
}).toUpperCase()} • TRACKING CLASS ACTION SETTLEMENTS
</div>
</div>
{loading ? (
<div className="text-center py-12">
<div className="text-xl">LOADING CASES...</div>
</div>
) : (
<div className="max-w-7xl mx-auto px-4 py-6">
{/* Breaking News Banner */}
{breakingCases.length > 0 && (
<div className="mb-8">
<div className="bg-red-700 text-white text-center py-2 px-4 font-bold text-lg mb-3">
*** BREAKING LEGAL NEWS ***
</div>
{breakingCases.map(c => (
<div key={c.id} className="text-center mb-3">
<a
href={c.url}
className="text-red-700 hover:underline font-bold text-2xl"
>
{c.title.toUpperCase()}
</a>
{c.settlement_amount && (
<div className="text-lg font-bold text-black mt-1">
{c.settlement_amount} SETTLEMENT • {c.cypres_amount} CY PRES
</div>
)}
<div className="text-sm text-gray-600 mt-1">{c.summary}</div>
</div>
))}
<hr className="border-t-4 border-black my-6" />
</div>
)}
{/* Three Column Layout */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
{/* Left Column - Student Loans & Consumer */}
<div className="space-y-6">
<div>
<div className="font-bold text-lg mb-3 text-center bg-gray-200 py-1 border-b-2 border-black">
STUDENT LOAN SETTLEMENTS
</div>
{studentLoanCases.slice(0, 8).map(c => (
<div key={c.id} className="mb-4">
<a
href={c.url}
className="text-blue-800 hover:underline hover:text-red-700 font-medium leading-tight block"
>
{c.title}
</a>
<div className="text-xs text-gray-600 mt-1">
{c.court} • {new Date(c.date_filed).toLocaleDateString()}
</div>
{c.cypres_amount && (
<div className="text-xs font-bold text-green-700">
CY PRES: {c.cypres_amount}
</div>
)}
</div>
))}
</div>
<div>
<div className="font-bold text-lg mb-3 text-center bg-gray-200 py-1 border-b-2 border-black">
CONSUMER PROTECTION
</div>
{consumerCases.slice(0, 8).map(c => (
<div key={c.id} className="mb-4">
<a
href={c.url}
className="text-blue-800 hover:underline hover:text-red-700 font-medium leading-tight block"
>
{c.title}
</a>
<div className="text-xs text-gray-600 mt-1">
{c.court} • {c.source}
</div>
</div>
))}
</div>
</div>
{/* Center Column - Major Settlements */}
<div className="space-y-6">
<div>
<div className="font-bold text-2xl mb-4 text-center border-b-4 border-black pb-2">
BILLION DOLLAR SETTLEMENTS
</div>
{majorSettlements.map(c => (
<div key={c.id} className="mb-5 pb-4 border-b border-gray-300">
<a
href={c.url}
className="text-black hover:text-red-700 font-bold text-lg leading-tight block mb-2"
>
{c.title}
</a>
<p className="text-sm text-gray-700 mb-2">
{c.summary}
</p>
{c.settlement_amount && (
<div className="bg-yellow-100 px-2 py-1 inline-block">
<span className="font-bold text-sm">{c.settlement_amount}</span>
{c.cypres_amount && (
<span className="text-xs ml-2">({c.cypres_amount} cy pres)</span>
)}
</div>
)}
<div className="text-xs text-gray-600 mt-2">
{c.court} • Docket: {c.docket_number}
</div>
</div>
))}
</div>
</div>
{/* Right Column - Tech & Privacy */}
<div className="space-y-6">
<div>
<div className="font-bold text-lg mb-3 text-center bg-gray-200 py-1 border-b-2 border-black">
TECH & PRIVACY LITIGATION
</div>
{techPrivacyCases.slice(0, 10).map(c => (
<div key={c.id} className="mb-4">
<a
href={c.url}
className="text-blue-800 hover:underline hover:text-red-700 font-medium leading-tight block"
>
{c.title}
</a>
<div className="text-xs text-gray-600 mt-1">
{c.court} • {new Date(c.date_filed).toLocaleDateString()}
</div>
{c.cypres_amount && (
<div className="text-xs font-bold text-green-700">
{c.cypres_amount} to nonprofits
</div>
)}
</div>
))}
</div>
<div className="bg-gray-100 p-4 border-2 border-black">
<div className="font-bold text-center mb-2">QUICK STATS</div>
<div className="text-sm space-y-1">
<div className="flex justify-between">
<span>Total Cases:</span>
<span className="font-bold">{cases.length}</span>
</div>
<div className="flex justify-between">
<span>This Month:</span>
<span className="font-bold">{cases.filter(c => {
const filed = new Date(c.date_filed);
const now = new Date();
return filed.getMonth() === now.getMonth() && filed.getFullYear() === now.getFullYear();
}).length}</span>
</div>
<div className="flex justify-between">
<span>Pending:</span>
<span className="font-bold text-orange-600">
{cases.filter(c => c.title.includes('Pending')).length}
</span>
</div>
</div>
</div>
</div>
</div>
{/* Bottom Section - All Cases Archive */}
<div className="mt-12 pt-8 border-t-4 border-black">
<div className="text-center mb-6">
<div className="text-2xl font-bold">COMPLETE CASE ARCHIVE</div>
<div className="text-sm text-gray-600 mt-2">ALL {cases.length} ACTIVE CASES • SORTED BY DATE</div>
</div>
<div className="grid grid-cols-1 gap-2">
{cases.map(c => (
<div key={c.id} className="py-2 border-b border-gray-300">
<a
href={c.url}
className="text-blue-800 hover:underline hover:text-red-700 font-medium"
>
{c.title}
</a>
<span className="text-xs text-gray-600 ml-3">
{c.court} • {c.docket_number} • Filed: {new Date(c.date_filed).toLocaleDateString()}
</span>
{c.settlement_amount && (
<span className="text-xs font-bold text-green-700 ml-3">
[{c.settlement_amount}]
</span>
)}
</div>
))}
</div>
</div>
</div>
)}
{/* Footer */}
<div className="text-center py-4 mt-12 border-t-4 border-black text-xs text-gray-600">
CY PRES CASE REPORT © 2025 | MONITORING CLASS ACTION SETTLEMENTS & DISTRIBUTIONS
</div>
</div>
)
}