Skip to content

Commit

Permalink
Added a wallet transaction load cancel button
Browse files Browse the repository at this point in the history
  • Loading branch information
GeekLad committed Aug 1, 2024
1 parent 3403fee commit 04fb8c6
Show file tree
Hide file tree
Showing 8 changed files with 378 additions and 211 deletions.
83 changes: 83 additions & 0 deletions components/loading-summary-left.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { Card, CardBody, Progress } from "@nextui-org/react";

import { LoadingItem } from "./loading-status-item";

import { type PositionLoadingState } from "@/pages/wallet/[walletAddress]";
import { MeteoraPosition } from "@/services/MeteoraPosition";
import { MeteoraPositionTransaction } from "@/services/ParseMeteoraTransactions";

export const LoadingSummaryLeft = (props: {
filteredPositions: MeteoraPosition[];
filteredTransactions: MeteoraPositionTransaction[];
loading: boolean;
positionLoadingState: PositionLoadingState;
usd: boolean;
updatedUsdValueCount: number;
}) => {
return (
<Card className="md:m-4 sm:mb-4">
<CardBody>
<LoadingItem
title="Time Elapsed"
value={props.positionLoadingState.durationString}
/>
<LoadingItem
hidden={props.positionLoadingState.apiDataLoaded}
title="Estimated Completion"
value={
props.positionLoadingState.estimatedCompletionString == ""
? "Calculating..."
: props.positionLoadingState.estimatedCompletionString
}
/>
<LoadingItem
loading={!props.positionLoadingState.allSignaturesFound}
title="# of Wallet Transactions"
value={props.positionLoadingState.signatureCount}
/>
<LoadingItem
loading={
!props.positionLoadingState.allPositionsFound &&
!props.positionLoadingState.rpcDataLoaded
}
title={"# of Position Transactions"}
value={props.filteredTransactions.length}
/>
<LoadingItem
loading={
!props.positionLoadingState.allPositionsFound &&
!props.positionLoadingState.rpcDataLoaded
}
title={"# of Positions"}
value={props.filteredPositions.length}
/>
<LoadingItem
hidden={
props.positionLoadingState.openPositionCount == 0 ||
!props.positionLoadingState.updatingOpenPositions
}
loading={props.positionLoadingState.updatingOpenPositions}
title="Updating Open Positions"
/>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="# of Pos. updated w/ USD"
value={props.updatedUsdValueCount}
/>
{props.positionLoadingState.apiDataLoaded ? (
<></>
) : (
<Progress
aria-label="Loading progress"
isIndeterminate={
!props.positionLoadingState.apiDataLoaded &&
props.positionLoadingState.estimatedCompletionString == ""
}
showValueLabel={true}
value={props.positionLoadingState.updatedUsdPercent}
/>
)}
</CardBody>
</Card>
);
};
48 changes: 48 additions & 0 deletions components/loading-summary-no-usd.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { Button, Card, CardBody } from "@nextui-org/react";

import { type PositionLoadingState } from "@/pages/wallet/[walletAddress]";

export const LoadingSummaryNoUsd = (props: {
positionLoadingState: PositionLoadingState;
}) => {
const oldestTransaction =
props.positionLoadingState.transactions.length > 0
? props.positionLoadingState.transactions.sort(
(a, b) => a.timestamp_ms - b.timestamp_ms,
)[0]
: null;

const oldestTransactionDate = oldestTransaction
? new Date(oldestTransaction.timestamp_ms).toLocaleDateString() +
" " +
new Date(oldestTransaction.timestamp_ms).toLocaleTimeString()
: "";

return (
<Card
className={`md:m-4 sm:mb-4 self-start ${props.positionLoadingState.updatingUsdValues || !oldestTransactionDate ? "hidden" : ""}`}
>
<CardBody>
<p className="mb-4">
<b>Oldest position transaction:</b> {oldestTransactionDate}
</p>
<p className="mb-4">
If you know you have no DLMM transactions prior to the date above or
you do not want to analyze on older transactions/positions, you can
safely stop loading more transactions.
</p>
<Button
className="w-half mb-4"
color="danger"
onClick={() => {
if (props.positionLoadingState.cancel) {
props.positionLoadingState.cancel();
}
}}
>
Stop Loading Wallet Transactions
</Button>
</CardBody>
</Card>
);
};
84 changes: 84 additions & 0 deletions components/loading-summary-usd.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import { Card, CardBody } from "@nextui-org/react";

import { LoadingItem } from "./loading-status-item";

import { type PositionLoadingState } from "@/pages/wallet/[walletAddress]";

