import { ref, onMounted, onUnmounted, type Ref } from 'vue' import axios from 'axios' import { api } from '@/api' interface UseApiResourceReturn { data: Ref loading: Ref error: Ref refresh: () => Promise } export function useApiResource(url: string, immediate = true): UseApiResourceReturn { const data = ref(null) as Ref const loading = ref(true) const error = ref(null) let controller = new AbortController() async function refresh() { controller.abort() controller = new AbortController() loading.value = true error.value = null try { const response = await api.get(url, { signal: controller.signal }) data.value = response.data } catch (e) { if (!axios.isCancel(e)) { error.value = 'Failed to load data' console.error(e) } } finally { loading.value = false } } if (immediate) onMounted(refresh) onUnmounted(() => controller.abort()) return { data, loading, error, refresh } }