YesPlayMusic/packages/web/api/hooks/useUser.ts
2023-03-26 22:10:56 +08:00

86 lines
2.2 KiB
TypeScript

import { dailyCheckIn, fetchUserAccount } from '@/web/api/user'
import { UserApiNames, FetchUserAccountResponse } from '@/shared/api/User'
import { CacheAPIs } from '@/shared/CacheAPIs'
import { IpcChannels } from '@/shared/IpcChannels'
import { useMutation, useQuery } from '@tanstack/react-query'
import { logout as logoutAPI, refreshCookie } from '../auth'
import { removeAllCookies, setCookies } from '@/web/utils/cookie'
import reactQueryClient from '@/web/utils/reactQueryClient'
export default function useUser() {
const key = [UserApiNames.FetchUserAccount]
return useQuery(
key,
async () => {
const existsQueryData = reactQueryClient.getQueryData(key)
if (!existsQueryData) {
window.ipcRenderer
?.invoke(IpcChannels.GetApiCache, {
api: CacheAPIs.UserAccount,
})
.then(cache => {
if (cache) reactQueryClient.setQueryData(key, cache)
})
}
return fetchUserAccount()
},
{
refetchOnWindowFocus: true,
}
)
}
export function useRefreshCookie() {
const user = useUser()
return useQuery(
[UserApiNames.RefreshCookie],
async () => {
const result = await refreshCookie()
if (result?.code === 200) {
setCookies(result.cookie)
}
return result
},
{
refetchInterval: 1000 * 60 * 30,
enabled: !!user.data?.profile?.userId,
}
)
}
export function useDailyCheckIn() {
const user = useUser()
return useQuery(
[UserApiNames.DailyCheckIn],
async () => {
try {
Promise.allSettled([dailyCheckIn(0), dailyCheckIn(1)])
return 'ok'
} catch (e: any) {
return 'error'
}
},
{
refetchInterval: 1000 * 60 * 30,
enabled: !!user.data?.profile?.userId,
}
)
}
export const useIsLoggedIn = () => {
const { data, isLoading } = useUser()
if (isLoading) return true
return !!data?.profile?.userId
}
export const logout = async () => {
await logoutAPI()
removeAllCookies()
await window.ipcRenderer?.invoke(IpcChannels.Logout)
await reactQueryClient.refetchQueries([UserApiNames.FetchUserAccount])
}
export const useMutationLogout = () => {
return useMutation(logout)
}