Commit e2705c7e authored by tom's avatar tom

[skip ci] improve typing of useApiQuery hook

parent 5b8ad31d
import { useQuery } from '@tanstack/react-query';
import type { AddressMetadataInfo } from 'types/api/addressMetadata';
import type { AddressMetadataInfoFormatted, AddressMetadataTagFormatted } from 'types/client/addressMetadata'; import type { AddressMetadataInfoFormatted, AddressMetadataTagFormatted } from 'types/client/addressMetadata';
import config from 'configs/app'; import config from 'configs/app';
import useApiFetch from 'lib/api/useApiFetch'; import useApiQuery from 'lib/api/useApiQuery';
import { getResourceKey } from 'lib/api/useApiQuery';
import parseMetaPayload from './parseMetaPayload'; import parseMetaPayload from './parseMetaPayload';
export default function useAddressMetadataInfoQuery(addresses: Array<string>) { export default function useAddressMetadataInfoQuery(addresses: Array<string>) {
const apiFetch = useApiFetch();
const queryParams = {
addresses,
chainId: config.chain.id,
tagsLimit: '20',
};
const resource = 'address_metadata_info'; const resource = 'address_metadata_info';
// TODO @tom2drum: Improve the typing here return useApiQuery<typeof resource, unknown, AddressMetadataInfoFormatted>(resource, {
// since we are formatting the API data in the select function here queryParams: {
// we cannot use the useApiQuery hook because of its current typing addresses,
// enhance useApiQuery so it can accept an API data and the formatted data types chainId: config.chain.id,
return useQuery<AddressMetadataInfo, unknown, AddressMetadataInfoFormatted>({ tagsLimit: '20',
queryKey: getResourceKey(resource, { queryParams }),
queryFn: async() => {
return apiFetch(resource, { queryParams }) as Promise<AddressMetadataInfo>;
}, },
enabled: addresses.length > 0 && config.features.addressMetadata.isEnabled, queryOptions: {
select: (data) => { enabled: addresses.length > 0 && config.features.addressMetadata.isEnabled,
const addresses = Object.entries(data.addresses) select: (data) => {
.map(([ address, { tags, reputation } ]) => { const addresses = Object.entries(data.addresses)
const formattedTags: Array<AddressMetadataTagFormatted> = tags.map((tag) => ({ ...tag, meta: parseMetaPayload(tag.meta) })); .map(([ address, { tags, reputation } ]) => {
return [ address.toLowerCase(), { tags: formattedTags, reputation } ] as const; const formattedTags: Array<AddressMetadataTagFormatted> = tags.map((tag) => ({ ...tag, meta: parseMetaPayload(tag.meta) }));
}) return [ address.toLowerCase(), { tags: formattedTags, reputation } ] as const;
.reduce((result, item) => { })
result[item[0]] = item[1]; .reduce((result, item) => {
return result; result[item[0]] = item[1];
}, {} as AddressMetadataInfoFormatted['addresses']); return result;
}, {} as AddressMetadataInfoFormatted['addresses']);
return { addresses };
return { addresses };
},
}, },
}); });
} }
...@@ -5,8 +5,8 @@ import type { ResourceError, ResourceName, ResourcePayload } from './resources'; ...@@ -5,8 +5,8 @@ import type { ResourceError, ResourceName, ResourcePayload } from './resources';
import type { Params as ApiFetchParams } from './useApiFetch'; import type { Params as ApiFetchParams } from './useApiFetch';
import useApiFetch from './useApiFetch'; import useApiFetch from './useApiFetch';
export interface Params<R extends ResourceName, E = unknown> extends ApiFetchParams<R> { export interface Params<R extends ResourceName, E = unknown, D = ResourcePayload<R>> extends ApiFetchParams<R> {
queryOptions?: Omit<UseQueryOptions<ResourcePayload<R>, ResourceError<E>, ResourcePayload<R>>, 'queryKey' | 'queryFn'>; queryOptions?: Omit<UseQueryOptions<ResourcePayload<R>, ResourceError<E>, D>, 'queryKey' | 'queryFn'>;
} }
export function getResourceKey<R extends ResourceName>(resource: R, { pathParams, queryParams }: Params<R> = {}) { export function getResourceKey<R extends ResourceName>(resource: R, { pathParams, queryParams }: Params<R> = {}) {
...@@ -17,13 +17,13 @@ export function getResourceKey<R extends ResourceName>(resource: R, { pathParams ...@@ -17,13 +17,13 @@ export function getResourceKey<R extends ResourceName>(resource: R, { pathParams
return [ resource ]; return [ resource ];
} }
export default function useApiQuery<R extends ResourceName, E = unknown>( export default function useApiQuery<R extends ResourceName, E = unknown, D = ResourcePayload<R>>(
resource: R, resource: R,
{ queryOptions, pathParams, queryParams, fetchParams }: Params<R, E> = {}, { queryOptions, pathParams, queryParams, fetchParams }: Params<R, E, D> = {},
) { ) {
const apiFetch = useApiFetch(); const apiFetch = useApiFetch();
return useQuery<ResourcePayload<R>, ResourceError<E>, ResourcePayload<R>>({ return useQuery<ResourcePayload<R>, ResourceError<E>, D>({
// eslint-disable-next-line @tanstack/query/exhaustive-deps // eslint-disable-next-line @tanstack/query/exhaustive-deps
queryKey: getResourceKey(resource, { pathParams, queryParams }), queryKey: getResourceKey(resource, { pathParams, queryParams }),
queryFn: async() => { queryFn: async() => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment