@@ -208,7 +248,7 @@ async function loadSymbols() {
item: (data) => `
${data.symbol}
`,
},
onChange(value) {
- const item = symbols.find(s => s.symbol === value);
+ const item = allSymbols.find(s => s.symbol === value);
if (!item) return;
document.getElementById('f-usdt').value = item.min_notional;
document.getElementById('f-min-label').textContent = `(min ${item.min_notional} USDT)`;
@@ -216,6 +256,17 @@ async function loadSymbols() {
});
}
+function openModal() {
+ document.getElementById('modal-overlay').classList.add('open');
+ if (symbolSelect) symbolSelect.focus();
+}
+
+function closeModal() {
+ document.getElementById('modal-overlay').classList.remove('open');
+}
+
+document.addEventListener('keydown', e => { if (e.key === 'Escape') closeModal(); });
+
async function loadBots() {
const res = await api('GET', '/bots');
const bots = await res.json();
@@ -276,13 +327,19 @@ async function loadClosed() {
async function createBot() {
const name = document.getElementById('f-name').value.trim();
- const symbol = document.getElementById('f-symbol').value.trim().toUpperCase();
+ const symbol = symbolSelect ? symbolSelect.getValue() : '';
const timeframe = document.getElementById('f-timeframe').value;
const usdt_amount = parseFloat(document.getElementById('f-usdt').value);
const profit_percent = parseFloat(document.getElementById('f-profit').value);
const testnet = document.getElementById('f-testnet').value === 'true';
if (!name || !symbol || !usdt_amount || !profit_percent) { alert('Tüm alanları doldurun'); return; }
await api('POST', '/bots', { name, symbol, timeframe, usdt_amount, profit_percent, testnet });
+ closeModal();
+ document.getElementById('f-name').value = '';
+ if (symbolSelect) symbolSelect.clear();
+ document.getElementById('f-usdt').value = '';
+ document.getElementById('f-profit').value = '';
+ document.getElementById('f-min-label').textContent = '';
loadBots();
}
@@ -304,17 +361,8 @@ async function deleteBot(id, name) {
function connectSSE() {
if (sseSource) sseSource.close();
- sseSource = new EventSource('/api/events', {
- headers: { 'Authorization': 'Bearer ' + AUTH_TOKEN }
- });
- // EventSource doesn't support custom headers natively; use URL param workaround
- sseSource.close();
sseSource = new EventSource(`/api/events?token=${encodeURIComponent(AUTH_TOKEN)}`);
-
- sseSource.addEventListener('trade', () => {
- loadPositions();
- loadClosed();
- });
+ sseSource.addEventListener('trade', () => { loadPositions(); loadClosed(); });
sseSource.onopen = () => {
document.getElementById('sse-dot').className = 'status-dot connected';
document.getElementById('sse-label').textContent = 'canlı';