123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- <script setup lang="ts">
- import type { VbenFormSchema } from '@vben-core/form-ui';
- import type { RegisterEmits } from './types';
- import { computed, reactive } from 'vue';
- import { useRouter } from 'vue-router';
- import { $t } from '@vben/locales';
- import { useVbenForm } from '@vben-core/form-ui';
- import { VbenButton } from '@vben-core/shadcn-ui';
- import Title from './auth-title.vue';
- interface Props {
- formSchema: VbenFormSchema[];
- /**
- * @zh_CN 是否处于加载处理状态
- */
- loading?: boolean;
- /**
- * @zh_CN 登陆路径
- */
- loginPath?: string;
- /**
- * @zh_CN 标题
- */
- title?: string;
- /**
- * @zh_CN 描述
- */
- subTitle?: string;
- /**
- * @zh_CN 按钮文本
- */
- submitButtonText?: string;
- }
- defineOptions({
- name: 'RegisterForm',
- });
- const props = withDefaults(defineProps<Props>(), {
- formSchema: () => [],
- loading: false,
- loginPath: '/auth/login',
- submitButtonText: '',
- subTitle: '',
- title: '',
- });
- const emit = defineEmits<{
- submit: RegisterEmits['submit'];
- }>();
- const [Form, { validate }] = useVbenForm(
- reactive({
- commonConfig: {
- hideLabel: true,
- hideRequiredMark: true,
- },
- schema: computed(() => props.formSchema),
- showDefaultActions: false,
- }),
- );
- const router = useRouter();
- async function handleSubmit() {
- const { valid, values } = await validate();
- if (valid) {
- emit('submit', values as { password: string; username: string });
- }
- }
- function goToLogin() {
- router.push(props.loginPath);
- }
- </script>
- <template>
- <div>
- <Title>
- <slot name="title">
- {{ title || $t('authentication.createAnAccount') }} 🚀
- </slot>
- <template #desc>
- <slot name="subTitle">
- {{ subTitle || $t('authentication.signUpSubtitle') }}
- </slot>
- </template>
- </Title>
- <Form />
- <VbenButton
- :class="{
- 'cursor-wait': loading,
- }"
- :loading="loading"
- aria-label="register"
- class="mt-2 w-full"
- @click="handleSubmit"
- >
- <slot name="submitButtonText">
- {{ submitButtonText || $t('authentication.signUp') }}
- </slot>
- </VbenButton>
- <div class="mt-4 text-center text-sm">
- {{ $t('authentication.alreadyHaveAccount') }}
- <span
- class="text-primary hover:text-primary-hover cursor-pointer text-sm font-normal"
- @click="goToLogin()"
- >
- {{ $t('authentication.goToLogin') }}
- </span>
- </div>
- </div>
- </template>
|