import type { AsyncData } from '#app' import type { ComputedRef, Ref } from 'vue' import { v4 as uuid4 } from 'uuid' import { useEntityManager } from '~/composables/data/useEntityManager' import ApiResource from '~/models/ApiResource' import type { AssociativeArray, Collection } from '~/types/data' interface useEntityFetchReturnType { fetch: ( model: typeof ApiResource, id: number ) => AsyncData fetchCollection: ( model: typeof ApiResource, parent?: ApiResource | null, query?: Ref ) => AsyncData getRef: ( model: new () => T, id: Ref ) => ComputedRef } // TODO: améliorer le typage des fonctions sur le modèle de getRef export const useEntityFetch = ( lazy: boolean = false ): useEntityFetchReturnType => { const { em } = useEntityManager() const fetch = (model: typeof ApiResource, id: number) => useAsyncData( model.entity + '_' + id + '_' + uuid4(), () => em.fetch(model, id, true), { lazy } ) const fetchCollection = ( model: typeof ApiResource, parent: ApiResource | null = null, query: Ref = ref(null) ) => useAsyncData( model.entity + '_many_' + uuid4(), () => em.fetchCollection(model, parent, query.value ?? undefined), { lazy } ) const getRef = ( model: new () => T, id: Ref ): ComputedRef => { return computed(() => (id.value ? (em.find(model, id.value) as T) : null)) } return { fetch, fetchCollection, getRef } }