mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-04-13 13:30:31 +08:00
55 lines
1.3 KiB
TypeScript
55 lines
1.3 KiB
TypeScript
import { convertFileSrc } from '@tauri-apps/api/core'
|
|
import { useMemo } from 'react'
|
|
import useSWR from 'swr'
|
|
|
|
import { downloadIconCache } from '@/services/cmds'
|
|
import { SWR_DEFAULTS } from '@/services/config'
|
|
|
|
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 swrKey = useMemo(() => {
|
|
if (!enabled || !iconValue.startsWith('http') || cacheKeyValue === '') {
|
|
return null
|
|
}
|
|
|
|
return ['icon-cache', iconValue, cacheKeyValue] as const
|
|
}, [enabled, iconValue, cacheKeyValue])
|
|
|
|
const { data } = useSWR(
|
|
swrKey,
|
|
async () => {
|
|
try {
|
|
const fileName = `${cacheKeyValue}-${getFileNameFromUrl(iconValue)}`
|
|
const iconPath = await downloadIconCache(iconValue, fileName)
|
|
return convertFileSrc(iconPath)
|
|
} catch {
|
|
return ''
|
|
}
|
|
},
|
|
SWR_DEFAULTS,
|
|
)
|
|
|
|
if (!swrKey) {
|
|
return ''
|
|
}
|
|
|
|
return data ?? ''
|
|
}
|