// 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('categories_cache', () => []) const isLoaded = useState('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(`${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) // Retry logic for 429 Too Many Requests if (err.statusCode === 429 || err.status === 429) { await new Promise(resolve => setTimeout(resolve, 1500)); // Wait 1.5s try { const retryRes = await $fetch(`${API_BASE_URL}/categories`, { method: 'GET', headers: token.value ? { Authorization: `Bearer ${token.value}` } : {} }) const cats = retryRes.data?.categories || [] categoriesState.value = cats isLoaded.value = true return { success: true, data: cats, total: retryRes.data?.total || 0 } } catch (retryErr) { console.error('Retry fetch categories failed:', retryErr) } } return { success: false, error: err.data?.message || err.message || 'Error fetching categories' } } } return { fetchCategories, categories: computed(() => categoriesState.value) // ส่งข้อมูลออกมาเป็น Computed เพื่อให้ UI อัปเดตตามอัตโนมัติ } }