import { useRef, RefObject, ChangeEvent, MutableRefObject } from 'react'; import { Button, UncontrolledTooltip } from 'reactstrap'; import { faFileUpload as importIcon } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import ServersImporter from '../services/ServersImporter'; import { ServerData } from '../data'; import './ImportServersBtn.scss'; type Ref = RefObject | MutableRefObject; export interface ImportServersBtnProps { onImport?: () => void; onImportError?: (error: Error) => void; tooltipPlacement?: 'top' | 'bottom'; className?: string; } interface ImportServersBtnConnectProps extends ImportServersBtnProps { createServers: (servers: ServerData[]) => void; fileRef: Ref; } const ImportServersBtn = ({ importServersFromFile }: ServersImporter) => ({ createServers, fileRef, onImport = () => {}, onImportError = () => {}, tooltipPlacement = 'bottom', className = '', }: ImportServersBtnConnectProps) => { const ref = fileRef ?? useRef(); const onChange = async ({ target }: ChangeEvent) => importServersFromFile(target.files?.[0]) .then(createServers) .then(onImport) .then(() => { // Reset input after processing file (target as { value: string | null }).value = null; }) .catch(onImportError); return ( <> You can create servers by importing a CSV file with columns name, apiKey and url. ); }; export default ImportServersBtn;