initial: bootstrap from BukidBountyApp base
This commit is contained in:
62
resources/js/composables/usePageData.js
Normal file
62
resources/js/composables/usePageData.js
Normal file
@@ -0,0 +1,62 @@
|
||||
// resources/js/composables/usePageData.js
|
||||
import { ref } from 'vue';
|
||||
import axios from 'axios';
|
||||
import { usePrefetchStore } from '../stores/prefetch';
|
||||
|
||||
export default function usePageData() {
|
||||
const data = ref(null);
|
||||
const loading = ref(false);
|
||||
const error = ref(false);
|
||||
const stale = ref(false);
|
||||
const prefetchStore = usePrefetchStore();
|
||||
|
||||
/**
|
||||
* Fetch page data with Cache-First strategy.
|
||||
* Checks persistent prefetchStore before hitting network.
|
||||
*/
|
||||
const fetchPageData = async (url, payload = {}, method = 'GET') => {
|
||||
loading.value = true;
|
||||
error.value = false;
|
||||
stale.value = false;
|
||||
|
||||
const cacheKey = `${method.toUpperCase()}:${url}:${JSON.stringify(payload)}`;
|
||||
|
||||
// 1. Try to get cached data first (Persistent & 6-month valid)
|
||||
if (prefetchStore.hasCache(cacheKey)) {
|
||||
data.value = prefetchStore.getCache(cacheKey);
|
||||
stale.value = true;
|
||||
loading.value = false; // We have SOMETHING to show immediately
|
||||
}
|
||||
|
||||
try {
|
||||
// 2. Fetch fresh data from network
|
||||
let response;
|
||||
if (method.toUpperCase() === 'POST') {
|
||||
response = await axios.post(url, payload);
|
||||
} else {
|
||||
response = await axios.get(url, { params: payload });
|
||||
}
|
||||
|
||||
if (response.data) {
|
||||
// Adapt to backend format (Inertia-like or raw)
|
||||
const freshData = response.data.props || response.data;
|
||||
data.value = freshData;
|
||||
|
||||
// 3. Update persistent cache
|
||||
prefetchStore.setCache(cacheKey, freshData);
|
||||
stale.value = false;
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn(`[usePageData] Failed to fetch fresh data for ${url}:`, err);
|
||||
if (!data.value) {
|
||||
error.value = true;
|
||||
}
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
|
||||
return { data: data.value, error: error.value, stale: stale.value };
|
||||
};
|
||||
|
||||
return { data, loading, error, stale, fetchPageData };
|
||||
}
|
||||
Reference in New Issue
Block a user