← 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>
  )
}