User Registration Form Update
March 8, 2025 · AI Conversations
<script>
import { ref } from "vue";
import { useForm, useField } from 'vee-validate'
import IconLoading from '../components/icons/IconLoading.vue';
import SingleColumn from '../layouts/SingleColumn.vue';
const { handleSubmit, handleReset } = useForm({
validationSchema: {
name (value) {
if (value?.length >= 2) return true
return 'Name needs to be at least 2 characters.'
},
email (value) {
if (/^[a-z.-]+@[a-z.-]+.[a-z]+$/i.test(value)) return true
return 'Must be a valid e-mail.'
},
password (value) {
if (value?.length >= 6) return true
return 'Password needs to be at least 6 characters.'
}
},
})
const name = useField('name')
const email = useField('email')
const password = useField('password')
const submit = handleSubmit(values => {
alert(JSON.stringify(values, null, 2))
})
const user = ref({
username: "",
email: "",
password: "",
});
const loading = ref(false);
const message = ref("");
const showPassword = ref(false);
const createUser = async () => {
loading.value = true;
const apiUrl = "https://autohauslange.carmar.digital/wp-json/wp/v2/users";
const adminUsername = "plstr-admin";
const applicationPassword = "MrYNs0r68Hb7ywed01JmiX7d";
// Encode credentials for Basic Auth
const authHeader = `Basic ${btoa(`${adminUsername}:${applicationPassword}`)}`;
try {
const response = await fetch(apiUrl, {
method: "POST",
headers: {
"Authorization": authHeader,
"Content-Type": "application/json",
},
body: JSON.stringify(user.value),
});
const result = await response.json();
if (response.ok) {
message.value = `User ${result.username} created successfully!`;
} else {
message.value = `Error: ${result.message}`;
}
} catch (error) {
message.value = `Request failed: ${error.message}`;
loading.value = false;
} finally {
loading.value = false;
}
};
</script>
Register
submit
clear
add confirm password
### Steps:
1. **Add a `confirmPassword` field in the form validation schema**.
2. **Ensure it matches the `password` field**.
3. **Bind it to the UI**.
—
### **Updated Code:**
<script setup lang="ts">
import { ref } from "vue";
import { useForm, useField } from 'vee-validate'
import IconLoading from '../components/icons/IconLoading.vue';
import SingleColumn from '../layouts/SingleColumn.vue';
const { handleSubmit, handleReset } = useForm({
validationSchema: {
name (value) {
if (value?.length >= 2) return true
return 'Name needs to be at least 2 characters.'
},
email (value) {
if (/^[a-z.-]+@[a-z.-]+.[a-z]+$/i.test(value)) return true
return 'Must be a valid e-mail.'
},
password (value) {
if (value?.length >= 6) return true
return 'Password needs to be at least 6 characters.'
},
confirmPassword (value, values) {
if (value === values.password) return true
return 'Passwords do not match.'
}
},
})
const name = useField('name')
const email = useField('email')
const password = useField('password')
const confirmPassword = useField('confirmPassword')
const submit = handleSubmit(values => {
alert(JSON.stringify(values, null, 2))
})
const showPassword = ref(false);
const showConfirmPassword = ref(false);
</script>
<template>
<SingleColumn :md="12" :mt="4">
<h3 class="text-h4 text-center mb-4">Register</h3>
<v-stepper model-value="1">
<v-stepper-header>
<v-stepper-item title="Sign Up" value="1"></v-stepper-item>
<v-divider></v-divider>
<v-stepper-item title="Verify" value="2"></v-stepper-item>
<v-divider></v-divider>
<v-stepper-item title="Login" value="3"></v-stepper-item>
</v-stepper-header>
<v-stepper-items>
<!-- Step 1: Registration Form -->
<v-stepper-content value="1">
<v-sheet class="mx-auto mt-4" max-width="600">
<form @submit.prevent="submit">
<v-text-field
v-model="name.value.value"
:counter="10"
:error-messages="name.errorMessage.value"
label="Name"
></v-text-field>
<v-text-field
v-model="email.value.value"
:error-messages="email.errorMessage.value"
label="E-mail"
></v-text-field>
<v-text-field
v-model="password.value.value"
:type="showPassword ? 'text' : 'password'"
:error-messages="password.errorMessage.value"
prepend-inner-icon="mdi-lock"
:append-inner-icon="showPassword ? 'mdi-eye-off' : 'mdi-eye'"
@click:append-inner="showPassword = !showPassword"
label="Password"
></v-text-field>
<v-text-field
v-model="confirmPassword.value.value"
:type="showConfirmPassword ? 'text' : 'password'"
:error-messages="confirmPassword.errorMessage.value"
prepend-inner-icon="mdi-lock"
:append-inner-icon="showConfirmPassword ? 'mdi-eye-off' : 'mdi-eye'"
@click:append-inner="showConfirmPassword = !showConfirmPassword"
label="Confirm Password"
></v-text-field>
<v-btn class="me-4" type="submit">Submit</v-btn>
<v-btn @click="handleReset">Clear</v-btn>
</form>
</v-sheet>
</v-stepper-content>
<!-- Step 2: Verification -->
<v-stepper-content value="2"></v-stepper-content>
<!-- Step 3: Login -->
<v-stepper-content value="3"></v-stepper-content>
</v-stepper-items>
</v-stepper>
</SingleColumn>
</template>
—
### **Key Additions:**
✅ **Added `confirmPassword` field**
✅ **Added validation to check if passwords match**
✅ **Included a password toggle for `confirmPassword`**
This will ensure that users must enter the same password in both fields before submitting. 🚀
### Steps to Fix:
1. **Add validation for confirm password** in the `validationSchema`.
2. **Bind confirm password field** using `useField('confirmPassword')`.
3. **Ensure confirm password matches password** in the validation function.
4. **Add a corresponding “ for confirm password** in the template.
—
### Updated Code:
<script setup lang="ts">
import { ref } from "vue";
import { useForm, useField } from "vee-validate";
import IconLoading from "../components/icons/IconLoading.vue";
import SingleColumn from "../layouts/SingleColumn.vue";
const { handleSubmit, handleReset } = useForm({
validationSchema: {
name(value) {
if (value?.length >= 2) return true;
return "Name needs to be at least 2 characters.";
},
email(value) {
if (/^[a-z.-]+@[a-z.-]+.[a-z]+$/i.test(value)) return true;
return "Must be a valid e-mail.";
},
password(value) {
if (value?.length >= 6) return true;
return "Password needs to be at least 6 characters.";
},
confirmPassword(value, { password }) {
if (!value) return "Confirm Password is required.";
if (value !== password) return "Passwords do not match.";
return true;
},
},
});
const name = useField("name");
const email = useField("email");
const password = useField("password");
const confirmPassword = useField("confirmPassword");
const submit = handleSubmit((values) => {
alert(JSON.stringify(values, null, 2));
});
const showPassword = ref(false);
const showConfirmPassword = ref(false);
</script>
<template>
<SingleColumn :md="12" :mt="4">
<h3 class="text-h4 text-center mb-4">Register</h3>
<v-stepper model-value="1">
<v-stepper-header>
<v-stepper-item title="Sign Up" value="1"></v-stepper-item>
<v-divider></v-divider>
<v-stepper-item title="Verify" value="2"></v-stepper-item>
<v-divider></v-divider>
<v-stepper-item title="Login" value="3"></v-stepper-item>
</v-stepper-header>
<v-stepper-items>
<!-- Step 1: Registration Form -->
<v-stepper-content value="1">
<v-sheet class="mx-auto mt-4" max-width="600">
<form @submit.prevent="submit">
<v-text-field
v-model="name.value.value"
:counter="10"
:error-messages="name.errorMessage.value"
label="Name"
></v-text-field>
<v-text-field
v-model="email.value.value"
:error-messages="email.errorMessage.value"
label="E-mail"
></v-text-field>
<v-text-field
v-model="password.value.value"
:type="showPassword ? 'text' : 'password'"
:error-messages="password.errorMessage.value"
prepend-inner-icon="mdi-lock"
:append-inner-icon="showPassword ? 'mdi-eye-off' : 'mdi-eye'"
@click:append-inner="showPassword = !showPassword"
label="Password"
></v-text-field>
<v-text-field
v-model="confirmPassword.value.value"
:type="showConfirmPassword ? 'text' : 'password'"
:error-messages="confirmPassword.errorMessage.value"
prepend-inner-icon="mdi-lock"
:append-inner-icon="showConfirmPassword ? 'mdi-eye-off' : 'mdi-eye'"
@click:append-inner="showConfirmPassword = !showConfirmPassword"
label="Confirm Password"
></v-text-field>
<v-btn class="me-4" type="submit">Submit</v-btn>
<v-btn @click="handleReset">Clear</v-btn>
</form>
</v-sheet>
</v-stepper-content>
<!-- Step 2: Verification -->
<v-stepper-content value="2"> </v-stepper-content>
<!-- Step 3: Login -->
<v-stepper-content value="3"> </v-stepper-content>
</v-stepper-items>
</v-stepper>
</SingleColumn>
</template>
—
### Key Fixes:
✅ **Added `confirmPassword` field** with validation.
✅ **Ensured confirm password matches password** in the validation schema.
✅ **Bound `confirmPassword` correctly** using `useField('confirmPassword')`.
✅ **Included confirm password field** in the form with visibility toggle.
Now, the confirm password field will validate and ensure both passwords match. 🚀