import { createForm } from '@felte/solid' import { validator } from '@felte/validator-zod' import { useNavigate } from '@solidjs/router' import { IconX } from '@tabler/icons-solidjs' import ky from 'ky' import { For } from 'solid-js' import { v4 as uuid } from 'uuid' import { z } from 'zod' import { endpointList, setEndpointList, setSelectedEndpoint } from '~/signals' const schema = z.object({ url: z.string().url().nonempty(), secret: z.string(), }) export default () => { const navigate = useNavigate() const onSetupSuccess = (id: string) => { setSelectedEndpoint(id) navigate('/overview') } const checkEndpoint = (url: string, secret: string) => ky .get(url, { headers: secret ? { Authorization: `Bearer ${secret}`, } : {}, }) .then(({ ok }) => ok) .catch(() => false) const onEndpointSelect = async (id: string) => { const endpoint = endpointList().find((e) => e.id === id) if (!endpoint) { return } if (!(await checkEndpoint(endpoint.url, endpoint.secret))) { return } onSetupSuccess(id) } const { form } = createForm>({ extend: validator({ schema }), async onSubmit({ url, secret }) { const i = endpointList().findIndex((history) => history.url === url) if (i > -1) { const { id, secret: oldSecret } = endpointList()[i] if (secret !== oldSecret && !(await checkEndpoint(url, secret))) { endpointList()[i].secret = secret setEndpointList(endpointList()) } onSetupSuccess(id) return } if (!(await checkEndpoint(url, secret))) { return } const id = uuid() setEndpointList([{ id, url, secret }, ...endpointList()]) onSetupSuccess(id) }, }) const onRemove = (id: string) => setEndpointList(endpointList().filter((e) => e.id !== id)) return (
{({ id, url }) => (
onEndpointSelect(id)} > {url}
)}
) }