Files
Athou_commafeed/commafeed-client/src/pages/WelcomePage.tsx

155 lines
5.1 KiB
TypeScript
Raw Normal View History

import { Trans } from "@lingui/macro"
2023-12-29 23:09:30 +01:00
import { Anchor, Box, Center, Container, Divider, Group, Image, Space, Title, useMantineColorScheme } from "@mantine/core"
2023-05-05 14:55:03 +02:00
import { client } from "app/client"
import { redirectToApiDocumentation, redirectToLogin, redirectToRegistration, redirectToRootCategory } from "app/redirect/thunks"
2023-05-05 14:55:03 +02:00
import { useAppDispatch, useAppSelector } from "app/store"
2024-02-29 13:51:26 +01:00
import welcomePageDark from "assets/welcome_page_dark.png"
import welcomePageLight from "assets/welcome_page_light.png"
2023-06-27 08:21:30 +02:00
import { ActionButton } from "components/ActionButton"
import { useBrowserExtension } from "hooks/useBrowserExtension"
2023-06-21 09:13:20 +02:00
import { useMobile } from "hooks/useMobile"
2023-05-04 21:27:02 +02:00
import { useAsyncCallback } from "react-async-hook"
import { SiGithub, SiTwitter } from "react-icons/si"
import { TbClock, TbKey, TbMoon, TbSettings, TbSun, TbUserPlus } from "react-icons/tb"
2023-05-04 21:27:02 +02:00
import { PageTitle } from "./PageTitle"
2023-06-27 19:05:38 +02:00
const iconSize = 18
2023-05-04 21:27:02 +02:00
export function WelcomePage() {
2023-06-27 19:05:38 +02:00
const serverInfos = useAppSelector(state => state.server.serverInfos)
2023-05-04 21:27:02 +02:00
const { colorScheme } = useMantineColorScheme()
2023-06-27 19:05:38 +02:00
const dispatch = useAppDispatch()
2024-02-29 13:51:26 +01:00
const image = colorScheme === "light" ? welcomePageLight : welcomePageDark
2023-06-27 19:05:38 +02:00
const login = useAsyncCallback(client.user.login, {
onSuccess: () => {
dispatch(redirectToRootCategory())
},
})
2023-05-04 21:27:02 +02:00
return (
<Container>
<Header />
2023-12-29 23:09:30 +01:00
<Center my="lg">
2023-05-04 21:27:02 +02:00
<Title order={3}>Bloat-free feed reader</Title>
</Center>
2023-06-27 19:05:38 +02:00
{serverInfos?.demoAccountEnabled && (
<Center>
<ActionButton
label={<Trans>Try the demo!</Trans>}
icon={<TbClock size={iconSize} />}
variant="outline"
2023-12-28 19:54:51 +01:00
onClick={async () => await login.execute({ name: "demo", password: "demo" })}
2023-06-27 19:05:38 +02:00
showLabelOnMobile
/>
</Center>
)}
2023-12-29 23:09:30 +01:00
<Divider my="lg" />
2023-05-04 21:27:02 +02:00
<Image src={image} />
2023-12-29 23:09:30 +01:00
<Divider my="lg" />
2023-05-04 21:27:02 +02:00
<Footer />
2023-12-29 23:09:30 +01:00
<Space h="lg" />
2023-05-04 21:27:02 +02:00
</Container>
)
}
function Header() {
2023-06-21 09:13:20 +02:00
const mobile = useMobile()
2023-05-04 21:27:02 +02:00
if (mobile) {
return (
<>
<PageTitle />
<Center>
<Buttons />
</Center>
</>
)
}
return (
2023-12-29 23:09:30 +01:00
<Group justify="space-between">
<Box>
<PageTitle />
</Box>
<Box>
<Buttons />
</Box>
2023-05-04 21:27:02 +02:00
</Group>
)
}
function Buttons() {
const serverInfos = useAppSelector(state => state.server.serverInfos)
const { colorScheme, toggleColorScheme } = useMantineColorScheme()
const { isBrowserExtensionPopup, openSettingsPage } = useBrowserExtension()
2023-05-04 21:27:02 +02:00
const dispatch = useAppDispatch()
const dark = colorScheme === "dark"
2023-05-04 21:27:02 +02:00
return (
2023-12-29 23:09:30 +01:00
<Group gap={14}>
2023-05-04 21:27:02 +02:00
<ActionButton
label={<Trans>Log in</Trans>}
2023-05-04 21:27:02 +02:00
icon={<TbKey size={iconSize} />}
variant="outline"
2023-12-28 19:54:51 +01:00
onClick={async () => await dispatch(redirectToLogin())}
2023-05-04 21:27:02 +02:00
showLabelOnMobile
/>
{serverInfos?.allowRegistrations && (
<ActionButton
label={<Trans>Sign up</Trans>}
2023-05-04 21:27:02 +02:00
icon={<TbUserPlus size={iconSize} />}
variant="filled"
2023-12-28 19:54:51 +01:00
onClick={async () => await dispatch(redirectToRegistration())}
2023-05-04 21:27:02 +02:00
showLabelOnMobile
/>
)}
<ActionButton
label={dark ? <Trans>Switch to light theme</Trans> : <Trans>Switch to dark theme</Trans>}
2023-05-04 21:27:02 +02:00
icon={colorScheme === "dark" ? <TbSun size={18} /> : <TbMoon size={iconSize} />}
onClick={() => toggleColorScheme()}
hideLabelOnDesktop
2023-05-04 21:27:02 +02:00
/>
{isBrowserExtensionPopup && (
<ActionButton
label={<Trans>Extension options</Trans>}
icon={<TbSettings size={iconSize} />}
onClick={() => openSettingsPage()}
hideLabelOnDesktop
/>
)}
2023-06-24 12:14:44 +02:00
</Group>
2023-05-04 21:27:02 +02:00
)
}
function Footer() {
const dispatch = useAppDispatch()
2023-05-04 21:27:02 +02:00
return (
2023-12-29 23:09:30 +01:00
<Group justify="space-between">
2023-05-04 21:27:02 +02:00
<Group>
<span>© CommaFeed</span>
<Anchor variant="text" href="https://github.com/Athou/commafeed/" target="_blank" rel="noreferrer">
<SiGithub />
</Anchor>
<Anchor variant="text" href="https://twitter.com/CommaFeed" target="_blank" rel="noreferrer">
<SiTwitter />
</Anchor>
</Group>
<Box>
2023-12-28 19:54:51 +01:00
<Anchor variant="text" onClick={async () => await dispatch(redirectToApiDocumentation())}>
API documentation
</Anchor>
</Box>
</Group>
2023-05-04 21:27:02 +02:00
)
}