"use client"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import AutoForm, { AutoFormSubmit } from "@/components/auto-form"; import { UserDataContext } from "@/components/providers/userdata-provider"; import { ToastBox, toastType } from "@/components/ui/toast-box"; import { useToast } from "@/components/ui/use-toast"; import type { IApiLoginReq, IApiLoginRes, IApiRegisterReq, IApiRegisterRes, } from "@/interfaces/api.interface"; import { EReturnState, type IStandardisedReturn } from "@/interfaces/general.interface"; import type { IUserData } from "@/interfaces/userdata.interface"; import ApiRequest from "@/services/apiRequest"; import { useLocalStorage } from "@/services/localStorage"; import { Bug, RefreshCw } from "lucide-react"; import Link from "next/link"; import React, { type Dispatch, type SetStateAction, useContext, useState } from "react"; import * as z from "zod"; import Image from "next/image"; const loginSchema = z.object({ email: z .string({ required_error: "Email is needed.", }) .email({ message: "Should be a valid email.", }) .describe("Your account email."), password: z .string({ required_error: "Password is needed.", }) .describe("Your account password."), }); const registerSchema = z.object({ firstName: z.string({ required_error: "First name is required.", }).describe("First name"), lastName: z.string({ required_error: "Last name is required.", }).describe("Last name"), pseudo: z.string({ required_error: "Nickname is required.", }).describe("Nickname"), email: z .string({ required_error: "Email is required.", }) .email("Email must be valid."), password: z .string({ required_error: "Password is required.", }) .min(8, "Password must be at least 8 characters.") .max(32, "Password must be less than 32 characters.") .regex(/[A-Z]/, "Password must contain at least one uppercase letter.") .regex(/[a-z]/, "Password must contain at least one lowercase letter.") .regex(/[0-9]/, "Password must contain at least one number.") .regex(/[^a-zA-Z0-9]/, "Password must contain at least one special character.") .describe("Your account password."), promoCode: z .string().max(255, "Your promotional code is too long.").optional(), }); export function AuthForms() { const [isLoading, setIsLoading] = useState(false); const [sub, setSub] = useLocalStorage("sub", ""); const userContext = useContext(UserDataContext); const { toast } = useToast(); async function doRegister( registerData: IApiRegisterReq, userDataSetter: Dispatch>, ): Promise> { console.trace(registerData); try { const ReqRes = await ApiRequest.standard.post.json< IApiRegisterReq, IApiRegisterRes >("auth/sign-up", registerData); console.trace(ReqRes.data); if (ReqRes.data.user) { userDataSetter({ ...ReqRes.data.user, wallet: { uat: Date.now(), update_interval: 30_000, owned_cryptos: [], }, }); setSub(ReqRes.data.access_token); } console.debug(ReqRes.data.message || "Not additional message from request"); return { state: EReturnState.done, resolved: ReqRes.data, }; } catch (error) { console.error("Error during registration:", error); return { state: EReturnState.serverError, message: error as string, }; } } async function doLogin( loginData: IApiLoginReq, ): Promise> { try { const ReqRes = await ApiRequest.standard.post.json( "auth/sign-in", loginData, ); console.trace(ReqRes.data); if (ReqRes.data.access_token) { setSub(ReqRes.data.access_token); } return { state: EReturnState.done, }; } catch (err) { console.error("Error during login:", err); return { state: EReturnState.serverError, message: err as string, }; } } if (!userContext || !userContext.setUserData) { return (

It seems that the context is missing..

); } return (
{"Logo

Neptune Crypto

Login Register { setIsLoading(true); doLogin(data).then((res) => { if (res.state !== EReturnState.done) { toast({ description: res.message || "An unexpected error occurred..", variant: "destructive", }); setIsLoading(false); return; } //toast.custom() toast({ description: "Login successful ! \n You will be redirected to the home page.", }); setTimeout(() => { setIsLoading(false); location.href = "/"; console.log("Moving to home."); }, 3_000); }); }} fieldConfig={{ password: { inputProps: { type: "password", placeholder: "••••••••", }, }, }} > {/* biome-ignore lint/style/useTemplate: */}

Login

{ setIsLoading(true); doRegister( data, userContext.setUserData as Dispatch>, ).then((res) => { if (res.state !== EReturnState.done) { //toast.custom() setIsLoading(false); return; } //toast.custom() setTimeout(() => { setIsLoading(false); //location.href = "/" console.log("Moving to home."); }, 5_000); }); }} fieldConfig={{ password: { inputProps: { type: "password", placeholder: "••••••••", }, }, }} > {/* biome-ignore lint/style/useTemplate: */}

Register

By submitting this form, you agree to the{" "} GDPR Compliance Policy & Usage Policy .

); }