diff --git "a/src/app/components/\"use clients\".js" "b/src/app/components/\"use clients\".js" deleted file mode 100644 index f12cd60..0000000 --- "a/src/app/components/\"use clients\".js" +++ /dev/null @@ -1,404 +0,0 @@ -"use client"; -import React, { useState } from 'react'; -import { Search, Filter, Plus, X, Edit2, Trash2, Copy, Eye, EyeOff } from 'lucide-react'; - -export default function BrokerManagementApp() { - const [route, setRoute] = useState('brokers'); - const [modal, setModal] = useState({ show: false, mode: 'add', data: null }); - const [search, setSearch] = useState(''); - const [tab, setTab] = useState('active'); - const [errors, setErrors] = useState({}); - const [hiddenRows, setHiddenRows] = useState([]); - const [showFilters, setShowFilters] = useState(false); - const [filters, setFilters] = useState({ broker: '', status: '', dateFrom: '', dateTo: '' }); - const [form, setForm] = useState({ name: '', broker: '', apiKey: '', secretKey: '', balance: '' }); - const [brokers, setBrokers] = useState([ - { id: 1, name: 'MarketAxess', apiId: '88234', broker: 'Meta5', date: 'Feb 14, 2025', status: 'active', balance: '$150.25', on: true }, - { id: 2, name: 'Tradeweb Markets', apiId: '89245', broker: 'Angel One', date: 'Mar 01, 2025', status: 'inactive', balance: '$175.50', on: true }, - { id: 3, name: 'MarketAxess', apiId: '88234', broker: 'Meta5', date: 'Feb 14, 2025', status: 'active', balance: '$150.25', on: false }, - { id: 4, name: 'Tradeweb Markets', apiId: '89245', broker: 'Zerodha', date: 'Mar 01, 2025', status: 'warning', balance: '$175.50', on: true }, - { id: 5, name: 'MarketAxess', apiId: '88234', broker: 'Dhan', date: 'Feb 14, 2025', status: 'active', balance: '$150.25', on: true }, - ]); - - const brokerList = ['Meta5', 'Angel One', 'Zerodha', 'Dhan', 'Upstox']; - const routes = ['Dashboard', 'Brokers', 'Scan & Trade', 'Positions', 'AI Strategy Builder']; - - const handleChange = (e) => { - const { name, value } = e.target; - setForm(prev => ({ ...prev, [name]: value })); - if (errors[name]) setErrors(prev => ({ ...prev, [name]: '' })); - }; - - const handleFilterChange = (e) => { - const { name, value } = e.target; - setFilters(prev => ({ ...prev, [name]: value })); - }; - - const clearFilters = () => { - setFilters({ broker: '', status: '', dateFrom: '', dateTo: '' }); - }; - - const validate = () => { - const err = {}; - if (!form.name.trim()) err.name = 'Name required'; - if (!form.broker) err.broker = 'Select broker'; - if (!form.apiKey.trim()) err.apiKey = 'API Key required'; - if (!form.secretKey.trim()) err.secretKey = 'Secret Key required'; - if (form.balance && isNaN(parseFloat(form.balance))) err.balance = 'Invalid balance'; - setErrors(err); - return Object.keys(err).length === 0; - }; - - const openAdd = () => { - setModal({ show: true, mode: 'add', data: null }); - setForm({ name: '', broker: '', apiKey: '', secretKey: '', balance: '' }); - setErrors({}); - }; - - const openEdit = (broker) => { - setModal({ show: true, mode: 'edit', data: broker }); - setForm({ name: broker.name, broker: broker.broker, apiKey: broker.apiId, secretKey: 'sk-41Z8kLjY...', balance: broker.balance.replace('$', '') }); - setErrors({}); - }; - - const deleteBroker = (id) => { - if (confirm('Delete this broker?')) setBrokers(brokers.filter(b => b.id !== id)); - }; - - const submit = () => { - if (!validate()) return; - if (modal.mode === 'add') { - const newBroker = { - id: Date.now(), name: form.name, apiId: Math.floor(10000 + Math.random() * 90000).toString(), - broker: form.broker, date: new Date().toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }), - status: 'active', balance: `$${parseFloat(form.balance || 0).toFixed(2)}`, on: true - }; - setBrokers([...brokers, newBroker]); - } else { - setBrokers(brokers.map(b => b.id === modal.data.id ? { ...b, name: form.name, broker: form.broker, balance: `$${parseFloat(form.balance || 0).toFixed(2)}` } : b)); - } - setModal({ show: false, mode: 'add', data: null }); - }; - - const toggle = (id) => setBrokers(brokers.map(b => b.id === id ? { ...b, on: !b.on } : b)); - - const toggleVisibility = (id) => { - setHiddenRows(prev => prev.includes(id) ? prev.filter(i => i !== id) : [...prev, id]); - }; - - const exportToCSV = () => { - const headers = ['Name', 'API ID', 'Broker', 'Date Added', 'Status', 'Balance', 'On/Off']; - const csvData = filtered.map(b => [ - b.name, - b.apiId, - b.broker, - b.date, - b.status, - b.balance, - b.on ? 'On' : 'Off' - ]); - - const csvContent = [ - headers.join(','), - ...csvData.map(row => row.join(',')) - ].join('\n'); - - const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); - const link = document.createElement('a'); - const url = URL.createObjectURL(blob); - link.setAttribute('href', url); - link.setAttribute('download', `brokers_${new Date().toISOString().split('T')[0]}.csv`); - link.style.visibility = 'hidden'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }; - - const statusIcon = (status) => { - const colors = { active: 'bg-green-500', inactive: 'bg-red-500', warning: 'bg-yellow-500' }; - return
; - }; - - const filtered = brokers.filter(b => { - const matchSearch = b.name.toLowerCase().includes(search.toLowerCase()) || b.broker.toLowerCase().includes(search.toLowerCase()); - const matchTab = tab === 'active' ? b.status === 'active' : tab === 'inactive' ? b.status === 'inactive' : tab === 'expired' ? b.status === 'expired' : true; - const matchBrokerFilter = !filters.broker || b.broker === filters.broker; - const matchStatusFilter = !filters.status || b.status === filters.status; - - let matchDateFilter = true; - if (filters.dateFrom || filters.dateTo) { - const brokerDate = new Date(b.date); - if (filters.dateFrom) matchDateFilter = matchDateFilter && brokerDate >= new Date(filters.dateFrom); - if (filters.dateTo) matchDateFilter = matchDateFilter && brokerDate <= new Date(filters.dateTo); - } - - return matchSearch && matchTab && matchBrokerFilter && matchStatusFilter && matchDateFilter && !hiddenRows.includes(b.id); - }); - - return ( -
-
-
-
-
-
-
-
- Hook nest -
- -
-
- - - -
- NSE - 📊 -
- -
-
-
- -
- {route === 'brokers' ? ( -
-
-
-
- 👥 - Brokers / API Management -
-
- - - -
-
-
-
-
- - setSearch(e.target.value)} - className="pl-10 pr-4 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-teal-500" /> -
- -
- {['active', 'inactive', 'expired'].map(t => ( - - ))} -
-
-
- - -
-
-
- - {showFilters && ( -
-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- -
-
- )} - -
- - - - {['Name', 'API ID', 'Broker', 'Date Added', 'Status', 'Balance', 'Action', 'On/Off'].map(h => ( - - ))} - - - - {filtered.map(b => ( - - - - - - - - - - - ))} - -
{h}
{b.name}{b.apiId} -
-
{b.broker[0]}
- {b.broker} -
-
{b.date}{statusIcon(b.status)}{b.balance} -
- - - -
-
- -
-
-
- ) : ( -
-

{routes.find(r => route === r.toLowerCase().replace(/ & /g, '-').replace(/ /g, '-'))}

-

This page is under construction

-
- )} -
- -
-
setModal({ show: false, mode: 'add', data: null })}>
-
-
-
-
-

