import type { TimeoutToggle } from '@shlinkio/shlink-frontend-kit'; import { useToggle } from '@shlinkio/shlink-frontend-kit'; import type { ResultProps } from '@shlinkio/shlink-frontend-kit/tailwind'; import { Button, Result } from '@shlinkio/shlink-frontend-kit/tailwind'; import type { FC } from 'react'; import { useCallback, useState } from 'react'; import { useNavigate } from 'react-router'; import { NoMenuLayout } from '../common/NoMenuLayout'; import type { FCWithDeps } from '../container/utils'; import { componentFactory, useDependencies } from '../container/utils'; import { useGoBack } from '../utils/helpers/hooks'; import type { ServerData, ServersMap, ServerWithId } from './data'; import { ensureUniqueIds } from './helpers'; import { DuplicatedServersModal } from './helpers/DuplicatedServersModal'; import type { ImportServersBtnProps } from './helpers/ImportServersBtn'; import { ServerForm } from './helpers/ServerForm'; const SHOW_IMPORT_MSG_TIME = 4000; type CreateServerProps = { createServers: (servers: ServerWithId[]) => void; servers: ServersMap; }; type CreateServerDeps = { ImportServersBtn: FC; useTimeoutToggle: TimeoutToggle; }; const ImportResult = ({ variant }: Pick) => (
{variant === 'success' && 'Servers properly imported. You can now select one from the list :)'} {variant === 'error' && 'The servers could not be imported. Make sure the format is correct.'}
); const CreateServer: FCWithDeps = ({ servers, createServers }) => { const { ImportServersBtn, useTimeoutToggle } = useDependencies(CreateServer); const navigate = useNavigate(); const goBack = useGoBack(); const hasServers = !!Object.keys(servers).length; // eslint-disable-next-line react-compiler/react-compiler const [serversImported, setServersImported] = useTimeoutToggle(false, SHOW_IMPORT_MSG_TIME); // eslint-disable-next-line react-compiler/react-compiler const [errorImporting, setErrorImporting] = useTimeoutToggle(false, SHOW_IMPORT_MSG_TIME); const [isConfirmModalOpen, toggleConfirmModal] = useToggle(); const [serverData, setServerData] = useState(); const saveNewServer = useCallback((newServerData: ServerData) => { const [newServerWithUniqueId] = ensureUniqueIds(servers, [newServerData]); createServers([newServerWithUniqueId]); navigate(`/server/${newServerWithUniqueId.id}`); }, [createServers, navigate, servers]); const onSubmit = useCallback((newServerData: ServerData) => { setServerData(newServerData); const serverExists = Object.values(servers).some( ({ url, apiKey }) => newServerData.url === url && newServerData.apiKey === apiKey, ); if (serverExists) { toggleConfirmModal(); } else { saveNewServer(newServerData); } }, [saveNewServer, servers, toggleConfirmModal]); return ( {!hasServers && ( )} {hasServers && } {serversImported && } {errorImporting && } serverData && saveNewServer(serverData)} /> ); }; export const CreateServerFactory = componentFactory(CreateServer, ['ImportServersBtn', 'useTimeoutToggle']);