Skip to content

Commit b38c702

Browse files
authored
Merge pull request #2023 from kleros/fix/profile-page-not-loading
fix: profile page not loading
2 parents 0b75799 + a35ceb0 commit b38c702

File tree

5 files changed

+57
-15
lines changed

5 files changed

+57
-15
lines changed

web/src/components/NumberDisplay.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import React from "react";
22

33
import { Tooltip } from "@kleros/ui-components-library";
4+
5+
import { commify } from "utils/commify";
6+
47
interface INumberDisplay {
58
value: string | number;
69
unit?: string;
@@ -31,10 +34,11 @@ const NumberDisplay: React.FC<INumberDisplay> = ({
3134
isCurrency = false,
3235
}) => {
3336
const parsedValue = Number(value);
34-
const formattedValue = getFormattedValue(parsedValue, decimals);
37+
const formattedValue = commify(getFormattedValue(parsedValue, decimals));
3538
const tooltipValue = isCurrency ? `${unit} ${value}` : `${value} ${unit}`;
3639
const displayUnit = showUnitInDisplay ? unit : "";
3740
const displayValue = isCurrency ? `${displayUnit} ${formattedValue}` : `${formattedValue} ${displayUnit}`;
41+
3842
return (
3943
<Tooltip small text={tooltipValue} place={place}>
4044
{displayValue}

web/src/hooks/queries/useCasesQuery.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Address } from "viem";
33

44
import { useGraphqlBatcher } from "context/GraphqlBatcher";
55
import { isUndefined } from "utils/index";
6+
import { sanitizeFilter } from "utils/sanitizeFilter";
67

78
import { graphql } from "src/graphql";
89
import {
@@ -71,38 +72,39 @@ const myCasesQueryWhere = graphql(`
7172

7273
export const useCasesQuery = (skip = 0, first = 3, where?: Dispute_Filter, sortOrder?: OrderDirection) => {
7374
const { graphqlBatcher } = useGraphqlBatcher();
75+
const sanitizedWhere = sanitizeFilter(where);
7476

7577
return useQuery<CasesPageQuery>({
76-
queryKey: [`useCasesQuery`, skip, where, sortOrder, first],
78+
queryKey: [`useCasesQuery`, skip, sanitizedWhere, sortOrder, first],
7779
queryFn: async () =>
7880
await graphqlBatcher.fetch({
7981
id: crypto.randomUUID(),
80-
document: isUndefined(where) ? casesQuery : casesQueryWhere,
82+
document: isUndefined(sanitizedWhere) ? casesQuery : casesQueryWhere,
8183
variables: {
8284
first,
8385
skip,
84-
where,
86+
where: sanitizedWhere,
8587
orderDirection: sortOrder ?? "desc",
8688
},
8789
}),
8890
});
8991
};
9092

9193
export const useMyCasesQuery = (user?: Address, skip = 0, where?: Dispute_Filter, sortOrder?: OrderDirection) => {
92-
const isEnabled = !isUndefined(user);
9394
const { graphqlBatcher } = useGraphqlBatcher();
95+
const sanitizedWhere = sanitizeFilter(where);
9496

9597
return useQuery<MyCasesQuery>({
96-
queryKey: [`useMyCasesQuery`, user, skip, where, sortOrder],
97-
enabled: isEnabled,
98+
queryKey: ["useMyCasesQuery", user, skip, sanitizedWhere, sortOrder],
99+
enabled: !isUndefined(user),
98100
queryFn: async () =>
99101
await graphqlBatcher.fetch({
100102
id: crypto.randomUUID(),
101-
document: isUndefined(where) ? myCasesQuery : myCasesQueryWhere,
103+
document: isUndefined(sanitizedWhere) ? myCasesQuery : myCasesQueryWhere,
102104
variables: {
103105
skip,
104106
id: user?.toLowerCase(),
105-
where,
107+
where: sanitizedWhere,
106108
orderDirection: sortOrder ?? "desc",
107109
},
108110
}),

web/src/hooks/queries/useUser.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Address } from "viem";
33

44
import { useGraphqlBatcher } from "context/GraphqlBatcher";
55

6+
import { sanitizeFilter } from "utils/sanitizeFilter";
67
import { STALE_TIME } from "src/consts";
78
import { graphql } from "src/graphql";
89
import { UserQuery, Dispute_Filter, UserDisputeFilterQuery, UserDetailsFragment } from "src/graphql/graphql";
@@ -52,19 +53,20 @@ const userQueryDisputeFilter = graphql(`
5253
`);
5354

5455
export const useUserQuery = (address?: Address, where?: Dispute_Filter) => {
56+
const sanitizedWhere = sanitizeFilter(where);
5557
const isEnabled = address !== undefined;
56-
const query = where ? userQueryDisputeFilter : userQuery;
58+
const query = sanitizedWhere ? userQueryDisputeFilter : userQuery;
5759
const { graphqlBatcher } = useGraphqlBatcher();
5860

5961
return useQuery<UserQuery | UserDisputeFilterQuery>({
60-
queryKey: [`userQuery${address?.toLowerCase()}`],
62+
queryKey: ["userQuery", address?.toLowerCase(), sanitizedWhere],
6163
enabled: isEnabled,
6264
staleTime: STALE_TIME,
6365
queryFn: async () =>
6466
await graphqlBatcher.fetch({
6567
id: crypto.randomUUID(),
6668
document: query,
67-
variables: { address: address?.toLowerCase(), where },
69+
variables: { address: address?.toLowerCase(), where: sanitizedWhere },
6870
}),
6971
});
7072
};

web/src/pages/Profile/index.tsx

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { isUndefined } from "utils/index";
1111
import { decodeURIFilter, useRootPath } from "utils/uri";
1212
import { DisputeDetailsFragment, useMyCasesQuery } from "queries/useCasesQuery";
1313
import { useUserQuery } from "queries/useUser";
14-
import { OrderDirection } from "src/graphql/graphql";
14+
import { Dispute_Filter, OrderDirection, UserDetailsFragment } from "src/graphql/graphql";
1515

1616
import CasesDisplay from "components/CasesDisplay";
1717
import ConnectWallet from "components/ConnectWallet";
@@ -50,6 +50,33 @@ const ConnectWalletContainer = styled.div`
5050
color: ${({ theme }) => theme.primaryText};
5151
`;
5252

53+
const calculateStats = (user: UserDetailsFragment, filter: Dispute_Filter) => {
54+
const toInt = (v) => Number(v) || 0;
55+
let totalCases, ruledCases;
56+
57+
if (!user) {
58+
totalCases = 0;
59+
ruledCases = 0;
60+
} else if (filter?.period === "appeal") {
61+
totalCases = toInt(user.totalAppealingDisputes);
62+
ruledCases = 0;
63+
} else if (filter?.ruled === true) {
64+
totalCases = toInt(user.totalResolvedDisputes);
65+
ruledCases = totalCases;
66+
} else if (filter?.ruled === false) {
67+
totalCases = toInt(user.disputes?.length);
68+
ruledCases = 0;
69+
} else {
70+
totalCases = toInt(user.disputes?.length);
71+
ruledCases = toInt(user.totalResolvedDisputes);
72+
}
73+
74+
return {
75+
totalCases,
76+
ruledCases,
77+
};
78+
};
79+
5380
const Profile: React.FC = () => {
5481
const { isConnected, address: connectedAddress } = useAccount();
5582
const { page, order, filter } = useParams();
@@ -69,8 +96,10 @@ const Profile: React.FC = () => {
6996
order === "asc" ? OrderDirection.Asc : OrderDirection.Desc
7097
);
7198
const { data: userData } = useUserQuery(addressToQuery, decodedFilter);
72-
const totalCases = userData?.user?.disputes.length;
73-
const totalResolvedCases = parseInt(userData?.user?.totalResolvedDisputes);
99+
const { totalCases, ruledCases: totalResolvedCases } = useMemo(
100+
() => calculateStats(userData?.user, decodedFilter),
101+
[userData?.user, decodedFilter]
102+
);
74103
const totalPages = useMemo(
75104
() => (!isUndefined(totalCases) ? Math.ceil(totalCases / casesPerPage) : 1),
76105
[totalCases, casesPerPage]

web/src/utils/sanitizeFilter.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export const sanitizeFilter = <T extends Record<string, any>>(f?: T) => {
2+
if (!f) return undefined as unknown as T;
3+
const cleaned = Object.fromEntries(Object.entries(f).filter(([_, v]) => !(Array.isArray(v) && v.length === 0)));
4+
return Object.keys(cleaned).length ? (cleaned as T) : undefined;
5+
};

0 commit comments

Comments
 (0)