) => {
e.preventDefault();
-
+ setIsSubmitting(true);
try {
schema.parse(values);
- values.password = await hashPassword(values.password);
- // If validation passes, proceed with form submission
- //console.log('Form login submitted:', values);
- login.mutate(values);
+ const request:LoginPropsRequest = {
+ email: values.email,
+ password: values.password
+ }
+ login.mutate(request, {
+ onSuccess: () => {
+ navigate('/');
+ }
+ } );
} catch (error) {
+ setIsSubmitting(false);
if (error instanceof z.ZodError) {
const fieldErrors: { [key: string]: string } = {};
error.errors.forEach(err => {
@@ -48,6 +55,7 @@ export const Login = () => {
});
setErrors(fieldErrors);
}
+ console.log("Error: "+error)
}
};
@@ -71,10 +79,12 @@ export const Login = () => {
-
+ {isSubmitting ? (
+
+ ) : (
+
+ )}
-
-
Not a member?{' '}
Register a new account here!
diff --git a/src/features/auth/routes/Register.tsx b/src/features/auth/routes/Register.tsx
index 7f04bcd..4545068 100644
--- a/src/features/auth/routes/Register.tsx
+++ b/src/features/auth/routes/Register.tsx
@@ -1,50 +1,52 @@
-import {Form, Link} from 'react-router-dom';
-import {Layout} from '../components/Layout';
+import { Form, Link } from 'react-router-dom';
+import { Layout } from '../components/Layout';
import * as z from "zod";
-import React, {useEffect, useState} from "react";
+import React, { useEffect, useState } from "react";
import Heading from "../../../components/Elements/Headings/Heading";
import InputField from "../../../components/Form/InputField";
import Button from "../../../components/Elements/Button";
-import {EmblaOptionsType} from "embla-carousel";
+import { EmblaOptionsType } from "embla-carousel";
import EmblaCarousel from "../../../components/Elements/Carousel/Carousel";
-import {fetchPokemon, Pokemon} from "../../avatarPic/api";
-import {hashPassword} from "./index";
-import {RegisterCredentialsDTO} from "../api/register";
-import {useRegister} from "../../../lib/auth";
+import { fetchPokemon, Pokemon } from "../../avatarPic/api";
+import { useRegister } from "../../../lib/auth";
import storage from "../../../utils/storage";
-import {useQuery} from "@tanstack/react-query";
+import { useQuery } from "@tanstack/react-query";
import SpinnerComponent from "../../spinner/SpinnerComponent";
-
-
+import { CreateUserPropsRequest } from "../types";
+import {useNavigate} from "react-router";
const schema = z.object({
email: z.string().min(1, 'Email is required').email('Invalid email format. Please insert valid email.'),
- password: z.string().min(1, 'Password needs to be at least 5 characters long.'),
+ password: z.string().min(1, 'Password needs to be at least 1 character long.'),
name: z.string().min(1, 'Name is required.')
});
+
type RegisterValues = {
email: string;
password: string;
name: string;
avatarId: string;
};
-const OPTIONS: EmblaOptionsType = {align: 'start'}
+
+const OPTIONS: EmblaOptionsType = { align: 'start' }
const SLIDE_COUNT = 6
const SLIDES = Array.from(Array(SLIDE_COUNT).keys())
export const Register = () => {
- //for register form
- const [values, setValues] = useState({email: '', password: '', name: '', avatarId: '1'});
+ // for register form
+ const [values, setValues] = useState({ email: '', password: '', name: '', avatarId: '1' });
const [errors, setErrors] = useState<{ [key: string]: string }>({});
+ const [isSubmitting, setIsSubmitting] = useState(false);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const [pokemonError, setPokemonError] = useState('');
+ const [emailsList, setEmailsList] = useState([]);
-
- //for pokemon image slider
+ // for pokemon image slider
const [pokemonList, setPokemonList] = useState([]);
const handlePokemonSelect = (pokemonId: string) => {
- handleChange({target: {name: 'avatarId', value: pokemonId}} as React.ChangeEvent)
+ handleChange({ target: { name: 'avatarId', value: pokemonId } } as React.ChangeEvent)
};
+ const navigate = useNavigate();
const { isLoading, error, data } = useQuery({
queryKey: ['pokemonList'],
@@ -55,31 +57,60 @@ export const Register = () => {
if (data) {
setPokemonList(data);
}
+ const emails: string[] = [
+ "asd@gmail.com",
+ "dsa@gmail.com"
+ ];
+
+ setEmailsList(emails);
+
}, [data]);
const handleChange = (e: React.ChangeEvent) => {
- const {name, value} = e.target;
- setValues({...values, [name]: value});
- setErrors({...errors, [name]: ''});
+ const { name, value } = e.target;
+ setValues({ ...values, [name]: value });
+ setErrors({ ...errors, [name]: '' });
};
+
const register = useRegister();
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
+ setIsSubmitting(true);
try {
schema.parse(values);
- values.password = await hashPassword(values.password);
+
+ if (emailsList.includes(values.email)) {
+ setErrors({ ...errors, email: 'Email is already taken' });
+ setIsSubmitting(false);
+ return;
+ }
+
const avatarIdNumber = parseInt(values.avatarId);
- const credentials: RegisterCredentialsDTO = {
+ const credentials: CreateUserPropsRequest = {
email: values.email,
password: values.password,
name: values.name,
avatarId: avatarIdNumber
};
+ register.mutate(credentials, {
+ onSuccess: () => {
+ navigate('/');
+ }
+ } );
- console.log('Form register submitted:', credentials);
- register.mutate(credentials);
+ setEmailsList([...emailsList, values.email]);
+
+ register.mutate(credentials, {
+ onSuccess: () => {
+ setIsSubmitting(false);
+ },
+ onError: () => {
+ setIsSubmitting(false);
+ }
+ });
await console.log(storage.getToken())
} catch (error) {
+ setIsSubmitting(false);
if (error instanceof z.ZodError) {
const fieldErrors: { [key: string]: string } = {};
error.errors.forEach(err => {
@@ -91,43 +122,44 @@ export const Register = () => {
}
};
-
-
return (