| 1234567891011121314151617181920212223242526272829303132333435363738 |
- import {useEntityManager} from "~/composables/data/useEntityManager";
- import ApiResource from "~/models/ApiResource";
- import {AssociativeArray, Collection} from "~/types/data";
- import {AsyncData} from "#app";
- import {ComputedRef, Ref} from "vue";
- interface useEntityFetchReturnType {
- fetch: (model: typeof ApiResource, id: number) => AsyncData<ApiResource, ApiResource | true>,
- fetchCollection: (model: typeof ApiResource, parent?: ApiResource | null, query?: Ref<AssociativeArray>) => AsyncData<Collection, any>
- // @ts-ignore
- getRef: <T extends ApiResource>(model: typeof T, id: Ref<number | null>) => ComputedRef<null | T>
- }
- // 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,
- () => em.fetch(model, id, true),
- { lazy }
- )
- const fetchCollection = (model: typeof ApiResource, parent: ApiResource | null = null, query: Ref<AssociativeArray | null> = ref(null)) => useAsyncData(
- model.entity + '_many',
- () => em.fetchCollection(model, parent, query.value),
- { lazy }
- )
- // @ts-ignore
- const getRef = <T extends ApiResource>(model: typeof T, id: Ref<number | null>): ComputedRef<T | null> => {
- return computed(() => (id.value ? em.find(model, id.value) as T : null))
- }
- //@ts-ignore
- return { fetch, fetchCollection, getRef }
- }
|