feat(Twitter-signup): check if username is taken

This commit is contained in:
Aminejvm 2021-06-10 08:19:31 +01:00
parent 266aadc164
commit 77f2ad45f9

View File

@ -1,10 +1,12 @@
import * as React from "react"; import * as React from "react";
import * as System from "~/components/system"; import * as System from "~/components/system";
import * as Validations from "~/common/validations"; import * as Validations from "~/common/validations";
import * as Actions from "~/common/actions";
import Field from "~/components/core/Field"; import Field from "~/components/core/Field";
import { AnimateSharedLayout, motion } from "framer-motion"; import { AnimateSharedLayout, motion } from "framer-motion";
import { LoaderSpinner } from "~/components/system/components/Loaders";
import { css } from "@emotion/react"; import { css } from "@emotion/react";
import { useForm } from "~/common/hooks"; import { useForm } from "~/common/hooks";
@ -24,7 +26,40 @@ const useTwitterSignup = () => {
return { ...handlers, scene }; return { ...handlers, scene };
}; };
const handleValidation = ({ username, email, acceptTerms }, errors) => { const useCheckUser = () => {
const MESSAGE = "The username is taken.";
const usernamesAllowed = React.useRef([]);
const usernamesTaken = React.useRef([]);
return async ({ username }, errors) => {
if (usernamesAllowed.current.some((value) => value === username)) {
return;
}
if (usernamesTaken.current.some((value) => value === username)) {
errors.username = MESSAGE;
return;
}
const response = await Actions.checkUsername({
username,
});
if (response.data) {
errors.username = "The username is taken.";
usernamesTaken.current.push(username);
return;
}
usernamesAllowed.current.push(username);
};
};
const createValidations = (validateUsername) => async (
{ username, email, acceptTerms },
errors
) => {
await validateUsername({ username }, errors);
if (!Validations.username(username)) errors.username = "Invalid username"; if (!Validations.username(username)) errors.username = "Invalid username";
// Note(amine): username should not be an email // Note(amine): username should not be an email
if (Validations.email(username)) errors.username = "Username shouldn't be an email"; if (Validations.email(username)) errors.username = "Username shouldn't be an email";
@ -49,14 +84,18 @@ export default function TwitterSignup({
onSignupWithVerification, onSignupWithVerification,
}) { }) {
const { scene, goToVerification } = useTwitterSignup(); const { scene, goToVerification } = useTwitterSignup();
const validateUsername = useCheckUser();
const { const {
getFieldProps, getFieldProps,
getFormProps, getFormProps,
values: { email, username }, values: { email, username },
isSubmitting, isSubmitting,
isValidating,
} = useForm({ } = useForm({
initialValues: { username: "", email: initialEmail, acceptTerms: false }, initialValues: { username: "", email: initialEmail, acceptTerms: false },
validate: handleValidation, validate: createValidations(validateUsername),
onSubmit: async ({ username, email }) => { onSubmit: async ({ username, email }) => {
if (email !== initialEmail) { if (email !== initialEmail) {
const response = await createVerification({ email }); const response = await createVerification({ email });
@ -84,6 +123,22 @@ export default function TwitterSignup({
placeholder="Username" placeholder="Username"
name="username" name="username"
type="text" type="text"
success="The username is available."
icon={
isValidating
? () => (
<LoaderSpinner
style={{
height: 16,
width: 16,
marginLeft: 16,
position: "absolute",
right: 12,
}}
/>
)
: null
}
{...getFieldProps("username")} {...getFieldProps("username")}
style={{ backgroundColor: "rgba(242,242,247,0.5)" }} style={{ backgroundColor: "rgba(242,242,247,0.5)" }}
/> />