123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- <script setup lang="ts">
- import type { VbenFormSchema } from '@vben-core/form-ui';
- import type { LoginCodeEmits } 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: 'AuthenticationCodeLogin',
- });
- const props = withDefaults(defineProps<Props>(), {
- loading: false,
- loginPath: '/auth/login',
- submitButtonText: '',
- subTitle: '',
- title: '',
- });
- const emit = defineEmits<{
- submit: LoginCodeEmits['submit'];
- }>();
- const router = useRouter();
- const [Form, { validate }] = useVbenForm(
- reactive({
- commonConfig: {
- hideLabel: true,
- hideRequiredMark: true,
- },
- schema: computed(() => props.formSchema),
- showDefaultActions: false,
- }),
- );
- async function handleSubmit() {
- const { valid, values } = await validate();
- if (valid) {
- emit('submit', {
- code: values?.code,
- phoneNumber: values?.phoneNumber,
- });
- }
- }
- function goToLogin() {
- router.push(props.loginPath);
- }
- </script>
- <template>
- <div>
- <Title>
- <slot name="title">
- {{ title || $t('authentication.welcomeBack') }} 📲
- </slot>
- <template #desc>
- <span class="text-muted-foreground">
- <slot name="subTitle">
- {{ subTitle || $t('authentication.codeSubtitle') }}
- </slot>
- </span>
- </template>
- </Title>
- <Form />
- <VbenButton
- :class="{
- 'cursor-wait': loading,
- }"
- :loading="loading"
- class="w-full"
- @click="handleSubmit"
- >
- <slot name="submitButtonText">
- {{ submitButtonText || $t('common.login') }}
- </slot>
- </VbenButton>
- <VbenButton class="mt-4 w-full" variant="outline" @click="goToLogin()">
- {{ $t('common.back') }}
- </VbenButton>
- </div>
- </template>
|