From c6aabc77b48fc82163c85efdb727247f449249d2 Mon Sep 17 00:00:00 2001 From: Johannes <72809645+jobenjada@users.noreply.github.com> Date: Fri, 19 May 2023 12:08:24 +0200 Subject: [PATCH] Revamp sign up page (#288) * New cleaner signup/login screen --- .env.docker | 5 +- .env.example | 4 + apps/demo/pages/app/index.tsx | 2 +- .../auth/forgot-password/email-sent/page.tsx | 21 +- apps/web/app/auth/forgot-password/page.tsx | 7 +- .../app/auth/forgot-password/reset/page.tsx | 7 +- .../forgot-password/reset/success/page.tsx | 15 +- apps/web/app/auth/layout.tsx | 12 +- apps/web/app/auth/login/page.tsx | 21 +- .../page.tsx | 5 +- apps/web/app/auth/signup/page.tsx | 43 ++-- .../app/auth/verification-requested/page.tsx | 5 +- apps/web/app/auth/verify/page.tsx | 5 +- .../[surveyId]/edit/WhenToSendCard.tsx | 2 +- apps/web/components/auth/FormWrapper.tsx | 14 ++ apps/web/components/auth/GithubButton.tsx | 6 +- apps/web/components/auth/GoogleButton.tsx | 26 ++ apps/web/components/auth/SigninForm.tsx | 160 +++++++----- apps/web/components/auth/SignupForm.tsx | 237 +++++++++++------- apps/web/components/auth/Testimonial.tsx | 51 ++++ apps/web/images/cal-logo-light.svg | 9 + apps/web/images/peer.webp | Bin 0 -> 21722 bytes packages/ui/components/Button.tsx | 2 +- turbo.json | 1 + 24 files changed, 430 insertions(+), 230 deletions(-) create mode 100644 apps/web/components/auth/FormWrapper.tsx create mode 100644 apps/web/components/auth/GoogleButton.tsx create mode 100644 apps/web/components/auth/Testimonial.tsx create mode 100644 apps/web/images/cal-logo-light.svg create mode 100644 apps/web/images/peer.webp diff --git a/.env.docker b/.env.docker index 33ecc2c051..b13b3c772c 100644 --- a/.env.docker +++ b/.env.docker @@ -88,4 +88,7 @@ NEXT_PUBLIC_SENTRY_DSN= # Configure Github Login NEXT_PUBLIC_GITHUB_AUTH_ENABLED=0 GITHUB_ID= -GITHUB_SECRET= \ No newline at end of file +GITHUB_SECRET= + +# Configure Google Login +NEXT_PUBLIC_GOOGLE_AUTH_ENABLED=0 diff --git a/.env.example b/.env.example index 34a9507bb5..2f7f606571 100644 --- a/.env.example +++ b/.env.example @@ -90,6 +90,10 @@ NEXT_PUBLIC_GITHUB_AUTH_ENABLED=0 GITHUB_ID= GITHUB_SECRET= +# Configure Google Login +NEXT_PUBLIC_GOOGLE_AUTH_ENABLED=0 + + # Stripe Billing Variables NEXT_PUBLIC_STRIPE_PRICING_TABLE_ID= NEXT_PUBLIC_STRIPE_PUBLIC_KEY= diff --git a/apps/demo/pages/app/index.tsx b/apps/demo/pages/app/index.tsx index daa169d461..f421dae2c4 100644 --- a/apps/demo/pages/app/index.tsx +++ b/apps/demo/pages/app/index.tsx @@ -68,7 +68,7 @@ export default function AppPage({}) { diff --git a/apps/web/app/auth/forgot-password/email-sent/page.tsx b/apps/web/app/auth/forgot-password/email-sent/page.tsx index 088a17d7b0..e11acb5ff3 100644 --- a/apps/web/app/auth/forgot-password/email-sent/page.tsx +++ b/apps/web/app/auth/forgot-password/email-sent/page.tsx @@ -1,17 +1,20 @@ import BackToLoginButton from "@/components/auth/BackToLoginButton"; +import FormWrapper from "@/components/auth/FormWrapper"; const SignInPage: React.FC = () => { return ( -
-

Password reset successfully requested

-

- Check your email for a link to reset your password. If it doesn't appear within a few minutes, - check your spam folder. -

-
- + +
+

Password reset successfully requested

+

+ Check your email for a link to reset your password. If it doesn't appear within a few minutes, + check your spam folder. +

+
+ +
-
+ ); }; diff --git a/apps/web/app/auth/forgot-password/page.tsx b/apps/web/app/auth/forgot-password/page.tsx index 97899f3bbb..bf5dbf377a 100644 --- a/apps/web/app/auth/forgot-password/page.tsx +++ b/apps/web/app/auth/forgot-password/page.tsx @@ -1,7 +1,12 @@ import { PasswordResetForm } from "../../../components/auth/PasswordResetForm"; +import FormWrapper from "@/components/auth/FormWrapper"; const ForgotPasswordPage: React.FC = () => { - return ; + return ( + + + + ); }; export default ForgotPasswordPage; diff --git a/apps/web/app/auth/forgot-password/reset/page.tsx b/apps/web/app/auth/forgot-password/reset/page.tsx index 3d9cd660ca..cf78557b3e 100644 --- a/apps/web/app/auth/forgot-password/reset/page.tsx +++ b/apps/web/app/auth/forgot-password/reset/page.tsx @@ -1,7 +1,12 @@ import { ResetPasswordForm } from "@/components/auth/ResetPasswordForm"; +import FormWrapper from "@/components/auth/FormWrapper"; const ResetPasswordPage: React.FC = () => { - return ; + return ( + + + + ); }; export default ResetPasswordPage; diff --git a/apps/web/app/auth/forgot-password/reset/success/page.tsx b/apps/web/app/auth/forgot-password/reset/success/page.tsx index 9a2cfe6d39..30ad409272 100644 --- a/apps/web/app/auth/forgot-password/reset/success/page.tsx +++ b/apps/web/app/auth/forgot-password/reset/success/page.tsx @@ -1,13 +1,16 @@ import BackToLoginButton from "@/components/auth/BackToLoginButton"; +import FormWrapper from "@/components/auth/FormWrapper"; export default function ResetPasswordSuccessPage() { return ( -
-

Password successfully reset

-

You can now log in with your new password

-
- + +
+

Password successfully reset

+

You can now log in with your new password

+
+ +
-
+ ); } diff --git a/apps/web/app/auth/layout.tsx b/apps/web/app/auth/layout.tsx index f52693015b..a5d03b3a45 100644 --- a/apps/web/app/auth/layout.tsx +++ b/apps/web/app/auth/layout.tsx @@ -1,4 +1,3 @@ -import { Logo } from "@/components/Logo"; import { getServerSession } from "next-auth"; import { redirect } from "next/navigation"; import { PosthogClientWrapper } from "../PosthogClientWrapper"; @@ -12,16 +11,7 @@ export default async function AuthLayout({ children }: { children: React.ReactNo
-
-
-
-
- -
- {children} -
-
-
+
{children}
diff --git a/apps/web/app/auth/login/page.tsx b/apps/web/app/auth/login/page.tsx index 7bec506c80..013b8e30ca 100644 --- a/apps/web/app/auth/login/page.tsx +++ b/apps/web/app/auth/login/page.tsx @@ -1,19 +1,16 @@ import { SigninForm } from "@/components/auth/SigninForm"; -import Link from "next/link"; +import Testimonial from "@/components/auth/Testimonial"; +import FormWrapper from "@/components/auth/FormWrapper"; export default function SignInPage() { return ( -
- - {process.env.NEXT_PUBLIC_SIGNUP_DISABLED !== "1" && ( -
- - Create an account - -
- )} +
+
+ +
+ + +
); } diff --git a/apps/web/app/auth/signup-without-verification-success/page.tsx b/apps/web/app/auth/signup-without-verification-success/page.tsx index bf28e0b18d..fccd170fa7 100644 --- a/apps/web/app/auth/signup-without-verification-success/page.tsx +++ b/apps/web/app/auth/signup-without-verification-success/page.tsx @@ -1,8 +1,9 @@ import BackToLoginButton from "@/components/auth/BackToLoginButton"; +import FormWrapper from "@/components/auth/FormWrapper"; export default function SignupWithoutVerificationSuccess() { return ( -
+

User successfully created

Your new user has been created successfully. Please click the button below and sign in to your @@ -10,6 +11,6 @@ export default function SignupWithoutVerificationSuccess() {


-
+ ); } diff --git a/apps/web/app/auth/signup/page.tsx b/apps/web/app/auth/signup/page.tsx index ac94ffb72e..136464c09b 100644 --- a/apps/web/app/auth/signup/page.tsx +++ b/apps/web/app/auth/signup/page.tsx @@ -1,26 +1,33 @@ import Link from "next/link"; import { SignupForm } from "@/components/auth/SignupForm"; +import FormWrapper from "@/components/auth/FormWrapper"; +import Testimonial from "@/components/auth/Testimonial"; export default function SignUpPage() { return ( -
- {process.env.NEXT_PUBLIC_SIGNUP_DISABLED === "1" ? ( - <> -

Sign up disabled

-

- The account creation is disabled in this instance. Please contact the site administrator to create - an account. -

-
- - Login - - - ) : ( - - )} +
+
+ +
+ + {process.env.NEXT_PUBLIC_SIGNUP_DISABLED === "1" ? ( + <> +

Sign up disabled

+

+ The account creation is disabled in this instance. Please contact the site administrator to + create an account. +

+
+ + Login + + + ) : ( + + )} +
); } diff --git a/apps/web/app/auth/verification-requested/page.tsx b/apps/web/app/auth/verification-requested/page.tsx index 740fa48c01..82264adfb9 100644 --- a/apps/web/app/auth/verification-requested/page.tsx +++ b/apps/web/app/auth/verification-requested/page.tsx @@ -2,11 +2,12 @@ import { RequestVerificationEmail } from "@/components/auth/RequestVerificationEmail"; import { useSearchParams } from "next/navigation"; +import FormWrapper from "@/components/auth/FormWrapper"; export default function VerficationPage() { const searchParams = useSearchParams(); return ( -
+ {searchParams && searchParams?.get("email") ? ( <>

@@ -27,6 +28,6 @@ export default function VerficationPage() { ) : (

No E-Mail Address provided

)} -

+ ); } diff --git a/apps/web/app/auth/verify/page.tsx b/apps/web/app/auth/verify/page.tsx index 4d9bf8add4..50ba78739d 100644 --- a/apps/web/app/auth/verify/page.tsx +++ b/apps/web/app/auth/verify/page.tsx @@ -2,14 +2,15 @@ import { SignIn } from "@/components/auth/SignIn"; import { useSearchParams } from "next/navigation"; +import FormWrapper from "@/components/auth/FormWrapper"; export default function Verify() { const searchParams = useSearchParams(); return searchParams && searchParams?.get("token") ? ( -
+

Verifying...

-
+ ) : (

No Token provided

); diff --git a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/WhenToSendCard.tsx b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/WhenToSendCard.tsx index 7be3bf8c4b..c784819a08 100644 --- a/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/WhenToSendCard.tsx +++ b/apps/web/app/environments/[environmentId]/surveys/[surveyId]/edit/WhenToSendCard.tsx @@ -135,7 +135,7 @@ export default function WhenToSendCard({ environmentId, localSurvey, setLocalSur +
+
+ + setIsPasswordFocused(true)} + required + className="focus:border-brand focus:ring-brand block w-full rounded-md border-slate-300 shadow-sm sm:text-sm" + /> +
+ {process.env.NEXT_PUBLIC_PASSWORD_RESET_DISABLED !== "1" && isPasswordFocused && ( +
+ + Forgot your password? + +
+ )} +
+ )} + + + + {process.env.NEXT_PUBLIC_GOOGLE_AUTH_ENABLED === "1" && ( + <> + + + )} + {process.env.NEXT_PUBLIC_GITHUB_AUTH_ENABLED === "1" && ( + <> + + + )} +
+ {process.env.NEXT_PUBLIC_SIGNUP_DISABLED !== "1" && ( +
+ Need an account?{" "} + + Register. + +
+ )} +
{searchParams?.get("error") && (
@@ -40,67 +137,6 @@ export const SigninForm = () => {
)} -
-
- -
- -
-
-
- -
- -
-
- -
- -
- {process.env.NEXT_PUBLIC_PASSWORD_RESET_DISABLED !== "1" && ( -
- - Forgot your password? - -
- )} - {process.env.NEXT_PUBLIC_GITHUB_AUTH_ENABLED === "1" && ( - <> -
- - {" "} - - )} - ); }; diff --git a/apps/web/components/auth/SignupForm.tsx b/apps/web/components/auth/SignupForm.tsx index 4cab816213..6454988b94 100644 --- a/apps/web/components/auth/SignupForm.tsx +++ b/apps/web/components/auth/SignupForm.tsx @@ -5,8 +5,9 @@ import { createUser } from "@/lib/users/users"; import { XCircleIcon } from "@heroicons/react/24/solid"; import Link from "next/link"; import { useRouter, useSearchParams } from "next/navigation"; -import { useState } from "react"; +import { useRef, useState } from "react"; import { GithubButton } from "./GithubButton"; +import { GoogleButton } from "@/components/auth/GoogleButton"; export const SignupForm = () => { const searchParams = useSearchParams(); @@ -36,6 +37,18 @@ export const SignupForm = () => { } }; + const [showLogin, setShowLogin] = useState(false); + const [isButtonEnabled, setButtonEnabled] = useState(true); + const [isPasswordFocused, setIsPasswordFocused] = useState(false); + const formRef = useRef(null); + + const checkFormValidity = () => { + // If all fields are filled, enable the button + if (formRef.current) { + setButtonEnabled(formRef.current.checkValidity()); + } + }; + return ( <> {error && ( @@ -53,106 +66,136 @@ export const SignupForm = () => {
)} -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
+
+

Create your Formbricks account

+
+ + {showLogin && ( +
+
+ +
+ +
+
+
+ + +
+
+ + setIsPasswordFocused(true)} + required + className="focus:border-brand focus:ring-brand block w-full rounded-md border-slate-300 shadow-sm sm:text-sm" + /> +
+ {process.env.NEXT_PUBLIC_PASSWORD_RESET_DISABLED !== "1" && isPasswordFocused && ( +
+ + Forgot your password? + +
+ )} +
+ )} + + -
- - -
- Already have an account?{" "} - - Log in. - -
- {(process.env.NEXT_PUBLIC_TERMS_URL || process.env.NEXT_PUBLIC_PRIVACY_URL) && ( -
- By clicking "Sign Up", you agree to our -
- {process.env.NEXT_PUBLIC_TERMS_URL && ( - - terms of service - - )} - {process.env.NEXT_PUBLIC_TERMS_URL && process.env.NEXT_PUBLIC_PRIVACY_URL && and } - {process.env.NEXT_PUBLIC_PRIVACY_URL && ( - - privacy policy - - )} - .
- We'll occasionally send you account related emails. -
+ {process.env.NEXT_PUBLIC_GOOGLE_AUTH_ENABLED === "1" && ( + <> + + + )} + {process.env.NEXT_PUBLIC_GITHUB_AUTH_ENABLED === "1" && ( + <> + {" "} + )}
- {process.env.NEXT_PUBLIC_GITHUB_AUTH_ENABLED === "1" && ( - <> -
- - - + + {(process.env.NEXT_PUBLIC_TERMS_URL || process.env.NEXT_PUBLIC_PRIVACY_URL) && ( +
+ By signing up, you agree to our +
+ {process.env.NEXT_PUBLIC_TERMS_URL && ( + + Terms of Service + + )} + {process.env.NEXT_PUBLIC_TERMS_URL && process.env.NEXT_PUBLIC_PRIVACY_URL && and } + {process.env.NEXT_PUBLIC_PRIVACY_URL && ( + + Privacy Policy. + + )} + {/*
+ We'll occasionally send you account related emails. */} +
+
)} - + +
+ Have an account?{" "} + + Log in. + +
+
); }; diff --git a/apps/web/components/auth/Testimonial.tsx b/apps/web/components/auth/Testimonial.tsx new file mode 100644 index 0000000000..440c4e9ef8 --- /dev/null +++ b/apps/web/components/auth/Testimonial.tsx @@ -0,0 +1,51 @@ +import { CheckCircleIcon } from "@heroicons/react/24/solid"; +import Image from "next/image"; +import Peer from "@/images/peer.webp"; +import CalComLogo from "@/images/cal-logo-light.svg"; + +export default function Testimonial() { + return ( +
+
+
+

Survey any segment

+

No coding required.

+
+ {/*

+ Make customer-centric decisions based on data. +
Keep 100% data ownership. +

*/} +
+
+ +

All features included

+
+
+ +

No Creditcard required

+
+
+ +

Trusted by 400+ product teams

+
+
+ +
+ Cal.com Co-CEO Peer Richelsen +
+

+ We measure the clarity of our docs and learn from churn all on one platform. Great product, very + responsive team! +

+

Peer Richelsen, Co-CEO Cal.com

+ Cal.com Logo +
+
+
+
+ ); +} diff --git a/apps/web/images/cal-logo-light.svg b/apps/web/images/cal-logo-light.svg new file mode 100644 index 0000000000..bccfe813ef --- /dev/null +++ b/apps/web/images/cal-logo-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/web/images/peer.webp b/apps/web/images/peer.webp new file mode 100644 index 0000000000000000000000000000000000000000..a26316f7620d210d9bf757bcc1b04041ba5be661 GIT binary patch literal 21722 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

$wHcJMdNOqi16)McvB86)fC7wu8RMNnTISs4 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