@xsprtd/nuxt-api
Version:
Nuxt API Authentication and Http Client
66 lines (65 loc) • 1.71 kB
JavaScript
import { ref } from "vue";
import { useCurrentUser } from "./useCurrentUser.js";
import { useApiOptions } from "./useApiOptions.js";
export const useErrorBag = () => {
const message = ref(null);
const errors = ref(null);
const { errorMessages } = useApiOptions();
const get = (key, defaultValue) => {
const payload = errors.value?.[key];
return payload ? payload[0] : defaultValue;
};
const has = (key) => {
return !!errors.value?.[key];
};
const byStatusCode = (error) => {
switch (error?.response?.status) {
case 422:
unprocessable(error);
break;
case 419:
csrf(error);
break;
case 401:
unauthenticated();
break;
default:
general(error);
break;
}
};
const general = (error) => {
console.warn(message.value = error.message || errorMessages.default, error);
};
const unprocessable = (error) => {
const { message: m, errors: e } = error?.response?._data;
message.value = m || errorMessages.default;
errors.value = e || null;
};
const csrf = (error) => {
console.warn(message.value = errorMessages.csrf, error);
};
const unauthenticated = () => {
const user = useCurrentUser();
if (user.value !== null) {
user.value = null;
}
console.warn(message.value = errorMessages.unauthenticated);
};
const reset = () => {
message.value = null;
errors.value = null;
};
const handle = (error) => {
if (!error) {
return;
}
const { response } = error;
if (response?.status) {
byStatusCode(error);
} else {
general(error);
}
};
return { message, errors, handle, reset, has, get };
};