|
| 1 | +import React, { useMemo } from "react"; |
| 2 | +import { useNavigate, useParams, useSearchParams } from "react-router-dom"; |
| 3 | + |
| 4 | +import styled from "styled-components"; |
| 5 | +import { responsiveSize } from "styles/responsiveSize"; |
| 6 | + |
| 7 | +import { isUndefined } from "utils/index"; |
| 8 | +import { decodeURIFilter, useRootPath } from "utils/uri"; |
| 9 | + |
| 10 | +import { DisputeDetailsFragment, OrderDirection } from "src/graphql/graphql"; |
| 11 | +import { useMyCasesQuery } from "queries/useCasesQuery"; |
| 12 | +import { useUserQuery } from "queries/useUser"; |
| 13 | +import CasesDisplay from "components/CasesDisplay"; |
| 14 | + |
| 15 | +const StyledCasesDisplay = styled(CasesDisplay)` |
| 16 | + margin-top: ${responsiveSize(24, 32)}; |
| 17 | +
|
| 18 | + .title { |
| 19 | + margin-bottom: ${responsiveSize(12, 24)}; |
| 20 | + } |
| 21 | +`; |
| 22 | + |
| 23 | +interface ICases { |
| 24 | + addressToQuery: `0x${string}`; |
| 25 | +} |
| 26 | + |
| 27 | +const Cases: React.FC<ICases> = ({ addressToQuery }) => { |
| 28 | + const { page, order, filter } = useParams(); |
| 29 | + const [searchParams] = useSearchParams(); |
| 30 | + const location = useRootPath(); |
| 31 | + const navigate = useNavigate(); |
| 32 | + |
| 33 | + const casesPerPage = 3; |
| 34 | + const pageNumber = parseInt(page ?? "1"); |
| 35 | + const disputeSkip = casesPerPage * (pageNumber - 1); |
| 36 | + const decodedFilter = decodeURIFilter(filter ?? "all"); |
| 37 | + const { data: disputesData } = useMyCasesQuery( |
| 38 | + addressToQuery, |
| 39 | + disputeSkip, |
| 40 | + decodedFilter, |
| 41 | + order === "asc" ? OrderDirection.Asc : OrderDirection.Desc |
| 42 | + ); |
| 43 | + |
| 44 | + const { data: userData } = useUserQuery(addressToQuery, decodedFilter); |
| 45 | + const totalCases = userData?.user?.disputes.length; |
| 46 | + const totalResolvedCases = parseInt(userData?.user?.totalResolvedDisputes); |
| 47 | + const totalPages = useMemo( |
| 48 | + () => (!isUndefined(totalCases) ? Math.ceil(totalCases / casesPerPage) : 1), |
| 49 | + [totalCases, casesPerPage] |
| 50 | + ); |
| 51 | + |
| 52 | + return ( |
| 53 | + <StyledCasesDisplay |
| 54 | + title="Cases Drawn" |
| 55 | + disputes={userData?.user !== null ? (disputesData?.user?.disputes as DisputeDetailsFragment[]) : []} |
| 56 | + numberDisputes={totalCases} |
| 57 | + numberClosedDisputes={totalResolvedCases} |
| 58 | + totalPages={totalPages} |
| 59 | + currentPage={pageNumber} |
| 60 | + setCurrentPage={(newPage: number) => |
| 61 | + navigate(`${location}/${newPage}/${order}/${filter}?${searchParams.toString()}`) |
| 62 | + } |
| 63 | + {...{ casesPerPage }} |
| 64 | + /> |
| 65 | + ); |
| 66 | +}; |
| 67 | + |
| 68 | +export default Cases; |
0 commit comments