Files
MrleeAdmin/app/utils/icon-utils.ts
T
Mr.April d84d972e73 feat: 适配5.x后端,重构前端架构
主要变更:
1. 重构API目录结构,采用模块化设计,适配5.x后端接口规范
2. 优化布局组件,提升用户界面体验
3. 增强国际化支持,完善多语言配置
4. 新增权限控制功能,支持前端路由权限管理
5. 优化认证流程,支持JWT认证机制
6. 新增中间件和插件,提升系统扩展性
7. 优化状态管理,采用更清晰的模块化设计
8. 新增搜索框、广告等组件,丰富页面功能
9. 更改包管理工具从npm到pnpm,提升依赖管理效率
10. 完善配置系统,支持多环境配置

适配5.x后端特性:
- 采用新的API接口规范
- 支持JWT认证机制
- 适配后端权限控制体系
- 支持后端国际化接口
- 优化数据交互方式
2026-04-07 11:01:11 +08:00

83 lines
3.0 KiB
TypeScript

interface IconifyResponse {
prefix: string
total: number
title: string
uncategorized?: string[]
categories?: Record<string, string[]>
aliases?: Record<string, string>
}
const ICONS_MAP: Record<string, string[]> = {}
const PENDING_REQUESTS: Record<string, Promise<string[]>> = {}
export async function fetchIconsData(prefix: string): Promise<string[]> {
if (Reflect.has(ICONS_MAP, prefix) && ICONS_MAP[prefix]) {
return ICONS_MAP[prefix]
}
if (Reflect.has(PENDING_REQUESTS, prefix) && (await PENDING_REQUESTS[prefix])) {
return PENDING_REQUESTS[prefix]
}
PENDING_REQUESTS[prefix] = (async () => {
try {
let icons: string[] = []
if (process.client) {
try {
const controller = new AbortController()
const timeoutId = setTimeout(() => controller.abort(), 1000 * 10)
const response: IconifyResponse = await fetch(
`/icons/${prefix}.json`,
{ signal: controller.signal }
).then((res) => res.json())
clearTimeout(timeoutId)
icons = response
console.log(`Loaded ${icons.length} ${prefix} icons from local cache`)
} catch (localError) {
console.warn(`Failed to load ${prefix} icons from local cache, trying online API...`, localError)
const controller = new AbortController()
const timeoutId = setTimeout(() => controller.abort(), 1000 * 10)
const response: IconifyResponse = await fetch(
`https://api.iconify.design/collection?prefix=${prefix}`,
{ signal: controller.signal }
).then((res) => res.json())
clearTimeout(timeoutId)
const list = response.uncategorized || []
if (response.categories) {
for (const category in response.categories) {
list.push(...(response.categories[category] || []))
}
}
icons = list.map((v) => `${prefix}:${v}`)
console.log(`Loaded ${icons.length} ${prefix} icons from online API`)
}
} else {
const controller = new AbortController()
const timeoutId = setTimeout(() => controller.abort(), 1000 * 10)
const response: IconifyResponse = await fetch(
`https://api.iconify.design/collection?prefix=${prefix}`,
{ signal: controller.signal }
).then((res) => res.json())
clearTimeout(timeoutId)
const list = response.uncategorized || []
if (response.categories) {
for (const category in response.categories) {
list.push(...(response.categories[category] || []))
}
}
icons = list.map((v) => `${prefix}:${v}`)
console.log(`Loaded ${icons.length} ${prefix} icons from online API (server side)`)
}
ICONS_MAP[prefix] = icons
} catch (error) {
console.error(`Failed to fetch icons for prefix ${prefix}:`, error)
return [] as string[]
}
return ICONS_MAP[prefix]
})()
return PENDING_REQUESTS[prefix]
}