soapbox/src/features/landing-page/index.tsx

109 wiersze
3.6 KiB
TypeScript
Czysty Zwykły widok Historia

import React from 'react';
import { FormattedMessage } from 'react-intl';
import { prepareRequest } from 'soapbox/actions/consumer-auth';
import Markup from 'soapbox/components/markup';
import { Button, Card, CardBody, Stack, Text } from 'soapbox/components/ui';
2022-11-16 13:32:32 +00:00
import RegistrationForm from 'soapbox/features/auth-login/components/registration-form';
2023-09-19 02:03:23 +00:00
import { useAppDispatch, useFeatures, useInstance, useSoapboxConfig } from 'soapbox/hooks';
import { capitalize } from 'soapbox/utils/strings';
2022-03-21 18:09:01 +00:00
const LandingPage = () => {
const dispatch = useAppDispatch();
const features = useFeatures();
const soapboxConfig = useSoapboxConfig();
2022-11-26 16:38:16 +00:00
const instance = useInstance();
/** Registrations are closed */
2022-03-21 18:09:01 +00:00
const renderClosed = () => {
return (
<Stack space={3} data-testid='registrations-closed'>
2022-03-21 18:09:01 +00:00
<Text size='xl' weight='bold' align='center'>
<FormattedMessage
id='registration.closed_title'
defaultMessage='Registrations Closed'
/>
2022-03-21 18:09:01 +00:00
</Text>
<Text theme='muted' align='center'>
<FormattedMessage
id='registration.closed_message'
2022-03-21 18:09:01 +00:00
defaultMessage='{instance} is not accepting new members.'
values={{ instance: instance.title }}
/>
2022-03-21 18:09:01 +00:00
</Text>
</Stack>
);
2022-03-21 18:09:01 +00:00
};
/** Mastodon API registrations are open */
const renderOpen = () => {
return <RegistrationForm />;
};
/** Display login button for external provider. */
const renderProvider = () => {
const { authProvider } = soapboxConfig;
return (
<Stack space={3}>
<Stack>
<Text size='2xl' weight='bold' align='center'>
<FormattedMessage id='registrations.get_started' defaultMessage="Let's get started!" />
</Text>
</Stack>
<Button onClick={() => dispatch(prepareRequest(authProvider))} theme='primary' block>
<FormattedMessage
id='oauth_consumer.tooltip'
defaultMessage='Sign in with {provider}'
values={{ provider: capitalize(authProvider) }}
/>
</Button>
</Stack>
);
};
// Render registration flow depending on features
const renderBody = () => {
if (soapboxConfig.authProvider) {
return renderProvider();
} else if (features.accountCreation && instance.registrations) {
return renderOpen();
} else {
return renderClosed();
}
};
2022-03-21 18:09:01 +00:00
return (
2022-04-21 19:29:25 +00:00
<main className='mt-16 sm:mt-24' data-testid='homepage'>
2022-03-21 18:09:01 +00:00
<div className='mx-auto max-w-7xl'>
2023-02-01 22:13:42 +00:00
<div className='grid grid-cols-1 gap-8 py-12 lg:grid-cols-12'>
<div className='px-4 sm:px-6 sm:text-center md:mx-auto md:max-w-2xl lg:col-span-6 lg:flex lg:text-start'>
2022-05-28 00:50:51 +00:00
<div className='w-full'>
2022-03-21 18:09:01 +00:00
<Stack space={3}>
2023-02-01 22:13:42 +00:00
<h1 className='overflow-hidden text-ellipsis bg-gradient-to-br from-accent-500 via-primary-500 to-gradient-end bg-clip-text text-5xl font-extrabold text-transparent sm:mt-5 sm:leading-none lg:mt-6 lg:text-6xl xl:text-7xl'>
2022-03-21 18:45:57 +00:00
{instance.title}
2022-03-21 18:09:01 +00:00
</h1>
2022-05-10 19:52:12 +00:00
<Markup
size='lg'
dangerouslySetInnerHTML={{ __html: instance.short_description || instance.description }}
/>
2022-03-21 18:09:01 +00:00
</Stack>
2020-04-10 20:24:12 +00:00
</div>
</div>
2023-02-01 22:13:42 +00:00
<div className='self-center sm:mt-24 lg:col-span-6 lg:mt-0'>
<Card size='xl' variant='rounded' className='sm:mx-auto sm:w-full sm:max-w-md'>
2022-03-21 18:09:01 +00:00
<CardBody>
{renderBody()}
2022-03-21 18:09:01 +00:00
</CardBody>
</Card>
2020-04-10 20:24:12 +00:00
</div>
</div>
2022-03-21 18:09:01 +00:00
</div>
</main>
);
};
2022-03-21 18:09:01 +00:00
export default LandingPage;