mirror of
https://github.com/imezx/Warp.git
synced 2025-04-24 15:10:03 +00:00
123 lines
3.6 KiB
JavaScript
123 lines
3.6 KiB
JavaScript
'use strict';
|
|
|
|
var vueDemi = require('vue-demi');
|
|
var shared = require('@vueuse/shared');
|
|
var axios = require('axios');
|
|
|
|
function useAxios(...args) {
|
|
const url = typeof args[0] === "string" ? args[0] : void 0;
|
|
const argsPlaceholder = typeof url === "string" ? 1 : 0;
|
|
const defaultOptions = {
|
|
immediate: !!argsPlaceholder,
|
|
shallow: true
|
|
};
|
|
let defaultConfig = {};
|
|
let instance = axios;
|
|
let options = defaultOptions;
|
|
const isAxiosInstance = (val) => !!(val == null ? void 0 : val.request);
|
|
if (args.length > 0 + argsPlaceholder) {
|
|
if (isAxiosInstance(args[0 + argsPlaceholder]))
|
|
instance = args[0 + argsPlaceholder];
|
|
else
|
|
defaultConfig = args[0 + argsPlaceholder];
|
|
}
|
|
if (args.length > 1 + argsPlaceholder) {
|
|
if (isAxiosInstance(args[1 + argsPlaceholder]))
|
|
instance = args[1 + argsPlaceholder];
|
|
}
|
|
if (args.length === 2 + argsPlaceholder && !isAxiosInstance(args[1 + argsPlaceholder]) || args.length === 3 + argsPlaceholder)
|
|
options = args[args.length - 1] || defaultOptions;
|
|
const {
|
|
initialData,
|
|
shallow,
|
|
onSuccess = shared.noop,
|
|
onError = shared.noop,
|
|
immediate,
|
|
resetOnExecute = false
|
|
} = options;
|
|
const response = vueDemi.shallowRef();
|
|
const data = (shallow ? vueDemi.shallowRef : vueDemi.ref)(initialData);
|
|
const isFinished = vueDemi.ref(false);
|
|
const isLoading = vueDemi.ref(false);
|
|
const isAborted = vueDemi.ref(false);
|
|
const error = vueDemi.shallowRef();
|
|
const cancelTokenSource = axios.CancelToken.source;
|
|
let cancelToken = cancelTokenSource();
|
|
const abort = (message) => {
|
|
if (isFinished.value || !isLoading.value)
|
|
return;
|
|
cancelToken.cancel(message);
|
|
cancelToken = cancelTokenSource();
|
|
isAborted.value = true;
|
|
isLoading.value = false;
|
|
isFinished.value = false;
|
|
};
|
|
const loading = (loading2) => {
|
|
isLoading.value = loading2;
|
|
isFinished.value = !loading2;
|
|
};
|
|
const resetData = () => {
|
|
if (resetOnExecute)
|
|
data.value = initialData;
|
|
};
|
|
const waitUntilFinished = () => new Promise((resolve, reject) => {
|
|
shared.until(isFinished).toBe(true).then(() => error.value ? reject(error.value) : resolve(result));
|
|
});
|
|
const promise = {
|
|
then: (...args2) => waitUntilFinished().then(...args2),
|
|
catch: (...args2) => waitUntilFinished().catch(...args2)
|
|
};
|
|
let executeCounter = 0;
|
|
const execute = (executeUrl = url, config = {}) => {
|
|
error.value = void 0;
|
|
const _url = typeof executeUrl === "string" ? executeUrl : url != null ? url : config.url;
|
|
if (_url === void 0) {
|
|
error.value = new axios.AxiosError(axios.AxiosError.ERR_INVALID_URL);
|
|
isFinished.value = true;
|
|
return promise;
|
|
}
|
|
resetData();
|
|
abort();
|
|
loading(true);
|
|
executeCounter += 1;
|
|
const currentExecuteCounter = executeCounter;
|
|
isAborted.value = false;
|
|
instance(_url, { ...defaultConfig, ...typeof executeUrl === "object" ? executeUrl : config, cancelToken: cancelToken.token }).then((r) => {
|
|
if (isAborted.value)
|
|
return;
|
|
response.value = r;
|
|
const result2 = r.data;
|
|
data.value = result2;
|
|
onSuccess(result2);
|
|
}).catch((e) => {
|
|
error.value = e;
|
|
onError(e);
|
|
}).finally(() => {
|
|
var _a;
|
|
(_a = options.onFinish) == null ? void 0 : _a.call(options);
|
|
if (currentExecuteCounter === executeCounter)
|
|
loading(false);
|
|
});
|
|
return promise;
|
|
};
|
|
if (immediate && url)
|
|
execute();
|
|
const result = {
|
|
response,
|
|
data,
|
|
error,
|
|
isFinished,
|
|
isLoading,
|
|
cancel: abort,
|
|
isAborted,
|
|
isCanceled: isAborted,
|
|
abort,
|
|
execute
|
|
};
|
|
return {
|
|
...result,
|
|
...promise
|
|
};
|
|
}
|
|
|
|
exports.useAxios = useAxios;
|