mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-10-27 16:22:11 +08:00
54 lines
1.3 KiB
TypeScript
54 lines
1.3 KiB
TypeScript
import { convertFileSrc } from '@tauri-apps/api/core'
|
|
import { useMemo } from 'react'
|
|
|
|
import { downloadIconCache } from '@/services/cmds'
|
|
import { useQuery } from '@/services/query-client'
|
|
|
|
export interface UseIconCacheOptions {
|
|
icon?: string | null
|
|
cacheKey?: string
|
|
enabled?: boolean
|
|
}
|
|
|
|
const getFileNameFromUrl = (url: string) => {
|
|
const lastSlashIndex = url.lastIndexOf('/')
|
|
return lastSlashIndex >= 0 ? url.slice(lastSlashIndex + 1) : url
|
|
}
|
|
|
|
export const useIconCache = ({
|
|
icon,
|
|
cacheKey,
|
|
enabled = true,
|
|
}: UseIconCacheOptions) => {
|
|
const iconValue = icon?.trim() ?? ''
|
|
const cacheKeyValue = cacheKey?.trim() ?? ''
|
|
|
|
const isEnabled = useMemo(() => {
|
|
return enabled && iconValue.startsWith('http') && cacheKeyValue !== ''
|
|
}, [enabled, iconValue, cacheKeyValue])
|
|
|
|
const { data } = useQuery({
|
|
queryKey: ['icon-cache', iconValue, cacheKeyValue],
|
|
queryFn: async () => {
|
|
try {
|
|
const fileName = `${cacheKeyValue}-${getFileNameFromUrl(iconValue)}`
|
|
const iconPath = await downloadIconCache(iconValue, fileName)
|
|
return convertFileSrc(iconPath)
|
|
} catch {
|
|
return ''
|
|
}
|
|
},
|
|
enabled: isEnabled,
|
|
refetchOnWindowFocus: false,
|
|
refetchOnReconnect: false,
|
|
staleTime: Infinity,
|
|
retry: 2,
|
|
})
|
|
|
|
if (!isEnabled) {
|
|
return ''
|
|
}
|
|
|
|
return data ?? ''
|
|
}
|