refactor: typing component template refs for VModal (#5994)

#### What type of PR is this?

/area ui
/kind improvement
/milestone 2.16.x

#### What this PR does / why we need it:

为 VModal 组件的引用添加类型。

See https://vuejs.org/guide/typescript/composition-api.html#typing-component-template-refs

#### Does this PR introduce a user-facing change?

```release-note
None
```
pull/6005/head v2.16.0-rc.1
Ryan Wang 2024-05-27 16:56:57 +08:00 committed by GitHub
parent 22ce60b0e9
commit afabffc546
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 79 additions and 79 deletions

View File

@ -23,7 +23,7 @@ const emit = defineEmits<{
const { t } = useI18n(); const { t } = useI18n();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const formState = ref<Group>({ const formState = ref<Group>({
spec: { spec: {
displayName: "", displayName: "",
@ -60,7 +60,7 @@ const handleSave = async () => {
} }
Toast.success(t("core.common.toast.save_success")); Toast.success(t("core.common.toast.save_success"));
modal.value.close(); modal.value?.close();
} catch (e) { } catch (e) {
console.error("Failed to save attachment group", e); console.error("Failed to save attachment group", e);
} finally { } finally {
@ -112,7 +112,7 @@ onMounted(() => {
@submit="$formkit.submit('attachment-group-form')" @submit="$formkit.submit('attachment-group-form')"
> >
</SubmitButton> </SubmitButton>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.cancel_and_shortcut") }} {{ $t("core.common.buttons.cancel_and_shortcut") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -33,7 +33,7 @@ const { t } = useI18n();
const { policies, isLoading, handleFetchPolicies } = useFetchAttachmentPolicy(); const { policies, isLoading, handleFetchPolicies } = useFetchAttachmentPolicy();
const { policyTemplates } = useFetchAttachmentPolicyTemplate(); const { policyTemplates } = useFetchAttachmentPolicyTemplate();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const selectedPolicy = ref<Policy>(); const selectedPolicy = ref<Policy>();
const selectedTemplateName = ref(); const selectedTemplateName = ref();
@ -200,7 +200,7 @@ function getPolicyTemplateDisplayName(templateName: string) {
</li> </li>
</ul> </ul>
<template #footer> <template #footer>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.close_and_shortcut") }} {{ $t("core.common.buttons.close_and_shortcut") }}
</VButton> </VButton>
</template> </template>

View File

@ -29,7 +29,7 @@ const emit = defineEmits<{
const { t } = useI18n(); const { t } = useI18n();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const formState = ref<Policy>({ const formState = ref<Policy>({
spec: { spec: {
@ -167,7 +167,7 @@ const handleSave = async () => {
} }
Toast.success(t("core.common.toast.save_success")); Toast.success(t("core.common.toast.save_success"));
modal.value.close(); modal.value?.close();
} catch (e) { } catch (e) {
console.error("Failed to save attachment policy", e); console.error("Failed to save attachment policy", e);
} finally { } finally {
@ -234,7 +234,7 @@ const modalTitle = props.policy
@submit="$formkit.submit('attachment-policy-form')" @submit="$formkit.submit('attachment-policy-form')"
> >
</SubmitButton> </SubmitButton>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.cancel_and_shortcut") }} {{ $t("core.common.buttons.cancel_and_shortcut") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -26,7 +26,7 @@ const { groups } = useFetchAttachmentGroup();
const { policies, handleFetchPolicies } = useFetchAttachmentPolicy(); const { policies, handleFetchPolicies } = useFetchAttachmentPolicy();
const { policyTemplates } = useFetchAttachmentPolicyTemplate(); const { policyTemplates } = useFetchAttachmentPolicyTemplate();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const selectedGroupName = useLocalStorage("attachment-upload-group", ""); const selectedGroupName = useLocalStorage("attachment-upload-group", "");
const selectedPolicyName = useLocalStorage("attachment-upload-policy", ""); const selectedPolicyName = useLocalStorage("attachment-upload-policy", "");
const policyEditingModal = ref(false); const policyEditingModal = ref(false);
@ -169,7 +169,7 @@ const onEditingModalClose = async () => {
? '' ? ''
: $t('core.attachment.upload_modal.filters.policy.not_select') : $t('core.attachment.upload_modal.filters.policy.not_select')
" "
:done-button-handler="() => modal.close()" :done-button-handler="() => modal?.close()"
/> />
</div> </div>
</VModal> </VModal>

View File

@ -39,7 +39,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const formState = ref<ReplyRequest>({ const formState = ref<ReplyRequest>({
raw: "", raw: "",
content: "", content: "",
@ -67,7 +67,7 @@ const handleCreateReply = async () => {
replyRequest: formState.value, replyRequest: formState.value,
}); });
modal.value.close(); modal.value?.close();
Toast.success( Toast.success(
t("core.comment.reply_modal.operations.submit.toast_success") t("core.comment.reply_modal.operations.submit.toast_success")
@ -149,7 +149,7 @@ const onEmojiSelect = (emoji: { native: string }) => {
@submit="$formkit.submit('create-reply-form')" @submit="$formkit.submit('create-reply-form')"
> >
</SubmitButton> </SubmitButton>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.cancel_and_shortcut") }} {{ $t("core.common.buttons.cancel_and_shortcut") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -1,4 +1,14 @@
<script lang="ts" setup> <script lang="ts" setup>
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
import { singlePageLabels } from "@/constants/labels";
import { FormType } from "@/types/slug";
import { apiClient } from "@/utils/api-client";
import { toDatetimeLocal, toISOString } from "@/utils/date";
import { randomUUID } from "@/utils/id";
import useSlugify from "@console/composables/use-slugify";
import { useThemeCustomTemplates } from "@console/modules/interface/themes/composables/use-theme";
import { submitForm } from "@formkit/core";
import type { SinglePage } from "@halo-dev/api-client";
import { import {
IconRefreshLine, IconRefreshLine,
Toast, Toast,
@ -6,20 +16,10 @@ import {
VModal, VModal,
VSpace, VSpace,
} from "@halo-dev/components"; } from "@halo-dev/components";
import { computed, nextTick, ref, watch } from "vue";
import type { SinglePage } from "@halo-dev/api-client";
import { cloneDeep } from "lodash-es"; import { cloneDeep } from "lodash-es";
import { apiClient } from "@/utils/api-client"; import { computed, nextTick, ref, watch } from "vue";
import { useThemeCustomTemplates } from "@console/modules/interface/themes/composables/use-theme";
import { singlePageLabels } from "@/constants/labels";
import { randomUUID } from "@/utils/id";
import { toDatetimeLocal, toISOString } from "@/utils/date";
import { submitForm } from "@formkit/core";
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
import useSlugify from "@console/composables/use-slugify";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import { usePageUpdateMutate } from "../composables/use-page-update-mutate"; import { usePageUpdateMutate } from "../composables/use-page-update-mutate";
import { FormType } from "@/types/slug";
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
@ -67,7 +67,7 @@ const formState = ref<SinglePage>({
name: randomUUID(), name: randomUUID(),
}, },
}); });
const modal = ref<InstanceType<typeof VModal>>(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const isSubmitting = ref(false); const isSubmitting = ref(false);
const publishing = ref(false); const publishing = ref(false);
const publishCanceling = ref(false); const publishCanceling = ref(false);

View File

@ -64,7 +64,7 @@ const formState = ref<Category>({
}); });
const selectedParentCategory = ref(); const selectedParentCategory = ref();
const saving = ref(false); const saving = ref(false);
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const isUpdateMode = !!props.category; const isUpdateMode = !!props.category;
@ -138,7 +138,7 @@ const handleSaveCategory = async () => {
} }
} }
modal.value.close(); modal.value?.close();
queryClient.invalidateQueries({ queryKey: ["post-categories"] }); queryClient.invalidateQueries({ queryKey: ["post-categories"] });
@ -304,7 +304,7 @@ const { handleGenerateSlug } = useSlugify(
@submit="$formkit.submit('category-form')" @submit="$formkit.submit('category-form')"
> >
</SubmitButton> </SubmitButton>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.cancel_and_shortcut") }} {{ $t("core.common.buttons.cancel_and_shortcut") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -59,7 +59,7 @@ const formState = ref<Tag>({
}, },
}); });
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const saving = ref(false); const saving = ref(false);
@ -101,7 +101,7 @@ const handleSaveTag = async () => {
}); });
} }
modal.value.close(); modal.value?.close();
Toast.success(t("core.common.toast.save_success")); Toast.success(t("core.common.toast.save_success"));
} catch (e) { } catch (e) {
@ -258,7 +258,7 @@ const { handleGenerateSlug } = useSlugify(
@submit="$formkit.submit('tag-form')" @submit="$formkit.submit('tag-form')"
> >
</SubmitButton> </SubmitButton>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.cancel_and_shortcut") }} {{ $t("core.common.buttons.cancel_and_shortcut") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -26,7 +26,7 @@ const emit = defineEmits<{
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { t } = useI18n(); const { t } = useI18n();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const formState = ref<Menu>({ const formState = ref<Menu>({
spec: { spec: {
@ -64,7 +64,7 @@ const handleSaveMenu = async () => {
queryClient.invalidateQueries({ queryKey: ["menus"] }); queryClient.invalidateQueries({ queryKey: ["menus"] });
modal.value.close(); modal.value?.close();
Toast.success(t("core.common.toast.save_success")); Toast.success(t("core.common.toast.save_success"));
} catch (e) { } catch (e) {
@ -108,7 +108,7 @@ onMounted(() => {
@submit="$formkit.submit('menu-form')" @submit="$formkit.submit('menu-form')"
> >
</SubmitButton> </SubmitButton>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.cancel_and_shortcut") }} {{ $t("core.common.buttons.cancel_and_shortcut") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -28,7 +28,7 @@ const emit = defineEmits<{
const { t } = useI18n(); const { t } = useI18n();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const selectedParentMenuItem = ref<string>(""); const selectedParentMenuItem = ref<string>("");
const formState = ref<MenuItem>({ const formState = ref<MenuItem>({
spec: { spec: {
@ -121,7 +121,7 @@ const handleSaveMenuItem = async () => {
emit("saved", data); emit("saved", data);
} }
modal.value.close(); modal.value?.close();
Toast.success(t("core.common.toast.save_success")); Toast.success(t("core.common.toast.save_success"));
} catch (e) { } catch (e) {
@ -381,7 +381,7 @@ onMounted(() => {
@submit="$formkit.submit('menuitem-form')" @submit="$formkit.submit('menuitem-form')"
> >
</SubmitButton> </SubmitButton>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.cancel_and_shortcut") }} {{ $t("core.common.buttons.cancel_and_shortcut") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -32,7 +32,7 @@ const emit = defineEmits<{
(event: "select", theme: Theme | undefined): void; (event: "select", theme: Theme | undefined): void;
}>(); }>();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const tabs = ref<ThemeListTab[]>([ const tabs = ref<ThemeListTab[]>([
{ {
@ -66,7 +66,7 @@ watch(
(value, oldValue) => { (value, oldValue) => {
if (value && oldValue) { if (value && oldValue) {
emit("select", value); emit("select", value);
modal.value.close(); modal.value?.close();
} }
} }
); );
@ -145,7 +145,7 @@ onMounted(() => {
</div> </div>
<template #footer> <template #footer>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.close") }} {{ $t("core.common.buttons.close") }}
</VButton> </VButton>
</template> </template>

View File

@ -41,7 +41,7 @@ const emit = defineEmits<{
const { pluginToUpgrade } = toRefs(props); const { pluginToUpgrade } = toRefs(props);
provide<Ref<Plugin | undefined>>("pluginToUpgrade", pluginToUpgrade); provide<Ref<Plugin | undefined>>("pluginToUpgrade", pluginToUpgrade);
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const tabs = ref<PluginInstallationTab[]>([ const tabs = ref<PluginInstallationTab[]>([
{ {
@ -131,12 +131,12 @@ onMounted(() => {
:is="tab.component" :is="tab.component"
v-bind="tab.props" v-bind="tab.props"
v-if="tab.id === activeTabId" v-if="tab.id === activeTabId"
@close-modal="modal.close()" @close-modal="modal?.close()"
/> />
</template> </template>
</div> </div>
<template #footer> <template #footer>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.close") }} {{ $t("core.common.buttons.close") }}
</VButton> </VButton>
</template> </template>

View File

@ -27,7 +27,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref<InstanceType<typeof VModal>>(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const { data: roleTemplates } = useQuery({ const { data: roleTemplates } = useQuery({
queryKey: ["role-templates"], queryKey: ["role-templates"],

View File

@ -18,7 +18,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref<InstanceType<typeof VModal>>(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const selectedRole = ref(""); const selectedRole = ref("");
const isSubmitting = ref(false); const isSubmitting = ref(false);

View File

@ -20,7 +20,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref<InstanceType<typeof VModal>>(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const formState = ref<CreateUserRequest>({ const formState = ref<CreateUserRequest>({
avatar: "", avatar: "",
bio: "", bio: "",

View File

@ -30,7 +30,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref<InstanceType<typeof VModal>>(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const formState = ref<User>(cloneDeep(props.user)); const formState = ref<User>(cloneDeep(props.user));
const isSubmitting = ref(false); const isSubmitting = ref(false);

View File

@ -30,7 +30,7 @@ const initialFormState: PasswordChangeFormState = {
password_confirm: "", password_confirm: "",
}; };
const modal = ref<InstanceType<typeof VModal>>(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const formState = ref<PasswordChangeFormState>(cloneDeep(initialFormState)); const formState = ref<PasswordChangeFormState>(cloneDeep(initialFormState));
const isSubmitting = ref(false); const isSubmitting = ref(false);

View File

@ -32,7 +32,7 @@ const emit = defineEmits<{
(e: "close"): void; (e: "close"): void;
}>(); }>();
const modal = ref<InstanceType<typeof VModal>>(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const globalSearchInput = ref<HTMLInputElement | null>(null); const globalSearchInput = ref<HTMLInputElement | null>(null);
const keyword = ref(""); const keyword = ref("");

View File

@ -9,7 +9,7 @@ import { ref } from "vue";
const userStore = useUserStore(); const userStore = useUserStore();
const { t } = useI18n(); const { t } = useI18n();
const modal = ref<InstanceType<typeof VModal>>(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const onLoginSucceed = () => { const onLoginSucceed = () => {
modal.value?.close(); modal.value?.close();

View File

@ -29,7 +29,7 @@ const emit = defineEmits<{
(event: "success", post: Post): void; (event: "success", post: Post): void;
}>(); }>();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const { mutate, isLoading } = useMutation({ const { mutate, isLoading } = useMutation({
mutationKey: ["uc:create-post"], mutationKey: ["uc:create-post"],
@ -84,7 +84,7 @@ const { mutate, isLoading } = useMutation({
} }
emit("success", data); emit("success", data);
modal.value.close(); modal.value?.close();
}, },
onError() { onError() {
if (props.publish) { if (props.publish) {
@ -133,7 +133,7 @@ function onSubmit(data: PostFormState) {
: $t("core.common.buttons.save") : $t("core.common.buttons.save")
}} }}
</VButton> </VButton>
<VButton type="default" @click="modal.close()"> <VButton type="default" @click="modal?.close()">
{{ $t("core.common.buttons.close") }} {{ $t("core.common.buttons.close") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -22,7 +22,7 @@ const emit = defineEmits<{
(event: "success", post: Post): void; (event: "success", post: Post): void;
}>(); }>();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const { mutateAsync, isLoading } = usePostUpdateMutate(); const { mutateAsync, isLoading } = usePostUpdateMutate();
@ -51,7 +51,7 @@ async function onSubmit(data: PostFormState) {
Toast.success(t("core.common.toast.save_success")); Toast.success(t("core.common.toast.save_success"));
emit("success", newPost); emit("success", newPost);
modal.value.close(); modal.value?.close();
} }
</script> </script>
@ -92,7 +92,7 @@ async function onSubmit(data: PostFormState) {
> >
{{ $t("core.common.buttons.save") }} {{ $t("core.common.buttons.save") }}
</VButton> </VButton>
<VButton type="default" @click="modal.close()"> <VButton type="default" @click="modal?.close()">
{{ $t("core.common.buttons.close") }} {{ $t("core.common.buttons.close") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -1,11 +1,11 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Toast, VButton, VModal, VSpace } from "@halo-dev/components"; import { useUserStore } from "@/stores/user";
import { computed, ref } from "vue";
import { useMutation, useQueryClient } from "@tanstack/vue-query";
import { apiClient } from "@/utils/api-client"; import { apiClient } from "@/utils/api-client";
import type { VerifyCodeRequest } from "@halo-dev/api-client"; import type { VerifyCodeRequest } from "@halo-dev/api-client";
import { useUserStore } from "@/stores/user"; import { Toast, VButton, VModal, VSpace } from "@halo-dev/components";
import { useMutation, useQueryClient } from "@tanstack/vue-query";
import { useIntervalFn } from "@vueuse/shared"; import { useIntervalFn } from "@vueuse/shared";
import { computed, ref } from "vue";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
const queryClient = useQueryClient(); const queryClient = useQueryClient();
@ -17,7 +17,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
// count down // count down
const timer = ref(0); const timer = ref(0);
@ -93,7 +93,7 @@ const { mutate: verifyEmail, isLoading: isVerifying } = useMutation({
); );
queryClient.invalidateQueries({ queryKey: ["user-detail"] }); queryClient.invalidateQueries({ queryKey: ["user-detail"] });
fetchCurrentUser(); fetchCurrentUser();
modal.value.close(); modal.value?.close();
}, },
}); });
@ -163,7 +163,7 @@ function handleVerify({ password, code }: VerifyCodeRequest) {
> >
{{ $t("core.common.buttons.verify") }} {{ $t("core.common.buttons.verify") }}
</VButton> </VButton>
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.close_and_shortcut") }} {{ $t("core.common.buttons.close_and_shortcut") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -16,7 +16,7 @@ interface PasswordChangeFormState {
password_confirm?: string; password_confirm?: string;
} }
const modal = ref<InstanceType<typeof VModal>>(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const formState = ref<PasswordChangeFormState>({ const formState = ref<PasswordChangeFormState>({
oldPassword: "", oldPassword: "",

View File

@ -20,7 +20,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const formState = ref< const formState = ref<
Omit<PersonalAccessToken, "spec"> & { Omit<PersonalAccessToken, "spec"> & {
@ -249,7 +249,7 @@ const { mutate, isLoading } = useMutation({
:text="$t('core.common.buttons.submit')" :text="$t('core.common.buttons.submit')"
@submit="$formkit.submit('pat-creation-form')" @submit="$formkit.submit('pat-creation-form')"
/> />
<VButton @click="modal.close()"> <VButton @click="modal?.close()">
{{ $t("core.common.buttons.cancel_and_shortcut") }} {{ $t("core.common.buttons.cancel_and_shortcut") }}
</VButton> </VButton>
</VSpace> </VSpace>

View File

@ -26,7 +26,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref<InstanceType<typeof VModal>>(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const formState = ref<User>( const formState = ref<User>(
cloneDeep(userStore.currentUser) || { cloneDeep(userStore.currentUser) || {
spec: { spec: {

View File

@ -13,7 +13,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const { data } = useQuery({ const { data } = useQuery({
queryKey: ["totp-auth-link"], queryKey: ["totp-auth-link"],
@ -35,7 +35,7 @@ const { mutate, isLoading } = useMutation({
onSuccess() { onSuccess() {
Toast.success("配置成功"); Toast.success("配置成功");
queryClient.invalidateQueries({ queryKey: ["two-factor-settings"] }); queryClient.invalidateQueries({ queryKey: ["two-factor-settings"] });
modal.value.close(); modal.value?.close();
}, },
}); });
@ -106,7 +106,7 @@ function onSubmit(data: TotpRequest) {
> >
完成 完成
</VButton> </VButton>
<VButton @click="modal.close()"></VButton> <VButton @click="modal?.close()"></VButton>
</VSpace> </VSpace>
</template> </template>
</VModal> </VModal>

View File

@ -11,7 +11,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const { mutate, isLoading } = useMutation({ const { mutate, isLoading } = useMutation({
mutationKey: ["totp-deletion"], mutationKey: ["totp-deletion"],
@ -25,7 +25,7 @@ const { mutate, isLoading } = useMutation({
onSuccess() { onSuccess() {
Toast.success("停用成功"); Toast.success("停用成功");
queryClient.invalidateQueries({ queryKey: ["two-factor-settings"] }); queryClient.invalidateQueries({ queryKey: ["two-factor-settings"] });
modal.value.close(); modal.value?.close();
}, },
}); });
@ -52,7 +52,7 @@ function onSubmit(password: string) {
> >
停用 停用
</VButton> </VButton>
<VButton @click="modal.close()"></VButton> <VButton @click="modal?.close()"></VButton>
</VSpace> </VSpace>
</template> </template>
</VModal> </VModal>

View File

@ -11,7 +11,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const { mutate, isLoading } = useMutation({ const { mutate, isLoading } = useMutation({
mutationKey: ["disable-two-factor"], mutationKey: ["disable-two-factor"],
@ -25,7 +25,7 @@ const { mutate, isLoading } = useMutation({
onSuccess() { onSuccess() {
Toast.success("停用成功"); Toast.success("停用成功");
queryClient.invalidateQueries({ queryKey: ["two-factor-settings"] }); queryClient.invalidateQueries({ queryKey: ["two-factor-settings"] });
modal.value.close(); modal.value?.close();
}, },
}); });
@ -52,7 +52,7 @@ function onSubmit(password: string) {
> >
停用 停用
</VButton> </VButton>
<VButton @click="modal.close()"></VButton> <VButton @click="modal?.close()"></VButton>
</VSpace> </VSpace>
</template> </template>
</VModal> </VModal>

View File

@ -11,7 +11,7 @@ const emit = defineEmits<{
(event: "close"): void; (event: "close"): void;
}>(); }>();
const modal = ref(); const modal = ref<InstanceType<typeof VModal> | null>(null);
const { mutate, isLoading } = useMutation({ const { mutate, isLoading } = useMutation({
mutationKey: ["enable-two-factor"], mutationKey: ["enable-two-factor"],
@ -25,7 +25,7 @@ const { mutate, isLoading } = useMutation({
onSuccess() { onSuccess() {
Toast.success("启用成功"); Toast.success("启用成功");
queryClient.invalidateQueries({ queryKey: ["two-factor-settings"] }); queryClient.invalidateQueries({ queryKey: ["two-factor-settings"] });
modal.value.close(); modal.value?.close();
}, },
}); });
@ -52,7 +52,7 @@ function onSubmit(password: string) {
> >
启用 启用
</VButton> </VButton>
<VButton @click="modal.close()"></VButton> <VButton @click="modal?.close()"></VButton>
</VSpace> </VSpace>
</template> </template>
</VModal> </VModal>