import React, { useState, useEffect } from 'react';
import { Camera, Phone, Mail, AlertTriangle, Trophy, Zap, Target, Clock, FileText, Mic } from 'lucide-react';
const GaslightingTracker = () => {
const [activeCase, setActiveCase] = useState('afca');
const [gaslightingScore, setGaslightingScore] = useState(9847);
const [newSubmission, setNewSubmission] = useState('');
const [responseGenerated, setResponseGenerated] = useState('');
const [isGenerating, setIsGenerating] = useState(false);
// Real cases from Thomas's inbox
const liveCases = {
afca: {
name: "AFCA (Champion)",
status: "Active Gaslighting",
caseNumbers: ["12-25-256067", "CRM:02084000001535", "CRM:02088000001181"],
gaslightingLevel: 10,
techniques: [
"Schrödinger's Complaint (exists and doesn't exist)",
"Auto-Close System Blame",
"Circular Logic Mastery",
"Customer Service Suggestion After Months"
],
latestMove: "Suggests calling after months of email exchanges",
color: "from-red-500 to-red-700",
icon: "🏛️"
},
arma: {
name: "ARMA Debt Collection",
status: "Helpful Threat Active",
caseNumbers: ["76980560"],
gaslightingLevel: 8,
techniques: [
"Friendly Debt Collection",
"We're Here to Help (Pay Us)",
"Financial Difficulty Sympathy Theater"
],
latestMove: "$461.37 overdue with caring tone",
color: "from-orange-500 to-orange-700",
icon: "🚗"
},
art: {
name: "Australian Retirement Trust",
status: "Security Theater",
caseNumbers: ["MFA-2025"],
gaslightingLevel: 7,
techniques: [
"Security While Withholding Funds",
"MFA Compliance Theater",
"Account Protection Irony"
],
latestMove: "Multi-factor auth while blocking access",
color: "from-blue-500 to-blue-700",
icon: "💰"
}
};
const gaslightingPhrases = [
"We received your correspondence; however, we do not have enough information",
"The complaint has been automatically closed by our system",
"I suggest you call afca and talk to one of our customer service officers",
"We're here to help with your outstanding balance",
"For your security, we're implementing additional verification",
"This matter has been escalated to our specialized team",
"We understand your frustration, however...",
"As per our previous correspondence which you may not have received..."
];
const generateResponse = async () => {
setIsGenerating(true);
// Simulate API call with realistic delay
await new Promise(resolve => setTimeout(resolve, 2000));
const responses = [
`Dear [Institution Name],
Thank you for your email demonstrating peak bureaucratic artistry. I'm particularly impressed by your Schrödinger's Complaint approach - simultaneously received and not received.
I have documented this correspondence as Exhibit #${Math.floor(Math.random() * 100)} in my growing collection of institutional gaslighting. Your technique scores ${Math.floor(Math.random() * 3) + 8}/10 on the Kafka Scale.
I suggest YOU call ME when you've decided whether my complaint exists in your quantum filing system.
Regards,
Someone Who Records Everything`,
`To Whom It May Concern (Or Pretends Not To),
I acknowledge receipt of your non-acknowledgment of my complaint that both exists and doesn't exist in your parallel universe filing system.
Your automated system's decision to close what was never opened demonstrates cutting-edge bureaucratic innovation. I'm forwarding this to my legal team who specialize in institutional comedy.
Please don't suggest I call you. I have better things to do than engage with customer service roulette.
Best regards,
A Person With Functioning Brain Cells`,
`Dear Gaslighting Champions,
Congratulations! You've achieved new heights in bureaucratic absurdity. Your ability to receive correspondence while simultaneously lacking information is truly inspirational.
I'm creating a case study of your techniques for my "Institutional Gaslighting Hall of Fame." Your performance deserves recognition.
I'll be sharing this exchange with relevant ombudsmen who appreciate fine examples of administrative creativity.
Sincerely,
Your Biggest Fan (and Biggest Problem)`
];
setResponseGenerated(responses[Math.floor(Math.random() * responses.length)]);
setIsGenerating(false);
};
const currentCase = liveCases[activeCase];
return (
);
};
export default GaslightingTracker;
{/* Header */}
Gaslighting Score: {gaslightingScore.toLocaleString()}
Active Cases: {Object.keys(liveCases).length}
{/* Live Case Selector */}
{/* Response Generator */}
{/* Famous Gaslighting Phrases */}
{/* Documentation Tips */}
🎯 LIVE INSTITUTIONAL GASLIGHTING COMMAND CENTER
{Object.entries(liveCases).map(([key, case_]) => (
{/* Active Case Details */}
setActiveCase(key)}
className={`p-4 rounded-lg cursor-pointer transition-all duration-300 ${
activeCase === key
? `bg-gradient-to-r ${case_.color} transform scale-105 shadow-xl`
: 'bg-gray-800 hover:bg-gray-700'
}`}
>
))}
{case_.icon}
{case_.name}
{case_.status}
Gaslighting Level: {case_.gaslightingLevel}/10
{currentCase.icon} {currentCase.name} - Case Analysis
Level {currentCase.gaslightingLevel}/10
Gaslighting Techniques Detected:
-
{currentCase.techniques.map((technique, index) => (
- {technique} ))}
Case Numbers & Latest Move:
{currentCase.caseNumbers.map((num, index) => (
{num}
))}
Latest Move: {currentCase.latestMove}
Counter-Gaslighting Response Generator
{responseGenerated ? (
{responseGenerated && (
)}
{responseGenerated}
) : (
Your devastating counter-response will appear here...
)}
🎭 Famous Gaslighting Phrases in the Wild
{gaslightingPhrases.map((phrase, index) => (
))}
"{phrase}"
Ivan's Pro Documentation Strategy
Record Everything
Every call, every response, every hang-up
Document Timeline
Dates, case numbers, contradictions
Expose Patterns
Turn gaslighting into evidence