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 } }