// @flow import { find } from "lodash"; import { observer } from "mobx-react"; import { BackIcon, EmailIcon } from "outline-icons"; import * as React from "react"; import { Redirect, Link, type Location } from "react-router-dom"; import styled from "styled-components"; import getQueryVariable from "shared/utils/getQueryVariable"; import ButtonLarge from "components/ButtonLarge"; import Fade from "components/Fade"; import Flex from "components/Flex"; import Heading from "components/Heading"; import HelpText from "components/HelpText"; import OutlineLogo from "components/OutlineLogo"; import PageTitle from "components/PageTitle"; import TeamLogo from "components/TeamLogo"; import Notices from "./Notices"; import Provider from "./Provider"; import env from "env"; import useStores from "hooks/useStores"; type Props = {| location: Location, |}; function Login({ location }: Props) { const { auth } = useStores(); const { config } = auth; const [emailLinkSentTo, setEmailLinkSentTo] = React.useState(""); const isCreate = location.pathname === "/create"; const handleReset = React.useCallback(() => { setEmailLinkSentTo(""); }, []); const handleEmailSuccess = React.useCallback((email) => { setEmailLinkSentTo(email); }, []); React.useEffect(() => { auth.fetchConfig(); }, [auth]); if (auth.authenticated) { return ; } // we're counting on the config request being fast if (!config) { return null; } const hasMultipleProviders = config.providers.length > 1; const defaultProvider = find( config.providers, (provider) => provider.id === auth.lastSignedIn && !isCreate ); const header = env.DEPLOYMENT === "hosted" && (config.hostname ? ( Back to home ) : ( Back to website )); if (emailLinkSentTo) { return ( {header} Check your email A magic sign-in link has been sent to the email{" "} {emailLinkSentTo}, no password needed.
Back to login
); } return ( {header} {env.TEAM_LOGO && env.DEPLOYMENT !== "hosted" ? ( ) : ( )} {isCreate ? ( Create an account ) : ( Login to {config.name || "Outline"} )} {defaultProvider && ( {hasMultipleProviders && ( <> You signed in with {defaultProvider.name} last time. )} )} {config.providers.map((provider) => { if (defaultProvider && provider.id === defaultProvider.id) { return null; } return ( ); })} {isCreate && ( Already have an account? Go to login. )} ); } const CheckEmailIcon = styled(EmailIcon)` margin-bottom: -1.5em; `; const Background = styled(Fade)` width: 100vw; height: 100vh; background: ${(props) => props.theme.background}; display: flex; `; const Logo = styled.div` margin-bottom: -1.5em; height: 38px; `; const Note = styled(HelpText)` text-align: center; font-size: 14px; em { font-style: normal; font-weight: 500; } `; const Back = styled.a` display: flex; align-items: center; color: inherit; padding: 32px; font-weight: 500; position: absolute; svg { transition: transform 100ms ease-in-out; } &:hover { svg { transform: translateX(-4px); } } `; const Or = styled.hr` margin: 1em 0; position: relative; width: 100%; &:after { content: "Or"; display: block; position: absolute; left: 50%; transform: translate3d(-50%, -50%, 0); text-transform: uppercase; font-size: 11px; color: ${(props) => props.theme.textSecondary}; background: ${(props) => props.theme.background}; border-radius: 2px; padding: 0 4px; } `; const Centered = styled(Flex)` user-select: none; width: 90vw; height: 100%; max-width: 320px; margin: 0 auto; `; export default observer(Login);