From f3020d6039eeb4d4284f6c4288973ade6a9f4156 Mon Sep 17 00:00:00 2001 From: ameerul-deriv <103412909+ameerul-deriv@users.noreply.github.com> Date: Thu, 14 Dec 2023 10:24:52 +0800 Subject: [PATCH] [FEQ] Ameerul / FEQ-1005 / P2P Order List (#12176) * feat: added hook for p2p_order_list * chore: added suggestions * fix: removed default values * fix: removed date epoch conversion, added is to boolean values * chore: empty commit * chore: removed p2p name from filename * fix: failing test cases --- ...rtList.spec.tsx => useAdvertList.spec.tsx} | 8 +- .../{useP2PAdvertList.ts => useAdvertList.ts} | 6 +- packages/api/src/hooks/p2p/useOrderList.ts | 82 +++++++++++++++++++ 3 files changed, 89 insertions(+), 7 deletions(-) rename packages/api/src/__tests__/{useP2PAdvertList.spec.tsx => useAdvertList.spec.tsx} (94%) rename packages/api/src/hooks/p2p/{useP2PAdvertList.ts => useAdvertList.ts} (94%) create mode 100644 packages/api/src/hooks/p2p/useOrderList.ts diff --git a/packages/api/src/__tests__/useP2PAdvertList.spec.tsx b/packages/api/src/__tests__/useAdvertList.spec.tsx similarity index 94% rename from packages/api/src/__tests__/useP2PAdvertList.spec.tsx rename to packages/api/src/__tests__/useAdvertList.spec.tsx index 997c28fa931a..cab6f9c56144 100644 --- a/packages/api/src/__tests__/useP2PAdvertList.spec.tsx +++ b/packages/api/src/__tests__/useAdvertList.spec.tsx @@ -1,20 +1,20 @@ import React from 'react'; import useInfiniteQuery from '../useInfiniteQuery'; import { renderHook } from '@testing-library/react-hooks'; -import useP2PAdvertList from '../hooks/p2p/useP2PAdvertList'; +import useAdvertList from '../hooks/p2p/useAdvertList'; import APIProvider from '../APIProvider'; jest.mock('../useInfiniteQuery'); const mockUseInfiniteQuery = useInfiniteQuery as jest.MockedFunction>; -describe('useP2PAdvertList', () => { +describe('useAdvertList', () => { test('should return undefined if there is no response', () => { const wrapper = ({ children }: { children: JSX.Element }) => {children}; // @ts-expect-error need to come up with a way to mock the return type of useInfiniteQuery mockUseInfiniteQuery.mockReturnValueOnce({}); - const { result } = renderHook(() => useP2PAdvertList(), { wrapper }); + const { result } = renderHook(() => useAdvertList(), { wrapper }); expect(result.current.data).toBeUndefined(); }); @@ -84,7 +84,7 @@ describe('useP2PAdvertList', () => { }, }); - const { result } = renderHook(() => useP2PAdvertList(), { wrapper }); + const { result } = renderHook(() => useAdvertList(), { wrapper }); const adverts_list = result.current.data; expect(adverts_list).toHaveLength(1); expect(adverts_list?.[0].country).toBe('id'); diff --git a/packages/api/src/hooks/p2p/useP2PAdvertList.ts b/packages/api/src/hooks/p2p/useAdvertList.ts similarity index 94% rename from packages/api/src/hooks/p2p/useP2PAdvertList.ts rename to packages/api/src/hooks/p2p/useAdvertList.ts index 5d257f80f4f6..a5c3c366577d 100644 --- a/packages/api/src/hooks/p2p/useP2PAdvertList.ts +++ b/packages/api/src/hooks/p2p/useAdvertList.ts @@ -5,13 +5,13 @@ import useAuthorize from '../useAuthorize'; /** * This custom hook returns available adverts for use with 'p2p_order_create' by calling 'p2p_advert_list' endpoint */ -const useP2PAdvertList = ( +const useAdvertList = ( payload?: NonNullable>[1]>['payload'], config?: NonNullable>[1]>['options'] ) => { const { isSuccess } = useAuthorize(); const { data, fetchNextPage, ...rest } = useInfiniteQuery('p2p_advert_list', { - payload: { ...payload, offset: payload?.offset || 0, limit: payload?.limit || 50 }, + payload: { ...payload, offset: payload?.offset, limit: payload?.limit }, options: { getNextPageParam: (lastPage, pages) => { if (!lastPage?.p2p_advert_list?.list) return; @@ -65,4 +65,4 @@ const useP2PAdvertList = ( }; }; -export default useP2PAdvertList; +export default useAdvertList; diff --git a/packages/api/src/hooks/p2p/useOrderList.ts b/packages/api/src/hooks/p2p/useOrderList.ts new file mode 100644 index 000000000000..8cc85bf6e8e5 --- /dev/null +++ b/packages/api/src/hooks/p2p/useOrderList.ts @@ -0,0 +1,82 @@ +import React from 'react'; +import useInfiniteQuery from '../../useInfiniteQuery'; +import useAuthorize from '../useAuthorize'; + +/** This custom hook returns a list of orders under the current client. */ +const useOrderList = ( + payload?: NonNullable>[1]>['payload'], + config?: NonNullable>[1]>['options'] +) => { + const { isSuccess } = useAuthorize(); + const { data, fetchNextPage, ...rest } = useInfiniteQuery('p2p_order_list', { + payload: { ...payload, offset: payload?.offset, limit: payload?.limit }, + options: { + getNextPageParam: (lastPage, pages) => { + if (!lastPage?.p2p_order_list?.list) return; + + return pages.length; + }, + enabled: isSuccess && (config?.enabled === undefined || config.enabled), + }, + }); + + // Flatten the data array + const flatten_data = React.useMemo(() => { + if (!data?.pages?.length) return; + + return data?.pages?.flatMap(page => page?.p2p_order_list?.list); + }, [data?.pages]); + + // Additional p2p_order_list data + const modified_data = React.useMemo(() => { + if (!flatten_data?.length) return undefined; + + return flatten_data.map(advert => ({ + ...advert, + /** Details of the advert for this order. */ + advert_details: { + ...advert?.advert_details, + /** Indicates if this is block trade advert or not. */ + is_block_trade: Boolean(advert?.advert_details?.block_trade), + }, + /** Details of the advertiser for this order. */ + advertiser_details: { + ...advert?.advertiser_details, + /** Indicates if the advertiser is currently online. */ + is_online: Boolean(advert?.advertiser_details?.is_online), + /** Indicates that the advertiser was recommended in the most recent review by the current user. */ + is_recommended: Boolean(advert?.advertiser_details?.is_recommended), + }, + /** Details of the client who created the order. */ + client_details: { + ...advert?.client_details, + /** Indicates if the advertiser is currently online. */ + is_online: Boolean(advert?.advertiser_details?.is_online), + /** Indicates that the advertiser was recommended in the most recent review by the current user. */ + is_recommended: Boolean(advert?.advertiser_details?.is_recommended), + }, + is_incoming: Boolean(advert?.is_incoming), + /** 1 if a review can be given, otherwise 0 */ + is_reviewable: Boolean(advert?.is_reviewable), + /** 1 if the latest order changes have been seen by the current client, otherwise 0. */ + is_seen: Boolean(advert?.is_seen), + /** Details of the review you gave for this order, if any. */ + review_details: { + ...advert?.review_details, + /** 1 if the advertiser is recommended, 0 if not recommended. */ + is_recommended: Boolean(advert?.review_details?.recommended), + }, + /** Indicates that the seller in the process of confirming the order. */ + is_verification_pending: Boolean(advert?.verification_pending), + })); + }, [flatten_data]); + + return { + /** The 'p2p_order_list' response. */ + data: modified_data, + loadMoreOrders: fetchNextPage, + ...rest, + }; +}; + +export default useOrderList;