Files
BarangaySystem/resources/js/composables/useHashKeyCache.js
2026-06-06 18:43:00 +08:00

99 lines
2.7 KiB
JavaScript

// resources/js/composables/useHashKeyCache.js
import { ref } from 'vue';
const hashDataStore = ref({});
/**
* Composable for handling hashkey-based URL patterns and data caching.
* Supported Patterns:
* 1. /path--h:HASHKEY -> Fetch data associated with the hashkey
* 2. /path--e:PAYLOAD -> Direct base64-encoded JSON payload in URL
*/
export function useHashKeyCache() {
/**
* Get data associated with a hashkey.
* @param {string} key
* @returns {any|null}
*/
const getHashData = (key) => {
return hashDataStore.value[key] || null;
};
/**
* Cache data against a hashkey.
* @param {string} key
* @param {any} data
*/
const setHashData = (key, data) => {
if (key && data) {
hashDataStore.value[key] = data;
}
};
/**
* Decodes a base64 encoded payload from the URL.
* @param {string} base64Payload
* @returns {any|null}
*/
const decodePayload = (base64Payload) => {
try {
const decodedStr = atob(base64Payload);
return JSON.parse(decodedStr);
} catch (e) {
console.error('[HashCache] Failed to decode URL payload:', e);
return null;
}
};
/**
* Parse the current URL or a given URL for hashkey/payload patterns.
* @param {string} urlString
* @returns {{type: 'hash'|'payload'|'none', value: any}}
*/
const parseHashUrl = (urlString = window.location.pathname) => {
const hashMatch = urlString.match(/--h:([A-Za-z0-9_-]+)/);
if (hashMatch) {
const hashkey = hashMatch[1];
return { type: 'hash', value: hashkey, data: getHashData(hashkey) };
}
const payloadMatch = urlString.match(/--e:([A-Za-z0-9+/=_-]+)/);
if (payloadMatch) {
const payload = decodePayload(payloadMatch[1]);
return { type: 'payload', value: payloadMatch[1], data: payload };
}
return { type: 'none', value: null, data: null };
};
/**
* Formats a URL with a hashkey.
* @param {string} baseUrl
* @param {string} hash
* @returns {string}
*/
const formatHashUrl = (baseUrl, hash) => {
return `${baseUrl.replace(/\/+$/, '')}--h:${hash}`;
};
/**
* Formats a URL with an encoded payload.
* @param {string} baseUrl
* @param {any} data
* @returns {string}
*/
const formatPayloadUrl = (baseUrl, data) => {
const payload = btoa(JSON.stringify(data));
return `${baseUrl.replace(/\/+$/, '')}--e:${payload}`;
};
return {
getHashData,
setHashData,
parseHashUrl,
formatHashUrl,
formatPayloadUrl,
hashDataStore
};
}