import { Result, useToggle } from '@shlinkio/shlink-frontend-kit'; import type { FC } from 'react'; import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Button } from 'reactstrap'; import { v4 as uuid } from 'uuid'; import { NoMenuLayout } from '../common/NoMenuLayout'; import type { TimeoutToggle } from '../utils/helpers/hooks'; import { useGoBack } from '../utils/helpers/hooks'; import type { ServerData, ServersMap, ServerWithId } from './data'; import { DuplicatedServersModal } from './helpers/DuplicatedServersModal'; import type { ImportServersBtnProps } from './helpers/ImportServersBtn'; import { ServerForm } from './helpers/ServerForm'; const SHOW_IMPORT_MSG_TIME = 4000; interface CreateServerProps { createServers: (servers: ServerWithId[]) => void; servers: ServersMap; } const ImportResult = ({ type }: { type: 'error' | 'success' }) => (
{type === 'success' && 'Servers properly imported. You can now select one from the list :)'} {type === 'error' && 'The servers could not be imported. Make sure the format is correct.'}
); export const CreateServer = (ImportServersBtn: FC, useTimeoutToggle: TimeoutToggle) => ( { servers, createServers }: CreateServerProps, ) => { const navigate = useNavigate(); const goBack = useGoBack(); const hasServers = !!Object.keys(servers).length; const [serversImported, setServersImported] = useTimeoutToggle(false, SHOW_IMPORT_MSG_TIME); const [errorImporting, setErrorImporting] = useTimeoutToggle(false, SHOW_IMPORT_MSG_TIME); const [isConfirmModalOpen, toggleConfirmModal] = useToggle(); const [serverData, setServerData] = useState(); const save = () => { if (!serverData) { return; } const id = uuid(); createServers([{ ...serverData, id }]); navigate(`/server/${id}`); }; useEffect(() => { const serverExists = Object.values(servers).some( ({ url, apiKey }) => serverData?.url === url && serverData?.apiKey === apiKey, ); serverExists ? toggleConfirmModal() : save(); }, [serverData]); return ( Add new server} onSubmit={setServerData}> {!hasServers && ( )} {hasServers && } {serversImported && } {errorImporting && } ); };