Skip to content

Commit

Permalink
Merge pull request argentlabs#658 from argentlabs/feat/add-transactio…
Browse files Browse the repository at this point in the history
…n-detail-page

Add TransactionDetail Page
  • Loading branch information
delaaxe committed May 23, 2022
2 parents fa7ce6d + 3138f0e commit 7079ce6
Show file tree
Hide file tree
Showing 6 changed files with 224 additions and 6 deletions.
5 changes: 5 additions & 0 deletions packages/extension/src/ui/AppRoutes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Outlet, Route, Routes } from "react-router-dom"
import styled from "styled-components"

import { useAppState } from "./app.state"
import { TransactionDetail } from "./features/accountActivity/TransactionDetail"
import { useTransactionErrorScreen } from "./features/accountActivity/useTransactionErrorScreen"
import { NftScreen } from "./features/accountNfts/NftScreen"
import { AccountListScreen } from "./features/accounts/AccountListScreen"
Expand Down Expand Up @@ -105,6 +106,10 @@ const walletRoutes = (
path={routes.accountActivity.path}
element={<AccountScreen tab="activity" />}
/>
<Route
path={routes.transactionDetail.path}
element={<TransactionDetail />}
/>
<Route path={routes.upgrade.path} element={<UpgradeScreen />} />
<Route path={routes.accounts.path} element={<AccountListScreen />} />
<Route path={routes.funding.path} element={<FundingScreen />} />
Expand Down
18 changes: 18 additions & 0 deletions packages/extension/src/ui/components/Icons/ChevronRight.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { FC } from "react"

export const ChevronRight: FC = () => {
return (
<svg
width="8"
height="12"
viewBox="0 0 8 12"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M7.50054 6C7.50074 6.16392 7.46598 6.32601 7.39857 6.47543C7.33116 6.62485 7.23266 6.75818 7.10963 6.86651L1.52065 11.7834C1.33545 11.9388 1.09679 12.0156 0.855712 11.9974C0.614635 11.9791 0.390272 11.8672 0.230599 11.6857C0.0709261 11.5041 -0.0113838 11.2673 0.0012698 11.0259C0.0139234 10.7845 0.120536 10.5576 0.298311 10.3937L5.18566 6.09422C5.19908 6.08246 5.20983 6.06797 5.21719 6.05172C5.22456 6.03547 5.22837 6.01784 5.22837 6C5.22837 5.98216 5.22456 5.96453 5.21719 5.94828C5.20983 5.93203 5.19908 5.91754 5.18566 5.90578L0.298311 1.60629C0.120536 1.44244 0.0139234 1.21554 0.0012698 0.974099C-0.0113838 0.732662 0.0709261 0.495856 0.230599 0.314317C0.390272 0.132778 0.614635 0.0209152 0.855712 0.00264792C1.09679 -0.0156194 1.33545 0.0611588 1.52065 0.216565L7.10763 5.13198C7.23096 5.24051 7.32978 5.37404 7.39752 5.5237C7.46527 5.67336 7.50039 5.83572 7.50054 6Z"
fill="#C2C0BE"
/>
</svg>
)
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import { FC, Fragment, Suspense } from "react"
import { useNavigate } from "react-router-dom"
import styled from "styled-components"

import { useAppState } from "../../app.state"
import { ErrorBoundary } from "../../components/ErrorBoundary"
import { ErrorBoundaryFallback } from "../../components/ErrorBoundaryFallback"
import { Spinner } from "../../components/Spinner"
import { routes } from "../../routes"
import { formatDateTime } from "../../services/dates"
import { openVoyagerTransaction } from "../../services/voyager.service"
import { Account } from "../accounts/Account"
import { SectionHeader } from "../accounts/SectionHeader"
import { useNetwork } from "../networks/useNetworks"
import { PendingTransactions } from "./PendingTransactions"
import { TransactionItem, TransactionsWrapper } from "./TransactionItem"
import { useActivity } from "./useActivity"
Expand All @@ -34,8 +33,7 @@ interface AccountActivityProps {
}

const Activity: FC<AccountActivityProps> = ({ account }) => {
const { switcherNetworkId } = useAppState()
const { network } = useNetwork(switcherNetworkId)
const navigate = useNavigate()

const activity = useActivity(account.address)

Expand All @@ -51,7 +49,7 @@ const Activity: FC<AccountActivityProps> = ({ account }) => {
hash={hash}
status={isRejected ? "red" : undefined}
meta={{ subTitle: formatDateTime(date), ...meta }}
onClick={() => openVoyagerTransaction(hash, network)}
onClick={() => navigate(routes.transactionDetail(hash))}
/>
))}
</TransactionsWrapper>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
import { FC } from "react"
import { Navigate, useNavigate, useParams } from "react-router-dom"
import styled, { css } from "styled-components"

import { useAppState } from "../../app.state"
import { CopyTooltip } from "../../components/CopyTooltip"
import { ChevronRight } from "../../components/Icons/ChevronRight"
import { CloseIcon } from "../../components/Icons/CloseIcon"
import { ContentCopyIcon } from "../../components/Icons/MuiIcons"
import { routes } from "../../routes"
import { formatDateTime } from "../../services/dates"
import { openVoyagerTransaction } from "../../services/voyager.service"
import { useSelectedAccount } from "../accounts/accounts.state"
import { useAccountTransactions } from "../accounts/accountTransactions.state"
import { useNetwork } from "../networks/useNetworks"

const HeadContainer = styled.div`
display: flex;
justify-content: flex-end;
padding: 20px 18px;
`

const CloseIconWrapper = styled.div`
cursor: pointer;
`

const Container = styled.div`
display: flex;
flex-direction: column;
padding: 9px 16px 0px;
margin-bottom: 68px;
`

const Title = styled.h2`
font-weight: 700;
font-size: 28px;
line-height: 34px;
margin-bottom: 17.5px;
text-align: left;
padding-left: 8px;
`

const TransactionCard = styled.section`
background: #333332;
border: 1px solid #161616;
border-radius: 8px;
display: flex;
flex-direction: column;
margin-bottom: 12px;
`

const TransactionField = styled.div<{ clickable?: boolean }>`
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 20px;
font-size: 15px;
font-weight: 600;
line-height: 20px;
${({ clickable }) =>
clickable &&
css`
cursor: pointer;
`}
`

const Separator = styled.div`
border-top: 1px solid #161616;
margin: 0;
padding: 0;
`

const TransactionFieldKey = styled.div`
color: #8f8e8c;
`
const TransactionFieldValue = styled.div``

const TransactionFailedField = styled(TransactionField)`
flex-direction: column;
align-items: flex-start;
gap: 4px;
`

const TransactionLogMessage = styled(TransactionFieldValue)`
line-break: anywhere;
font-weight: 400;
font-size: 14px;
line-height: 15px;
`

const TransactionLogKey = styled(TransactionFieldKey)`
display: flex;
align-items: center;
gap: 7px;
`
export const TransactionDetail: FC = () => {
const navigate = useNavigate()
const { switcherNetworkId } = useAppState()
const { network } = useNetwork(switcherNetworkId)
const { txHash } = useParams()

const account = useSelectedAccount()

const { transactions } = useAccountTransactions(account?.address ?? "")

const transaction = transactions.find((tx) => tx.hash === txHash)

if (!transaction) {
return <Navigate to={routes.accounts()} />
}

const isRejected = transaction.status === "REJECTED"

const date = transaction.timestamp && new Date(transaction.timestamp * 1000)

const dateLabel = formatDateTime(date)

return (
<>
<HeadContainer>
<CloseIconWrapper onClick={() => navigate(routes.accountActivity())}>
<CloseIcon />
</CloseIconWrapper>
</HeadContainer>
<Container>
<Title>Transaction</Title>

<TransactionCard>
<TransactionField>
<TransactionFieldKey>Status</TransactionFieldKey>
<TransactionFieldValue>
{isRejected ? "Failed" : "Complete"}
</TransactionFieldValue>
</TransactionField>
<Separator />
<TransactionField>
<TransactionFieldKey>Time</TransactionFieldKey>
{dateLabel && (
<TransactionFieldValue>{dateLabel}</TransactionFieldValue>
)}
</TransactionField>
<Separator />

{/* TODO: Add this back when we have a way to fetch Network Fee from
txHash */}

{/* {!isRejected && (
<TransactionField>
<TransactionFieldKey>Network Fee</TransactionFieldKey>
<TransactionFieldValue>0.0012 ETH</TransactionFieldValue>
</TransactionField>
)} */}
</TransactionCard>

{isRejected ? (
<TransactionCard>
<TransactionFailedField clickable>
<TransactionLogKey>
<div>Transaction log</div>
<CopyTooltip
message="Copied"
copyValue={
transaction.failureReason?.error_message || transaction.hash
}
>
<ContentCopyIcon style={{ fontSize: 12 }} />
</CopyTooltip>
</TransactionLogKey>
<TransactionLogMessage style={{ color: "#8f8e8c" }}>
{transaction.failureReason?.error_message || "Unknown error"}
</TransactionLogMessage>
</TransactionFailedField>
</TransactionCard>
) : (
<TransactionCard>
<TransactionField
clickable
onClick={() => openVoyagerTransaction(transaction.hash, network)}
>
<TransactionFieldKey>View on Voyager</TransactionFieldKey>
<TransactionFieldValue>
<ChevronRight />
</TransactionFieldValue>
</TransactionField>
</TransactionCard>
)}
</Container>
</>
)
}
4 changes: 4 additions & 0 deletions packages/extension/src/ui/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ export const routes = {
`/account/nfts/${contractAddress}/${tokenId}`,
`/account/nfts/:contractAddress/:tokenId`,
),
transactionDetail: route(
(txHash: string) => `/account/activity/transaction-detail/${txHash}`,
`/account/activity/transaction-detail/:txHash`,
),
upgrade: route("/account/upgrade"),
accounts: route("/accounts"),
newToken: route("/tokens/new"),
Expand Down
2 changes: 2 additions & 0 deletions packages/extension/src/ui/services/dates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ export const formatDateTime = (date: Date | string | number) =>
day: "numeric",
hour: "numeric",
minute: "numeric",
timeZone: "UTC",
timeZoneName: "short",
})

0 comments on commit 7079ce6

Please sign in to comment.