// @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);