import { createFormControl, createFormGroup } from "solid-forms"; import { Trans, useLingui } from "@lingui-solid/solid/macro"; import { useNavigate } from "@revolt/routing"; import { Column, Dialog, DialogProps, Form2, Text } from "@revolt/ui"; import { useModals } from ".."; import { Modals } from "../types"; const RE_INVITE_URL = /(?:invite|stt.gg)\/([a-z0-9]+)/gi; /** * Modal to join a server */ export function JoinServerModal( props: DialogProps & Modals & { type: "join_server" }, ) { const { t } = useLingui(); const navigate = useNavigate(); const { showError } = useModals(); const group = createFormGroup({ link: createFormControl("", { required: true }), }); async function onSubmit() { try { let code = group.controls.link.value; const match = RE_INVITE_URL.exec(code); if (match) code = match[1]; // fetch invite and display // const invite = await props.client.api.get(`/invites/${code}`); // TODO: replace const acceptedInvite = await props.client.api.post(`/invites/${code}`); if (acceptedInvite.type === "Server") { navigate(`/server/${acceptedInvite.server._id}`); } else { // TODO: group // navigate(`/channel/${result.channels}`); } props.onClose(); } catch (error) { showError(error); } } const submit = Form2.useSubmitHandler(group, onSubmit); return ( Join a server} actions={[ { text: Close }, { text: Join, onClick: () => { onSubmit(); return false; }, isDisabled: !Form2.canSubmit(group), }, ]} isDisabled={group.isPending} >
Use a code or invite link
); }