143 lines
3.4 KiB
TypeScript
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,
|
|
}
|
|
}
|