87 lines
2.6 KiB
TypeScript
87 lines
2.6 KiB
TypeScript
// Interface สำหรับข้อมูลหมวดหมู่ (Category)
|
|
export interface Category {
|
|
id: number
|
|
name: {
|
|
th: string
|
|
en: string
|
|
[key: string]: string
|
|
}
|
|
slug: string
|
|
description: {
|
|
th: string
|
|
en: string
|
|
[key: string]: string
|
|
}
|
|
icon: string
|
|
sort_order: number
|
|
is_active: boolean
|
|
created_at: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface CategoryData {
|
|
total: number
|
|
categories: Category[]
|
|
}
|
|
|
|
interface CategoryResponse {
|
|
code: number
|
|
message: string
|
|
data: CategoryData
|
|
}
|
|
|
|
// Composable สำหรับจัดการข้อมูลหมวดหมู่
|
|
export const useCategory = () => {
|
|
const config = useRuntimeConfig()
|
|
const API_BASE_URL = config.public.apiBase as string
|
|
const { token } = useAuth()
|
|
|
|
// ใช้ useState เพื่อเก็บ Cached Data ระดับ Global (แชร์กันทุก Component)
|
|
const categoriesState = useState<Category[]>('categories_cache', () => [])
|
|
const isLoaded = useState<boolean>('categories_loaded', () => false)
|
|
|
|
// ฟังก์ชันดึงข้อมูลหมวดหมู่ทั้งหมด
|
|
// Endpoint: GET /categories
|
|
const fetchCategories = async (forceRefresh = false) => {
|
|
// ถ้ามีข้อมูลอยู่แล้วและไม่สั่งบังคับโหลดใหม่ ให้ใช้ข้อมูลเดิมทันที
|
|
if (isLoaded.value && !forceRefresh && categoriesState.value.length > 0) {
|
|
return {
|
|
success: true,
|
|
data: categoriesState.value,
|
|
total: categoriesState.value.length
|
|
}
|
|
}
|
|
|
|
try {
|
|
const response = await $fetch<CategoryResponse>(`${API_BASE_URL}/categories`, {
|
|
method: 'GET',
|
|
headers: token.value ? {
|
|
Authorization: `Bearer ${token.value}`
|
|
} : {}
|
|
})
|
|
|
|
const categories = response.data?.categories || []
|
|
|
|
// เก็บข้อมูลลง State
|
|
categoriesState.value = categories
|
|
isLoaded.value = true
|
|
|
|
return {
|
|
success: true,
|
|
data: categories,
|
|
total: response.data?.total || 0
|
|
}
|
|
} catch (err: any) {
|
|
console.error('Fetch categories failed:', err)
|
|
return {
|
|
success: false,
|
|
error: err.data?.message || err.message || 'Error fetching categories'
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
fetchCategories,
|
|
categories: computed(() => categoriesState.value) // ส่งข้อมูลออกมาเป็น Computed เพื่อให้ UI อัปเดตตามอัตโนมัติ
|
|
}
|
|
}
|