export const LoadingSummaryUsd = (props: {
positionLoadingState: PositionLoadingState;
estimatedPointsFromFeesAndRewards: number;
usdFeesAndRewards: number;
usdDivergenceLoss: number;
usdProfit: number;
positionsWithErrorsCount: number;
}) => {
return (
<Card
className={`md:m-4 sm:mb-4 self-start ${props.positionLoadingState.updatingUsdValues ? "" : "hidden"}`}
>
<CardBody>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="Estimated Points from Fees"
value={props.estimatedPointsFromFeesAndRewards.toLocaleString(
Intl.NumberFormat().resolvedOptions().locale,
{
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
)}
/>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="Total Fees in USD"
value={props.usdFeesAndRewards.toLocaleString(
Intl.NumberFormat().resolvedOptions().locale,
{
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
)}
/>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="Total Divergence Loss in USD"
value={props.usdDivergenceLoss.toLocaleString(
Intl.NumberFormat().resolvedOptions().locale,
{
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
)}
/>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="Total USD Profit"
value={props.usdProfit.toLocaleString(
Intl.NumberFormat().resolvedOptions().locale,
{
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
)}
/>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="# of Pos. w/ API Errors"
value={props.positionsWithErrorsCount.toLocaleString(
Intl.NumberFormat().resolvedOptions().locale,
{
minimumFractionDigits: 0,
maximumFractionDigits: 0,
},
)}
/>
</CardBody>
</Card>
);
};
152 changes: 20 additions & 132 deletions components/loading-summary.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Card, CardBody, Progress } from "@nextui-org/react";

import { LoadingItem } from "./loading-status-item";
import { LoadingSummaryLeft } from "./loading-summary-left";
import { LoadingSummaryNoUsd } from "./loading-summary-no-usd";
import { LoadingSummaryUsd } from "./loading-summary-usd";

import { type PositionLoadingState } from "@/pages/wallet/[walletAddress]";
import { MeteoraPosition } from "@/services/MeteoraPosition";
Expand Down Expand Up @@ -59,135 +59,23 @@ export const LoadingSummary = (props: {

return (
<div className="md:grid grid-flow-cols grid-cols-2 items-end">
<Card className="md:m-4 sm:mb-4">
<CardBody>
<LoadingItem
title="Time Elapsed"
value={props.positionLoadingState.durationString}
/>
<LoadingItem
hidden={props.positionLoadingState.apiDataLoaded}
title="Estimated Completion"
value={
props.positionLoadingState.estimatedCompletionString == ""
? "Calculating..."
: props.positionLoadingState.estimatedCompletionString
}
/>
<LoadingItem
loading={!props.positionLoadingState.allSignaturesFound}
title="# of Wallet Transactions"
value={props.positionLoadingState.signatureCount}
/>
<LoadingItem
loading={
!props.positionLoadingState.allPositionsFound &&
!props.positionLoadingState.rpcDataLoaded
}
title={"# of Position Transactions"}
value={filteredTransactions.length}
/>
<LoadingItem
loading={
!props.positionLoadingState.allPositionsFound &&
!props.positionLoadingState.rpcDataLoaded
}
title={"# of Positions"}
value={props.filteredPositions.length}
/>
<LoadingItem
hidden={
props.positionLoadingState.openPositionCount == 0 ||
!props.positionLoadingState.updatingOpenPositions
}
loading={props.positionLoadingState.updatingOpenPositions}
title="Updating Open Positions"
/>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="# of Pos. updated w/ USD"
value={updatedUsdValueCount}
/>
{props.positionLoadingState.apiDataLoaded ? (
<></>
) : (
<Progress
aria-label="Loading progress"
isIndeterminate={
!props.positionLoadingState.apiDataLoaded &&
props.positionLoadingState.estimatedCompletionString == ""
}
showValueLabel={true}
value={props.positionLoadingState.updatedUsdPercent}
/>
)}
</CardBody>
</Card>
<Card className="md:m-4 sm:mb-4 self-start">
<CardBody>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="Estimated Points from Fees"
value={estimatedPointsFromFeesAndRewards.toLocaleString(
Intl.NumberFormat().resolvedOptions().locale,
{
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
)}
/>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="Total Fees in USD"
value={usdFeesAndRewards.toLocaleString(
Intl.NumberFormat().resolvedOptions().locale,
{
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
)}
/>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="Total Divergence Loss in USD"
value={usdDivergenceLoss.toLocaleString(
Intl.NumberFormat().resolvedOptions().locale,
{
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
)}
/>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="Total USD Profit"
value={usdProfit.toLocaleString(
Intl.NumberFormat().resolvedOptions().locale,
{
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
)}
/>
<LoadingItem
loading={!props.positionLoadingState.apiDataLoaded}
title="# of Pos. w/ API Errors"
value={positionsWithErrorsCount.toLocaleString(
Intl.NumberFormat().resolvedOptions().locale,
{
minimumFractionDigits: 0,
maximumFractionDigits: 0,
},
)}
/>
</CardBody>
</Card>
<LoadingSummaryLeft
filteredPositions={props.filteredPositions}
filteredTransactions={filteredTransactions}
loading={props.loading}
positionLoadingState={props.positionLoadingState}
updatedUsdValueCount={updatedUsdValueCount}
usd={props.usd}
/>
<LoadingSummaryNoUsd positionLoadingState={props.positionLoadingState} />
<LoadingSummaryUsd
estimatedPointsFromFeesAndRewards={estimatedPointsFromFeesAndRewards}
positionLoadingState={props.positionLoadingState}
positionsWithErrorsCount={positionsWithErrorsCount}
usdDivergenceLoss={usdDivergenceLoss}
usdFeesAndRewards={usdFeesAndRewards}
usdProfit={usdProfit}
/>
</div>
);
};
Loading

0 comments on commit 04fb8c6

Please sign in to comment.