import React, { useState, useMemo, useEffect } from 'react';
import {
Search,
Download,
Settings,
ShieldAlert,
Hash,
Globe,
Filter,
Trash2,
ChevronLeft,
ChevronRight,
Info,
Smartphone
} from 'lucide-react';
const App = () => {
const [countryCode, setCountryCode] = useState('1');
const [startNumber, setStartNumber] = useState('5550100');
const [count, setCount] = useState(100);
const [numbers, setNumbers] = useState([]);
const [isGenerating, setIsGenerating] = useState(false);
const [searchTerm, setSearchTerm] = useState('');
const [currentPage, setCurrentPage] = useState(1);
const [showDisclaimer, setShowDisclaimer] = useState(true);
const itemsPerPage = 10;
// Mock Carrier/Metadata Logic
const generateMetadata = (num) => {
const carriers = ['Mobile One', 'Global Connect', 'TeleNet', 'Horizon Wireless'];
return {
carrier: carriers[Math.floor(Math.random() * carriers.length)],
type: Math.random() > 0.3 ? 'Mobile' : 'Landline',
valid: true
};
};
const handleGenerate = () => {
setIsGenerating(true);
setTimeout(() => {
const newBatch = [];
const base = parseInt(startNumber);
for (let i = 0; i < Math.min(count, 1000); i++) {
const fullNum = `+${countryCode}${base + i}`;
newBatch.push({
id: i,
raw: base + i,
formatted: fullNum,
...generateMetadata(fullNum)
});
}
setNumbers(newBatch);
setIsGenerating(false);
setCurrentPage(1);
}, 800);
};
const filteredNumbers = useMemo(() => {
return numbers.filter(n =>
n.formatted.includes(searchTerm) || n.carrier.toLowerCase().includes(searchTerm.toLowerCase())
);
}, [numbers, searchTerm]);
const paginatedNumbers = useMemo(() => {
const start = (currentPage - 1) * itemsPerPage;
return filteredNumbers.slice(start, start + itemsPerPage);
}, [filteredNumbers, currentPage]);
const exportCSV = () => {
const headers = "ID,Full Number,Type,Carrier\n";
const rows = numbers.map(n => `${n.id},${n.formatted},${n.type},${n.carrier}`).join("\n");
const blob = new Blob([headers + rows], { type: 'text/csv' });
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.setAttribute('hidden', '');
a.setAttribute('href', url);
a.setAttribute('download', 'phone_export.csv');
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
};
if (showDisclaimer) {
return (
Ethical Use Policy
This tool is designed for **research, testing, and educational purposes only**.
Generating numbers does not imply ownership or access to real user data.
Automated calling or SMS via this tool is strictly prohibited.
setShowDisclaimer(false)}
className="w-full bg-blue-600 hover:bg-blue-700 text-white font-semibold py-3 rounded-xl transition-all shadow-lg active:scale-95"
>
I Accept & Continue
);
}
return (
{/* Header */}
{/* Controls Grid */}
{isGenerating ? 'Generating Numbers...' : 'Generate Exploration Batch'}
{/* Analytics Mini-Dashboard */}
{numbers.length > 0 && (
Total Batch
{numbers.length}
)}
{/* Results Table */}
#
Phone Number
Carrier
Type
Status
{paginatedNumbers.map((num, idx) => (
{(currentPage - 1) * itemsPerPage + idx + 1}
{num.formatted}
{num.carrier}
{num.type}
))}
{numbers.length === 0 && (
No numbers generated yet
Enter a start number and click generate to begin.
)}
{/* Pagination */}
{filteredNumbers.length > itemsPerPage && (
Showing {((currentPage - 1) * itemsPerPage) + 1} to {Math.min(currentPage * itemsPerPage, filteredNumbers.length)} of {filteredNumbers.length}
setCurrentPage(p => Math.max(1, p - 1))}
className="p-2 bg-white border rounded-lg hover:bg-slate-50 disabled:opacity-50"
disabled={currentPage === 1}
>
setCurrentPage(p => p + 1)}
className="p-2 bg-white border rounded-lg hover:bg-slate-50 disabled:opacity-50"
disabled={currentPage * itemsPerPage >= filteredNumbers.length}
>
)}
);
};
export default App;