mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-30 17:53:31 -04:00 
			
		
		
		
	Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { useAsyncValidator } from "~/composables/use-validators";
 | |
| import type { VForm } from "~/types/vuetify";
 | |
| import { usePublicApi } from "~/composables/api/api-client";
 | |
| 
 | |
| const domAccountForm = ref<VForm | null>(null);
 | |
| const username = ref("");
 | |
| const fullName = ref("");
 | |
| const email = ref("");
 | |
| const password1 = ref("");
 | |
| const password2 = ref("");
 | |
| const advancedOptions = ref(false);
 | |
| 
 | |
| export const useUserRegistrationForm = () => {
 | |
|   const i18n = useI18n();
 | |
| 
 | |
|   function safeValidate(form: Ref<VForm | null>) {
 | |
|     if (form.value && form.value.validate) {
 | |
|       return form.value.validate();
 | |
|     }
 | |
|     return false;
 | |
|   }
 | |
|   // ================================================================
 | |
|   // Provide Group Details
 | |
|   const publicApi = usePublicApi();
 | |
|   // ================================================================
 | |
|   // Provide Account Details
 | |
| 
 | |
|   const usernameErrorMessages = ref<string[]>([]);
 | |
|   const { validate: validateUsername, valid: validUsername } = useAsyncValidator(
 | |
|     username,
 | |
|     (v: string) => publicApi.validators.username(v),
 | |
|     i18n.t("validation.username-is-taken"),
 | |
|     usernameErrorMessages,
 | |
|   );
 | |
|   const emailErrorMessages = ref<string[]>([]);
 | |
|   const { validate: validateEmail, valid: validEmail } = useAsyncValidator(
 | |
|     email,
 | |
|     (v: string) => publicApi.validators.email(v),
 | |
|     i18n.t("validation.email-is-taken"),
 | |
|     emailErrorMessages,
 | |
|   );
 | |
|   const accountDetails = {
 | |
|     username,
 | |
|     fullName,
 | |
|     email,
 | |
|     advancedOptions,
 | |
|     validate: async () => {
 | |
|       if (!(validUsername.value && validEmail.value)) {
 | |
|         await Promise.all([validateUsername(), validateEmail()]);
 | |
|       }
 | |
| 
 | |
|       return (safeValidate(domAccountForm as Ref<VForm>) && validUsername.value && validEmail.value);
 | |
|     },
 | |
|     reset: () => {
 | |
|       accountDetails.username.value = "";
 | |
|       accountDetails.fullName.value = "";
 | |
|       accountDetails.email.value = "";
 | |
|       accountDetails.advancedOptions.value = false;
 | |
|     },
 | |
|   };
 | |
|   // ================================================================
 | |
|   // Provide Credentials
 | |
|   const passwordMatch = () => password1.value === password2.value || i18n.t("user.password-must-match");
 | |
|   const credentials = {
 | |
|     password1,
 | |
|     password2,
 | |
|     passwordMatch,
 | |
|     reset: () => {
 | |
|       credentials.password1.value = "";
 | |
|       credentials.password2.value = "";
 | |
|     },
 | |
|   };
 | |
| 
 | |
|   return {
 | |
|     accountDetails,
 | |
|     credentials,
 | |
|     emailErrorMessages,
 | |
|     usernameErrorMessages,
 | |
|     // Fields
 | |
|     advancedOptions,
 | |
|     // Validators
 | |
|     validateUsername,
 | |
|     validateEmail,
 | |
|     // Dom Refs
 | |
|     domAccountForm,
 | |
|   };
 | |
| };
 |