import { faFileDownload as exportIcon, faPlus as plusIcon } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import type { TimeoutToggle } from '@shlinkio/shlink-frontend-kit'; import { Button, Result, SearchInput, SimpleCard, Table } from '@shlinkio/shlink-frontend-kit/tailwind'; import type { FC } from 'react'; import { useMemo, useState } from 'react'; import { NoMenuLayout } from '../common/NoMenuLayout'; import type { FCWithDeps } from '../container/utils'; import { componentFactory, useDependencies } from '../container/utils'; import type { ServersMap } from './data'; import type { ImportServersBtnProps } from './helpers/ImportServersBtn'; import type { ManageServersRowProps } from './ManageServersRow'; import type { ServersExporter } from './services/ServersExporter'; type ManageServersProps = { servers: ServersMap; }; type ManageServersDeps = { ServersExporter: ServersExporter; ImportServersBtn: FC; useTimeoutToggle: TimeoutToggle; ManageServersRow: FC; }; const SHOW_IMPORT_MSG_TIME = 4000; const ManageServers: FCWithDeps = ({ servers }) => { const { ServersExporter: serversExporter, ImportServersBtn, useTimeoutToggle, ManageServersRow, } = useDependencies(ManageServers); const [searchTerm, setSearchTerm] = useState(''); const allServers = useMemo(() => Object.values(servers), [servers]); const filteredServers = useMemo( () => allServers.filter(({ name, url }) => `${name} ${url}`.toLowerCase().match(searchTerm.toLowerCase())), [allServers, searchTerm], ); const hasAutoConnect = allServers.some(({ autoConnect }) => !!autoConnect); // eslint-disable-next-line react-compiler/react-compiler const [errorImporting, setErrorImporting] = useTimeoutToggle(false, SHOW_IMPORT_MSG_TIME); return (
Import servers {filteredServers.length > 0 && ( )}
{hasAutoConnect && ( Auto-connect )} NameBase URLOptions )}> {!filteredServers.length && ( No servers found. )} {filteredServers.map((server) => ( ))}
{errorImporting && (
The servers could not be imported. Make sure the format is correct.
)}
); }; export const ManageServersFactory = componentFactory(ManageServers, [ 'ServersExporter', 'ImportServersBtn', 'useTimeoutToggle', 'ManageServersRow', ]);