Skip to content

Commit 8c0ec9e

Browse files
committed
feat: add DealAssociatedDealsTable component and integrate into DealsRoute for associated deals display
1 parent 72175c7 commit 8c0ec9e

File tree

3 files changed

+151
-1
lines changed

3 files changed

+151
-1
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import { DETAIL_TABLE_LENGTH, TABLE_REFETCH_INTERVAL } from '@/config';
2+
import { execute } from '@/graphql/poco/execute';
3+
import { useQuery } from '@tanstack/react-query';
4+
import { DataTable } from '@/components/DataTable';
5+
import { PaginatedNavigation } from '@/components/PaginatedNavigation';
6+
import { usePageParam } from '@/hooks/usePageParam';
7+
import { ErrorAlert } from '@/modules/ErrorAlert';
8+
import { columns } from '@/modules/deals/dealsTable/columns';
9+
import useUserStore from '@/stores/useUser.store';
10+
import { createPlaceholderDataFnForQueryKey } from '@/utils/createPlaceholderDataFnForQueryKey';
11+
import { dealAssociatedDealsQuery } from './dealAssociatedDealsQuery';
12+
13+
function useDealAssociatedDealsData({
14+
dealId,
15+
currentPage,
16+
}: {
17+
dealId: string;
18+
currentPage: number;
19+
}) {
20+
const { chainId } = useUserStore();
21+
const skip = currentPage * DETAIL_TABLE_LENGTH;
22+
const nextSkip = skip + DETAIL_TABLE_LENGTH;
23+
24+
const queryKey = [chainId, 'deal', 'associatedDeals', dealId, currentPage];
25+
const { data, isLoading, isRefetching, isError, errorUpdateCount } = useQuery(
26+
{
27+
queryKey,
28+
queryFn: () =>
29+
execute(dealAssociatedDealsQuery, chainId, {
30+
length: DETAIL_TABLE_LENGTH,
31+
skip,
32+
nextSkip,
33+
dealId,
34+
}),
35+
refetchInterval: TABLE_REFETCH_INTERVAL,
36+
placeholderData: createPlaceholderDataFnForQueryKey(queryKey),
37+
}
38+
);
39+
const associatedDeals = data?.deal?.requestorder?.deals ?? [];
40+
const hasNextPage = (associatedDeals.dealsHasNext?.length ?? 0) > 0;
41+
const additionalPages = hasNextPage ? 1 : 0;
42+
43+
const formattedAssociatedDeal =
44+
associatedDeals.map((associatedDeal) => ({
45+
...associatedDeal,
46+
destination: `/deal/${associatedDeal.dealid}`,
47+
})) ?? [];
48+
49+
return {
50+
data: formattedAssociatedDeal,
51+
isLoading,
52+
isRefetching,
53+
isError,
54+
additionalPages,
55+
hasPastError: isError || errorUpdateCount > 0,
56+
};
57+
}
58+
59+
export function DealAssociatedDealsTable({ dealId }: { dealId: string }) {
60+
const [currentPage, setCurrentPage] = usePageParam('dealAssociatedDealsPage');
61+
const {
62+
data: associatedDeals,
63+
additionalPages,
64+
hasPastError,
65+
} = useDealAssociatedDealsData({
66+
dealId,
67+
currentPage,
68+
});
69+
70+
return (
71+
<div className="space-y-6">
72+
{hasPastError && !associatedDeals.length ? (
73+
<ErrorAlert message="An error occurred during deal associatedDeals loading." />
74+
) : (
75+
<DataTable columns={columns} data={associatedDeals} />
76+
)}
77+
<PaginatedNavigation
78+
currentPage={currentPage}
79+
totalPages={currentPage + additionalPages}
80+
onPageChange={setCurrentPage}
81+
/>
82+
</div>
83+
);
84+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { graphql } from '@/graphql/poco/gql';
2+
3+
export const dealAssociatedDealsQuery = graphql(`
4+
query DealAssociatedDeals(
5+
$length: Int!
6+
$skip: Int!
7+
$nextSkip: Int!
8+
$dealId: ID!
9+
) {
10+
deal(id: $dealId) {
11+
requestorder {
12+
deals(where: { id_not: $dealId }, first: $length, skip: $skip) {
13+
dealid: id
14+
timestamp
15+
startTime
16+
app {
17+
address: id
18+
name
19+
}
20+
dataset {
21+
address: id
22+
name
23+
}
24+
workerpool {
25+
address: id
26+
description
27+
}
28+
beneficiary {
29+
address: id
30+
}
31+
callback {
32+
address: id
33+
}
34+
appPrice
35+
datasetPrice
36+
workerpoolPrice
37+
params
38+
tag
39+
trust
40+
category {
41+
catid: id
42+
name
43+
workClockTimeRef
44+
description
45+
}
46+
botSize
47+
botFirst
48+
completedTasksCount
49+
claimedTasksCount
50+
requester {
51+
address: id
52+
}
53+
}
54+
dealsHasNext: deals(
55+
first: 1
56+
where: { id_not: $dealId }
57+
skip: $nextSkip
58+
) {
59+
id
60+
}
61+
}
62+
}
63+
}
64+
`);

src/routes/$chainSlug/_layout/deal/$dealId.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { useTabParam } from '@/hooks/usePageParam';
99
import { DetailsTable } from '@/modules/DetailsTable';
1010
import { ErrorAlert } from '@/modules/ErrorAlert';
1111
import { Tabs } from '@/modules/Tabs';
12+
import { DealAssociatedDealsTable } from '@/modules/deals/deal/DealAssociatedDealsTable';
1213
import { DealBreadcrumbs } from '@/modules/deals/deal/DealBreadcrumbs';
1314
import { DealTasksTable } from '@/modules/deals/deal/DealTasksTable';
1415
import { buildDealDetails } from '@/modules/deals/deal/buildDealDetails';
@@ -56,7 +57,7 @@ function useDealData(dealId: string, chainId: number) {
5657
}
5758

5859
function DealsRoute() {
59-
const tabLabels = ['DETAILS', 'TASKS'];
60+
const tabLabels = ['DETAILS', 'TASKS', 'ASSOCIATED DEALS'];
6061
const [currentTab, setCurrentTab] = useTabParam('dealTab', tabLabels, 0);
6162
const { chainId, isConnected } = useUserStore();
6263
const { dealId } = Route.useParams();
@@ -123,6 +124,7 @@ function DealsRoute() {
123124
<DetailsTable details={dealDetails || {}} />
124125
))}
125126
{currentTab === 1 && <DealTasksTable dealId={dealId} />}
127+
{currentTab === 2 && <DealAssociatedDealsTable dealId={dealId} />}
126128
</div>
127129
</div>
128130
);

0 commit comments

Comments
 (0)