nuxt-apex
Version:
Auto-generates fully typed useFetch composables for Nuxt 3/4 server endpoints with Zod validation and zero boilerplate
50 lines (49 loc) • 1.42 kB
JavaScript
import { ref, shallowRef } from "vue";
export function useLoad(runner, options = {}) {
const status = ref("idle");
const data = shallowRef(null);
const error = shallowRef(null);
let lastCallId = 0;
let isActive = true;
const cancel = () => {
lastCallId++;
status.value = "idle";
};
const load = async (...args) => {
if (typeof runner !== "function") return;
const callId = ++lastCallId;
status.value = "pending";
error.value = null;
try {
const result = await runner(...args);
if (!isActive || callId !== lastCallId) return;
data.value = result;
status.value = "success";
} catch (err) {
if (!isActive || callId !== lastCallId) return;
error.value = err;
status.value = "error";
}
};
const isPromise = runner !== null && typeof runner?.then === "function";
if (isPromise) {
const promise = runner;
const callId = ++lastCallId;
status.value = "pending";
promise.then((res) => {
if (!isActive || callId !== lastCallId) return;
data.value = res;
status.value = "success";
}).catch((err) => {
if (!isActive || callId !== lastCallId) return;
error.value = err;
status.value = "error";
});
} else {
const { immediate = false, args: initialArgs } = options;
if (immediate) {
load(...initialArgs ?? []);
}
}
return { status, data, error, load };
}