Files
2026-06-06 18:43:00 +08:00

116 lines
3.9 KiB
JavaScript

// resources/js/composables/Core/usePrefetch.js
import { useNavigate } from './useNavigate';
import { useAuth } from './useAuth';
import axios from 'axios';
import { usePrefetchStore } from '../../stores/prefetch';
export function usePrefetch() {
const { prefetch: prefetchJS } = useNavigate();
const { hasRole, UserTypes } = useAuth();
const prefetchStore = usePrefetchStore();
// Registry of pages and their corresponding data endpoints
// Each entry: { page: string, dataUrls: Array<{ url: string, method: string, payload: object }>, roles: string[] }
const registry = [
{
page: 'UserList',
dataUrls: [
{ url: '/admin/users/list', method: 'GET' }
],
roles: [UserTypes.ULTIMATE, UserTypes.SUPER_OPERATOR]
},
{
page: 'ManageStoresAdmin',
dataUrls: [{ url: '/Admin/Stores/List', method: 'POST' }],
roles: [UserTypes.ULTIMATE, UserTypes.SUPER_OPERATOR]
},
{
page: 'ListStores',
dataUrls: [{ url: '/ListStores/List/data', method: 'POST' }],
roles: 'all'
},
{
page: 'ManageProductsAdmin',
dataUrls: [{ url: '/Admin/Products/List', method: 'POST' }],
roles: [UserTypes.ULTIMATE, UserTypes.SUPER_OPERATOR]
},
{
page: 'ShipmentList',
dataUrls: [{ url: '/Shipments/List', method: 'POST' }],
roles: 'all'
},
{
page: 'CooperativeList',
dataUrls: [{ url: '/Cooperatives/List', method: 'POST' }],
roles: 'all'
},
{
page: 'VerificationDashboard',
dataUrls: [{ url: '/Farmers/List', method: 'POST' }],
roles: [UserTypes.ULTIMATE, UserTypes.SUPER_OPERATOR, UserTypes.OPERATOR]
},
{
page: 'ListReports',
dataUrls: [{ url: '/admin/accounting/reports', method: 'POST' }],
roles: [UserTypes.ULTIMATE, UserTypes.SUPER_OPERATOR]
}
];
/**
* Prefetch a single data endpoint and store it in the persistent cache.
*/
const prefetchData = async ({ url, method = 'GET', payload = {} }) => {
try {
const cacheKey = `${method}:${url}:${JSON.stringify(payload)}`;
// Standardizing the request
let response;
if (method.toUpperCase() === 'POST') {
response = await axios.post(url, payload);
} else {
response = await axios.get(url, { params: payload });
}
if (response.data) {
prefetchStore.setCache(cacheKey, response.data);
console.log(`[Prefetch] Cached ${url}`);
}
} catch (error) {
console.warn(`[Prefetch] Failed to prefetch data for ${url}:`, error);
}
};
/**
* Trigger prefetching for ALL allowed modules.
* Staggered to avoid network congestion.
*/
const prefetchEverything = async () => {
const allowedModules = registry.filter(item => {
if (item.roles === 'all') return true;
return item.roles.some(role => hasRole(role));
});
console.log(`[Prefetch] Starting universal prefetch for ${allowedModules.length} modules.`);
// Process in a queue with small delay to avoid hammering
for (const module of allowedModules) {
// 1. Prefetch JS Chunk
prefetchJS(module.page);
// 2. Prefetch Data Endpoints
for (const dataInfo of module.dataUrls) {
// Background fetch, don't wait for completion before starting next module
prefetchData(dataInfo);
}
// Small break between modules
await new Promise(r => setTimeout(r, 200));
}
};
return {
prefetchEverything,
prefetchData
};
}