116 lines
3.9 KiB
JavaScript
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
|
|
};
|
|
}
|