initial: bootstrap from BukidBountyApp base
This commit is contained in:
98
resources/js/composables/useHashKeyCache.js
Normal file
98
resources/js/composables/useHashKeyCache.js
Normal file
@@ -0,0 +1,98 @@
|
||||
// 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
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user