import { Dialog, Transition } from '@headlessui/react'; import { XMarkIcon } from '@heroicons/react/24/outline'; import React, { useState } from 'react'; import { AddSourceRequest } from '../types'; interface AddSourceDialogProps { isOpen: boolean; onClose: () => void; onAddSource: (request: AddSourceRequest) => Promise; exchangeId: string; exchangeName: string; } export function AddSourceDialog({ isOpen, onClose, onAddSource, exchangeName, }: AddSourceDialogProps) { const [source, setSource] = useState(''); const [sourceCode, setSourceCode] = useState(''); const [id, setId] = useState(''); const [name, setName] = useState(''); const [code, setCode] = useState(''); const [aliases, setAliases] = useState(''); const [loading, setLoading] = useState(false); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!source || !sourceCode || !id || !name || !code) return; setLoading(true); try { await onAddSource({ source, source_code: sourceCode, mapping: { id, name, code, aliases: aliases .split(',') .map(a => a.trim()) .filter(Boolean), }, }); // Reset form setSource(''); setSourceCode(''); setId(''); setName(''); setCode(''); setAliases(''); } catch (error) { console.error('Error adding source:', error); } finally { setLoading(false); } }; return (
Add Source to {exchangeName}
setSourceCode(e.target.value)} className="w-full bg-surface border border-border rounded px-3 py-2 text-text-primary focus:ring-1 focus:ring-primary-500 focus:border-primary-500" placeholder="e.g., IB, ALP, POLY" required />
setId(e.target.value)} className="w-full bg-surface border border-border rounded px-3 py-2 text-text-primary focus:ring-1 focus:ring-primary-500 focus:border-primary-500" placeholder="e.g., NYSE, NASDAQ" required />
setName(e.target.value)} className="w-full bg-surface border border-border rounded px-3 py-2 text-text-primary focus:ring-1 focus:ring-primary-500 focus:border-primary-500" placeholder="e.g., New York Stock Exchange" required />
setCode(e.target.value)} className="w-full bg-surface border border-border rounded px-3 py-2 text-text-primary focus:ring-1 focus:ring-primary-500 focus:border-primary-500" placeholder="e.g., NYSE" required />
setAliases(e.target.value)} className="w-full bg-surface border border-border rounded px-3 py-2 text-text-primary focus:ring-1 focus:ring-primary-500 focus:border-primary-500" placeholder="e.g., NYSE, New York, Big Board" />
); }