From 54c11beda8aab56e9321b791444e4e802585f933 Mon Sep 17 00:00:00 2001 From: yassinedorbozgithub Date: Sat, 21 Jun 2025 10:37:09 +0100 Subject: [PATCH] fix(frontend): enhance hook types --- .../nlp/components/NlpSampleForm.tsx | 6 +---- frontend/src/hooks/crud/useCreate.tsx | 12 ++++----- frontend/src/hooks/crud/useDelete.tsx | 17 +++++------- frontend/src/hooks/crud/useDeleteMany.tsx | 12 ++++----- frontend/src/hooks/crud/useFind.tsx | 23 ++++++---------- frontend/src/hooks/crud/useGet.tsx | 13 +++++----- frontend/src/hooks/crud/useImport.tsx | 8 +++--- frontend/src/hooks/crud/useInfiniteFind.ts | 23 ++++++---------- .../hooks/crud/useNormalizedInfiniteQuery.ts | 23 ++++++---------- frontend/src/hooks/crud/useUpdate.tsx | 17 +++++------- frontend/src/hooks/crud/useUpdateMany.tsx | 12 ++++----- frontend/src/hooks/crud/useUpload.tsx | 12 ++++----- frontend/src/types/base.types.ts | 26 ++++++++++++++++--- 13 files changed, 94 insertions(+), 110 deletions(-) diff --git a/frontend/src/components/nlp/components/NlpSampleForm.tsx b/frontend/src/components/nlp/components/NlpSampleForm.tsx index 3a839bf9..ef24a65a 100644 --- a/frontend/src/components/nlp/components/NlpSampleForm.tsx +++ b/frontend/src/components/nlp/components/NlpSampleForm.tsx @@ -15,7 +15,6 @@ import { EntityType } from "@/services/types"; import { ComponentFormProps } from "@/types/common/dialogs.types"; import { INlpDatasetSample, - INlpDatasetSampleAttributes, INlpSampleFormAttributes, } from "@/types/nlp-sample.types"; @@ -29,10 +28,7 @@ export const NlpSampleForm: FC> = ({ }) => { const { t } = useTranslate(); const { toast } = useToast(); - const { mutate: updateSample } = useUpdate< - EntityType.NLP_SAMPLE, - INlpDatasetSampleAttributes - >(EntityType.NLP_SAMPLE, { + const { mutate: updateSample } = useUpdate(EntityType.NLP_SAMPLE, { onError: () => { toast.error(t("message.internal_server_error")); }, diff --git a/frontend/src/hooks/crud/useCreate.tsx b/frontend/src/hooks/crud/useCreate.tsx index 24a3c688..fa0c0734 100644 --- a/frontend/src/hooks/crud/useCreate.tsx +++ b/frontend/src/hooks/crud/useCreate.tsx @@ -9,19 +9,19 @@ import { useMutation, useQueryClient } from "react-query"; import { QueryType, TMutationOptions } from "@/services/types"; -import { IBaseSchema, IDynamicProps, TType } from "@/types/base.types"; +import { IBaseSchema, THook } from "@/types/base.types"; import { useEntityApiClient } from "../useApiClient"; import { isSameEntity, useNormalizeAndCache } from "./helpers"; export const useCreate = < - TEntity extends IDynamicProps["entity"], - TAttr = TType["attributes"], - TBasic extends IBaseSchema = TType["basic"], - TFull extends IBaseSchema = TType["full"], + TE extends THook["entity"], + TAttr = THook<{ entity: TE }>["attributes"], + TBasic extends IBaseSchema = THook<{ entity: TE }>["basic"], + TFull extends IBaseSchema = THook<{ entity: TE }>["full"], >( - entity: TEntity, + entity: TE, options?: Omit< TMutationOptions, "mutationFn" | "mutationKey" diff --git a/frontend/src/hooks/crud/useDelete.tsx b/frontend/src/hooks/crud/useDelete.tsx index 37384c41..706ad588 100644 --- a/frontend/src/hooks/crud/useDelete.tsx +++ b/frontend/src/hooks/crud/useDelete.tsx @@ -9,24 +9,19 @@ import { useMutation, useQueryClient } from "react-query"; import { QueryType, TMutationOptions } from "@/services/types"; -import { - IBaseSchema, - IDynamicProps, - IEntityMapTypes, - TType, -} from "@/types/base.types"; +import { IBaseSchema, IEntityMapTypes, THook } from "@/types/base.types"; import { useEntityApiClient } from "../useApiClient"; import { isSameEntity } from "./helpers"; export const useDelete = < - TEntity extends IDynamicProps["entity"], - TAttr = TType["attributes"], - TBasic extends IBaseSchema = TType["basic"], - TFull extends IBaseSchema = TType["full"], + TE extends THook["entity"], + TAttr = THook<{ entity: TE }>["attributes"], + TBasic extends IBaseSchema = THook<{ entity: TE }>["basic"], + TFull extends IBaseSchema = THook<{ entity: TE }>["full"], >( - entity: TEntity, + entity: TE, options?: Omit< TMutationOptions, "mutationFn" | "mutationKey" diff --git a/frontend/src/hooks/crud/useDeleteMany.tsx b/frontend/src/hooks/crud/useDeleteMany.tsx index b9ca036f..5ade0045 100644 --- a/frontend/src/hooks/crud/useDeleteMany.tsx +++ b/frontend/src/hooks/crud/useDeleteMany.tsx @@ -9,19 +9,19 @@ import { useMutation, useQueryClient } from "react-query"; import { QueryType, TMutationOptions } from "@/services/types"; -import { IBaseSchema, IDynamicProps, TType } from "@/types/base.types"; +import { IBaseSchema, THook } from "@/types/base.types"; import { useEntityApiClient } from "../useApiClient"; import { isSameEntity } from "./helpers"; export const useDeleteMany = < - TEntity extends IDynamicProps["entity"], - TAttr = TType["attributes"], - TBasic extends IBaseSchema = TType["basic"], - TFull extends IBaseSchema = TType["full"], + TE extends THook["entity"], + TAttr = THook<{ entity: TE }>["attributes"], + TBasic extends IBaseSchema = THook<{ entity: TE }>["basic"], + TFull extends IBaseSchema = THook<{ entity: TE }>["full"], >( - entity: TEntity, + entity: TE, options?: Omit< TMutationOptions, "mutationFn" | "mutationKey" diff --git a/frontend/src/hooks/crud/useFind.tsx b/frontend/src/hooks/crud/useFind.tsx index d1580082..8a3f27e3 100644 --- a/frontend/src/hooks/crud/useFind.tsx +++ b/frontend/src/hooks/crud/useFind.tsx @@ -8,19 +8,12 @@ import { useQuery, UseQueryOptions } from "react-query"; -import { - EntityType, - Format, - QueryType, - TPopulateTypeFromFormat, -} from "@/services/types"; +import { EntityType, Format, QueryType } from "@/services/types"; import { IBaseSchema, - IDynamicProps, IFindConfigProps, POPULATE_BY_TYPE, - TAllowedFormat, - TType, + THook, } from "@/types/base.types"; import { useEntityApiClient } from "../useApiClient"; @@ -31,13 +24,13 @@ import { useCount } from "./useCount"; import { useGetFromCache } from "./useGet"; export const useFind = < - TDynamicProps extends IDynamicProps, - TAttr = TType["attributes"], - TBasic extends IBaseSchema = TType["basic"], - TFull extends IBaseSchema = TType["full"], - P = TPopulateTypeFromFormat, + TP extends THook["params"], + TAttr = THook["attributes"], + TBasic extends IBaseSchema = THook["basic"], + TFull extends IBaseSchema = THook["full"], + P = THook["populate"], >( - { entity, format }: TDynamicProps & TAllowedFormat, + { entity, format }: THook["params"], config?: IFindConfigProps, options?: Omit< UseQueryOptions, diff --git a/frontend/src/hooks/crud/useGet.tsx b/frontend/src/hooks/crud/useGet.tsx index 5f8b9066..2ce4c4a3 100644 --- a/frontend/src/hooks/crud/useGet.tsx +++ b/frontend/src/hooks/crud/useGet.tsx @@ -11,10 +11,9 @@ import { useQuery, useQueryClient, UseQueryOptions } from "react-query"; import { EntityType, Format, QueryType } from "@/services/types"; import { IBaseSchema, - IDynamicProps, IEntityMapTypes, POPULATE_BY_TYPE, - TAllowedFormat, + THook, TType, } from "@/types/base.types"; @@ -23,13 +22,13 @@ import { useEntityApiClient } from "../useApiClient"; import { useNormalizeAndCache } from "./helpers"; export const useGet = < - TDynamicProps extends IDynamicProps, - TAttr = TType["attributes"], - TBasic extends IBaseSchema = TType["basic"], - TFull extends IBaseSchema = TType["full"], + T extends THook["params"], + TAttr = THook["attributes"], + TBasic extends IBaseSchema = THook["basic"], + TFull extends IBaseSchema = THook["full"], >( id: string, - { entity, format }: TDynamicProps & TAllowedFormat, + { entity, format }: THook["params"], options?: Omit< UseQueryOptions< unknown, diff --git a/frontend/src/hooks/crud/useImport.tsx b/frontend/src/hooks/crud/useImport.tsx index 8e4a4e3d..dd64521a 100644 --- a/frontend/src/hooks/crud/useImport.tsx +++ b/frontend/src/hooks/crud/useImport.tsx @@ -9,18 +9,18 @@ import { useMutation, useQueryClient } from "react-query"; import { QueryType, TMutationOptions } from "@/services/types"; -import { IBaseSchema, IDynamicProps, TType } from "@/types/base.types"; +import { IBaseSchema, THook } from "@/types/base.types"; import { useEntityApiClient } from "../useApiClient"; import { isSameEntity, useNormalizeAndCache } from "./helpers"; export const useImport = < - TEntity extends IDynamicProps["entity"], + TE extends THook["entity"], TAttr extends File = File, - TBasic extends IBaseSchema = TType["basic"], + TBasic extends IBaseSchema = THook<{ entity: TE }>["basic"], >( - entity: TEntity, + entity: TE, options: Omit< TMutationOptions, "mutationFn" | "mutationKey" diff --git a/frontend/src/hooks/crud/useInfiniteFind.ts b/frontend/src/hooks/crud/useInfiniteFind.ts index dd2888cc..97e511c9 100644 --- a/frontend/src/hooks/crud/useInfiniteFind.ts +++ b/frontend/src/hooks/crud/useInfiniteFind.ts @@ -8,19 +8,12 @@ import { useInfiniteQuery, UseInfiniteQueryOptions } from "react-query"; -import { - EntityType, - Format, - QueryType, - TPopulateTypeFromFormat, -} from "@/services/types"; +import { EntityType, Format, QueryType } from "@/services/types"; import { IBaseSchema, - IDynamicProps, IFindConfigProps, POPULATE_BY_TYPE, - TAllowedFormat, - TType, + THook, } from "@/types/base.types"; import { useEntityApiClient } from "../useApiClient"; @@ -29,13 +22,13 @@ import { useNormalizeAndCache } from "./helpers"; import { useGetFromCache } from "./useGet"; export const useInfiniteFind = < - TDynamicProps extends IDynamicProps, - TAttr = TType["attributes"], - TBasic extends IBaseSchema = TType["basic"], - TFull extends IBaseSchema = TType["full"], - P = TPopulateTypeFromFormat, + T extends THook["params"], + TAttr = THook["attributes"], + TBasic extends IBaseSchema = THook["basic"], + TFull extends IBaseSchema = THook["full"], + P = THook["populate"], >( - { entity, format }: TDynamicProps & TAllowedFormat, + { entity, format }: THook["params"], config?: IFindConfigProps, options?: Omit< UseInfiniteQueryOptions< diff --git a/frontend/src/hooks/crud/useNormalizedInfiniteQuery.ts b/frontend/src/hooks/crud/useNormalizedInfiniteQuery.ts index 5e42382e..cc5d25ca 100644 --- a/frontend/src/hooks/crud/useNormalizedInfiniteQuery.ts +++ b/frontend/src/hooks/crud/useNormalizedInfiniteQuery.ts @@ -8,19 +8,12 @@ import { useInfiniteQuery, UseInfiniteQueryOptions } from "react-query"; -import { - EntityType, - Format, - QueryType, - TPopulateTypeFromFormat, -} from "@/services/types"; +import { EntityType, Format, QueryType } from "@/services/types"; import { IBaseSchema, - IDynamicProps, IFindConfigProps, POPULATE_BY_TYPE, - TAllowedFormat, - TType, + THook, } from "@/types/base.types"; import { useEntityApiClient } from "../useApiClient"; @@ -32,13 +25,13 @@ import { useGetFromCache } from "./useGet"; const PAGE_SIZE = 20; export const useNormalizedInfiniteQuery = < - TDynamicProps extends IDynamicProps, - TAttr = TType["attributes"], - TBasic extends IBaseSchema = TType["basic"], - TFull extends IBaseSchema = TType["full"], - P = TPopulateTypeFromFormat, + T extends THook["params"], + TAttr = THook["attributes"], + TBasic extends IBaseSchema = THook["basic"], + TFull extends IBaseSchema = THook["full"], + P = THook["populate"], >( - { entity, format }: TDynamicProps & TAllowedFormat, + { entity, format }: THook["params"], config?: IFindConfigProps, options?: Omit< UseInfiniteQueryOptions< diff --git a/frontend/src/hooks/crud/useUpdate.tsx b/frontend/src/hooks/crud/useUpdate.tsx index 541ad14a..8a5321f0 100644 --- a/frontend/src/hooks/crud/useUpdate.tsx +++ b/frontend/src/hooks/crud/useUpdate.tsx @@ -9,12 +9,7 @@ import { useMutation, useQueryClient } from "react-query"; import { QueryType, TMutationOptions, TSetCacheProps } from "@/services/types"; -import { - IBaseSchema, - IDynamicProps, - IEntityMapTypes, - TType, -} from "@/types/base.types"; +import { IBaseSchema, IEntityMapTypes, THook, TType } from "@/types/base.types"; import { merge } from "@/utils/object"; import { useEntityApiClient } from "../useApiClient"; @@ -23,12 +18,12 @@ import { useNormalizeAndCache } from "./helpers"; import { useGetFromCache } from "./useGet"; export const useUpdate = < - TEntity extends IDynamicProps["entity"], - TAttr = TType["attributes"], - TBasic extends IBaseSchema = TType["basic"], - TFull extends IBaseSchema = TType["full"], + TE extends THook["entity"], + TAttr = THook<{ entity: TE }>["attributes"], + TBasic extends IBaseSchema = THook<{ entity: TE }>["basic"], + TFull extends IBaseSchema = THook<{ entity: TE }>["full"], >( - entity: TEntity, + entity: TE, options?: Omit< TMutationOptions< TBasic, diff --git a/frontend/src/hooks/crud/useUpdateMany.tsx b/frontend/src/hooks/crud/useUpdateMany.tsx index 5d69ce52..001da302 100644 --- a/frontend/src/hooks/crud/useUpdateMany.tsx +++ b/frontend/src/hooks/crud/useUpdateMany.tsx @@ -9,19 +9,19 @@ import { useMutation, useQueryClient } from "react-query"; import { QueryType, TMutationOptions } from "@/services/types"; -import { IBaseSchema, IDynamicProps, TType } from "@/types/base.types"; +import { IBaseSchema, THook } from "@/types/base.types"; import { useEntityApiClient } from "../useApiClient"; import { isSameEntity } from "./helpers"; export const useUpdateMany = < - TEntity extends IDynamicProps["entity"], - TAttr = TType["attributes"], - TBasic extends IBaseSchema = TType["basic"], - TFull extends IBaseSchema = TType["full"], + TE extends THook["entity"], + TAttr = THook<{ entity: TE }>["attributes"], + TBasic extends IBaseSchema = THook<{ entity: TE }>["basic"], + TFull extends IBaseSchema = THook<{ entity: TE }>["full"], >( - entity: TEntity, + entity: TE, options?: Omit< TMutationOptions< string, diff --git a/frontend/src/hooks/crud/useUpload.tsx b/frontend/src/hooks/crud/useUpload.tsx index d7d8dcec..c55ae556 100644 --- a/frontend/src/hooks/crud/useUpload.tsx +++ b/frontend/src/hooks/crud/useUpload.tsx @@ -10,19 +10,19 @@ import { useMutation, useQueryClient } from "react-query"; import { QueryType, TMutationOptions } from "@/services/types"; import { AttachmentResourceRef } from "@/types/attachment.types"; -import { IBaseSchema, IDynamicProps, TType } from "@/types/base.types"; +import { IBaseSchema, THook } from "@/types/base.types"; import { useEntityApiClient } from "../useApiClient"; import { isSameEntity, useNormalizeAndCache } from "./helpers"; export const useUpload = < - TEntity extends IDynamicProps["entity"], - TAttr = TType["attributes"], - TBasic extends IBaseSchema = TType["basic"], - TFull extends IBaseSchema = TType["full"], + TE extends THook["entity"], + TAttr = THook<{ entity: TE }>["attributes"], + TBasic extends IBaseSchema = THook<{ entity: TE }>["basic"], + TFull extends IBaseSchema = THook<{ entity: TE }>["full"], >( - entity: TEntity, + entity: TE, options?: Omit< TMutationOptions< TBasic, diff --git a/frontend/src/types/base.types.ts b/frontend/src/types/base.types.ts index 184a8439..569c36f9 100644 --- a/frontend/src/types/base.types.ts +++ b/frontend/src/types/base.types.ts @@ -8,7 +8,7 @@ import { GridPaginationModel, GridSortModel } from "@mui/x-data-grid"; -import { EntityType, Format } from "@/services/types"; +import { EntityType, Format, TPopulateTypeFromFormat } from "@/services/types"; import { IAttachment, IAttachmentAttributes } from "./attachment.types"; import { @@ -39,8 +39,8 @@ import { INlpEntityFull, } from "./nlp-entity.types"; import { + INlpDatasetSampleAttributes, INlpSample, - INlpSampleAttributes, INlpSampleFull, } from "./nlp-sample.types"; import { @@ -170,7 +170,7 @@ export interface IEntityMapTypes { INlpEntityFull >; [EntityType.NLP_SAMPLE]: IEntityTypes< - INlpSampleAttributes, + INlpDatasetSampleAttributes, INlpSample, INlpSampleFull >; @@ -227,6 +227,26 @@ export interface IDynamicProps { format?: Format; } +type AllNever = { + [K in keyof T]: never; +}; + +export type THook< + G extends IDynamicProps = IDynamicProps, + TE extends keyof IEntityMapTypes = G["entity"], + TP extends IDynamicProps = IDynamicProps & + G & + AllNever> & + TAllowedFormat, +> = { + full: TType["full"]; + basic: TType["basic"]; + params: TP; + entity: TE; + populate: TPopulateTypeFromFormat; + attributes: TType["attributes"]; +}; + export interface IFindConfigProps { params?: any; hasCount?: boolean;