From 503b581da6acb06a23f4f591a7d62219548b1cf7 Mon Sep 17 00:00:00 2001 From: adrian-ol Date: Tue, 21 Jan 2025 15:56:40 +0100 Subject: [PATCH 1/4] HUM-99: available jobs service refactor --- .../mobile/available-jobs-table-mobile.tsx | 6 ++--- .../worker/hooks/use-available-jobs-query.ts | 21 ++++++++++++++++ .../use-infinite-available-jobs-query.ts | 24 ++++++++++++++++++ .../fetch-available-jobs.schema.ts | 16 ++++++++++++ .../fetch-available-jobs.ts | 25 +++++++++++++++++++ .../fetch-available-jobs.types.ts | 15 +++++++++++ .../services/fetch-available-jobs/index.ts | 3 +++ 7 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 packages/apps/human-app/frontend/src/modules/worker/hooks/use-available-jobs-query.ts create mode 100644 packages/apps/human-app/frontend/src/modules/worker/hooks/use-infinite-available-jobs-query.ts create mode 100644 packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema.ts create mode 100644 packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts create mode 100644 packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts create mode 100644 packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/index.ts diff --git a/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx b/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx index 361afe7e89..71216ead42 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx @@ -8,8 +8,8 @@ import { useJobsFilterStore } from '@/modules/worker/hooks/use-jobs-filter-store import { Alert } from '@/shared/components/ui/alert'; import { getNetworkName } from '@/modules/smart-contracts/get-network-name'; import { getErrorMessageForError } from '@/shared/errors'; -import type { AvailableJob } from '@/modules/worker/services/available-jobs-data'; -import { useInfiniteGetAvailableJobsData } from '@/modules/worker/services/available-jobs-data'; +import type { AvailableJob } from '@/modules/worker/services/fetch-available-jobs'; +import { useInfiniteAvailableJobsQuery } from '@/modules/worker/hooks/use-infinite-available-jobs-query'; import { Loader } from '@/shared/components/ui/loader'; import { EvmAddress } from '@/modules/worker/components/jobs/evm-address'; import { Chip } from '@/shared/components/ui/chip'; @@ -37,7 +37,7 @@ export function AvailableJobsTableMobile({ error: tableError, fetchNextPage, hasNextPage, - } = useInfiniteGetAvailableJobsData(); + } = useInfiniteAvailableJobsQuery(); const { filterParams, setPageParams, resetFilterParams } = useJobsFilterStore(); const { t } = useTranslation(); diff --git a/packages/apps/human-app/frontend/src/modules/worker/hooks/use-available-jobs-query.ts b/packages/apps/human-app/frontend/src/modules/worker/hooks/use-available-jobs-query.ts new file mode 100644 index 0000000000..1432a90072 --- /dev/null +++ b/packages/apps/human-app/frontend/src/modules/worker/hooks/use-available-jobs-query.ts @@ -0,0 +1,21 @@ +/* eslint-disable camelcase -- api response*/ +import { useQuery } from '@tanstack/react-query'; +import { useParams } from 'react-router-dom'; +import { useJobsFilterStore } from '@/modules/worker/hooks/use-jobs-filter-store'; +import { fetchAvailableJobs } from '@/modules/worker/services/fetch-available-jobs'; +import type { AvailableJobsSuccessResponse } from '@/modules/worker/services/fetch-available-jobs'; + +export function useAvailableJobsQuery() { + const { filterParams } = useJobsFilterStore(); + const { address: oracleAddress } = useParams<{ address: string }>(); + + const queryParams = { + ...filterParams, + oracle_address: oracleAddress ?? '', + }; + + return useQuery({ + queryKey: ['availableJobs', queryParams], + queryFn: ({ signal }) => fetchAvailableJobs(queryParams, signal), + }); +} diff --git a/packages/apps/human-app/frontend/src/modules/worker/hooks/use-infinite-available-jobs-query.ts b/packages/apps/human-app/frontend/src/modules/worker/hooks/use-infinite-available-jobs-query.ts new file mode 100644 index 0000000000..7679f14a1f --- /dev/null +++ b/packages/apps/human-app/frontend/src/modules/worker/hooks/use-infinite-available-jobs-query.ts @@ -0,0 +1,24 @@ +/* eslint-disable camelcase -- api response*/ +import { useInfiniteQuery } from '@tanstack/react-query'; +import { useParams } from 'react-router-dom'; +import { useJobsFilterStore } from '@/modules/worker/hooks/use-jobs-filter-store'; +import { fetchAvailableJobs } from '@/modules/worker/services/fetch-available-jobs'; +import type { AvailableJobsSuccessResponse } from '@/modules/worker/services/fetch-available-jobs'; + +export function useInfiniteAvailableJobsQuery() { + const { filterParams } = useJobsFilterStore(); + const { address: oracleAddress } = useParams<{ address: string }>(); + + const queryParams = { + ...filterParams, + oracle_address: oracleAddress ?? '', + }; + + return useInfiniteQuery({ + queryKey: ['availableJobsInfinite', queryParams], + queryFn: ({ signal }) => fetchAvailableJobs(queryParams, signal), + initialPageParam: 0, + getNextPageParam: (lastPage) => + lastPage.total_pages - 1 <= lastPage.page ? undefined : lastPage.page, + }); +} diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema.ts b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema.ts new file mode 100644 index 0000000000..a8cc3d408a --- /dev/null +++ b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema.ts @@ -0,0 +1,16 @@ +/* eslint-disable camelcase -- api response*/ +import { z } from 'zod'; +import { createPaginationSchema } from '@/shared/helpers/pagination'; + +export const availableJobSchema = z.object({ + escrow_address: z.string(), + chain_id: z.number(), + job_type: z.string(), + status: z.string(), + job_description: z.string().optional(), + reward_amount: z.string().optional(), + reward_token: z.string().optional(), +}); + +export const availableJobsSuccessResponseSchema = + createPaginationSchema(availableJobSchema); diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts new file mode 100644 index 0000000000..234b20c522 --- /dev/null +++ b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts @@ -0,0 +1,25 @@ +import { apiClient } from '@/api/api-client'; +import { apiPaths } from '@/api/api-paths'; +import { stringifyUrlQueryObject } from '@/shared/helpers/transfomers'; +import type { + AvailableJobsSuccessResponse, + JobTableQueryParams, +} from '@/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types'; +import { availableJobsSuccessResponseSchema } from '@/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema'; + +export async function fetchAvailableJobs( + params: JobTableQueryParams, + abortSignal: AbortSignal +): Promise { + const endpoint = `${apiPaths.worker.jobs.path}?${stringifyUrlQueryObject(params)}`; + + return apiClient( + endpoint, + { + authenticated: true, + successSchema: availableJobsSuccessResponseSchema, + options: { method: 'GET' }, + }, + abortSignal + ); +} diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts new file mode 100644 index 0000000000..c30cc4fdae --- /dev/null +++ b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts @@ -0,0 +1,15 @@ +import { type z } from 'zod'; +import type { JobsFilterStoreProps } from '@/modules/worker/hooks/use-jobs-filter-store'; +import { + type availableJobSchema, + type availableJobsSuccessResponseSchema, +} from '@/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema'; + +export type AvailableJob = z.infer; +export type AvailableJobsSuccessResponse = z.infer< + typeof availableJobsSuccessResponseSchema +>; + +export type JobTableQueryParams = JobsFilterStoreProps['filterParams'] & { + oracle_address: string; +}; diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/index.ts b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/index.ts new file mode 100644 index 0000000000..f3359e7d2e --- /dev/null +++ b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/index.ts @@ -0,0 +1,3 @@ +export * from './fetch-available-jobs.types'; +export * from './fetch-available-jobs.schema'; +export * from './fetch-available-jobs'; From 8602c56ac0e6c65f34c2ab1403bf92180fa34e8a Mon Sep 17 00:00:00 2001 From: mpblocky <185767042+mpblocky@users.noreply.github.com> Date: Tue, 25 Feb 2025 11:09:09 +0100 Subject: [PATCH 2/4] fix: remove doubled and unused code --- .../mobile/available-jobs-table-mobile.tsx | 2 +- .../worker/hooks/use-available-jobs-query.ts | 21 ----------------- .../worker/services/available-jobs-data.ts | 23 +++---------------- .../fetch-available-jobs.schema.ts | 16 ------------- .../fetch-available-jobs.ts | 2 +- .../fetch-available-jobs.types.ts | 2 +- 6 files changed, 6 insertions(+), 60 deletions(-) delete mode 100644 packages/apps/human-app/frontend/src/modules/worker/hooks/use-available-jobs-query.ts delete mode 100644 packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema.ts diff --git a/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx b/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx index 71216ead42..328fd45633 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx @@ -26,7 +26,7 @@ interface AvailableJobsTableMobileProps { export function AvailableJobsTableMobile({ setIsMobileFilterDrawerOpen, -}: AvailableJobsTableMobileProps) { +}: Readonly) { const { colorPalette } = useColorMode(); const [allPages, setAllPages] = useState([]); diff --git a/packages/apps/human-app/frontend/src/modules/worker/hooks/use-available-jobs-query.ts b/packages/apps/human-app/frontend/src/modules/worker/hooks/use-available-jobs-query.ts deleted file mode 100644 index 1432a90072..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/hooks/use-available-jobs-query.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable camelcase -- api response*/ -import { useQuery } from '@tanstack/react-query'; -import { useParams } from 'react-router-dom'; -import { useJobsFilterStore } from '@/modules/worker/hooks/use-jobs-filter-store'; -import { fetchAvailableJobs } from '@/modules/worker/services/fetch-available-jobs'; -import type { AvailableJobsSuccessResponse } from '@/modules/worker/services/fetch-available-jobs'; - -export function useAvailableJobsQuery() { - const { filterParams } = useJobsFilterStore(); - const { address: oracleAddress } = useParams<{ address: string }>(); - - const queryParams = { - ...filterParams, - oracle_address: oracleAddress ?? '', - }; - - return useQuery({ - queryKey: ['availableJobs', queryParams], - queryFn: ({ signal }) => fetchAvailableJobs(queryParams, signal), - }); -} diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts b/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts index 1f18fc8981..28ece91ddf 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts +++ b/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts @@ -1,5 +1,5 @@ /* eslint-disable camelcase -- api response*/ -import { useInfiniteQuery, useQuery } from '@tanstack/react-query'; +import { useQuery } from '@tanstack/react-query'; import { z } from 'zod'; import { useParams } from 'react-router-dom'; import { apiClient } from '@/api/api-client'; @@ -9,7 +9,7 @@ import type { JobsFilterStoreProps } from '@/modules/worker/hooks/use-jobs-filte import { useJobsFilterStore } from '@/modules/worker/hooks/use-jobs-filter-store'; import { createPaginationSchema } from '@/shared/helpers/pagination'; -const availableJobSchema = z.object({ +export const availableJobSchema = z.object({ escrow_address: z.string(), chain_id: z.number(), job_type: z.string(), @@ -19,7 +19,7 @@ const availableJobSchema = z.object({ reward_token: z.string().optional(), }); -const availableJobsSuccessResponseSchema = +export const availableJobsSuccessResponseSchema = createPaginationSchema(availableJobSchema); export type AvailableJob = z.infer; @@ -58,20 +58,3 @@ export function useGetAvailableJobsData() { queryFn: ({ signal }) => getAvailableJobsTableData(dto, signal), }); } - -export function useInfiniteGetAvailableJobsData() { - const { filterParams } = useJobsFilterStore(); - const { address: oracle_address } = useParams<{ address: string }>(); - const dto = { ...filterParams, oracle_address: oracle_address ?? '' }; - - return useInfiniteQuery({ - initialPageParam: 0, - queryKey: ['availableJobsInfinite', dto], - queryFn: ({ signal }) => getAvailableJobsTableData(dto, signal), - getNextPageParam: (pageParams) => { - return pageParams.total_pages - 1 <= pageParams.page - ? undefined - : pageParams.page; - }, - }); -} diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema.ts b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema.ts deleted file mode 100644 index a8cc3d408a..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable camelcase -- api response*/ -import { z } from 'zod'; -import { createPaginationSchema } from '@/shared/helpers/pagination'; - -export const availableJobSchema = z.object({ - escrow_address: z.string(), - chain_id: z.number(), - job_type: z.string(), - status: z.string(), - job_description: z.string().optional(), - reward_amount: z.string().optional(), - reward_token: z.string().optional(), -}); - -export const availableJobsSuccessResponseSchema = - createPaginationSchema(availableJobSchema); diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts index 234b20c522..d96a3ab296 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts +++ b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts @@ -5,7 +5,7 @@ import type { AvailableJobsSuccessResponse, JobTableQueryParams, } from '@/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types'; -import { availableJobsSuccessResponseSchema } from '@/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema'; +import { availableJobsSuccessResponseSchema } from '../available-jobs-data'; export async function fetchAvailableJobs( params: JobTableQueryParams, diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts index c30cc4fdae..d340e0c8c6 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts +++ b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts @@ -3,7 +3,7 @@ import type { JobsFilterStoreProps } from '@/modules/worker/hooks/use-jobs-filte import { type availableJobSchema, type availableJobsSuccessResponseSchema, -} from '@/modules/worker/services/fetch-available-jobs/fetch-available-jobs.schema'; +} from '../available-jobs-data'; export type AvailableJob = z.infer; export type AvailableJobsSuccessResponse = z.infer< From f84709fb10b2c9e7c08962dedadcd408b743dca0 Mon Sep 17 00:00:00 2001 From: mpblocky <185767042+mpblocky@users.noreply.github.com> Date: Tue, 25 Feb 2025 11:30:16 +0100 Subject: [PATCH 3/4] fix: deduplicate code in available jobs --- .../desktop/available-jobs-table.tsx | 2 +- .../mobile/available-jobs-table-mobile.tsx | 6 ++-- .../use-infinite-available-jobs-query.ts | 24 -------------- .../worker/services/available-jobs-data.ts | 32 +++++++++++++++---- .../fetch-available-jobs.ts | 25 --------------- .../fetch-available-jobs.types.ts | 15 --------- .../services/fetch-available-jobs/index.ts | 3 -- 7 files changed, 30 insertions(+), 77 deletions(-) delete mode 100644 packages/apps/human-app/frontend/src/modules/worker/hooks/use-infinite-available-jobs-query.ts delete mode 100644 packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts delete mode 100644 packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts delete mode 100644 packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/index.ts diff --git a/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/desktop/available-jobs-table.tsx b/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/desktop/available-jobs-table.tsx index a49014f658..bd4a3e0607 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/desktop/available-jobs-table.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/desktop/available-jobs-table.tsx @@ -166,7 +166,7 @@ const getColumns = ( export function AvailableJobsTable({ chainIdsEnabled, -}: AvailableJobsTableProps) { +}: Readonly) { const { colorPalette, isDarkMode } = useColorMode(); const { setSearchEscrowAddress, diff --git a/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx b/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx index 328fd45633..678d996c84 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/components/jobs/available-jobs/mobile/available-jobs-table-mobile.tsx @@ -8,8 +8,6 @@ import { useJobsFilterStore } from '@/modules/worker/hooks/use-jobs-filter-store import { Alert } from '@/shared/components/ui/alert'; import { getNetworkName } from '@/modules/smart-contracts/get-network-name'; import { getErrorMessageForError } from '@/shared/errors'; -import type { AvailableJob } from '@/modules/worker/services/fetch-available-jobs'; -import { useInfiniteAvailableJobsQuery } from '@/modules/worker/hooks/use-infinite-available-jobs-query'; import { Loader } from '@/shared/components/ui/loader'; import { EvmAddress } from '@/modules/worker/components/jobs/evm-address'; import { Chip } from '@/shared/components/ui/chip'; @@ -19,6 +17,10 @@ import { useColorMode } from '@/shared/hooks/use-color-mode'; import type { JobType } from '@/modules/smart-contracts/EthKVStore/config'; import { EscrowAddressSearchForm } from '@/modules/worker/components/jobs/escrow-address-search-form'; import { AvailableJobsAssignJobButton } from '@/modules/worker/components/jobs/available-jobs/mobile/available-jobs-assign-job-button'; +import { + type AvailableJob, + useInfiniteAvailableJobsQuery, +} from '@/modules/worker/services/available-jobs-data'; interface AvailableJobsTableMobileProps { setIsMobileFilterDrawerOpen: Dispatch>; diff --git a/packages/apps/human-app/frontend/src/modules/worker/hooks/use-infinite-available-jobs-query.ts b/packages/apps/human-app/frontend/src/modules/worker/hooks/use-infinite-available-jobs-query.ts deleted file mode 100644 index 7679f14a1f..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/hooks/use-infinite-available-jobs-query.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable camelcase -- api response*/ -import { useInfiniteQuery } from '@tanstack/react-query'; -import { useParams } from 'react-router-dom'; -import { useJobsFilterStore } from '@/modules/worker/hooks/use-jobs-filter-store'; -import { fetchAvailableJobs } from '@/modules/worker/services/fetch-available-jobs'; -import type { AvailableJobsSuccessResponse } from '@/modules/worker/services/fetch-available-jobs'; - -export function useInfiniteAvailableJobsQuery() { - const { filterParams } = useJobsFilterStore(); - const { address: oracleAddress } = useParams<{ address: string }>(); - - const queryParams = { - ...filterParams, - oracle_address: oracleAddress ?? '', - }; - - return useInfiniteQuery({ - queryKey: ['availableJobsInfinite', queryParams], - queryFn: ({ signal }) => fetchAvailableJobs(queryParams, signal), - initialPageParam: 0, - getNextPageParam: (lastPage) => - lastPage.total_pages - 1 <= lastPage.page ? undefined : lastPage.page, - }); -} diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts b/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts index 28ece91ddf..22da21074c 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts +++ b/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts @@ -1,5 +1,5 @@ /* eslint-disable camelcase -- api response*/ -import { useQuery } from '@tanstack/react-query'; +import { useInfiniteQuery, useQuery } from '@tanstack/react-query'; import { z } from 'zod'; import { useParams } from 'react-router-dom'; import { apiClient } from '@/api/api-client'; @@ -27,22 +27,22 @@ export type AvailableJobsSuccessResponse = z.infer< typeof availableJobsSuccessResponseSchema >; -type GetJobTableDataDto = JobsFilterStoreProps['filterParams'] & { +type JobTableQueryParams = JobsFilterStoreProps['filterParams'] & { oracle_address: string; }; const getAvailableJobsTableData = async ( - dto: GetJobTableDataDto, + params: JobTableQueryParams, abortSignal: AbortSignal ) => { + const endpoint = `${apiPaths.worker.jobs.path}?${stringifyUrlQueryObject(params)}`; + return apiClient( - `${apiPaths.worker.jobs.path}?${stringifyUrlQueryObject({ ...dto })}`, + endpoint, { authenticated: true, successSchema: availableJobsSuccessResponseSchema, - options: { - method: 'GET', - }, + options: { method: 'GET' }, }, abortSignal ); @@ -58,3 +58,21 @@ export function useGetAvailableJobsData() { queryFn: ({ signal }) => getAvailableJobsTableData(dto, signal), }); } + +export function useInfiniteAvailableJobsQuery() { + const { filterParams } = useJobsFilterStore(); + const { address: oracleAddress } = useParams<{ address: string }>(); + + const queryParams = { + ...filterParams, + oracle_address: oracleAddress ?? '', + }; + + return useInfiniteQuery({ + queryKey: ['availableJobsInfinite', queryParams], + queryFn: ({ signal }) => getAvailableJobsTableData(queryParams, signal), + initialPageParam: 0, + getNextPageParam: (lastPage) => + lastPage.total_pages - 1 <= lastPage.page ? undefined : lastPage.page, + }); +} diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts deleted file mode 100644 index d96a3ab296..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { apiClient } from '@/api/api-client'; -import { apiPaths } from '@/api/api-paths'; -import { stringifyUrlQueryObject } from '@/shared/helpers/transfomers'; -import type { - AvailableJobsSuccessResponse, - JobTableQueryParams, -} from '@/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types'; -import { availableJobsSuccessResponseSchema } from '../available-jobs-data'; - -export async function fetchAvailableJobs( - params: JobTableQueryParams, - abortSignal: AbortSignal -): Promise { - const endpoint = `${apiPaths.worker.jobs.path}?${stringifyUrlQueryObject(params)}`; - - return apiClient( - endpoint, - { - authenticated: true, - successSchema: availableJobsSuccessResponseSchema, - options: { method: 'GET' }, - }, - abortSignal - ); -} diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts deleted file mode 100644 index d340e0c8c6..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/fetch-available-jobs.types.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { type z } from 'zod'; -import type { JobsFilterStoreProps } from '@/modules/worker/hooks/use-jobs-filter-store'; -import { - type availableJobSchema, - type availableJobsSuccessResponseSchema, -} from '../available-jobs-data'; - -export type AvailableJob = z.infer; -export type AvailableJobsSuccessResponse = z.infer< - typeof availableJobsSuccessResponseSchema ->; - -export type JobTableQueryParams = JobsFilterStoreProps['filterParams'] & { - oracle_address: string; -}; diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/index.ts b/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/index.ts deleted file mode 100644 index f3359e7d2e..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/services/fetch-available-jobs/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './fetch-available-jobs.types'; -export * from './fetch-available-jobs.schema'; -export * from './fetch-available-jobs'; From d287172ac038fc545f9997564758ca1e723e87b5 Mon Sep 17 00:00:00 2001 From: mpblocky <185767042+mpblocky@users.noreply.github.com> Date: Tue, 25 Feb 2025 12:34:15 +0100 Subject: [PATCH 4/4] fix: remove exporting available job schemas --- .../src/modules/worker/services/available-jobs-data.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts b/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts index 22da21074c..f0dfff4f6b 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts +++ b/packages/apps/human-app/frontend/src/modules/worker/services/available-jobs-data.ts @@ -9,7 +9,7 @@ import type { JobsFilterStoreProps } from '@/modules/worker/hooks/use-jobs-filte import { useJobsFilterStore } from '@/modules/worker/hooks/use-jobs-filter-store'; import { createPaginationSchema } from '@/shared/helpers/pagination'; -export const availableJobSchema = z.object({ +const availableJobSchema = z.object({ escrow_address: z.string(), chain_id: z.number(), job_type: z.string(), @@ -19,7 +19,7 @@ export const availableJobSchema = z.object({ reward_token: z.string().optional(), }); -export const availableJobsSuccessResponseSchema = +const availableJobsSuccessResponseSchema = createPaginationSchema(availableJobSchema); export type AvailableJob = z.infer;