diff --git a/web/src/hooks/models/useModelsData.js b/web/src/hooks/models/useModelsData.js index 93b68783..da222429 100644 --- a/web/src/hooks/models/useModelsData.js +++ b/web/src/hooks/models/useModelsData.js @@ -59,17 +59,18 @@ export const useModelsData = () => { searchVendor: '', }; + // ---------- helpers ---------- + // Safely extract array items from API payload + const extractItems = (payload) => { + const items = payload?.items || payload || []; + return Array.isArray(items) ? items : []; + }; + // Form API reference const [formApi, setFormApi] = useState(null); // Get form values helper function - const getFormValues = () => { - const formValues = formApi ? formApi.getValues() : {}; - return { - searchKeyword: formValues.searchKeyword || '', - searchVendor: formValues.searchVendor || '', - }; - }; + const getFormValues = () => formApi?.getValues() || formInitValues; // Close edit modal const closeEdit = () => { @@ -129,8 +130,7 @@ export const useModelsData = () => { const res = await API.get(url); const { success, message, data } = res.data; if (success) { - const items = data.items || data || []; - const newPageData = Array.isArray(items) ? items : []; + const newPageData = extractItems(data); setActivePage(data.page || page); setModelCount(data.total || newPageData.length); setModelFormat(newPageData); @@ -151,15 +151,32 @@ export const useModelsData = () => { setLoading(false); }; + // Fetch vendor counts separately to keep tab numbers accurate + const refreshVendorCounts = async () => { + try { + // Load all models (large page_size) to compute counts for every vendor + const res = await API.get('/api/models/?p=1&page_size=100000'); + if (res.data.success) { + const newItems = extractItems(res.data.data); + updateVendorCounts(newItems); + } + } catch (_) { + // ignore count refresh errors + } + }; + // Refresh data const refresh = async (page = activePage) => { await loadModels(page, pageSize); + // When not viewing 'all', tab counts need a separate refresh + if (activeVendorKey !== 'all') { + await refreshVendorCounts(); + } }; // Search models with keyword and vendor const searchModels = async () => { - const formValues = getFormValues(); - const { searchKeyword, searchVendor } = formValues; + const { searchKeyword = '', searchVendor = '' } = getFormValues(); if (searchKeyword === '' && searchVendor === '') { // If keyword is blank, load models instead @@ -174,8 +191,7 @@ export const useModelsData = () => { ); const { success, message, data } = res.data; if (success) { - const items = data.items || data || []; - const newPageData = Array.isArray(items) ? items : []; + const newPageData = extractItems(data); setActivePage(data.page || 1); setModelCount(data.total || newPageData.length); setModelFormat(newPageData);