mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 02:57:57 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			196 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="medium-10 column signup">
 | |
|     <div class="text-center medium-12 signup--hero">
 | |
|       <img
 | |
|         :src="globalConfig.logo"
 | |
|         :alt="globalConfig.installationName"
 | |
|         class="hero--logo"
 | |
|       />
 | |
|       <h2 class="hero--title">
 | |
|         {{ $t('REGISTER.TRY_WOOT') }}
 | |
|       </h2>
 | |
|     </div>
 | |
|     <div class="row align-center">
 | |
|       <div class="small-12 medium-6 large-5 column">
 | |
|         <form class="signup--box login-box" @submit.prevent="submit">
 | |
|           <woot-input
 | |
|             v-model="credentials.fullName"
 | |
|             :class="{ error: $v.credentials.fullName.$error }"
 | |
|             :label="$t('REGISTER.FULL_NAME.LABEL')"
 | |
|             :placeholder="$t('REGISTER.FULL_NAME.PLACEHOLDER')"
 | |
|             :error="
 | |
|               $v.credentials.fullName.$error
 | |
|                 ? $t('REGISTER.FULL_NAME.ERROR')
 | |
|                 : ''
 | |
|             "
 | |
|             @blur="$v.credentials.fullName.$touch"
 | |
|           />
 | |
|           <woot-input
 | |
|             v-model="credentials.accountName"
 | |
|             :class="{ error: $v.credentials.accountName.$error }"
 | |
|             :label="$t('REGISTER.ACCOUNT_NAME.LABEL')"
 | |
|             :placeholder="$t('REGISTER.ACCOUNT_NAME.PLACEHOLDER')"
 | |
|             :error="
 | |
|               $v.credentials.accountName.$error
 | |
|                 ? $t('REGISTER.ACCOUNT_NAME.ERROR')
 | |
|                 : ''
 | |
|             "
 | |
|             @blur="$v.credentials.accountName.$touch"
 | |
|           />
 | |
|           <woot-input
 | |
|             v-model.trim="credentials.email"
 | |
|             type="email"
 | |
|             :class="{ error: $v.credentials.email.$error }"
 | |
|             :label="$t('REGISTER.EMAIL.LABEL')"
 | |
|             :placeholder="$t('REGISTER.EMAIL.PLACEHOLDER')"
 | |
|             :error="
 | |
|               $v.credentials.email.$error ? $t('REGISTER.EMAIL.ERROR') : ''
 | |
|             "
 | |
|             @blur="$v.credentials.email.$touch"
 | |
|           />
 | |
|           <woot-submit-button
 | |
|             :disabled="isSignupInProgress"
 | |
|             :button-text="$t('REGISTER.SUBMIT')"
 | |
|             :loading="isSignupInProgress"
 | |
|             button-class="large expanded"
 | |
|           >
 | |
|           </woot-submit-button>
 | |
|           <p class="accept--terms" v-html="termsLink"></p>
 | |
|         </form>
 | |
|         <div class="column text-center sigin--footer">
 | |
|           <span>{{ $t('REGISTER.HAVE_AN_ACCOUNT') }}</span>
 | |
|           <router-link to="/app/login">
 | |
|             {{
 | |
|               useInstallationName(
 | |
|                 $t('LOGIN.TITLE'),
 | |
|                 globalConfig.installationName
 | |
|               )
 | |
|             }}
 | |
|           </router-link>
 | |
|         </div>
 | |
|       </div>
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import { required, minLength, email } from 'vuelidate/lib/validators';
 | |
| import Auth from '../../api/auth';
 | |
| import { mapGetters } from 'vuex';
 | |
| import globalConfigMixin from 'shared/mixins/globalConfigMixin';
 | |
| import alertMixin from 'shared/mixins/alertMixin';
 | |
| 
 | |
| export default {
 | |
|   mixins: [globalConfigMixin, alertMixin],
 | |
|   data() {
 | |
|     return {
 | |
|       credentials: {
 | |
|         accountName: '',
 | |
|         fullName: '',
 | |
|         email: '',
 | |
|       },
 | |
|       isSignupInProgress: false,
 | |
|       error: '',
 | |
|     };
 | |
|   },
 | |
|   validations: {
 | |
|     credentials: {
 | |
|       accountName: {
 | |
|         required,
 | |
|         minLength: minLength(2),
 | |
|       },
 | |
|       fullName: {
 | |
|         required,
 | |
|         minLength: minLength(2),
 | |
|       },
 | |
|       email: {
 | |
|         required,
 | |
|         email,
 | |
|       },
 | |
|     },
 | |
|   },
 | |
|   computed: {
 | |
|     ...mapGetters({
 | |
|       globalConfig: 'globalConfig/get',
 | |
|     }),
 | |
|     termsLink() {
 | |
|       return this.$t('REGISTER.TERMS_ACCEPT')
 | |
|         .replace('https://www.chatwoot.com/terms', this.globalConfig.termsURL)
 | |
|         .replace(
 | |
|           'https://www.chatwoot.com/privacy-policy',
 | |
|           this.globalConfig.privacyURL
 | |
|         );
 | |
|     },
 | |
|   },
 | |
|   methods: {
 | |
|     async submit() {
 | |
|       this.$v.$touch();
 | |
|       if (this.$v.$invalid) {
 | |
|         return;
 | |
|       }
 | |
|       this.isSignupInProgress = true;
 | |
|       try {
 | |
|         const response = await Auth.register(this.credentials);
 | |
|         if (response.status === 200) {
 | |
|           window.location = '/';
 | |
|         }
 | |
|       } catch (error) {
 | |
|         let errorMessage = this.$t('REGISTER.API.ERROR_MESSAGE');
 | |
|         if (error.response && error.response.data.message) {
 | |
|           errorMessage = error.response.data.message;
 | |
|         }
 | |
|         this.showAlert(errorMessage);
 | |
|       } finally {
 | |
|         this.isSignupInProgress = false;
 | |
|       }
 | |
|     },
 | |
|   },
 | |
| };
 | |
| </script>
 | |
| <style scoped lang="scss">
 | |
| .signup {
 | |
|   .signup--hero {
 | |
|     margin-bottom: var(--space-larger);
 | |
| 
 | |
|     .hero--logo {
 | |
|       width: 180px;
 | |
|     }
 | |
| 
 | |
|     .hero--title {
 | |
|       margin-top: var(--space-large);
 | |
|       font-weight: var(--font-weight-light);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .signup--box {
 | |
|     padding: var(--space-large);
 | |
| 
 | |
|     label {
 | |
|       font-size: var(--font-size-default);
 | |
|       color: var(--b-600);
 | |
| 
 | |
|       input {
 | |
|         padding: var(--space-slab);
 | |
|         height: var(--space-larger);
 | |
|         font-size: var(--font-size-default);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .sigin--footer {
 | |
|     padding: var(--space-medium);
 | |
|     font-size: var(--font-size-default);
 | |
| 
 | |
|     > a {
 | |
|       font-weight: var(--font-weight-bold);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .accept--terms {
 | |
|     font-size: var(--font-size-small);
 | |
|     text-align: center;
 | |
|     margin: var(--space-normal) 0 0 0;
 | |
|   }
 | |
| }
 | |
| </style>
 | 
