wechat-article / components /dashboard /AuthPopoverPanel.vue
asemxin2000's picture
Deploy wechat-article-exporter to Space
6e41657 verified
Raw
History Blame Contribute Delete
3.51 kB
<script setup lang="ts">
const { loggedIn, user, clear, openInPopup, session } = useUserSession();
const open = defineModel<boolean>('open', { default: false });
// 登入功能
const loginWithGitHub = async () => {
deleteCookie('nuxt-auth-state');
window.location.href = '/auth/github';
};
const loginWithGoogle = async () => {
deleteCookie('nuxt-auth-state');
window.location.href = '/auth/google';
};
// 登出功能
const logout = async () => {};
// 由于 nuxt-auth-utils 库在授权时的bug,在授权之前需要手动删除临时cookie
function deleteCookie(name) {
document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;
}
interface Action {
id: string;
name: string;
onClick: () => Promise<void> | void;
}
function closePanel(): void {
open.value = false;
}
const actions: Action[] = [
{
id: 'profile',
name: '个人中心',
onClick: async () => {
closePanel();
navigateTo('/dashboard/profile');
},
},
{
id: 'logout',
name: '退出',
onClick: async () => {
closePanel();
await clear();
},
},
];
</script>
<template>
<div>
<div v-if="loggedIn && user" class="min-w-60">
<div class="py-5 flex flex-col items-center">
<img :alt="user.username" :src="user.avatar" class="size-20 rounded-full" />
<h2 class="flex items-center gap-1.5 pt-1 font-bold">
<span>{{ user.name }}</span>
<UBadge
:ui="{ rounded: 'rounded-full' }"
:color="user.plan === 'pro' ? 'fuchsia' : 'gray'"
variant="subtle"
size="xs"
class="px-2 font-mono font-bold"
>{{ user.plan }}</UBadge
>
</h2>
<div class="flex items-center gap-1.5">
<UIcon v-if="user.provider === 'GitHub'" name="i-logos:github-icon" class="text-gray-200" />
<UIcon v-if="user.provider === 'Google'" name="i-logos:google-icon" class="text-gray-200" />
<span>{{ user.username }}</span>
</div>
<div class="mt-3" v-if="user.plan === 'free'">
<!-- <UButton>订阅 Pro 会员</UButton>-->
<UButton
:ui="{ rounded: 'rounded-full', padding: { sm: 'px-5' } }"
class="flex gap-2 items-center rounded-full border-2 border-primary text-primary font-medium bg-white hover:bg-primary hover:text-white transition-colors px-5 py-1.5 text-sm"
>订阅 Pro 会员 (10元/月)</UButton
>
</div>
</div>
<div class="w-full">
<ul>
<li
v-for="action in actions"
:key="action.id"
class="px-4 border-t border-gray-200/50 flex justify-between items-center hover:bg-gray-100/60"
>
<a @click="action.onClick" class="flex-1 py-2.5 cursor-pointer">{{ action.name }}</a>
</li>
</ul>
</div>
</div>
<!-- Providers -->
<div v-else class="py-5 flex flex-col p-3 min-w-60">
<p class="font-serif">Log into with</p>
<div class="space-y-3 my-3">
<!-- GitHub -->
<UButton @click="loginWithGitHub" block color="white" size="xl" icon="i-logos:github-icon">GitHub</UButton>
<!-- Google -->
<UButton @click="loginWithGoogle" block color="white" size="xl" icon="i-logos:google-icon">Google</UButton>
</div>
</div>
</div>
</template>