import React, { useState, useEffect, useMemo } from "react"; import { BinRecord, PrepaidItem, PurchasedCard, generateInitialRecords, generatePrepaidItems, createRandomAccountNumber, } from "./data/mockData"; import { AccountDialog } from "./components/AccountDialog"; import { PaymentDialog } from "./components/PaymentDialog"; import { CustomDomainBadge } from "./components/CustomDomainBadge"; import { PurchasesView } from "./components/PurchasesView"; import { Search, SlidersHorizontal, RefreshCw, KeyRound, ExternalLink } from "lucide-react"; const ACCOUNT_NUMBER_KEY = "bin-lines-account-number"; const ACCOUNT_CONFIRMED_KEY = "bin-lines-account-number-confirmed"; const BALANCE_KEY = "bin-lines-account-balance"; const PURCHASES_KEY = "bin-lines-account-purchases"; type ActiveTab = "bins" | "enrolls" | "prepaids" | "purchases"; export default function App() { const [data] = useState(() => generateInitialRecords()); const [prepaids] = useState(() => generatePrepaidItems()); const [accountNumber, setAccountNumber] = useState(() => { const saved = localStorage.getItem(ACCOUNT_NUMBER_KEY); if (saved && /^\d{6}$/.test(saved)) return saved; const fresh = createRandomAccountNumber(); localStorage.setItem(ACCOUNT_NUMBER_KEY, fresh); return fresh; }); const [balance, setBalance] = useState(() => { const saved = localStorage.getItem(BALANCE_KEY); return saved ? Number(saved) : 0.0; }); const [purchasedCards, setPurchasedCards] = useState(() => { try { const saved = localStorage.getItem(PURCHASES_KEY); return saved ? JSON.parse(saved) : []; } catch { return []; } }); const [activeTab, setActiveTab] = useState("bins"); const [searchQuery, setSearchQuery] = useState(""); const [selectedBaseFilter, setSelectedBaseFilter] = useState("ALL"); const [isAccountDialogOpen, setIsAccountDialogOpen] = useState(false); const [paymentModalState, setPaymentModalState] = useState<{ isOpen: boolean; kind: "balance" | "buy"; bin?: string; product?: string; price: number; state?: string; zip?: string; baseType?: string; } | null>(null); useEffect(() => { const confirmed = localStorage.getItem(ACCOUNT_CONFIRMED_KEY); if (confirmed !== accountNumber) { setIsAccountDialogOpen(true); } }, [accountNumber]); useEffect(() => { localStorage.setItem(BALANCE_KEY, balance.toString()); }, [balance]); useEffect(() => { localStorage.setItem(PURCHASES_KEY, JSON.stringify(purchasedCards)); }, [purchasedCards]); const handleConfirmAccount = () => { localStorage.setItem(ACCOUNT_CONFIRMED_KEY, accountNumber); setIsAccountDialogOpen(false); }; const handleRegenerateAccount = () => { const fresh = createRandomAccountNumber(); setAccountNumber(fresh); localStorage.setItem(ACCOUNT_NUMBER_KEY, fresh); localStorage.removeItem(ACCOUNT_CONFIRMED_KEY); setIsAccountDialogOpen(true); }; const handleAddBalance = (amount: number) => { setBalance((prev) => prev + amount); }; const handleCardPurchased = (card: PurchasedCard) => { if (balance >= card.pricePaid) { setBalance((prev) => Math.max(0, prev - card.pricePaid)); } setPurchasedCards((prev) => [card, ...prev]); }; const openPaymentForBalance = () => { setPaymentModalState({ isOpen: true, kind: "balance", price: 0 }); }; const openPaymentForBin = (record: BinRecord) => { setPaymentModalState({ isOpen: true, kind: "buy", bin: record.bin, price: record.price, state: record.state, zip: record.zip, baseType: record.base, }); }; const openPaymentForPrepaid = (item: PrepaidItem) => { setPaymentModalState({ isOpen: true, kind: "buy", product: item.name, price: item.price, state: item.state, zip: "10001", baseType: "Prepaid Mastercard", }); }; const baseFilterOptions = [ "ALL", "TOP BASE", "FIRE BIN", "LIVE RATE", "LINKABLE", "ONLINE SHOPPING", "LUCKY", "FOOD", ]; const filteredBins = useMemo(() => { const query = searchQuery.trim().toLowerCase(); return data.bins.filter((record) => { if (selectedBaseFilter !== "ALL" && !record.base.toUpperCase().includes(selectedBaseFilter)) { return false; } if (!query) return true; const combined = `${record.bin} ${record.type} ${record.state} ${record.zip} ${record.country} ${record.base}`.toLowerCase(); return combined.includes(query); }); }, [data.bins, searchQuery, selectedBaseFilter]); const filteredEnrolls = useMemo(() => { const query = searchQuery.trim().toLowerCase(); return data.enrolls.filter((record) => { if (!query) return true; const combined = `${record.bin} ${record.type} ${record.state} ${record.zip} ${record.country} ${record.base}`.toLowerCase(); return combined.includes(query); }); }, [data.enrolls, searchQuery]); const filteredPrepaids = useMemo(() => { const query = searchQuery.trim().toLowerCase(); return prepaids.filter((item) => { if (!query) return true; const combined = `${item.name} ${item.state} ${item.price} ${item.faceValue}`.toLowerCase(); return combined.includes(query); }); }, [prepaids, searchQuery]); return (
{/* Telegram Banner */} JOIN OUR TELEGRAM {/* Custom Domain Badge */} {/* Account Summary Header */}
Balance

${balance.toFixed(2)}

setIsAccountDialogOpen(true)} >
Your account number {accountNumber}
{/* Brand Section */} {/* Tabs */}
{/* CC Tab */} {activeTab === "bins" && (
setSearchQuery(e.target.value)} className="w-full pr-10" />
Filters: {baseFilterOptions.map((opt) => ( ))}
{filteredBins.map((rec) => ( ))}
BIN Type State ZIP Country Base Buy
{rec.bin} {rec.type} {rec.state} {rec.zip} {rec.country} {rec.base}
)} {/* Enrolls Tab */} {activeTab === "enrolls" && (
{filteredEnrolls.map((rec) => ( ))}
BIN Type State ZIP Country Base Buy
{rec.bin} {rec.type} {rec.state} {rec.zip} {rec.country} {rec.base}
)} {/* Prepaids Tab */} {activeTab === "prepaids" && (
Fresh Restock Fresh Restock
{filteredPrepaids.map((item) => ( ))}
Prepaid State Buy
{ (e.target as HTMLImageElement).src = "/mastercard.png"; }} /> {item.name}
{item.state}
)} {/* Purchases Vault Tab */} {activeTab === "purchases" && (
setActiveTab("bins")} />
)} {/* Dialogs */} setPaymentModalState(null)} activePayment={paymentModalState} userBalance={balance} accountNumber={accountNumber} onAddBalance={handleAddBalance} onCardPurchased={handleCardPurchased} /> setIsAccountDialogOpen(false)} />
); } Built with KickStartMVP ♥