Skip to content

Commit 8ea4f89

Browse files
committed
feat: implement register functionality
1 parent be469f2 commit 8ea4f89

File tree

8 files changed

+758
-10
lines changed

8 files changed

+758
-10
lines changed

playground/nuxt.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default defineNuxtConfig({
77
...BASE_CONFIG,
88
nuxtUsers: {
99
auth: {
10-
whitelist: ['/noauth'],
10+
whitelist: ['/noauth', '/register'],
1111
tokenExpiration: 10,
1212
// TODO: if it is uncommented it makes `yarn test:types` fails - for some unknown reason
1313
// INFO: if it is commented out you can not login to the playground

playground/pages/index.vue

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,20 @@ initializeUser()
4141
class="login-section"
4242
>
4343
<p>Please log in to access your profile</p>
44-
<NuxtLink
45-
to="/login"
46-
class="btn btn-primary"
47-
>
48-
Login
49-
</NuxtLink>
44+
<div class="auth-actions">
45+
<NuxtLink
46+
to="/login"
47+
class="btn btn-primary"
48+
>
49+
Login
50+
</NuxtLink>
51+
<NuxtLink
52+
to="/register"
53+
class="btn btn-secondary"
54+
>
55+
Register
56+
</NuxtLink>
57+
</div>
5058
</div>
5159
</div>
5260
</div>
@@ -85,7 +93,8 @@ h1 {
8593
opacity: 0.9;
8694
}
8795
88-
.actions {
96+
.actions,
97+
.auth-actions {
8998
display: flex;
9099
gap: 16px;
91100
justify-content: center;

playground/pages/register.vue

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<template>
2+
<div>
3+
<Head>
4+
<Title>Register - Nuxt Users</Title>
5+
</Head>
6+
7+
<div class="container">
8+
<h1>Register</h1>
9+
10+
<NUsersRegisterForm
11+
redirect-to="/login"
12+
login-link="/login"
13+
@success="onRegistrationSuccess"
14+
@error="onRegistrationError"
15+
/>
16+
</div>
17+
</div>
18+
</template>
19+
20+
<script setup lang="ts">
21+
import type { UserWithoutPassword } from 'nuxt-users/utils'
22+
23+
// Handle successful registration
24+
const onRegistrationSuccess = (data: { user: Omit<UserWithoutPassword, 'active'>, message: string }) => {
25+
console.log('Registration successful:', data)
26+
// Additional success handling if needed
27+
}
28+
29+
// Handle registration error
30+
const onRegistrationError = (error: string) => {
31+
console.error('Registration error:', error)
32+
// Additional error handling if needed
33+
}
34+
</script>
35+
36+
<style scoped>
37+
.container {
38+
max-width: 500px;
39+
margin: 0 auto;
40+
padding: 2rem;
41+
}
42+
43+
h1 {
44+
text-align: center;
45+
margin-bottom: 2rem;
46+
}
47+
</style>

src/module.ts

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,14 @@ export default defineNuxtModule<RuntimeModuleOptions>({
7070
passwordResetTokens: options.tables?.passwordResetTokens || defaultOptions.tables.passwordResetTokens,
7171
},
7272
auth: {
73-
whitelist: [...(defaultOptions.auth?.whitelist || []), ...(options.auth?.whitelist || [])],
73+
whitelist: (() => {
74+
const combinedWhitelist = [...(defaultOptions.auth?.whitelist || []), ...(options.auth?.whitelist || [])]
75+
// Auto-whitelist /confirm-email if /register is whitelisted
76+
if (combinedWhitelist.includes('/register') && !combinedWhitelist.includes('/confirm-email')) {
77+
combinedWhitelist.push('/confirm-email')
78+
}
79+
return combinedWhitelist
80+
})(),
7481
tokenExpiration: options.auth?.tokenExpiration || defaultOptions.auth.tokenExpiration,
7582
permissions: options.auth?.permissions || defaultOptions.auth.permissions
7683
},
@@ -89,7 +96,14 @@ export default defineNuxtModule<RuntimeModuleOptions>({
8996
preventCommonPasswords: options.passwordValidation?.preventCommonPasswords ?? defaultOptions.passwordValidation.preventCommonPasswords,
9097
},
9198
auth: {
92-
whitelist: [...(defaultOptions.auth?.whitelist || []), ...(options.auth?.whitelist || [])],
99+
whitelist: (() => {
100+
const combinedWhitelist = [...(defaultOptions.auth?.whitelist || []), ...(options.auth?.whitelist || [])]
101+
// Auto-whitelist /confirm-email if /register is whitelisted
102+
if (combinedWhitelist.includes('/register') && !combinedWhitelist.includes('/confirm-email')) {
103+
combinedWhitelist.push('/confirm-email')
104+
}
105+
return combinedWhitelist
106+
})(),
93107
permissions: options.auth?.permissions || defaultOptions.auth.permissions
94108
},
95109
apiBasePath: options.apiBasePath || defaultOptions.apiBasePath
@@ -159,6 +173,20 @@ export default defineNuxtModule<RuntimeModuleOptions>({
159173
handler: resolver.resolve('./runtime/server/api/nuxt-users/password/reset.post')
160174
})
161175

176+
// Registration
177+
addServerHandler({
178+
route: `${base}/register`,
179+
method: 'post',
180+
handler: resolver.resolve('./runtime/server/api/nuxt-users/register.post')
181+
})
182+
183+
// Email confirmation
184+
addServerHandler({
185+
route: `${base}/confirm-email`,
186+
method: 'get',
187+
handler: resolver.resolve('./runtime/server/api/nuxt-users/confirm-email.get')
188+
})
189+
162190
// User management
163191
addServerHandler({
164192
route: `${base}`,
@@ -272,6 +300,11 @@ export default defineNuxtModule<RuntimeModuleOptions>({
272300
filePath: resolver.resolve('./runtime/components/NUsersUserForm.vue')
273301
})
274302

303+
addComponent({
304+
name: 'NUsersRegisterForm',
305+
filePath: resolver.resolve('./runtime/components/NUsersRegisterForm.vue')
306+
})
307+
275308
nuxt.options.css = nuxt.options.css || []
276309
nuxt.options.css.push(resolver.resolve('./runtime/assets/nuxt-users.css'))
277310
},

0 commit comments

Comments
 (0)