{modal.mode === 'add' ? 'Add Broker' : 'Edit Broker'}

-

Choose your preferred exchange to add a broker.

-
- -
- -
-
-

Broker Details

-
- - - {errors.name &&

{errors.name}

} -
-
- - - {errors.broker &&

{errors.broker}

} -
-
- -
-
-

API Details

- {modal.mode === 'edit' && ( - - )} -
-
- -
- - -
- {errors.apiKey &&

{errors.apiKey}

} -

Date {modal.mode === 'add' ? 'Created' : 'Modified'}: {modal.mode === 'add' ? new Date().toLocaleDateString() : '30/12/2025'}

-
-
- - - {errors.secretKey &&

{errors.secretKey}

} -
-
- - - {errors.balance &&

{errors.balance}

} -
- {modal.mode === 'add' && form.broker && ( - Help me connect to the API - )} -
-
- -
- - -
-
-
-
-
- ); -} \ No newline at end of file diff --git a/src/app/components/BrokerManagement.jsx b/src/app/components/BrokerManagement.jsx index cfc02ea..fd105cd 100644 --- a/src/app/components/BrokerManagement.jsx +++ b/src/app/components/BrokerManagement.jsx @@ -13,7 +13,7 @@ export default function BrokerManagementApp() { const [brokers, setBrokers] = useState([ { id: 1, name: 'MarketAxess', apiId: '88234', broker: 'Meta5', date: 'Feb 14, 2025', status: 'active', balance: '$150.25', on: true }, { id: 2, name: - 'Tradeweb Markets', apiId: '89245', broker: 'Angel One', date: 'Mar 01, 2025', status: 'inactive', balance: '$175.50', on: true }, + 'Tradeweb Market', apiId: '89245', broker: 'Angel One', date: 'Mar 01, 2025', status: 'inactive', balance: '$175.50', on: true }, { id: 3, name: 'MarketAxess', apiId: '88234', broker: 'Meta5', date: 'Feb 14, 2025', status: 'active', balance: '$150.25', on: false }, { id: 4, name: 'Tradeweb Markets', apiId: '89245', broker: 'Zerodha', date: 'Mar 01, 2025', status: 'warning', balance: '$175.50', on: true }, { id: 5, name: 'MarketAxess', apiId: '88234', broker: 'Dhan', date: 'Feb 14, 2025', status: 'active', balance: '$150.25', on: true },