'use client'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; import './topbar.css'; import { Anchor, Avatar, Button, Card, Checkbox, Container, Group, Menu, Modal, Paper, PasswordInput, Text, TextInput, Title, UnstyledButton } from '@mantine/core'; import Cookies from 'js-cookie'; import { useEffect, useState } from 'react'; import { useForm } from '@mantine/form'; import { login, register, logout, me, refresh } from '@/api/auth'; import { User } from '@/api/auth.types'; import { useToggle } from '@mantine/hooks'; import { notifications } from '@mantine/notifications'; interface HeaderItem { name: string; link: string; role?: string; } const headerItems: HeaderItem[] = [ { name: 'Races', link: '/races' }, { name: 'Classes', link: '/classes' }, { name: 'Feats', link: '/feats' }, { name: 'Options & Features', link: '/options' }, { name: 'Backgrounds', link: '/backgrounds' }, { name: 'Items', link: '/items' }, { name: 'Spells', link: '/spells' }, { name: 'Management', link: '/management', role: 'admin' } ]; export default function Topbar() { const pathName = usePathname(); const [modalType, toggle] = useToggle([undefined, 'login', 'register', 'reset']); const [headers, setHeaders] = useState([]); const [user, setUser] = useState(undefined); useEffect(() => { if (Cookies.get('logged_in')) { me().then((response) => { if (response) { setUser(response.user); } }); } else { refresh(true).then((response) => { if (response) { setUser(response.user); } else { setUser(undefined); } }); } }, []); useEffect(() => { const h: HeaderItem[] = []; headerItems.forEach((item) => { if (item.role == undefined || user?.role == item.role) { h.push(item); } setHeaders(h); }); }, [user]); return ( <> ); } interface LoginModalProps { type?: string; toggle: any; setUser: (user: User) => void; } function LoginModal({ type, toggle, setUser }: LoginModalProps) { function passwordValidator(value: string) { if (value.trim().length < 10) { return 'Password must be at least 10 characters'; } if (value.trim().length >= 128) { return 'Password must be at most 128 characters'; } if (!/(\d)/.test(value)) { return 'Password must contain at least one number'; } if (!/[a-z]/.test(value)) { return 'Password must contain at least one lowercase letter'; } if (!/[A-Z]/.test(value)) { return 'Password must contain at least one uppercase letter'; } if (!/[!@#$%^&*]/.test(value)) { return 'Password must contain at least one special character'; } if (/(.)\1\1/.test(value)) { return 'Password must not contain more than 2 repeating characters'; } return null; } function emailValidator(value: string) { if (value.trim().length == 0) { return 'Email is required'; } if (!/^\S+@\S+$/.test(value)) { return 'Invalid email'; } return null; } const form = useForm({ initialValues: { firstName: '', lastName: '', email: '', password: '', remember: false }, validate: { firstName: (value) => (value.trim().length > 0 ? null : 'First name is required'), lastName: (value) => (value.trim().length > 0 ? null : 'Last name is required'), email: emailValidator, password: passwordValidator } }); function onClose() { toggle(undefined); if (!form.values.remember) { form.reset(); } } return ( {type == 'reset' ? ( Reset password Enter your email and we will send you a link to reset your password.{' '} toggle('login')}> Go Back
console.log(values))}>
) : type == 'register' ? ( Create account Already have an account?{' '} toggle('login')}> Sign in
{ const id = notifications.show({ loading: true, title: `Creating account`, message: `Please wait...`, autoClose: false, withCloseButton: false }); const registerResponse = await register({ first_name: values.firstName, last_name: values.lastName, email: values.email, password: values.password }); if (registerResponse) { const loginResponse = await login(values.email, values.password); if (loginResponse) { setUser(loginResponse.user); onClose(); notifications.update({ id, title: `Account created`, message: `Welcome ${loginResponse.user.first_name}!`, color: 'green', autoClose: 2000, loading: false }); } else { notifications.update({ id, title: `Unable to Login`, message: `Please try again.`, color: 'red', autoClose: 2000, loading: false }); } } else { notifications.update({ id, title: `Unable to Register`, message: `Please try again.`, color: 'error', autoClose: 2000, loading: false }); } })} >
) : ( Welcome back! Do not have an account yet?{' '} toggle('register')}> Create account
{ const response = await login(values.email, values.password); if (response) { setUser(response.user); onClose(); } else { notifications.show({ title: `Unable to Login`, message: `Please try again.`, color: 'red', autoClose: 2000 }); } })} > toggle('reset')}> Forgot password?
)}
); }