gongxiangp2/hooks/useCategoryData.ts
chenpei 0ce59be34e 备份:组织架构设计方案讨论前的代码快照
- 包含所有当前修改和新功能
- 准备开始组织架构优化实施方案
2025-12-30 13:20:26 +08:00

143 lines
3.4 KiB
TypeScript

/**
* 分类数据获取 Hook
* 封装店铺、场景、平台、品类的数据获取逻辑
*/
import { useState, useEffect, useCallback } from 'react'
/**
* 分类项接口
*/
export interface CategoryItem {
id: string
name: string
}
/**
* 分类数据接口
*/
export interface CategoryData {
categories: CategoryItem[]
scenes: CategoryItem[]
platforms: CategoryItem[]
productCategories: CategoryItem[]
}
/**
* 分类数据 Hook 返回值
*/
export interface UseCategoryDataReturn {
data: CategoryData
loading: boolean
error: string | null
refresh: () => Promise<void>
refreshCategories: () => Promise<void>
refreshScenes: () => Promise<void>
refreshPlatforms: () => Promise<void>
refreshProductCategories: () => Promise<void>
}
/**
* 分类数据获取 Hook
*/
export function useCategoryData(): UseCategoryDataReturn {
const [categories, setCategories] = useState<CategoryItem[]>([])
const [scenes, setScenes] = useState<CategoryItem[]>([])
const [platforms, setPlatforms] = useState<CategoryItem[]>([])
const [productCategories, setProductCategories] = useState<CategoryItem[]>([])
const [loading, setLoading] = useState(true)
const [error, setError] = useState<string | null>(null)
// 获取店铺列表
const fetchCategories = useCallback(async () => {
try {
const response = await fetch('/api/categories')
if (response.ok) {
const data = await response.json()
setCategories(data)
}
} catch (err) {
console.error('Error fetching categories:', err)
}
}, [])
// 获取场景列表
const fetchScenes = useCallback(async () => {
try {
const response = await fetch('/api/scenes')
if (response.ok) {
const data = await response.json()
setScenes(data)
}
} catch (err) {
console.error('Error fetching scenes:', err)
}
}, [])
// 获取平台列表
const fetchPlatforms = useCallback(async () => {
try {
const response = await fetch('/api/platforms')
if (response.ok) {
const data = await response.json()
setPlatforms(data)
}
} catch (err) {
console.error('Error fetching platforms:', err)
}
}, [])
// 获取品类列表
const fetchProductCategories = useCallback(async () => {
try {
const response = await fetch('/api/product-categories')
if (response.ok) {
const data = await response.json()
setProductCategories(data)
}
} catch (err) {
console.error('Error fetching product categories:', err)
}
}, [])
// 刷新所有数据
const refresh = useCallback(async () => {
setLoading(true)
setError(null)
try {
await Promise.all([
fetchCategories(),
fetchScenes(),
fetchPlatforms(),
fetchProductCategories(),
])
} catch (err) {
setError('获取分类数据失败')
console.error('Error refreshing category data:', err)
} finally {
setLoading(false)
}
}, [fetchCategories, fetchScenes, fetchPlatforms, fetchProductCategories])
// 初始加载
useEffect(() => {
refresh()
}, [refresh])
return {
data: {
categories,
scenes,
platforms,
productCategories,
},
loading,
error,
refresh,
refreshCategories: fetchCategories,
refreshScenes: fetchScenes,
refreshPlatforms: fetchPlatforms,
refreshProductCategories: fetchProductCategories,
}
}