diff --git a/frontend/composables/user.ts b/frontend/composables/user.ts index 1d81868..44db735 100644 --- a/frontend/composables/user.ts +++ b/frontend/composables/user.ts @@ -23,6 +23,23 @@ const userLogin = async (email: String, password: String) => { await getUser() } +const newUserSchema = z.object({ + name: z.string(), + email: z.string().email(), + password: z.string().min(6), + password_confirmation: z.string().min(6), +}) + +const userSignup = async (data: unknown) => { + const newUser = newUserSchema.safeParse(data) + + if (!newUser.success) return newUser.error.format() + + await request.post('/register', newUser.data) + + await getUser() +} + const getUser = async () => { await request .get('/api/user') @@ -43,4 +60,4 @@ const userLogout = async () => { const useUser = () => useState('user', () => '') -export { userLogin, useUser, getUser, userLogout } +export { userLogin, useUser, getUser, userLogout, userSignup } diff --git a/frontend/pages/login/index.vue b/frontend/pages/login/index.vue index 5875e10..3eaee98 100644 --- a/frontend/pages/login/index.vue +++ b/frontend/pages/login/index.vue @@ -6,11 +6,14 @@ definePageMeta({ const user = useUser() const userCredential = reactive({ + name: '', email: '', password: '', + password_confirmation: '', }) const isSigningIn = ref(false) +const isSignUp = ref(false) const errors = reactive({ email: '', @@ -31,6 +34,16 @@ const login = async () => { setTimeout(() => (isSigningIn.value = false), 500) } +const toggleSignup = () => { + isSignUp.value = !isSignUp.value +} + +const signup = async () => { + isSigningIn.value = true + const error = await userSignup(userCredential) + setTimeout(() => (isSigningIn.value = false), 500) +} + watch( () => user.value, () => { @@ -43,6 +56,11 @@ watch(
+ + + @@ -55,14 +73,29 @@ watch( {{ errors.password }} + + +
{{ errors.user }}
- + +
+ {{ + isSignUp + ? 'Already have an account? Sign in' + : 'No account? Sign up' + }} +