import styles from './Invite.module.scss'; import Button from '../../components/ui/Button'; import { ArrowBack } from "@styled-icons/boxicons-regular"; import Overline from '../../components/ui/Overline'; import { Invites } from "revolt.js/dist/api/objects"; import Preloader from '../../components/ui/Preloader'; import { takeError } from "../../context/revoltjs/util"; import { useHistory, useParams } from "react-router-dom"; import ServerIcon from '../../components/common/ServerIcon'; import UserIcon from '../../components/common/user/UserIcon'; import { useContext, useEffect, useState } from "preact/hooks"; import RequiresOnline from '../../context/revoltjs/RequiresOnline'; import { AppContext, ClientStatus, StatusContext } from "../../context/revoltjs/RevoltClient"; export default function Invite() { const history = useHistory(); const client = useContext(AppContext); const status = useContext(StatusContext); const { code } = useParams<{ code: string }>(); const [ processing, setProcessing ] = useState(false); const [ error, setError ] = useState<string | undefined>(undefined); const [ invite, setInvite ] = useState<Invites.RetrievedInvite | undefined>(undefined); useEffect(() => { if (typeof invite === 'undefined' && (status === ClientStatus.ONLINE || status === ClientStatus.READY)) { client.fetchInvite(code) .then(data => setInvite(data)) .catch(err => setError(takeError(err))) } }, [ status ]); if (typeof invite === 'undefined') { return ( <div className={styles.preloader}> <RequiresOnline> { error ? <Overline type="error" error={error} /> : <Preloader type="spinner" /> } </RequiresOnline> </div> ) } // ! FIXME: add i18n translations return ( <div className={styles.invite} style={{ backgroundImage: invite.server_banner ? `url('${client.generateFileURL(invite.server_banner)}')` : undefined }}> <div className={styles.leave}> <ArrowBack size={32} onClick={() => history.push('/')} /> </div> { !processing && <div className={styles.icon}> <ServerIcon attachment={invite.server_icon} server_name={invite.server_name} size={64} /> </div> } <div className={styles.details}> { processing ? <Preloader type="ring" /> : <> <h1>{ invite.server_name }</h1> <h2>#{invite.channel_name}</h2> <h3>Invited by <UserIcon size={24} attachment={invite.user_avatar} /> { invite.user_name }</h3> <Overline type="error" error={error} /> <Button contrast onClick={ async () => { if (status === ClientStatus.READY) { return history.push('/'); } try { setProcessing(true); let result = await client.joinInvite(code); if (result.type === 'Server') { history.push(`/server/${result.server._id}/channel/${result.channel._id}`); } } catch (err) { setError(takeError(err)); setProcessing(false); } } } >{ status === ClientStatus.READY ? 'Login to REVOLT' : 'Accept Invite' }</Button> </> } </div> </div> ); }