@prefecthq/vue-compositions
Version:
A collection of reusable vue compositions.
104 lines • 3.19 kB
JavaScript
import { reactive, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';
class InvalidRouteQueryProperty extends Error {
constructor() {
super('Invalid route query property');
}
}
function factory() {
const operations = reactive([]);
let route;
let router;
let interval;
const update = async () => {
const query = applyQueryOperations(route.query, operations);
await router.push({ query });
operations.splice(0);
};
watch(operations, () => {
if (!operations.length) {
return;
}
clearInterval(interval);
interval = setTimeout(update);
});
const useRouteQuery = () => {
router = useRouter();
route = useRoute();
const clear = () => {
router.push({ query: {} });
};
const set = (key, value) => {
query[key] = value;
};
const get = (key) => {
return query[key];
};
const remove = (key) => {
delete query[key];
};
const query = new Proxy({}, {
get(target, property) {
if (typeof property === 'symbol') {
throw new InvalidRouteQueryProperty();
}
const query = applyQueryOperations(route.query, operations);
return query[property];
},
set(target, property, value) {
if (typeof property === 'symbol') {
throw new InvalidRouteQueryProperty();
}
const operation = updateOperationFactory(property, value);
operations.push(operation);
return true;
},
deleteProperty(target, property) {
if (typeof property === 'symbol') {
throw new InvalidRouteQueryProperty();
}
const operation = deleteOperationFactory(property);
operations.push(operation);
return true;
},
ownKeys() {
const query = applyQueryOperations(route.query, operations);
return Object.keys(query);
},
has(target, property) {
const query = applyQueryOperations(route.query, operations);
return property in query;
},
});
return {
clear,
set,
get,
remove,
query,
};
};
return useRouteQuery;
}
function applyQueryOperations(currentQuery, operations) {
let query = { ...currentQuery };
for (const operation of operations) {
query = operation(query);
}
return query;
}
function updateOperationFactory(key, value) {
return (currentQuery) => {
const query = { ...currentQuery, [key]: value };
return query;
};
}
function deleteOperationFactory(key) {
return (currentQuery) => {
const query = { ...currentQuery };
delete query[key];
return query;
};
}
export const useRouteQuery = factory();
//# sourceMappingURL=useRouteQuery.js.map