From 71c7a9662f77c0c524b0b859d8997b985f734933 Mon Sep 17 00:00:00 2001 From: Bruno Quaresma Date: Tue, 22 Nov 2022 17:03:51 +0000 Subject: [PATCH 1/4] refactor: Refactor login page --- site/src/components/SignInForm/SignInForm.tsx | 42 +++-- .../WorkspacesTable/WorkspacesTableBody.tsx | 2 +- site/src/pages/LoginPage/LoginPage.tsx | 59 ++----- .../pages/LoginPage/LoginPageView.stories.tsx | 19 ++ site/src/pages/LoginPage/LoginPageView.tsx | 167 ++++++++++++++++++ .../pages/TemplatesPage/TemplatesPageView.tsx | 2 +- site/static/featured/scheduling.webp | Bin 0 -> 57368 bytes .../static/{empty => featured}/templates.webp | Bin .../{empty => featured}/workspaces.webp | Bin 9 files changed, 228 insertions(+), 63 deletions(-) create mode 100644 site/src/pages/LoginPage/LoginPageView.stories.tsx create mode 100644 site/src/pages/LoginPage/LoginPageView.tsx create mode 100644 site/static/featured/scheduling.webp rename site/static/{empty => featured}/templates.webp (100%) rename site/static/{empty => featured}/workspaces.webp (100%) diff --git a/site/src/components/SignInForm/SignInForm.tsx b/site/src/components/SignInForm/SignInForm.tsx index f55358375bef6..e27008d82e88a 100644 --- a/site/src/components/SignInForm/SignInForm.tsx +++ b/site/src/components/SignInForm/SignInForm.tsx @@ -11,7 +11,6 @@ import { FC } from "react" import * as Yup from "yup" import { AuthMethods } from "../../api/typesGenerated" import { getFormHelpers, onChangeTrimmed } from "../../util/formUtils" -import { Welcome } from "../Welcome/Welcome" import { LoadingButton } from "./../LoadingButton/LoadingButton" import { AlertBanner } from "components/AlertBanner/AlertBanner" @@ -57,6 +56,27 @@ const validationSchema = Yup.object({ }) const useStyles = makeStyles((theme) => ({ + wrapper: { + maxWidth: 385, + width: "100%", + + [theme.breakpoints.down("sm")]: { + maxWidth: "none", + }, + }, + + title: { + fontSize: theme.spacing(4), + fontWeight: 400, + margin: 0, + marginBottom: theme.spacing(4), + lineHeight: 1, + + "& strong": { + fontWeight: 600, + }, + }, + buttonIcon: { width: 14, height: 14, @@ -87,13 +107,7 @@ export interface SignInFormProps { redirectTo: string loginErrors: Partial> authMethods?: AuthMethods - onSubmit: ({ - email, - password, - }: { - email: string - password: string - }) => Promise + onSubmit: (credentials: { email: string; password: string }) => void // initialTouched is only used for testing the error state of the form. initialTouched?: FormikTouched } @@ -129,8 +143,10 @@ export const SignInForm: FC> = ({ ) return ( - <> - +
+

+ Sign in to Coder +

{Object.keys(loginErrors).map( @@ -176,7 +192,7 @@ export const SignInForm: FC> = ({
{(authMethods?.github || authMethods?.oidc) && ( - <> +
Or
@@ -222,8 +238,8 @@ export const SignInForm: FC> = ({ )} - +
)} - +
) } diff --git a/site/src/components/WorkspacesTable/WorkspacesTableBody.tsx b/site/src/components/WorkspacesTable/WorkspacesTableBody.tsx index 77a75907a0480..db41fb3bc078b 100644 --- a/site/src/components/WorkspacesTable/WorkspacesTableBody.tsx +++ b/site/src/components/WorkspacesTable/WorkspacesTableBody.tsx @@ -62,7 +62,7 @@ export const WorkspacesTableBody: FC< } image={
- +
} /> diff --git a/site/src/pages/LoginPage/LoginPage.tsx b/site/src/pages/LoginPage/LoginPage.tsx index 8ce55a45ef129..234d63062ae4e 100644 --- a/site/src/pages/LoginPage/LoginPage.tsx +++ b/site/src/pages/LoginPage/LoginPage.tsx @@ -1,40 +1,16 @@ import { useActor } from "@xstate/react" -import { FullScreenLoader } from "components/Loader/FullScreenLoader" -import { SignInLayout } from "components/SignInLayout/SignInLayout" -import React, { useContext } from "react" +import { FC, useContext } from "react" import { Helmet } from "react-helmet-async" import { Navigate, useLocation } from "react-router-dom" -import { LoginErrors, SignInForm } from "../../components/SignInForm/SignInForm" -import { pageTitle } from "../../util/page" import { retrieveRedirect } from "../../util/redirect" import { XServiceContext } from "../../xServices/StateContext" +import { LoginPageView } from "./LoginPageView" -interface LocationState { - isRedirect: boolean -} - -export const LoginPage: React.FC = () => { +export const LoginPage: FC = () => { const location = useLocation() const xServices = useContext(XServiceContext) const [authState, authSend] = useActor(xServices.authXService) - const isLoading = authState.hasTag("loading") const redirectTo = retrieveRedirect(location.search) - const locationState = location.state - ? (location.state as LocationState) - : null - const isRedirected = locationState ? locationState.isRedirect : false - const { authError, getUserError, checkPermissionsError, getMethodsError } = - authState.context - - const onSubmit = async ({ - email, - password, - }: { - email: string - password: string - }) => { - authSend({ type: "SIGN_IN", email, password }) - } if (authState.matches("signedIn")) { return @@ -44,28 +20,15 @@ export const LoginPage: React.FC = () => { return ( <> - {pageTitle("Login")} + Sign in to Coder - {authState.hasTag("loading") ? ( - - ) : ( - - - - )} + { + authSend({ type: "SIGN_IN", email, password }) + }} + /> ) } diff --git a/site/src/pages/LoginPage/LoginPageView.stories.tsx b/site/src/pages/LoginPage/LoginPageView.stories.tsx new file mode 100644 index 0000000000000..9ecacde906619 --- /dev/null +++ b/site/src/pages/LoginPage/LoginPageView.stories.tsx @@ -0,0 +1,19 @@ +import { action } from "@storybook/addon-actions" +import { ComponentMeta, Story } from "@storybook/react" +import { LoginPageView, LoginPageViewProps } from "./LoginPageView" + +export default { + title: "pages/LoginPageView", + component: LoginPageView, +} as ComponentMeta + +const Template: Story = (args) => ( + +) + +export const Example = Template.bind({}) +Example.args = { + isLoading: false, + onSignIn: action("onSignIn"), + context: {}, +} diff --git a/site/src/pages/LoginPage/LoginPageView.tsx b/site/src/pages/LoginPage/LoginPageView.tsx new file mode 100644 index 0000000000000..4d6059313ac77 --- /dev/null +++ b/site/src/pages/LoginPage/LoginPageView.tsx @@ -0,0 +1,167 @@ +import { makeStyles } from "@material-ui/core/styles" +import { Logo } from "components/Icons/Logo" +import { FullScreenLoader } from "components/Loader/FullScreenLoader" +import { FC } from "react" +import { useLocation } from "react-router-dom" +import { AuthContext } from "xServices/auth/authXService" +import { LoginErrors, SignInForm } from "../../components/SignInForm/SignInForm" +import { retrieveRedirect } from "../../util/redirect" + +interface LocationState { + isRedirect: boolean +} + +export interface LoginPageViewProps { + context: AuthContext + isLoading: boolean + onSignIn: (credentials: { email: string; password: string }) => void +} + +export const LoginPageView: FC = ({ + context, + isLoading, + onSignIn, +}) => { + const location = useLocation() + const redirectTo = retrieveRedirect(location.search) + const locationState = location.state + ? (location.state as LocationState) + : null + const isRedirected = locationState ? locationState.isRedirect : false + const { authError, getUserError, checkPermissionsError, getMethodsError } = + context + const styles = useStyles() + + return isLoading ? ( + + ) : ( +
+
+ + +
+ +
+ +
+ Copyright © 2022 Coder Technologies, Inc. +
+
+ +
+
+
+

Scheduling

+

+ Coder automates your cloud cost control by ensuring developer + resources are only online while used. +

+ +
+
+
+
+ ) +} + +const useStyles = makeStyles((theme) => ({ + container: { + padding: theme.spacing(5), + margin: "auto", + display: "flex", + height: "100vh", + + [theme.breakpoints.down("md")]: { + height: "auto", + minHeight: "100vh", + }, + + [theme.breakpoints.down("sm")]: { + padding: theme.spacing(4), + }, + }, + + left: { + flex: 1, + display: "flex", + flexDirection: "column", + gap: theme.spacing(4), + }, + + right: { + flex: 1, + + [theme.breakpoints.down("md")]: { + display: "none", + }, + }, + + formSection: { + flex: 1, + display: "flex", + alignItems: "center", + justifyContent: "center", + }, + + footer: { + fontSize: 12, + color: theme.palette.text.secondary, + }, + + tipWrapper: { + width: "100%", + height: "100%", + borderRadius: theme.shape.borderRadius, + background: theme.palette.background.paper, + padding: theme.spacing(5), + display: "flex", + justifyContent: "center", + alignItems: "center", + }, + + tipContent: { + maxWidth: 570, + textAlign: "center", + fontSize: 16, + color: theme.palette.text.secondary, + lineHeight: "160%", + + "& p": { + maxWidth: 440, + margin: "auto", + }, + + "& strong": { + color: theme.palette.text.primary, + }, + }, + + tipTitle: { + fontWeight: 400, + fontSize: 24, + margin: 0, + lineHeight: 1, + marginBottom: theme.spacing(2), + color: theme.palette.text.primary, + }, + + tipImage: { + maxWidth: 570, + marginTop: theme.spacing(4), + }, +})) diff --git a/site/src/pages/TemplatesPage/TemplatesPageView.tsx b/site/src/pages/TemplatesPage/TemplatesPageView.tsx index 17a94529319d0..64acc2f5f9fb0 100644 --- a/site/src/pages/TemplatesPage/TemplatesPageView.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPageView.tsx @@ -185,7 +185,7 @@ export const TemplatesPageView: FC< cta={} image={
- +
} /> diff --git a/site/static/featured/scheduling.webp b/site/static/featured/scheduling.webp new file mode 100644 index 0000000000000000000000000000000000000000..8883af09f7dd899d88a97e7f4585b05ee8624ee0 GIT binary patch literal 57368 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 Date: Wed, 23 Nov 2022 10:57:16 -0300 Subject: [PATCH 2/4] Apply suggestions from code review Co-authored-by: Kira Pilot --- site/src/pages/LoginPage/LoginPageView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/src/pages/LoginPage/LoginPageView.tsx b/site/src/pages/LoginPage/LoginPageView.tsx index 4d6059313ac77..bd15ed218c463 100644 --- a/site/src/pages/LoginPage/LoginPageView.tsx +++ b/site/src/pages/LoginPage/LoginPageView.tsx @@ -4,8 +4,8 @@ import { FullScreenLoader } from "components/Loader/FullScreenLoader" import { FC } from "react" import { useLocation } from "react-router-dom" import { AuthContext } from "xServices/auth/authXService" -import { LoginErrors, SignInForm } from "../../components/SignInForm/SignInForm" -import { retrieveRedirect } from "../../util/redirect" +import { LoginErrors, SignInForm } from "components/SignInForm/SignInForm" +import { retrieveRedirect } from "util/redirect" interface LocationState { isRedirect: boolean From 4e20541ddfb60d589a26c2b8275e717b7d75c861 Mon Sep 17 00:00:00 2001 From: Bruno Quaresma Date: Wed, 23 Nov 2022 14:27:18 +0000 Subject: [PATCH 3/4] Add translations --- site/src/components/SignInForm/SignInForm.tsx | 7 +++++-- site/src/i18n/en/common.json | 1 + site/src/i18n/en/index.ts | 2 ++ site/src/i18n/en/loginPage.json | 3 +++ site/src/pages/LoginPage/LoginPage.tsx | 7 ++++++- 5 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 site/src/i18n/en/loginPage.json diff --git a/site/src/components/SignInForm/SignInForm.tsx b/site/src/components/SignInForm/SignInForm.tsx index e27008d82e88a..71e31e6c5e628 100644 --- a/site/src/components/SignInForm/SignInForm.tsx +++ b/site/src/components/SignInForm/SignInForm.tsx @@ -13,6 +13,7 @@ import { AuthMethods } from "../../api/typesGenerated" import { getFormHelpers, onChangeTrimmed } from "../../util/formUtils" import { LoadingButton } from "./../LoadingButton/LoadingButton" import { AlertBanner } from "components/AlertBanner/AlertBanner" +import { useTranslation } from "react-i18next" /** * BuiltInAuthFormValues describes a form using built-in (email/password) @@ -121,7 +122,6 @@ export const SignInForm: FC> = ({ initialTouched, }) => { const styles = useStyles() - const form: FormikContextType = useFormik({ initialValues: { @@ -141,11 +141,14 @@ export const SignInForm: FC> = ({ form, loginErrors.authError, ) + const commonTranslation = useTranslation("common") + const loginPageTranslation = useTranslation("loginPage") return (

- Sign in to Coder + {loginPageTranslation.t("signInTo")}{" "} + {commonTranslation.t("coder")}

diff --git a/site/src/i18n/en/common.json b/site/src/i18n/en/common.json index 18afb7754453a..e2dc165b58f6f 100644 --- a/site/src/i18n/en/common.json +++ b/site/src/i18n/en/common.json @@ -1,4 +1,5 @@ { + "coder": "Coder", "workspaceStatus": { "loading": "Loading", "running": "Running", diff --git a/site/src/i18n/en/index.ts b/site/src/i18n/en/index.ts index 05836182b6e29..e37f8c6337760 100644 --- a/site/src/i18n/en/index.ts +++ b/site/src/i18n/en/index.ts @@ -9,6 +9,7 @@ import buildPage from "./buildPage.json" import workspacesPage from "./workspacesPage.json" import usersPage from "./usersPage.json" import templateVersionPage from "./templateVersionPage.json" +import loginPage from "./loginPage.json" export const en = { common, @@ -22,4 +23,5 @@ export const en = { workspacesPage, usersPage, templateVersionPage, + loginPage, } diff --git a/site/src/i18n/en/loginPage.json b/site/src/i18n/en/loginPage.json new file mode 100644 index 0000000000000..329dc925a2e8e --- /dev/null +++ b/site/src/i18n/en/loginPage.json @@ -0,0 +1,3 @@ +{ + "signInTo": "Sign in to" +} diff --git a/site/src/pages/LoginPage/LoginPage.tsx b/site/src/pages/LoginPage/LoginPage.tsx index 234d63062ae4e..a131a39450a27 100644 --- a/site/src/pages/LoginPage/LoginPage.tsx +++ b/site/src/pages/LoginPage/LoginPage.tsx @@ -1,6 +1,7 @@ import { useActor } from "@xstate/react" import { FC, useContext } from "react" import { Helmet } from "react-helmet-async" +import { useTranslation } from "react-i18next" import { Navigate, useLocation } from "react-router-dom" import { retrieveRedirect } from "../../util/redirect" import { XServiceContext } from "../../xServices/StateContext" @@ -11,6 +12,8 @@ export const LoginPage: FC = () => { const xServices = useContext(XServiceContext) const [authState, authSend] = useActor(xServices.authXService) const redirectTo = retrieveRedirect(location.search) + const commonTranslation = useTranslation("common") + const loginPageTranslation = useTranslation("loginPage") if (authState.matches("signedIn")) { return @@ -20,7 +23,9 @@ export const LoginPage: FC = () => { return ( <> - Sign in to Coder + + {loginPageTranslation.t("signInTo")} {commonTranslation.t("coder")} + Date: Wed, 23 Nov 2022 14:30:10 +0000 Subject: [PATCH 4/4] Fix e2e selector --- site/e2e/pom/SignInPage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/e2e/pom/SignInPage.ts b/site/e2e/pom/SignInPage.ts index d9c27bd16646f..362674588f6c0 100644 --- a/site/e2e/pom/SignInPage.ts +++ b/site/e2e/pom/SignInPage.ts @@ -12,6 +12,6 @@ export class SignInPage extends BasePom { ): Promise { await this.page.fill("text=Email", email) await this.page.fill("text=Password", password) - await this.page.click("text=Sign In") + await this.page.click('button:has-text("Sign In")') } }