import { useState, useEffect } from 'react'; import { Settings, Link as LinkIcon, Trash2, RefreshCw, CheckCircle, XCircle, AlertCircle, UserPlus } from 'lucide-react'; import { cn } from '../lib/utils'; import { BrokerConnection } from '../types/broker'; import { InfluencerRegistration, ApprovalStatus } from '../types/influencerRegistration'; import { removeBrokerCredentials, clearAllBrokerCredentials } from '../config/brokerConfig'; import { influencers } from '../config/data'; interface AdminPanelProps { isOpen: boolean; onClose: () => void; } export const AdminPanel = ({ isOpen, onClose }: AdminPanelProps) => { const [connections, setConnections] = useState([]); const [registrations, setRegistrations] = useState([]); const [activeTab, setActiveTab] = useState<'connections' | 'registrations'>('connections'); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); // Load connections when panel opens useEffect(() => { if (isOpen) { loadConnections(); loadRegistrations(); } }, [isOpen]); const loadConnections = () => { setIsLoading(true); setError(null); try { const brokerCredentials = JSON.parse(localStorage.getItem('broker_credentials') || '{}'); const connectionList: BrokerConnection[] = Object.keys(brokerCredentials).map(influencerId => { const credentials = brokerCredentials[influencerId]; return { id: influencerId, influencerId, brokerType: 'ZERODHA', credentials, isConnected: !!credentials.accessToken, lastConnected: credentials.accessToken ? new Date().toISOString() : undefined, permissions: { allowPositions: true, allowOrders: false, allowHoldings: true, }, }; }); setConnections(connectionList); } catch (err) { setError('Failed to load connections'); console.error('Error loading connections:', err); } finally { setIsLoading(false); } }; const loadRegistrations = () => { try { const storedRegistrations = JSON.parse(localStorage.getItem('influencer_registrations') || '[]'); setRegistrations(storedRegistrations); } catch (err) { console.error('Error loading registrations:', err); setRegistrations([]); } }; const handleDisconnect = (influencerId: string) => { if (confirm('Are you sure you want to disconnect this broker account?')) { removeBrokerCredentials(influencerId); loadConnections(); } }; const handleClearAll = () => { if (confirm('Are you sure you want to clear all broker connections? This cannot be undone.')) { clearAllBrokerCredentials(); loadConnections(); } }; const handleRefresh = () => { loadConnections(); loadRegistrations(); }; const handleApproveRegistration = (registrationId: string) => { const updatedRegistrations = registrations.map(reg => { if (reg.id === registrationId) { return { ...reg, status: 'approved' as ApprovalStatus, reviewedAt: new Date().toISOString(), reviewedBy: 'admin', }; } return reg; }); setRegistrations(updatedRegistrations); localStorage.setItem('influencer_registrations', JSON.stringify(updatedRegistrations)); // Add to approved influencers list const approvedInfluencers = JSON.parse(localStorage.getItem('approved_influencers') || '[]'); const registration = updatedRegistrations.find(r => r.id === registrationId); if (registration) { approvedInfluencers.push({ id: registration.id, name: registration.name, email: registration.email, avatar: registration.avatar, bio: registration.bio, socialLinks: registration.socialLinks, tradingStyle: registration.tradingStyle, followers: registration.followers, isPrivate: registration.isPrivate, accessCode: registration.accessCode, }); localStorage.setItem('approved_influencers', JSON.stringify(approvedInfluencers)); } }; const handleRejectRegistration = (registrationId: string, reason: string) => { const updatedRegistrations = registrations.map(reg => { if (reg.id === registrationId) { return { ...reg, status: 'rejected' as ApprovalStatus, reviewedAt: new Date().toISOString(), reviewedBy: 'admin', rejectionReason: reason, }; } return reg; }); setRegistrations(updatedRegistrations); localStorage.setItem('influencer_registrations', JSON.stringify(updatedRegistrations)); }; const handleDeleteInfluencer = (influencerId: string) => { if (confirm('Are you sure you want to delete this influencer? This will remove their account, data, and all connections. This action cannot be undone.')) { // Remove from approved influencers const approvedInfluencers = JSON.parse(localStorage.getItem('approved_influencers') || '[]'); const updatedApproved = approvedInfluencers.filter((inf: any) => inf.id !== influencerId); localStorage.setItem('approved_influencers', JSON.stringify(updatedApproved)); // Remove from users const users = JSON.parse(localStorage.getItem('users') || '[]'); const updatedUsers = users.filter((user: any) => user.influencerId !== influencerId); localStorage.setItem('users', JSON.stringify(updatedUsers)); // Remove from registrations const existingRegistrations = JSON.parse(localStorage.getItem('influencer_registrations') || '[]'); const updatedRegistrations = existingRegistrations.filter((reg: any) => reg.id !== influencerId); localStorage.setItem('influencer_registrations', JSON.stringify(updatedRegistrations)); // Remove broker credentials removeBrokerCredentials(influencerId); // Refresh data loadRegistrations(); loadConnections(); } }; if (!isOpen) return null; return (

Broker Connections

Manage influencer broker integrations

{error && (
{error}
)}
{isLoading ? (
) : activeTab === 'connections' ? ( <> {connections.length === 0 ? (

No Broker Connections

Connect influencer Zerodha accounts to see them here

) : (
{connections.map((connection) => { const influencer = influencers.find(inf => inf.id === connection.influencerId); return (
{influencer?.avatar || 'NA'}

{influencer?.name || 'Unknown Influencer'}

{connection.isConnected ? 'Connected' : 'Disconnected'} {connection.brokerType}

API Key

{connection.credentials.apiKey.substring(0, 8)}...

Status

{connection.isConnected ? ( ) : ( )} {connection.isConnected ? 'Active' : 'Inactive'}

Permissions

{connection.permissions.allowPositions && ( Positions )} {connection.permissions.allowHoldings && ( Holdings )} {connection.permissions.allowOrders && ( Orders )}

Last Connected

{connection.lastConnected ? new Date(connection.lastConnected).toLocaleDateString() : 'Never' }

); })}
)} ) : ( <> {registrations.length === 0 ? (

No Registration Requests

Influencer registration requests will appear here

) : (
{registrations.map((registration) => (
{registration.avatar || registration.name.charAt(0).toUpperCase()}

{registration.name}

{registration.status.charAt(0).toUpperCase() + registration.status.slice(1)} {registration.isPrivate && ( Private )}

{registration.email}

{registration.status === 'pending' && (
)} {registration.status === 'approved' && ( )}

Trading Style

{registration.tradingStyle || 'N/A'}

Followers

{registration.followers?.toLocaleString() || '0'}

Submitted

{new Date(registration.submittedAt).toLocaleDateString()}

{registration.bio && (

Bio

{registration.bio}

)} {registration.rejectionReason && (

Rejection Reason: {registration.rejectionReason}

)}
))}
)} )}

Security Note

Broker credentials are stored locally in your browser. Never share your API credentials with anyone. Regularly review and revoke access for any suspicious connections.

); };