|
1 | 1 | import { createContext, FC, ReactNode, useContext, useState } from 'react' |
| 2 | +import { getEvmBech32Address, isValidEthAddress } from '../../utils/helpers' |
2 | 3 |
|
3 | 4 | interface HoverHighlightingContextInfo { |
4 | | - readonly highlightedAddress: string | undefined |
5 | | - highlightAddress: (value: string) => void |
| 5 | + shouldHighlight: (address: string) => boolean |
| 6 | + selectAddress: (value: string) => void |
6 | 7 | releaseAddress: (value: string) => void |
7 | 8 | } |
8 | 9 |
|
9 | 10 | const HoverHighlightingContext = createContext<HoverHighlightingContextInfo | null>(null) |
10 | 11 |
|
11 | 12 | const noContext: HoverHighlightingContextInfo = { |
12 | | - highlightedAddress: undefined, |
13 | | - highlightAddress: () => {}, |
| 13 | + shouldHighlight: () => false, |
| 14 | + selectAddress: () => {}, |
14 | 15 | releaseAddress: () => {}, |
15 | 16 | } |
16 | 17 |
|
| 18 | +/** |
| 19 | + * Convert highlight address to a uniform format: |
| 20 | + */ |
| 21 | +const normalizeAddress = (address: string) => |
| 22 | + isValidEthAddress(address) |
| 23 | + ? getEvmBech32Address(address).toLowerCase() // We always want oasis address, not eth |
| 24 | + : address.toLowerCase() // wherever else this is, just lowercase it |
| 25 | + |
17 | 26 | export const HoverHighlightingContextProvider: FC<{ children: ReactNode }> = ({ children }) => { |
18 | | - const [address, setAddress] = useState<string | undefined>() |
19 | | - const releaseAddress = (oldAddress: string) => { |
20 | | - if (address === oldAddress) setAddress(undefined) |
| 27 | + const [selectedAddress, setSelectedAddress] = useState<string | undefined>() |
| 28 | + const shouldHighlight = (address: string) => |
| 29 | + !!selectedAddress && selectedAddress === normalizeAddress(address) |
| 30 | + const selectAddress = (address: string) => setSelectedAddress(normalizeAddress(address)) |
| 31 | + const releaseAddress = (address: string) => { |
| 32 | + if (selectedAddress === normalizeAddress(address)) setSelectedAddress(undefined) |
21 | 33 | } |
22 | 34 | return ( |
23 | 35 | <HoverHighlightingContext.Provider |
24 | 36 | value={{ |
25 | | - highlightedAddress: address, |
26 | | - highlightAddress: setAddress, |
| 37 | + shouldHighlight, |
| 38 | + selectAddress, |
27 | 39 | releaseAddress, |
28 | 40 | }} |
29 | 41 | > |
|
0 commit comments