Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
frontend
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
vicotor
frontend
Commits
c61b982d
Commit
c61b982d
authored
Feb 10, 2023
by
tom
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
blocks routes
parent
9d722d82
Changes
34
Show whitespace changes
Inline
Side-by-side
Showing
34 changed files
with
148 additions
and
122 deletions
+148
-122
redirects.js
configs/nextjs/redirects.js
+1
-1
resources.ts
lib/api/resources.ts
+2
-2
useNavItems.tsx
lib/hooks/useNavItems.tsx
+56
-18
paths.json
lib/link/paths.json
+1
-1
routes.ts
lib/link/routes.ts
+7
-7
useCurrentRoute.ts
lib/link/useCurrentRoute.ts
+0
-25
getSeo.ts
lib/next/block/getSeo.ts
+4
-4
types.ts
lib/next/block/types.ts
+0
-3
getServerSideProps.ts
lib/next/getServerSideProps.ts
+2
-0
getQueryParamString.ts
lib/router/getQueryParamString.ts
+7
-0
[height].tsx
pages/block/[height].tsx
+3
-4
search-results.tsx
pages/search-results.tsx
+2
-1
nextjs-routes.d.ts
types/nextjs-routes.d.ts
+1
-1
AddressDetails.tsx
ui/address/AddressDetails.tsx
+2
-1
AddressBlocksValidatedListItem.tsx
...ddress/blocksValidated/AddressBlocksValidatedListItem.tsx
+1
-1
AddressBlocksValidatedTableItem.tsx
...dress/blocksValidated/AddressBlocksValidatedTableItem.tsx
+2
-2
AddressCoinBalanceListItem.tsx
ui/address/coinBalance/AddressCoinBalanceListItem.tsx
+2
-2
AddressCoinBalanceTableItem.tsx
ui/address/coinBalance/AddressCoinBalanceTableItem.tsx
+2
-2
AddressIntTxsListItem.tsx
ui/address/internals/AddressIntTxsListItem.tsx
+2
-2
AddressIntTxsTableItem.tsx
ui/address/internals/AddressIntTxsTableItem.tsx
+2
-2
BlockDetails.tsx
ui/block/BlockDetails.tsx
+9
-7
BlocksListItem.tsx
ui/blocks/BlocksListItem.tsx
+3
-3
BlocksTableItem.tsx
ui/blocks/BlocksTableItem.tsx
+3
-3
LatestBlocks.tsx
ui/home/LatestBlocks.tsx
+2
-2
LatestBlocksItem.tsx
ui/home/LatestBlocksItem.tsx
+2
-2
Stats.tsx
ui/home/Stats.tsx
+2
-1
Block.tsx
ui/pages/Block.tsx
+9
-6
SearchResultListItem.tsx
ui/searchResults/SearchResultListItem.tsx
+2
-1
SearchResultTableItem.tsx
ui/searchResults/SearchResultTableItem.tsx
+2
-1
AddressLink.tsx
ui/shared/address/AddressLink.tsx
+3
-2
NavLink.tsx
ui/snippets/navigation/NavLink.tsx
+6
-10
SearchBarSuggestItem.tsx
ui/snippets/searchBar/SearchBarSuggestItem.tsx
+2
-1
TxsListItem.tsx
ui/txs/TxsListItem.tsx
+2
-2
TxsTableItem.tsx
ui/txs/TxsTableItem.tsx
+2
-2
No files found.
configs/nextjs/redirects.js
View file @
c61b982d
...
@@ -35,7 +35,7 @@ const oldUrls = [
...
@@ -35,7 +35,7 @@ const oldUrls = [
},
},
{
{
oldPath
:
'
/block/:height/transactions
'
,
oldPath
:
'
/block/:height/transactions
'
,
newPath
:
`
${
PATHS
.
block
}
`
,
newPath
:
`
${
PATHS
.
block
}
?tab=txs
`
,
},
},
{
{
oldPath
:
'
/address/:id/transactions
'
,
oldPath
:
'
/address/:id/transactions
'
,
...
...
lib/api/resources.ts
View file @
c61b982d
...
@@ -98,10 +98,10 @@ export const RESOURCES = {
...
@@ -98,10 +98,10 @@ export const RESOURCES = {
filterFields
:
[
'
type
'
as
const
],
filterFields
:
[
'
type
'
as
const
],
},
},
block
:
{
block
:
{
path
:
'
/api/v2/blocks/:
id
'
,
path
:
'
/api/v2/blocks/:
height
'
,
},
},
block_txs
:
{
block_txs
:
{
path
:
'
/api/v2/blocks/:
id
/transactions
'
,
path
:
'
/api/v2/blocks/:
height
/transactions
'
,
paginationFields
:
[
'
block_number
'
as
const
,
'
items_count
'
as
const
,
'
index
'
as
const
],
paginationFields
:
[
'
block_number
'
as
const
,
'
items_count
'
as
const
,
'
index
'
as
const
],
filterFields
:
[],
filterFields
:
[],
},
},
...
...
lib/hooks/useNavItems.tsx
View file @
c61b982d
import
{
useRouter
}
from
'
next/router
'
;
import
type
{
Route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
appConfig
from
'
configs/app/config
'
;
import
appConfig
from
'
configs/app/config
'
;
...
@@ -14,40 +16,76 @@ import tokensIcon from 'icons/token.svg';
...
@@ -14,40 +16,76 @@ import tokensIcon from 'icons/token.svg';
import
transactionsIcon
from
'
icons/transactions.svg
'
;
import
transactionsIcon
from
'
icons/transactions.svg
'
;
import
walletIcon
from
'
icons/wallet.svg
'
;
import
walletIcon
from
'
icons/wallet.svg
'
;
import
watchlistIcon
from
'
icons/watchlist.svg
'
;
import
watchlistIcon
from
'
icons/watchlist.svg
'
;
import
link
from
'
lib/link/link
'
;
import
useCurrentRoute
from
'
lib/link/useCurrentRoute
'
;
import
notEmpty
from
'
lib/notEmpty
'
;
import
notEmpty
from
'
lib/notEmpty
'
;
export
default
function
useNavItems
()
{
export
interface
NavItem
{
text
:
string
;
nextRoute
:
Route
;
icon
:
React
.
FunctionComponent
<
React
.
SVGAttributes
<
SVGElement
>>
;
isActive
?:
boolean
;
isNewUi
?:
boolean
;
}
interface
ReturnType
{
mainNavItems
:
Array
<
NavItem
>
;
accountNavItems
:
Array
<
NavItem
>
;
profileItem
:
NavItem
;
}
export
default
function
useNavItems
():
ReturnType
{
const
isMarketplaceFilled
=
appConfig
.
marketplaceAppList
.
length
>
0
;
const
isMarketplaceFilled
=
appConfig
.
marketplaceAppList
.
length
>
0
;
const
currentRoute
=
useCurrentRoute
()();
const
router
=
useRouter
();
const
pathname
=
router
.
pathname
;
return
React
.
useMemo
(()
=>
{
return
React
.
useMemo
(()
=>
{
const
mainNavItems
=
[
const
mainNavItems
=
[
{
text
:
'
Blocks
'
,
url
:
link
(
'
blocks
'
),
icon
:
blocksIcon
,
isActive
:
currentRoute
.
startsWith
(
'
block
'
),
isNewUi
:
true
},
{
text
:
'
Blocks
'
,
nextRoute
:
{
pathname
:
'
/blocks
'
as
const
},
icon
:
blocksIcon
,
isActive
:
pathname
.
startsWith
(
'
/
block
'
),
isNewUi
:
true
},
{
text
:
'
Transactions
'
,
url
:
link
(
'
txs
'
),
icon
:
transactionsIcon
,
isActive
:
currentRoute
.
startsWith
(
'
tx
'
),
isNewUi
:
true
},
{
text
:
'
Transactions
'
,
nextRoute
:
{
pathname
:
'
/txs
'
as
const
},
icon
:
transactionsIcon
,
isActive
:
pathname
.
startsWith
(
'
/
tx
'
),
isNewUi
:
true
},
{
text
:
'
Tokens
'
,
url
:
link
(
'
tokens
'
),
icon
:
tokensIcon
,
isActive
:
currentRoute
.
startsWith
(
'
token
'
),
isNewUi
:
true
},
{
text
:
'
Tokens
'
,
nextRoute
:
{
pathname
:
'
/tokens
'
as
const
},
icon
:
tokensIcon
,
isActive
:
pathname
.
startsWith
(
'
/
token
'
),
isNewUi
:
true
},
{
text
:
'
Accounts
'
,
url
:
link
(
'
accounts
'
),
icon
:
walletIcon
,
isActive
:
currentRoute
===
'
accounts
'
,
isNewUi
:
true
},
{
text
:
'
Accounts
'
,
nextRoute
:
{
pathname
:
'
/accounts
'
as
const
},
icon
:
walletIcon
,
isActive
:
pathname
===
'
/
accounts
'
,
isNewUi
:
true
},
isMarketplaceFilled
?
isMarketplaceFilled
?
{
text
:
'
Apps
'
,
url
:
link
(
'
apps
'
),
icon
:
appsIcon
,
isActive
:
currentRoute
.
startsWith
(
'
app
'
),
isNewUi
:
true
}
:
null
,
{
text
:
'
Apps
'
,
nextRoute
:
{
pathname
:
'
/apps
'
as
const
},
icon
:
appsIcon
,
isActive
:
pathname
.
startsWith
(
'
/
app
'
),
isNewUi
:
true
}
:
null
,
{
text
:
'
Charts & stats
'
,
url
:
link
(
'
stats
'
),
icon
:
statsIcon
,
isActive
:
currentRoute
===
'
stats
'
,
isNewUi
:
true
},
{
text
:
'
Charts & stats
'
,
nextRoute
:
{
pathname
:
'
/stats
'
as
const
},
icon
:
statsIcon
,
isActive
:
pathname
===
'
/
stats
'
,
isNewUi
:
true
},
// there should be custom site sections like Stats, Faucet, More, etc but never an 'other'
// there should be custom site sections like Stats, Faucet, More, etc but never an 'other'
// examples https://explorer-edgenet.polygon.technology/ and https://explorer.celo.org/
// examples https://explorer-edgenet.polygon.technology/ and https://explorer.celo.org/
// at this stage custom menu items is under development, we will implement it later
// at this stage custom menu items is under development, we will implement it later
// { text: 'Other', url: link('other'), icon: gearIcon, isActive:
currentRout
e === 'other' },
// { text: 'Other', url: link('other'), icon: gearIcon, isActive:
pathnam
e === 'other' },
].
filter
(
notEmpty
);
].
filter
(
notEmpty
);
const
accountNavItems
=
[
const
accountNavItems
=
[
{
text
:
'
Watchlist
'
,
url
:
link
(
'
watchlist
'
),
icon
:
watchlistIcon
,
isActive
:
currentRoute
===
'
watchlist
'
,
isNewUi
:
true
},
{
{
text
:
'
Private tags
'
,
url
:
link
(
'
private_tags
'
),
icon
:
privateTagIcon
,
isActive
:
currentRoute
.
startsWith
(
'
private_tags
'
),
isNewUi
:
true
},
text
:
'
Watchlist
'
,
{
text
:
'
Public tags
'
,
url
:
link
(
'
public_tags
'
),
icon
:
publicTagIcon
,
isActive
:
currentRoute
===
'
public_tags
'
,
isNewUi
:
true
},
nextRoute
:
{
pathname
:
'
/account/watchlist
'
as
const
},
{
text
:
'
API keys
'
,
url
:
link
(
'
api_keys
'
),
icon
:
apiKeysIcon
,
isActive
:
currentRoute
===
'
api_keys
'
,
isNewUi
:
true
},
icon
:
watchlistIcon
,
{
text
:
'
Custom ABI
'
,
url
:
link
(
'
custom_abi
'
),
icon
:
abiIcon
,
isActive
:
currentRoute
===
'
custom_abi
'
,
isNewUi
:
true
},
isActive
:
pathname
===
'
/account/watchlist
'
,
isNewUi
:
true
,
},
{
text
:
'
Private tags
'
,
nextRoute
:
{
pathname
:
'
/account/tag_address
'
as
const
},
icon
:
privateTagIcon
,
isActive
:
pathname
===
'
/account/tag_address
'
,
isNewUi
:
true
,
},
{
text
:
'
Public tags
'
,
nextRoute
:
{
pathname
:
'
/account/public_tags_request
'
as
const
},
icon
:
publicTagIcon
,
isActive
:
pathname
===
'
/account/public_tags_request
'
,
isNewUi
:
true
,
},
{
text
:
'
API keys
'
,
nextRoute
:
{
pathname
:
'
/account/api_key
'
as
const
},
icon
:
apiKeysIcon
,
isActive
:
pathname
===
'
/account/api_key
'
,
isNewUi
:
true
},
{
text
:
'
Custom ABI
'
,
nextRoute
:
{
pathname
:
'
/account/custom_abi
'
as
const
},
icon
:
abiIcon
,
isActive
:
pathname
===
'
/account/custom_abi
'
,
isNewUi
:
true
,
},
];
];
const
profileItem
=
{
text
:
'
My profile
'
,
url
:
link
(
'
profile
'
),
icon
:
profileIcon
,
isActive
:
currentRoute
===
'
profile
'
,
isNewUi
:
true
};
const
profileItem
=
{
text
:
'
My profile
'
,
nextRoute
:
{
pathname
:
'
/auth/profile
'
as
const
},
icon
:
profileIcon
,
isActive
:
pathname
===
'
/auth/profile
'
,
isNewUi
:
true
};
return
{
mainNavItems
,
accountNavItems
,
profileItem
};
return
{
mainNavItems
,
accountNavItems
,
profileItem
};
},
[
isMarketplaceFilled
,
currentRout
e
]);
},
[
isMarketplaceFilled
,
pathnam
e
]);
}
}
lib/link/paths.json
View file @
c61b982d
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
"txs"
:
"/txs"
,
"txs"
:
"/txs"
,
"tx"
:
"/tx/:id"
,
"tx"
:
"/tx/:id"
,
"blocks"
:
"/blocks"
,
"blocks"
:
"/blocks"
,
"block"
:
"/block/:
id
"
,
"block"
:
"/block/:
height
"
,
"tokens"
:
"/tokens"
,
"tokens"
:
"/tokens"
,
"token_index"
:
"/token/:hash"
,
"token_index"
:
"/token/:hash"
,
"token_instance_item"
:
"/token/:hash/instance/:id"
,
"token_instance_item"
:
"/token/:hash/instance/:id"
,
...
...
lib/link/routes.ts
View file @
c61b982d
...
@@ -46,13 +46,13 @@ export const ROUTES = {
...
@@ -46,13 +46,13 @@ export const ROUTES = {
},
},
// BLOCKS
// BLOCKS
blocks
:
{
//
blocks: {
pattern
:
PATHS
.
blocks
,
//
pattern: PATHS.blocks,
crossNetworkNavigation
:
true
,
//
crossNetworkNavigation: true,
},
//
},
block
:
{
//
block: {
pattern
:
PATHS
.
block
,
//
pattern: PATHS.block,
},
//
},
// TOKENS
// TOKENS
tokens
:
{
tokens
:
{
...
...
lib/link/useCurrentRoute.ts
deleted
100644 → 0
View file @
9d722d82
import
{
useRouter
}
from
'
next/router
'
;
import
React
from
'
react
'
;
import
type
{
RouteName
}
from
'
lib/link/routes
'
;
import
{
ROUTES
}
from
'
lib/link/routes
'
;
const
PATH_PARAM_REGEXP
=
/
\/
:
(\w
+
)
/g
;
export
default
function
useCurrentRoute
()
{
const
{
route
:
nextRoute
}
=
useRouter
();
return
React
.
useCallback
(():
RouteName
=>
{
for
(
const
routeName
in
ROUTES
)
{
const
route
=
ROUTES
[
routeName
as
RouteName
];
const
formattedRoute
=
route
.
pattern
.
replace
(
PATH_PARAM_REGEXP
,
(
_
,
paramName
:
string
)
=>
{
return
`/[
${
paramName
}
]`
;
});
if
(
formattedRoute
===
nextRoute
)
{
return
routeName
as
RouteName
;
}
}
return
'
network_index
'
;
},
[
nextRoute
]);
}
lib/next/block/getSeo.ts
View file @
c61b982d
import
type
{
PageParams
}
from
'
./typ
es
'
;
import
type
{
RoutedQuery
}
from
'
nextjs-rout
es
'
;
import
getNetworkTitle
from
'
lib/networks/getNetworkTitle
'
;
import
getNetworkTitle
from
'
lib/networks/getNetworkTitle
'
;
export
default
function
getSeo
(
params
?:
PageParams
)
{
export
default
function
getSeo
(
params
?:
RoutedQuery
<
'
/block/[height]
'
>
)
{
const
networkTitle
=
getNetworkTitle
();
const
networkTitle
=
getNetworkTitle
();
return
{
return
{
title
:
params
?
`Block
${
params
.
id
}
-
${
networkTitle
}
`
:
''
,
title
:
params
?
`Block
${
params
.
height
}
-
${
networkTitle
}
`
:
''
,
description
:
params
?
`View the transactions, token transfers, and uncles for block number
${
params
.
id
}
`
:
''
,
description
:
params
?
`View the transactions, token transfers, and uncles for block number
${
params
.
height
}
`
:
''
,
};
};
}
}
lib/next/block/types.ts
deleted
100644 → 0
View file @
9d722d82
export
type
PageParams
=
{
id
:
string
;
}
lib/next/getServerSideProps.ts
View file @
c61b982d
...
@@ -4,6 +4,7 @@ export type Props = {
...
@@ -4,6 +4,7 @@ export type Props = {
cookies
:
string
;
cookies
:
string
;
referrer
:
string
;
referrer
:
string
;
id
?:
string
;
id
?:
string
;
height
?:
string
;
}
}
export
const
getServerSideProps
:
GetServerSideProps
<
Props
>
=
async
({
req
,
query
})
=>
{
export
const
getServerSideProps
:
GetServerSideProps
<
Props
>
=
async
({
req
,
query
})
=>
{
...
@@ -12,6 +13,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async({ req, query
...
@@ -12,6 +13,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async({ req, query
cookies
:
req
.
headers
.
cookie
||
''
,
cookies
:
req
.
headers
.
cookie
||
''
,
referrer
:
req
.
headers
.
referer
||
''
,
referrer
:
req
.
headers
.
referer
||
''
,
id
:
query
.
id
?.
toString
()
||
''
,
id
:
query
.
id
?.
toString
()
||
''
,
height
:
query
.
height
?.
toString
()
||
''
,
},
},
};
};
};
};
lib/router/getQueryParamString.ts
0 → 100644
View file @
c61b982d
export
default
function
getQueryParamString
(
param
:
string
|
Array
<
string
>
|
undefined
):
string
{
if
(
Array
.
isArray
(
param
))
{
return
param
.
join
(
'
,
'
);
}
return
param
||
''
;
}
pages/block/[
id
].tsx
→
pages/block/[
height
].tsx
View file @
c61b982d
import
type
{
NextPage
}
from
'
next
'
;
import
type
{
NextPage
}
from
'
next
'
;
import
Head
from
'
next/head
'
;
import
Head
from
'
next/head
'
;
import
type
{
RoutedQuery
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
PageParams
}
from
'
lib/next/block/types
'
;
import
getSeo
from
'
lib/next/block/getSeo
'
;
import
getSeo
from
'
lib/next/block/getSeo
'
;
import
Block
from
'
ui/pages/Block
'
;
import
Block
from
'
ui/pages/Block
'
;
const
BlockPage
:
NextPage
<
PageParams
>
=
({
id
}:
PageParams
)
=>
{
const
BlockPage
:
NextPage
<
RoutedQuery
<
'
/block/[height]
'
>>
=
({
height
}:
RoutedQuery
<
'
/block/[height]
'
>
)
=>
{
const
{
title
,
description
}
=
getSeo
({
id
});
const
{
title
,
description
}
=
getSeo
({
height
});
return
(
return
(
<>
<>
<
Head
>
<
Head
>
...
...
pages/search-results.tsx
View file @
c61b982d
import
type
{
GetServerSideProps
,
NextPage
}
from
'
next
'
;
import
type
{
GetServerSideProps
,
NextPage
}
from
'
next
'
;
import
Head
from
'
next/head
'
;
import
Head
from
'
next/head
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
SearchRedirectResult
}
from
'
types/api/search
'
;
import
type
{
SearchRedirectResult
}
from
'
types/api/search
'
;
...
@@ -43,7 +44,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async({ req, res, r
...
@@ -43,7 +44,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async({ req, res, r
const
redirectUrl
=
(()
=>
{
const
redirectUrl
=
(()
=>
{
switch
(
payload
.
type
)
{
switch
(
payload
.
type
)
{
case
'
block
'
:
{
case
'
block
'
:
{
return
link
(
'
block
'
,
{
id
:
q
});
return
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
q
}
});
}
}
case
'
address
'
:
{
case
'
address
'
:
{
return
link
(
'
address_index
'
,
{
id
:
payload
.
parameter
||
q
});
return
link
(
'
address_index
'
,
{
id
:
payload
.
parameter
||
q
});
...
...
types/nextjs-routes.d.ts
View file @
c61b982d
...
@@ -19,7 +19,7 @@ declare module "nextjs-routes" {
...
@@ -19,7 +19,7 @@ declare module "nextjs-routes" {
|
DynamicRoute
<
"
/apps/[id]
"
,
{
"
id
"
:
string
}
>
|
DynamicRoute
<
"
/apps/[id]
"
,
{
"
id
"
:
string
}
>
|
StaticRoute
<
"
/apps
"
>
|
StaticRoute
<
"
/apps
"
>
|
StaticRoute
<
"
/auth/profile
"
>
|
StaticRoute
<
"
/auth/profile
"
>
|
DynamicRoute
<
"
/block/[
id]
"
,
{
"
id
"
:
string
}
>
|
DynamicRoute
<
"
/block/[
height]
"
,
{
"
height
"
:
string
}
>
|
StaticRoute
<
"
/blocks
"
>
|
StaticRoute
<
"
/blocks
"
>
|
StaticRoute
<
"
/graph
"
>
|
StaticRoute
<
"
/graph
"
>
|
StaticRoute
<
"
/
"
>
|
StaticRoute
<
"
/
"
>
...
...
ui/address/AddressDetails.tsx
View file @
c61b982d
import
{
Box
,
Flex
,
Text
,
Icon
,
Grid
}
from
'
@chakra-ui/react
'
;
import
{
Box
,
Flex
,
Text
,
Icon
,
Grid
}
from
'
@chakra-ui/react
'
;
import
type
{
UseQueryResult
}
from
'
@tanstack/react-query
'
;
import
type
{
UseQueryResult
}
from
'
@tanstack/react-query
'
;
import
{
useRouter
}
from
'
next/router
'
;
import
{
useRouter
}
from
'
next/router
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
Address
as
TAddress
}
from
'
types/api/address
'
;
import
type
{
Address
as
TAddress
}
from
'
types/api/address
'
;
...
@@ -201,7 +202,7 @@ const AddressDetails = ({ addressQuery, scrollRef }: Props) => {
...
@@ -201,7 +202,7 @@ const AddressDetails = ({ addressQuery, scrollRef }: Props) => {
py=
{
{
base
:
'
2px
'
,
lg
:
1
}
}
py=
{
{
base
:
'
2px
'
,
lg
:
1
}
}
>
>
<
LinkInternal
<
LinkInternal
href=
{
link
(
'
block
'
,
{
id
:
String
(
data
.
block_number_balance_updated_at
)
})
}
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
data
.
block_number_balance_updated_at
)
}
})
}
display=
"flex"
display=
"flex"
alignItems=
"center"
alignItems=
"center"
>
>
...
...
ui/address/blocksValidated/AddressBlocksValidatedListItem.tsx
View file @
c61b982d
...
@@ -17,7 +17,7 @@ type Props = Block & {
...
@@ -17,7 +17,7 @@ type Props = Block & {
};
};
const
AddressBlocksValidatedListItem
=
(
props
:
Props
)
=>
{
const
AddressBlocksValidatedListItem
=
(
props
:
Props
)
=>
{
const
blockUrl
=
route
({
pathname
:
'
/block/[
id]
'
,
query
:
{
id
:
props
.
height
.
toString
()
}
});
const
blockUrl
=
route
({
pathname
:
'
/block/[
height]
'
,
query
:
{
height
:
props
.
height
.
toString
()
}
});
const
timeAgo
=
useTimeAgoIncrement
(
props
.
timestamp
,
props
.
page
===
1
);
const
timeAgo
=
useTimeAgoIncrement
(
props
.
timestamp
,
props
.
page
===
1
);
const
totalReward
=
getBlockTotalReward
(
props
);
const
totalReward
=
getBlockTotalReward
(
props
);
...
...
ui/address/blocksValidated/AddressBlocksValidatedTableItem.tsx
View file @
c61b982d
import
{
Td
,
Tr
,
Text
,
Box
,
Flex
}
from
'
@chakra-ui/react
'
;
import
{
Td
,
Tr
,
Text
,
Box
,
Flex
}
from
'
@chakra-ui/react
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
Block
}
from
'
types/api/block
'
;
import
type
{
Block
}
from
'
types/api/block
'
;
import
getBlockTotalReward
from
'
lib/block/getBlockTotalReward
'
;
import
getBlockTotalReward
from
'
lib/block/getBlockTotalReward
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
link
from
'
lib/link/link
'
;
import
LinkInternal
from
'
ui/shared/LinkInternal
'
;
import
LinkInternal
from
'
ui/shared/LinkInternal
'
;
import
Utilization
from
'
ui/shared/Utilization/Utilization
'
;
import
Utilization
from
'
ui/shared/Utilization/Utilization
'
;
...
@@ -15,7 +15,7 @@ type Props = Block & {
...
@@ -15,7 +15,7 @@ type Props = Block & {
};
};
const
AddressBlocksValidatedTableItem
=
(
props
:
Props
)
=>
{
const
AddressBlocksValidatedTableItem
=
(
props
:
Props
)
=>
{
const
blockUrl
=
link
(
'
block
'
,
{
id
:
String
(
props
.
height
)
});
const
blockUrl
=
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
props
.
height
)
}
});
const
timeAgo
=
useTimeAgoIncrement
(
props
.
timestamp
,
props
.
page
===
1
);
const
timeAgo
=
useTimeAgoIncrement
(
props
.
timestamp
,
props
.
page
===
1
);
const
totalReward
=
getBlockTotalReward
(
props
);
const
totalReward
=
getBlockTotalReward
(
props
);
...
...
ui/address/coinBalance/AddressCoinBalanceListItem.tsx
View file @
c61b982d
import
{
Text
,
Stat
,
StatHelpText
,
StatArrow
,
Flex
}
from
'
@chakra-ui/react
'
;
import
{
Text
,
Stat
,
StatHelpText
,
StatArrow
,
Flex
}
from
'
@chakra-ui/react
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
AddressCoinBalanceHistoryItem
}
from
'
types/api/address
'
;
import
type
{
AddressCoinBalanceHistoryItem
}
from
'
types/api/address
'
;
...
@@ -7,7 +8,6 @@ import type { AddressCoinBalanceHistoryItem } from 'types/api/address';
...
@@ -7,7 +8,6 @@ import type { AddressCoinBalanceHistoryItem } from 'types/api/address';
import
appConfig
from
'
configs/app/config
'
;
import
appConfig
from
'
configs/app/config
'
;
import
{
WEI
,
ZERO
}
from
'
lib/consts
'
;
import
{
WEI
,
ZERO
}
from
'
lib/consts
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
link
from
'
lib/link/link
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
LinkInternal
from
'
ui/shared/LinkInternal
'
;
import
LinkInternal
from
'
ui/shared/LinkInternal
'
;
...
@@ -18,7 +18,7 @@ type Props = AddressCoinBalanceHistoryItem & {
...
@@ -18,7 +18,7 @@ type Props = AddressCoinBalanceHistoryItem & {
};
};
const
AddressCoinBalanceListItem
=
(
props
:
Props
)
=>
{
const
AddressCoinBalanceListItem
=
(
props
:
Props
)
=>
{
const
blockUrl
=
link
(
'
block
'
,
{
id
:
String
(
props
.
block_number
)
});
const
blockUrl
=
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
props
.
block_number
)
}
});
const
deltaBn
=
BigNumber
(
props
.
delta
).
div
(
WEI
);
const
deltaBn
=
BigNumber
(
props
.
delta
).
div
(
WEI
);
const
isPositiveDelta
=
deltaBn
.
gte
(
ZERO
);
const
isPositiveDelta
=
deltaBn
.
gte
(
ZERO
);
const
timeAgo
=
useTimeAgoIncrement
(
props
.
block_timestamp
,
props
.
page
===
1
);
const
timeAgo
=
useTimeAgoIncrement
(
props
.
block_timestamp
,
props
.
page
===
1
);
...
...
ui/address/coinBalance/AddressCoinBalanceTableItem.tsx
View file @
c61b982d
import
{
Td
,
Tr
,
Text
,
Stat
,
StatHelpText
,
StatArrow
}
from
'
@chakra-ui/react
'
;
import
{
Td
,
Tr
,
Text
,
Stat
,
StatHelpText
,
StatArrow
}
from
'
@chakra-ui/react
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
AddressCoinBalanceHistoryItem
}
from
'
types/api/address
'
;
import
type
{
AddressCoinBalanceHistoryItem
}
from
'
types/api/address
'
;
import
{
WEI
,
ZERO
}
from
'
lib/consts
'
;
import
{
WEI
,
ZERO
}
from
'
lib/consts
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
link
from
'
lib/link/link
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
LinkInternal
from
'
ui/shared/LinkInternal
'
;
import
LinkInternal
from
'
ui/shared/LinkInternal
'
;
...
@@ -16,7 +16,7 @@ type Props = AddressCoinBalanceHistoryItem & {
...
@@ -16,7 +16,7 @@ type Props = AddressCoinBalanceHistoryItem & {
};
};
const
AddressCoinBalanceTableItem
=
(
props
:
Props
)
=>
{
const
AddressCoinBalanceTableItem
=
(
props
:
Props
)
=>
{
const
blockUrl
=
link
(
'
block
'
,
{
id
:
String
(
props
.
block_number
)
});
const
blockUrl
=
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
props
.
block_number
)
}
});
const
deltaBn
=
BigNumber
(
props
.
delta
).
div
(
WEI
);
const
deltaBn
=
BigNumber
(
props
.
delta
).
div
(
WEI
);
const
isPositiveDelta
=
deltaBn
.
gte
(
ZERO
);
const
isPositiveDelta
=
deltaBn
.
gte
(
ZERO
);
const
timeAgo
=
useTimeAgoIncrement
(
props
.
block_timestamp
,
props
.
page
===
1
);
const
timeAgo
=
useTimeAgoIncrement
(
props
.
block_timestamp
,
props
.
page
===
1
);
...
...
ui/address/internals/AddressIntTxsListItem.tsx
View file @
c61b982d
import
{
Flex
,
Tag
,
Icon
,
Box
,
HStack
,
Text
}
from
'
@chakra-ui/react
'
;
import
{
Flex
,
Tag
,
Icon
,
Box
,
HStack
,
Text
}
from
'
@chakra-ui/react
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
InternalTransaction
}
from
'
types/api/internalTransaction
'
;
import
type
{
InternalTransaction
}
from
'
types/api/internalTransaction
'
;
...
@@ -7,7 +8,6 @@ import type { InternalTransaction } from 'types/api/internalTransaction';
...
@@ -7,7 +8,6 @@ import type { InternalTransaction } from 'types/api/internalTransaction';
import
appConfig
from
'
configs/app/config
'
;
import
appConfig
from
'
configs/app/config
'
;
import
eastArrowIcon
from
'
icons/arrows/east.svg
'
;
import
eastArrowIcon
from
'
icons/arrows/east.svg
'
;
import
dayjs
from
'
lib/date/dayjs
'
;
import
dayjs
from
'
lib/date/dayjs
'
;
import
link
from
'
lib/link/link
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
AddressIcon
from
'
ui/shared/address/AddressIcon
'
;
import
AddressIcon
from
'
ui/shared/address/AddressIcon
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
...
@@ -50,7 +50,7 @@ const TxInternalsListItem = ({
...
@@ -50,7 +50,7 @@ const TxInternalsListItem = ({
</
Flex
>
</
Flex
>
<
HStack
spacing=
{
1
}
>
<
HStack
spacing=
{
1
}
>
<
Text
fontSize=
"sm"
fontWeight=
{
500
}
>
Block
</
Text
>
<
Text
fontSize=
"sm"
fontWeight=
{
500
}
>
Block
</
Text
>
<
LinkInternal
href=
{
link
(
'
block
'
,
{
id
:
block
.
toString
()
})
}
>
{
block
}
</
LinkInternal
>
<
LinkInternal
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
block
.
toString
()
}
})
}
>
{
block
}
</
LinkInternal
>
</
HStack
>
</
HStack
>
<
Box
w=
"100%"
display=
"flex"
columnGap=
{
3
}
>
<
Box
w=
"100%"
display=
"flex"
columnGap=
{
3
}
>
<
Address
width=
"calc((100% - 48px) / 2)"
>
<
Address
width=
"calc((100% - 48px) / 2)"
>
...
...
ui/address/internals/AddressIntTxsTableItem.tsx
View file @
c61b982d
import
{
Tr
,
Td
,
Tag
,
Icon
,
Box
,
Flex
,
Text
}
from
'
@chakra-ui/react
'
;
import
{
Tr
,
Td
,
Tag
,
Icon
,
Box
,
Flex
,
Text
}
from
'
@chakra-ui/react
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
InternalTransaction
}
from
'
types/api/internalTransaction
'
;
import
type
{
InternalTransaction
}
from
'
types/api/internalTransaction
'
;
...
@@ -7,7 +8,6 @@ import type { InternalTransaction } from 'types/api/internalTransaction';
...
@@ -7,7 +8,6 @@ import type { InternalTransaction } from 'types/api/internalTransaction';
import
appConfig
from
'
configs/app/config
'
;
import
appConfig
from
'
configs/app/config
'
;
import
rightArrowIcon
from
'
icons/arrows/east.svg
'
;
import
rightArrowIcon
from
'
icons/arrows/east.svg
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
link
from
'
lib/link/link
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
AddressIcon
from
'
ui/shared/address/AddressIcon
'
;
import
AddressIcon
from
'
ui/shared/address/AddressIcon
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
...
@@ -58,7 +58,7 @@ const AddressIntTxsTableItem = ({
...
@@ -58,7 +58,7 @@ const AddressIntTxsTableItem = ({
</
Flex
>
</
Flex
>
</
Td
>
</
Td
>
<
Td
verticalAlign=
"middle"
>
<
Td
verticalAlign=
"middle"
>
<
LinkInternal
href=
{
link
(
'
block
'
,
{
id
:
block
.
toString
()
})
}
>
{
block
}
</
LinkInternal
>
<
LinkInternal
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
block
.
toString
()
}
})
}
>
{
block
}
</
LinkInternal
>
</
Td
>
</
Td
>
<
Td
verticalAlign=
"middle"
>
<
Td
verticalAlign=
"middle"
>
<
Address
display=
"inline-flex"
maxW=
"100%"
>
<
Address
display=
"inline-flex"
maxW=
"100%"
>
...
...
ui/block/BlockDetails.tsx
View file @
c61b982d
...
@@ -2,6 +2,7 @@ import { Grid, GridItem, Text, Icon, Link, Box, Tooltip } from '@chakra-ui/react
...
@@ -2,6 +2,7 @@ import { Grid, GridItem, Text, Icon, Link, Box, Tooltip } from '@chakra-ui/react
import
BigNumber
from
'
bignumber.js
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
capitalize
from
'
lodash/capitalize
'
;
import
capitalize
from
'
lodash/capitalize
'
;
import
{
useRouter
}
from
'
next/router
'
;
import
{
useRouter
}
from
'
next/router
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
{
scroller
,
Element
}
from
'
react-scroll
'
;
import
{
scroller
,
Element
}
from
'
react-scroll
'
;
...
@@ -13,8 +14,8 @@ import getBlockReward from 'lib/block/getBlockReward';
...
@@ -13,8 +14,8 @@ import getBlockReward from 'lib/block/getBlockReward';
import
{
WEI
,
WEI_IN_GWEI
,
ZERO
}
from
'
lib/consts
'
;
import
{
WEI
,
WEI_IN_GWEI
,
ZERO
}
from
'
lib/consts
'
;
import
dayjs
from
'
lib/date/dayjs
'
;
import
dayjs
from
'
lib/date/dayjs
'
;
import
{
space
}
from
'
lib/html-entities
'
;
import
{
space
}
from
'
lib/html-entities
'
;
import
link
from
'
lib/link/link
'
;
import
getNetworkValidatorTitle
from
'
lib/networks/getNetworkValidatorTitle
'
;
import
getNetworkValidatorTitle
from
'
lib/networks/getNetworkValidatorTitle
'
;
import
getQueryParamString
from
'
lib/router/getQueryParamString
'
;
import
BlockDetailsSkeleton
from
'
ui/block/details/BlockDetailsSkeleton
'
;
import
BlockDetailsSkeleton
from
'
ui/block/details/BlockDetailsSkeleton
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
CopyToClipboard
from
'
ui/shared/CopyToClipboard
'
;
import
CopyToClipboard
from
'
ui/shared/CopyToClipboard
'
;
...
@@ -30,10 +31,11 @@ import Utilization from 'ui/shared/Utilization/Utilization';
...
@@ -30,10 +31,11 @@ import Utilization from 'ui/shared/Utilization/Utilization';
const
BlockDetails
=
()
=>
{
const
BlockDetails
=
()
=>
{
const
[
isExpanded
,
setIsExpanded
]
=
React
.
useState
(
false
);
const
[
isExpanded
,
setIsExpanded
]
=
React
.
useState
(
false
);
const
router
=
useRouter
();
const
router
=
useRouter
();
const
height
=
getQueryParamString
(
router
.
query
.
height
);
const
{
data
,
isLoading
,
isError
,
error
}
=
useApiQuery
(
'
block
'
,
{
const
{
data
,
isLoading
,
isError
,
error
}
=
useApiQuery
(
'
block
'
,
{
pathParams
:
{
id
:
router
.
query
.
id
?.
toString
()
},
pathParams
:
{
height
},
queryOptions
:
{
enabled
:
Boolean
(
router
.
query
.
id
)
},
queryOptions
:
{
enabled
:
Boolean
(
height
)
},
});
});
const
handleCutClick
=
React
.
useCallback
(()
=>
{
const
handleCutClick
=
React
.
useCallback
(()
=>
{
...
@@ -46,10 +48,10 @@ const BlockDetails = () => {
...
@@ -46,10 +48,10 @@ const BlockDetails = () => {
const
handlePrevNextClick
=
React
.
useCallback
((
direction
:
'
prev
'
|
'
next
'
)
=>
{
const
handlePrevNextClick
=
React
.
useCallback
((
direction
:
'
prev
'
|
'
next
'
)
=>
{
const
increment
=
direction
===
'
next
'
?
+
1
:
-
1
;
const
increment
=
direction
===
'
next
'
?
+
1
:
-
1
;
const
nextId
=
String
(
Number
(
router
.
query
.
id
)
+
increment
);
const
nextId
=
String
(
Number
(
height
)
+
increment
);
router
.
push
({
pathname
:
'
/block/[
id]
'
,
query
:
{
id
:
nextId
}
},
undefined
);
router
.
push
({
pathname
:
'
/block/[
height]
'
,
query
:
{
height
:
nextId
}
},
undefined
);
},
[
router
]);
},
[
height
,
router
]);
if
(
isLoading
)
{
if
(
isLoading
)
{
return
<
BlockDetailsSkeleton
/>;
return
<
BlockDetailsSkeleton
/>;
...
@@ -115,7 +117,7 @@ const BlockDetails = () => {
...
@@ -115,7 +117,7 @@ const BlockDetails = () => {
title=
"Transactions"
title=
"Transactions"
hint=
"The number of transactions in the block."
hint=
"The number of transactions in the block."
>
>
<
LinkInternal
href=
{
link
(
'
block
'
,
{
id
:
router
.
query
.
id
},
{
tab
:
'
txs
'
})
}
>
<
LinkInternal
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
router
.
query
.
height
?.
toString
()
||
''
,
tab
:
'
txs
'
}
})
}
>
{
data
.
tx_count
}
transactions
{
data
.
tx_count
}
transactions
</
LinkInternal
>
</
LinkInternal
>
</
DetailsInfoItem
>
</
DetailsInfoItem
>
...
...
ui/blocks/BlocksListItem.tsx
View file @
c61b982d
import
{
Flex
,
Spinner
,
Text
,
Box
,
Icon
}
from
'
@chakra-ui/react
'
;
import
{
Flex
,
Spinner
,
Text
,
Box
,
Icon
}
from
'
@chakra-ui/react
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
capitalize
from
'
lodash/capitalize
'
;
import
capitalize
from
'
lodash/capitalize
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
Block
}
from
'
types/api/block
'
;
import
type
{
Block
}
from
'
types/api/block
'
;
...
@@ -9,7 +10,6 @@ import appConfig from 'configs/app/config';
...
@@ -9,7 +10,6 @@ import appConfig from 'configs/app/config';
import
flameIcon
from
'
icons/flame.svg
'
;
import
flameIcon
from
'
icons/flame.svg
'
;
import
getBlockTotalReward
from
'
lib/block/getBlockTotalReward
'
;
import
getBlockTotalReward
from
'
lib/block/getBlockTotalReward
'
;
import
{
WEI
}
from
'
lib/consts
'
;
import
{
WEI
}
from
'
lib/consts
'
;
import
link
from
'
lib/link/link
'
;
import
getNetworkValidatorTitle
from
'
lib/networks/getNetworkValidatorTitle
'
;
import
getNetworkValidatorTitle
from
'
lib/networks/getNetworkValidatorTitle
'
;
import
BlockTimestamp
from
'
ui/blocks/BlockTimestamp
'
;
import
BlockTimestamp
from
'
ui/blocks/BlockTimestamp
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
...
@@ -36,7 +36,7 @@ const BlocksListItem = ({ data, isPending, enableTimeIncrement }: Props) => {
...
@@ -36,7 +36,7 @@ const BlocksListItem = ({ data, isPending, enableTimeIncrement }: Props) => {
{
isPending
&&
<
Spinner
size=
"sm"
/>
}
{
isPending
&&
<
Spinner
size=
"sm"
/>
}
<
LinkInternal
<
LinkInternal
fontWeight=
{
600
}
fontWeight=
{
600
}
href=
{
link
(
'
block
'
,
{
id
:
String
(
data
.
height
)
})
}
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
data
.
height
)
}
})
}
>
>
{
data
.
height
}
{
data
.
height
}
</
LinkInternal
>
</
LinkInternal
>
...
@@ -54,7 +54,7 @@ const BlocksListItem = ({ data, isPending, enableTimeIncrement }: Props) => {
...
@@ -54,7 +54,7 @@ const BlocksListItem = ({ data, isPending, enableTimeIncrement }: Props) => {
<
Flex
columnGap=
{
2
}
>
<
Flex
columnGap=
{
2
}
>
<
Text
fontWeight=
{
500
}
>
Txn
</
Text
>
<
Text
fontWeight=
{
500
}
>
Txn
</
Text
>
{
data
.
tx_count
>
0
?
(
{
data
.
tx_count
>
0
?
(
<
LinkInternal
href=
{
link
(
'
block
'
,
{
id
:
String
(
data
.
height
)
},
{
tab
:
'
txs
'
})
}
>
<
LinkInternal
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
data
.
height
),
tab
:
'
txs
'
}
})
}
>
{
data
.
tx_count
}
{
data
.
tx_count
}
</
LinkInternal
>
</
LinkInternal
>
)
:
)
:
...
...
ui/blocks/BlocksTableItem.tsx
View file @
c61b982d
import
{
Tr
,
Td
,
Flex
,
Box
,
Icon
,
Tooltip
,
Spinner
,
useColorModeValue
}
from
'
@chakra-ui/react
'
;
import
{
Tr
,
Td
,
Flex
,
Box
,
Icon
,
Tooltip
,
Spinner
,
useColorModeValue
}
from
'
@chakra-ui/react
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
BigNumber
from
'
bignumber.js
'
;
import
{
motion
}
from
'
framer-motion
'
;
import
{
motion
}
from
'
framer-motion
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
Block
}
from
'
types/api/block
'
;
import
type
{
Block
}
from
'
types/api/block
'
;
...
@@ -8,7 +9,6 @@ import type { Block } from 'types/api/block';
...
@@ -8,7 +9,6 @@ import type { Block } from 'types/api/block';
import
flameIcon
from
'
icons/flame.svg
'
;
import
flameIcon
from
'
icons/flame.svg
'
;
import
getBlockTotalReward
from
'
lib/block/getBlockTotalReward
'
;
import
getBlockTotalReward
from
'
lib/block/getBlockTotalReward
'
;
import
{
WEI
}
from
'
lib/consts
'
;
import
{
WEI
}
from
'
lib/consts
'
;
import
link
from
'
lib/link/link
'
;
import
BlockTimestamp
from
'
ui/blocks/BlockTimestamp
'
;
import
BlockTimestamp
from
'
ui/blocks/BlockTimestamp
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
GasUsedToTargetRatio
from
'
ui/shared/GasUsedToTargetRatio
'
;
import
GasUsedToTargetRatio
from
'
ui/shared/GasUsedToTargetRatio
'
;
...
@@ -41,7 +41,7 @@ const BlocksTableItem = ({ data, isPending, enableTimeIncrement }: Props) => {
...
@@ -41,7 +41,7 @@ const BlocksTableItem = ({ data, isPending, enableTimeIncrement }: Props) => {
<
Tooltip
isDisabled=
{
data
.
type
!==
'
reorg
'
}
label=
"Chain reorganizations"
>
<
Tooltip
isDisabled=
{
data
.
type
!==
'
reorg
'
}
label=
"Chain reorganizations"
>
<
LinkInternal
<
LinkInternal
fontWeight=
{
600
}
fontWeight=
{
600
}
href=
{
link
(
'
block
'
,
{
id
:
String
(
data
.
height
)
})
}
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
data
.
height
)
}
})
}
>
>
{
data
.
height
}
{
data
.
height
}
</
LinkInternal
>
</
LinkInternal
>
...
@@ -55,7 +55,7 @@ const BlocksTableItem = ({ data, isPending, enableTimeIncrement }: Props) => {
...
@@ -55,7 +55,7 @@ const BlocksTableItem = ({ data, isPending, enableTimeIncrement }: Props) => {
</
Td
>
</
Td
>
<
Td
isNumeric
fontSize=
"sm"
>
<
Td
isNumeric
fontSize=
"sm"
>
{
data
.
tx_count
>
0
?
(
{
data
.
tx_count
>
0
?
(
<
LinkInternal
href=
{
link
(
'
block
'
,
{
id
:
String
(
data
.
height
)
},
{
tab
:
'
txs
'
})
}
>
<
LinkInternal
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
data
.
height
),
tab
:
'
txs
'
}
})
}
>
{
data
.
tx_count
}
{
data
.
tx_count
}
</
LinkInternal
>
</
LinkInternal
>
)
:
data
.
tx_count
}
)
:
data
.
tx_count
}
...
...
ui/home/LatestBlocks.tsx
View file @
c61b982d
import
{
Box
,
Heading
,
Flex
,
Text
,
VStack
,
Skeleton
}
from
'
@chakra-ui/react
'
;
import
{
Box
,
Heading
,
Flex
,
Text
,
VStack
,
Skeleton
}
from
'
@chakra-ui/react
'
;
import
{
useQueryClient
}
from
'
@tanstack/react-query
'
;
import
{
useQueryClient
}
from
'
@tanstack/react-query
'
;
import
{
AnimatePresence
}
from
'
framer-motion
'
;
import
{
AnimatePresence
}
from
'
framer-motion
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
SocketMessage
}
from
'
lib/socket/types
'
;
import
type
{
SocketMessage
}
from
'
lib/socket/types
'
;
...
@@ -9,7 +10,6 @@ import type { Block } from 'types/api/block';
...
@@ -9,7 +10,6 @@ import type { Block } from 'types/api/block';
import
useApiQuery
,
{
getResourceKey
}
from
'
lib/api/useApiQuery
'
;
import
useApiQuery
,
{
getResourceKey
}
from
'
lib/api/useApiQuery
'
;
import
useIsMobile
from
'
lib/hooks/useIsMobile
'
;
import
useIsMobile
from
'
lib/hooks/useIsMobile
'
;
import
{
nbsp
}
from
'
lib/html-entities
'
;
import
{
nbsp
}
from
'
lib/html-entities
'
;
import
link
from
'
lib/link/link
'
;
import
useSocketChannel
from
'
lib/socket/useSocketChannel
'
;
import
useSocketChannel
from
'
lib/socket/useSocketChannel
'
;
import
useSocketMessage
from
'
lib/socket/useSocketMessage
'
;
import
useSocketMessage
from
'
lib/socket/useSocketMessage
'
;
import
LinkInternal
from
'
ui/shared/LinkInternal
'
;
import
LinkInternal
from
'
ui/shared/LinkInternal
'
;
...
@@ -98,7 +98,7 @@ const LatestBlocks = () => {
...
@@ -98,7 +98,7 @@ const LatestBlocks = () => {
</
AnimatePresence
>
</
AnimatePresence
>
</
VStack
>
</
VStack
>
<
Flex
justifyContent=
"center"
>
<
Flex
justifyContent=
"center"
>
<
LinkInternal
fontSize=
"sm"
href=
{
link
(
'
blocks
'
)
}
>
View all blocks
</
LinkInternal
>
<
LinkInternal
fontSize=
"sm"
href=
{
route
({
pathname
:
'
/blocks
'
}
)
}
>
View all blocks
</
LinkInternal
>
</
Flex
>
</
Flex
>
</>
</>
);
);
...
...
ui/home/LatestBlocksItem.tsx
View file @
c61b982d
...
@@ -8,13 +8,13 @@ import {
...
@@ -8,13 +8,13 @@ import {
Text
,
Text
,
}
from
'
@chakra-ui/react
'
;
}
from
'
@chakra-ui/react
'
;
import
{
motion
}
from
'
framer-motion
'
;
import
{
motion
}
from
'
framer-motion
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
Block
}
from
'
types/api/block
'
;
import
type
{
Block
}
from
'
types/api/block
'
;
import
blockIcon
from
'
icons/block.svg
'
;
import
blockIcon
from
'
icons/block.svg
'
;
import
getBlockTotalReward
from
'
lib/block/getBlockTotalReward
'
;
import
getBlockTotalReward
from
'
lib/block/getBlockTotalReward
'
;
import
link
from
'
lib/link/link
'
;
import
BlockTimestamp
from
'
ui/blocks/BlockTimestamp
'
;
import
BlockTimestamp
from
'
ui/blocks/BlockTimestamp
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
LinkInternal
from
'
ui/shared/LinkInternal
'
;
import
LinkInternal
from
'
ui/shared/LinkInternal
'
;
...
@@ -44,7 +44,7 @@ const LatestBlocksItem = ({ block, h }: Props) => {
...
@@ -44,7 +44,7 @@ const LatestBlocksItem = ({ block, h }: Props) => {
<
HStack
spacing=
{
2
}
>
<
HStack
spacing=
{
2
}
>
<
Icon
as=
{
blockIcon
}
boxSize=
"30px"
color=
"link"
/>
<
Icon
as=
{
blockIcon
}
boxSize=
"30px"
color=
"link"
/>
<
LinkInternal
<
LinkInternal
href=
{
link
(
'
block
'
,
{
id
:
String
(
block
.
height
)
})
}
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
block
.
height
)
}
})
}
fontSize=
"xl"
fontSize=
"xl"
fontWeight=
"500"
fontWeight=
"500"
>
>
...
...
ui/home/Stats.tsx
View file @
c61b982d
import
{
Grid
}
from
'
@chakra-ui/react
'
;
import
{
Grid
}
from
'
@chakra-ui/react
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
appConfig
from
'
configs/app/config
'
;
import
appConfig
from
'
configs/app/config
'
;
...
@@ -45,7 +46,7 @@ const Stats = () => {
...
@@ -45,7 +46,7 @@ const Stats = () => {
icon=
{
blockIcon
}
icon=
{
blockIcon
}
title=
"Total blocks"
title=
"Total blocks"
value=
{
Number
(
data
.
total_blocks
).
toLocaleString
()
}
value=
{
Number
(
data
.
total_blocks
).
toLocaleString
()
}
url=
{
link
(
'
blocks
'
)
}
url=
{
route
({
pathname
:
'
/blocks
'
}
)
}
/>
/>
{
hasAvgBlockTime
&&
(
{
hasAvgBlockTime
&&
(
<
StatsItem
<
StatsItem
...
...
ui/pages/Block.tsx
View file @
c61b982d
...
@@ -6,6 +6,7 @@ import type { RoutedTab } from 'ui/shared/RoutedTabs/types';
...
@@ -6,6 +6,7 @@ import type { RoutedTab } from 'ui/shared/RoutedTabs/types';
import
{
useAppContext
}
from
'
lib/appContext
'
;
import
{
useAppContext
}
from
'
lib/appContext
'
;
import
useIsMobile
from
'
lib/hooks/useIsMobile
'
;
import
useIsMobile
from
'
lib/hooks/useIsMobile
'
;
import
useQueryWithPages
from
'
lib/hooks/useQueryWithPages
'
;
import
useQueryWithPages
from
'
lib/hooks/useQueryWithPages
'
;
import
getQueryParamString
from
'
lib/router/getQueryParamString
'
;
import
BlockDetails
from
'
ui/block/BlockDetails
'
;
import
BlockDetails
from
'
ui/block/BlockDetails
'
;
import
TextAd
from
'
ui/shared/ad/TextAd
'
;
import
TextAd
from
'
ui/shared/ad/TextAd
'
;
import
Page
from
'
ui/shared/Page/Page
'
;
import
Page
from
'
ui/shared/Page/Page
'
;
...
@@ -24,17 +25,19 @@ const BlockPageContent = () => {
...
@@ -24,17 +25,19 @@ const BlockPageContent = () => {
const
router
=
useRouter
();
const
router
=
useRouter
();
const
isMobile
=
useIsMobile
();
const
isMobile
=
useIsMobile
();
const
appProps
=
useAppContext
();
const
appProps
=
useAppContext
();
const
height
=
getQueryParamString
(
router
.
query
.
height
);
const
tab
=
getQueryParamString
(
router
.
query
.
tab
);
const
blockTxsQuery
=
useQueryWithPages
({
const
blockTxsQuery
=
useQueryWithPages
({
resourceName
:
'
block_txs
'
,
resourceName
:
'
block_txs
'
,
pathParams
:
{
id
:
router
.
query
.
id
?.
toString
()
},
pathParams
:
{
height
},
options
:
{
options
:
{
enabled
:
Boolean
(
router
.
query
.
id
&&
router
.
query
.
tab
===
'
txs
'
),
enabled
:
Boolean
(
height
&&
tab
===
'
txs
'
),
},
},
});
});
if
(
!
router
.
query
.
id
)
{
if
(
!
height
)
{
return
null
;
throw
new
Error
(
'
Block not found
'
,
{
cause
:
{
status
:
404
}
})
;
}
}
const
tabs
:
Array
<
RoutedTab
>
=
[
const
tabs
:
Array
<
RoutedTab
>
=
[
...
@@ -42,7 +45,7 @@ const BlockPageContent = () => {
...
@@ -42,7 +45,7 @@ const BlockPageContent = () => {
{
id
:
'
txs
'
,
title
:
'
Transactions
'
,
component
:
<
TxsContent
query=
{
blockTxsQuery
}
showBlockInfo=
{
false
}
showSocketInfo=
{
false
}
/>
},
{
id
:
'
txs
'
,
title
:
'
Transactions
'
,
component
:
<
TxsContent
query=
{
blockTxsQuery
}
showBlockInfo=
{
false
}
showSocketInfo=
{
false
}
/>
},
];
];
const
hasPagination
=
!
isMobile
&&
router
.
query
.
tab
===
'
txs
'
&&
blockTxsQuery
.
isPaginationVisible
;
const
hasPagination
=
!
isMobile
&&
tab
===
'
txs
'
&&
blockTxsQuery
.
isPaginationVisible
;
const
hasGoBackLink
=
appProps
.
referrer
&&
appProps
.
referrer
.
includes
(
'
/blocks
'
);
const
hasGoBackLink
=
appProps
.
referrer
&&
appProps
.
referrer
.
includes
(
'
/blocks
'
);
...
@@ -50,7 +53,7 @@ const BlockPageContent = () => {
...
@@ -50,7 +53,7 @@ const BlockPageContent = () => {
<
Page
>
<
Page
>
<
TextAd
mb=
{
6
}
/>
<
TextAd
mb=
{
6
}
/>
<
PageTitle
<
PageTitle
text=
{
`Block #${
router.query.id
}`
}
text=
{
`Block #${
height
}`
}
backLinkUrl=
{
hasGoBackLink
?
appProps
.
referrer
:
undefined
}
backLinkUrl=
{
hasGoBackLink
?
appProps
.
referrer
:
undefined
}
backLinkLabel=
"Back to blocks list"
backLinkLabel=
"Back to blocks list"
/>
/>
...
...
ui/searchResults/SearchResultListItem.tsx
View file @
c61b982d
import
{
Text
,
Flex
,
Icon
,
Box
,
chakra
}
from
'
@chakra-ui/react
'
;
import
{
Text
,
Flex
,
Icon
,
Box
,
chakra
}
from
'
@chakra-ui/react
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
SearchResultItem
}
from
'
types/api/search
'
;
import
type
{
SearchResultItem
}
from
'
types/api/search
'
;
...
@@ -56,7 +57,7 @@ const SearchResultListItem = ({ data, searchTerm }: Props) => {
...
@@ -56,7 +57,7 @@ const SearchResultListItem = ({ data, searchTerm }: Props) => {
return
(
return
(
<
Flex
alignItems=
"center"
>
<
Flex
alignItems=
"center"
>
<
Icon
as=
{
blockIcon
}
boxSize=
{
6
}
mr=
{
2
}
color=
"gray.500"
/>
<
Icon
as=
{
blockIcon
}
boxSize=
{
6
}
mr=
{
2
}
color=
"gray.500"
/>
<
LinkInternal
fontWeight=
{
700
}
href=
{
link
(
'
block
'
,
{
id
:
String
(
data
.
block_number
)
})
}
>
<
LinkInternal
fontWeight=
{
700
}
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
data
.
block_number
)
}
})
}
>
<
Box
as=
{
shouldHighlightHash
?
'
span
'
:
'
mark
'
}
>
{
data
.
block_number
}
</
Box
>
<
Box
as=
{
shouldHighlightHash
?
'
span
'
:
'
mark
'
}
>
{
data
.
block_number
}
</
Box
>
</
LinkInternal
>
</
LinkInternal
>
</
Flex
>
</
Flex
>
...
...
ui/searchResults/SearchResultTableItem.tsx
View file @
c61b982d
import
{
Tr
,
Td
,
Text
,
Flex
,
Icon
,
Box
}
from
'
@chakra-ui/react
'
;
import
{
Tr
,
Td
,
Text
,
Flex
,
Icon
,
Box
}
from
'
@chakra-ui/react
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
SearchResultItem
}
from
'
types/api/search
'
;
import
type
{
SearchResultItem
}
from
'
types/api/search
'
;
...
@@ -88,7 +89,7 @@ const SearchResultTableItem = ({ data, searchTerm }: Props) => {
...
@@ -88,7 +89,7 @@ const SearchResultTableItem = ({ data, searchTerm }: Props) => {
<
Td
fontSize=
"sm"
>
<
Td
fontSize=
"sm"
>
<
Flex
alignItems=
"center"
>
<
Flex
alignItems=
"center"
>
<
Icon
as=
{
blockIcon
}
boxSize=
{
6
}
mr=
{
2
}
color=
"gray.500"
/>
<
Icon
as=
{
blockIcon
}
boxSize=
{
6
}
mr=
{
2
}
color=
"gray.500"
/>
<
LinkInternal
fontWeight=
{
700
}
href=
{
link
(
'
block
'
,
{
id
:
String
(
data
.
block_number
)
})
}
>
<
LinkInternal
fontWeight=
{
700
}
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
data
.
block_number
)
}
})
}
>
<
Box
as=
{
shouldHighlightHash
?
'
span
'
:
'
mark
'
}
>
{
data
.
block_number
}
</
Box
>
<
Box
as=
{
shouldHighlightHash
?
'
span
'
:
'
mark
'
}
>
{
data
.
block_number
}
</
Box
>
</
LinkInternal
>
</
LinkInternal
>
</
Flex
>
</
Flex
>
...
...
ui/shared/address/AddressLink.tsx
View file @
c61b982d
import
{
chakra
,
shouldForwardProp
,
Tooltip
,
Box
}
from
'
@chakra-ui/react
'
;
import
{
chakra
,
shouldForwardProp
,
Tooltip
,
Box
}
from
'
@chakra-ui/react
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
type
{
HTMLAttributeAnchorTarget
}
from
'
react
'
;
import
type
{
HTMLAttributeAnchorTarget
}
from
'
react
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
...
@@ -27,7 +28,7 @@ type AddressTokenTxProps = {
...
@@ -27,7 +28,7 @@ type AddressTokenTxProps = {
type
BlockProps
=
{
type
BlockProps
=
{
type
:
'
block
'
;
type
:
'
block
'
;
hash
:
string
;
hash
:
string
;
id
:
string
;
height
:
string
;
}
}
type
AddressTokenProps
=
{
type
AddressTokenProps
=
{
...
@@ -48,7 +49,7 @@ const AddressLink = (props: Props) => {
...
@@ -48,7 +49,7 @@ const AddressLink = (props: Props) => {
}
else
if
(
type
===
'
token
'
)
{
}
else
if
(
type
===
'
token
'
)
{
url
=
link
(
'
token_index
'
,
{
hash
:
hash
});
url
=
link
(
'
token_index
'
,
{
hash
:
hash
});
}
else
if
(
type
===
'
block
'
)
{
}
else
if
(
type
===
'
block
'
)
{
url
=
link
(
'
block
'
,
{
id
:
props
.
id
});
url
=
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
props
.
height
}
});
}
else
if
(
type
===
'
address_token
'
)
{
}
else
if
(
type
===
'
address_token
'
)
{
url
=
link
(
'
address_index
'
,
{
id
:
hash
},
{
tab
:
'
token_transfers
'
,
token
:
props
.
tokenHash
,
scroll_to_tabs
:
'
true
'
});
url
=
link
(
'
address_index
'
,
{
id
:
hash
},
{
tab
:
'
token_transfers
'
,
token
:
props
.
tokenHash
,
scroll_to_tabs
:
'
true
'
});
}
else
{
}
else
{
...
...
ui/snippets/navigation/NavLink.tsx
View file @
c61b982d
import
{
Link
,
Icon
,
Text
,
HStack
,
Tooltip
,
Box
}
from
'
@chakra-ui/react
'
;
import
{
Link
,
Icon
,
Text
,
HStack
,
Tooltip
,
Box
}
from
'
@chakra-ui/react
'
;
import
type
{
LinkProps
}
from
'
next/link
'
;
import
NextLink
from
'
next/link
'
;
import
NextLink
from
'
next/link
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
NavItem
}
from
'
lib/hooks/useNavItems
'
;
import
getDefaultTransitionProps
from
'
theme/utils/getDefaultTransitionProps
'
;
import
getDefaultTransitionProps
from
'
theme/utils/getDefaultTransitionProps
'
;
import
useColors
from
'
./useColors
'
;
import
useColors
from
'
./useColors
'
;
interface
Props
{
type
Props
=
NavItem
&
{
isCollapsed
?:
boolean
;
isCollapsed
?:
boolean
;
isActive
?:
boolean
;
url
:
string
;
text
:
string
;
icon
:
React
.
FunctionComponent
<
React
.
SVGAttributes
<
SVGElement
>>
;
px
?:
string
|
number
;
px
?:
string
|
number
;
isNewUi
:
boolean
;
}
}
const
NavLink
=
({
text
,
url
,
icon
,
isCollapsed
,
isActive
,
px
,
isNewUi
}:
Props
)
=>
{
const
NavLink
=
({
text
,
nextRoute
,
icon
,
isCollapsed
,
isActive
,
px
,
isNewUi
}:
Props
)
=>
{
const
colors
=
useColors
();
const
colors
=
useColors
();
const
isExpanded
=
isCollapsed
===
false
;
const
isExpanded
=
isCollapsed
===
false
;
const
content
=
(
const
content
=
(
<
Link
<
Link
{
...
(
isNewUi
?
{}
:
{
href
:
url
})
}
{
...
(
isNewUi
?
{}
:
{
href
:
route
(
nextRoute
)
})
}
w=
{
{
base
:
'
100%
'
,
lg
:
isExpanded
?
'
180px
'
:
'
60px
'
,
xl
:
isCollapsed
?
'
60px
'
:
'
180px
'
}
}
w=
{
{
base
:
'
100%
'
,
lg
:
isExpanded
?
'
180px
'
:
'
60px
'
,
xl
:
isCollapsed
?
'
60px
'
:
'
180px
'
}
}
px=
{
px
||
{
base
:
3
,
lg
:
isExpanded
?
3
:
'
15px
'
,
xl
:
isCollapsed
?
'
15px
'
:
3
}
}
px=
{
px
||
{
base
:
3
,
lg
:
isExpanded
?
3
:
'
15px
'
,
xl
:
isCollapsed
?
'
15px
'
:
3
}
}
py=
{
2.5
}
py=
{
2.5
}
...
@@ -69,7 +65,7 @@ const NavLink = ({ text, url, icon, isCollapsed, isActive, px, isNewUi }: Props)
...
@@ -69,7 +65,7 @@ const NavLink = ({ text, url, icon, isCollapsed, isActive, px, isNewUi }: Props)
{
/* why not NextLink in all cases? since prev UI and new one are hosting in the same domain and global routing is managed by nginx */
}
{
/* why not NextLink in all cases? since prev UI and new one are hosting in the same domain and global routing is managed by nginx */
}
{
/* we have to hard reload page on every transition between urls from different part of the app */
}
{
/* we have to hard reload page on every transition between urls from different part of the app */
}
{
isNewUi
?
(
{
isNewUi
?
(
<
NextLink
href=
{
url
as
LinkProps
[
'
href
'
]
}
passHref
>
<
NextLink
href=
{
nextRoute
}
passHref
>
{
content
}
{
content
}
</
NextLink
>
</
NextLink
>
)
:
content
}
)
:
content
}
...
...
ui/snippets/searchBar/SearchBarSuggestItem.tsx
View file @
c61b982d
import
{
chakra
,
Text
,
Flex
,
useColorModeValue
,
Icon
,
Box
}
from
'
@chakra-ui/react
'
;
import
{
chakra
,
Text
,
Flex
,
useColorModeValue
,
Icon
,
Box
}
from
'
@chakra-ui/react
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
SearchResultItem
}
from
'
types/api/search
'
;
import
type
{
SearchResultItem
}
from
'
types/api/search
'
;
...
@@ -32,7 +33,7 @@ const SearchBarSuggestItem = ({ data, isMobile, searchTerm }: Props) => {
...
@@ -32,7 +33,7 @@ const SearchBarSuggestItem = ({ data, isMobile, searchTerm }: Props) => {
return
link
(
'
tx
'
,
{
id
:
data
.
tx_hash
});
return
link
(
'
tx
'
,
{
id
:
data
.
tx_hash
});
}
}
case
'
block
'
:
{
case
'
block
'
:
{
return
link
(
'
block
'
,
{
id
:
String
(
data
.
block_number
)
});
return
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
String
(
data
.
block_number
)
}
});
}
}
}
}
})();
})();
...
...
ui/txs/TxsListItem.tsx
View file @
c61b982d
...
@@ -5,6 +5,7 @@ import {
...
@@ -5,6 +5,7 @@ import {
Icon
,
Icon
,
Text
,
Text
,
}
from
'
@chakra-ui/react
'
;
}
from
'
@chakra-ui/react
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
Transaction
}
from
'
types/api/transaction
'
;
import
type
{
Transaction
}
from
'
types/api/transaction
'
;
...
@@ -14,7 +15,6 @@ import rightArrowIcon from 'icons/arrows/east.svg';
...
@@ -14,7 +15,6 @@ import rightArrowIcon from 'icons/arrows/east.svg';
import
transactionIcon
from
'
icons/transactions.svg
'
;
import
transactionIcon
from
'
icons/transactions.svg
'
;
import
getValueWithUnit
from
'
lib/getValueWithUnit
'
;
import
getValueWithUnit
from
'
lib/getValueWithUnit
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
link
from
'
lib/link/link
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
AddressIcon
from
'
ui/shared/address/AddressIcon
'
;
import
AddressIcon
from
'
ui/shared/address/AddressIcon
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
...
@@ -88,7 +88,7 @@ const TxsListItem = ({ tx, showBlockInfo, currentAddress, enableTimeIncrement }:
...
@@ -88,7 +88,7 @@ const TxsListItem = ({ tx, showBlockInfo, currentAddress, enableTimeIncrement }:
{
showBlockInfo
&&
tx
.
block
!==
null
&&
(
{
showBlockInfo
&&
tx
.
block
!==
null
&&
(
<
Box
mt=
{
2
}
>
<
Box
mt=
{
2
}
>
<
Text
as=
"span"
>
Block
</
Text
>
<
Text
as=
"span"
>
Block
</
Text
>
<
LinkInternal
href=
{
link
(
'
block
'
,
{
id
:
tx
.
block
.
toString
()
})
}
>
{
tx
.
block
}
</
LinkInternal
>
<
LinkInternal
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
tx
.
block
.
toString
()
}
})
}
>
{
tx
.
block
}
</
LinkInternal
>
</
Box
>
</
Box
>
)
}
)
}
<
Flex
alignItems=
"center"
height=
{
6
}
mt=
{
6
}
>
<
Flex
alignItems=
"center"
height=
{
6
}
mt=
{
6
}
>
...
...
ui/txs/TxsTableItem.tsx
View file @
c61b982d
...
@@ -10,13 +10,13 @@ import {
...
@@ -10,13 +10,13 @@ import {
Hide
,
Hide
,
}
from
'
@chakra-ui/react
'
;
}
from
'
@chakra-ui/react
'
;
import
{
motion
}
from
'
framer-motion
'
;
import
{
motion
}
from
'
framer-motion
'
;
import
{
route
}
from
'
nextjs-routes
'
;
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
type
{
Transaction
}
from
'
types/api/transaction
'
;
import
type
{
Transaction
}
from
'
types/api/transaction
'
;
import
rightArrowIcon
from
'
icons/arrows/east.svg
'
;
import
rightArrowIcon
from
'
icons/arrows/east.svg
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
useTimeAgoIncrement
from
'
lib/hooks/useTimeAgoIncrement
'
;
import
link
from
'
lib/link/link
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
Address
from
'
ui/shared/address/Address
'
;
import
AddressIcon
from
'
ui/shared/address/AddressIcon
'
;
import
AddressIcon
from
'
ui/shared/address/AddressIcon
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
import
AddressLink
from
'
ui/shared/address/AddressLink
'
;
...
@@ -99,7 +99,7 @@ const TxsTableItem = ({ tx, showBlockInfo, currentAddress, enableTimeIncrement }
...
@@ -99,7 +99,7 @@ const TxsTableItem = ({ tx, showBlockInfo, currentAddress, enableTimeIncrement }
</
Td
>
</
Td
>
{
showBlockInfo
&&
(
{
showBlockInfo
&&
(
<
Td
>
<
Td
>
{
tx
.
block
&&
<
LinkInternal
href=
{
link
(
'
block
'
,
{
id
:
tx
.
block
.
toString
()
})
}
>
{
tx
.
block
}
</
LinkInternal
>
}
{
tx
.
block
&&
<
LinkInternal
href=
{
route
({
pathname
:
'
/block/[height]
'
,
query
:
{
height
:
tx
.
block
.
toString
()
}
})
}
>
{
tx
.
block
}
</
LinkInternal
>
}
</
Td
>
</
Td
>
)
}
)
}
<
Show
above=
"xl"
ssr=
{
false
}
>
<
Show
above=
"xl"
ssr=
{
false
}
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment