generated from VLADIMIR/template_frontend
add use api
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
import { ref, type Ref } from 'vue';
|
||||
|
||||
export type ApiMethod<T, P = void> = (params: P) => Promise<T>;
|
||||
|
||||
interface UseApiOptions<T> {
|
||||
immediate?: boolean;
|
||||
onSuccess?: (data: T) => void;
|
||||
onError?: (error: Error) => void;
|
||||
}
|
||||
|
||||
export function useApi<T, P = void>(
|
||||
method: ApiMethod<T, P>,
|
||||
params?: P,
|
||||
options: UseApiOptions<T> = {}
|
||||
) {
|
||||
const data = ref<T | null>(null) as Ref<T | null>;
|
||||
const loading = ref(false);
|
||||
const error = ref<Error | null>(null);
|
||||
|
||||
const execute = async (execParams?: P) => {
|
||||
loading.value = true;
|
||||
error.value = null;
|
||||
|
||||
try {
|
||||
const result = await method(execParams !== undefined ? execParams : (params as P));
|
||||
data.value = result;
|
||||
options.onSuccess?.(result);
|
||||
return result;
|
||||
} catch (e) {
|
||||
const err = e instanceof Error ? e : new Error('Unknown error');
|
||||
error.value = err;
|
||||
options.onError?.(err);
|
||||
throw err;
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
const reset = () => {
|
||||
data.value = null;
|
||||
loading.value = false;
|
||||
error.value = null;
|
||||
};
|
||||
|
||||
// Автоматический запуск
|
||||
if (options.immediate !== false) {
|
||||
execute();
|
||||
}
|
||||
|
||||
return {
|
||||
data,
|
||||
loading,
|
||||
error,
|
||||
execute,
|
||||
reset,
|
||||
};
|
||||
}
|
||||
|
||||
// Упрощенная версия для GET-запросов
|
||||
export function useApiData<T, P = void>(
|
||||
method: ApiMethod<T, P>,
|
||||
params?: P
|
||||
) {
|
||||
return useApi(method, params, { immediate: true });
|
||||
}
|
||||
Reference in New Issue
Block a user