@@ -3,8 +3,8 @@ import Token from '@depay/web3-tokens-evm';
33import React , { useState , useEffect } from 'react' ;
44import Blockchains from '@depay/web3-blockchains' ;
55
6- let supported = [ 'ethereum' , 'bsc' , 'polygon' , 'fantom' , 'velas ' ] ;
7- supported . evm = [ 'ethereum' , 'bsc' , 'polygon' , 'fantom' , 'velas ' ] ;
6+ let supported = [ 'ethereum' , 'bsc' , 'polygon' , 'fantom' , 'arbitrum' , 'avalanche' , 'gnosis' , 'optimism '] ;
7+ supported . evm = [ 'ethereum' , 'bsc' , 'polygon' , 'fantom' , 'arbitrum' , 'avalanche' , 'gnosis' , 'optimism '] ;
88supported . solana = [ ] ;
99
1010const _jsxFileName = "/Users/sebastian/Work/DePay/react-token-image/src/index.js" ; function _optionalChain ( ops ) { let lastAccessLHS = undefined ; let value = ops [ 0 ] ; let i = 1 ; while ( i < ops . length ) { const op = ops [ i ] ; const fn = ops [ i + 1 ] ; i += 2 ; if ( ( op === 'optionalAccess' || op === 'optionalCall' ) && value == null ) { return undefined ; } if ( op === 'access' || op === 'optionalAccess' ) { lastAccessLHS = value ; value = fn ( value ) ; } else if ( op === 'call' || op === 'optionalCall' ) { value = fn ( ( ...args ) => value . call ( lastAccessLHS , ...args ) ) ; lastAccessLHS = undefined ; } } return value ; }
@@ -15,34 +15,46 @@ const UNKNOWN_IMAGE = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmN
1515
1616let TokenImage = function ( props ) {
1717
18- const [ src , _setSrc ] = useState ( ) ;
19- const [ source , setSource ] = useState ( ) ;
18+ const [ src , setSrc ] = useState ( ) ;
19+ const [ source , _setSource ] = useState ( ) ;
2020
2121 const blockchain = props . blockchain . toLowerCase ( ) ;
2222 const address = props . address ;
2323 const id = props . id ;
2424 const date = new Date ( ) ;
25- const localStorageKey = [ 'react-token-image' , blockchain , address , [ date . getFullYear ( ) , date . getMonth ( ) , date . getDate ( ) ] . join ( '-' ) ] . join ( '-' ) ;
25+ const getLocalStorageKey = ( blockchain , address ) => {
26+ return [
27+ 'react-token-image' ,
28+ blockchain ,
29+ address ,
30+ [ date . getFullYear ( ) , date . getMonth ( ) , date . getDate ( ) ] . join ( '-' )
31+ ] . join ( '-' )
32+ } ;
2633
27- const setSrc = ( _src ) => {
28- localStorage . setItem ( localStorageKey , _src ) ;
29- _setSrc ( _src ) ;
34+ const setSource = ( src , source ) => {
35+ setSrc ( src ) ;
36+ _setSource ( source ) ;
37+ if ( source != 'unknown' ) {
38+ localStorage . setItem ( getLocalStorageKey ( blockchain , address ) , src ) ;
39+ }
3040 } ;
3141
3242 useEffect ( ( ) => {
33- const storedImage = localStorage . getItem ( localStorageKey ) ;
34- if ( storedImage && storedImage . length && storedImage != UNKNOWN_IMAGE ) { return setSrc ( storedImage ) }
43+ const storedImage = localStorage . getItem ( getLocalStorageKey ( blockchain , address ) ) ;
44+ if ( storedImage && storedImage . length && storedImage != UNKNOWN_IMAGE ) {
45+ return setSource ( storedImage , 'stored' )
46+ }
3547 const foundMajorToken = Blockchains [ blockchain ] . tokens . find ( ( token ) => token . address . toLowerCase ( ) === address . toLowerCase ( ) ) ;
3648 if ( foundMajorToken ) {
37- setSrc ( foundMajorToken . logo ) ;
49+ setSource ( foundMajorToken . logo , 'web3-blockchains' ) ;
3850 } else {
3951 if ( supported . evm . includes ( blockchain ) ) {
40- setSource ( 'repository' ) ;
41- setSrc ( logoFromRepository ( { blockchain, address } ) ) ;
52+ setSource ( logoFromRepository ( { blockchain, address } ) , 'repository' ) ;
4253 } else if ( blockchain === 'solana' ) {
43- setSource ( 'metaplex' ) ;
4454 logoFromMetaplex ( { blockchain, address } ) . then ( ( image ) => {
45- setSrc ( image ) ;
55+ setSource ( image , 'metaplex' ) ;
56+ } ) . catch ( ( error ) => {
57+ setSource ( logoFromRepository ( { blockchain, address } ) , 'repository' ) ;
4658 } ) ;
4759 }
4860 }
@@ -69,6 +81,7 @@ let TokenImage = function(props){
6981 api : Token . solana . METADATA_LAYOUT ,
7082 cache : 86400000 , // 1 day
7183 } ) ;
84+
7285
7386 if ( _optionalChain ( [ metaData , 'optionalAccess' , _ => _ . data , 'optionalAccess' , _2 => _2 . uri ] ) ) {
7487
@@ -80,26 +93,22 @@ let TokenImage = function(props){
8093 if ( json && json . image ) {
8194 resolve ( json . image ) ;
8295 } else {
83- resolve ( ' ') ;
96+ reject ( 'image not found on metaplex ') ;
8497 }
85- } ) . catch ( ( ) => resolve ( ' ') ) ;
98+ } ) . catch ( ( ) => reject ( 'image not found on metaplex ') ) ;
8699 } else {
87- resolve ( ' ') ;
100+ reject ( 'image not found on metaplex ') ;
88101 }
89102 } else {
90- resolve ( ' ') ;
103+ reject ( 'image not found on metaplex ') ;
91104 }
92105
93- } catch ( e ) { resolve ( ' ') ; }
106+ } catch ( e ) { reject ( 'image not found on metaplex ') ; }
94107 } )
95108 } ;
96109
97110 const logoFromRepository = ( { blockchain, address } ) => {
98- if ( [ 'ethereum' , 'bsc' , 'polygon' , 'fantom' , 'solana' ] . includes ( blockchain ) ) {
99- return `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/${ mapBlockchainNameToTrustWalletAssets ( blockchain ) } /assets/${ address } /logo.png`
100- } else if ( blockchain == 'velas' ) {
101- return `https://raw.githubusercontent.com/wagyuswapapp/assets/master/blockchains/velas/assets/${ address . toLowerCase ( ) } /logo.png`
102- }
111+ return `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/${ mapBlockchainNameToTrustWalletAssets ( blockchain ) } /assets/${ address } /logo.png`
103112 } ;
104113
105114 const mapBlockchainNameToTrustWalletAssets = ( blockchain ) => {
@@ -128,8 +137,7 @@ let TokenImage = function(props){
128137 } ;
129138
130139 const setUnknown = ( ) => {
131- setSource ( 'unknown' ) ;
132- setSrc ( UNKNOWN_IMAGE ) ;
140+ setSource ( UNKNOWN_IMAGE , 'unknown' ) ;
133141 } ;
134142
135143 const uriToImage = ( tokenURI ) => {
@@ -147,8 +155,7 @@ let TokenImage = function(props){
147155 if ( image . match ( / ^ i p f s / ) ) {
148156 image = `https://ipfs.io/ipfs/${ image . split ( '://' ) [ 1 ] } ` ;
149157 }
150- setSource ( 'meta' ) ;
151- setSrc ( image ) ;
158+ setSource ( image , 'meta' ) ;
152159 } else {
153160 setUnknown ( ) ;
154161 }
@@ -157,12 +164,13 @@ let TokenImage = function(props){
157164 } ;
158165
159166 const handleLoadError = ( error ) => {
167+ delete localStorage [ getLocalStorageKey ( blockchain , address ) ] ;
160168 if ( source == 'metaplex' ) {
161- setSource ( 'repository' ) ;
162- setSrc ( logoFromRepository ( { blockchain, address } ) ) ;
169+ setSource ( logoFromRepository ( { blockchain, address } ) , 'repository' ) ;
170+ } else if ( source == 'web3-blockchains' ) {
171+ setSource ( logoFromRepository ( { blockchain, address } ) , 'repository' ) ;
163172 } else if ( source == 'repository' ) {
164- setSource ( 'depay' ) ;
165- setSrc ( `https://integrate.depay.com/tokens/${ blockchain } /${ address } /image` ) ;
173+ setSource ( `https://integrate.depay.com/tokens/${ blockchain } /${ address } /image` , 'depay' ) ;
166174 } else if ( source == 'depay' && supported . evm . includes ( blockchain ) ) {
167175 if ( id ) {
168176 request ( { blockchain, address, api : uriAPI , method : 'uri' , params : [ id ] } ) . then ( ( uri ) => {
@@ -177,13 +185,17 @@ let TokenImage = function(props){
177185 }
178186 } ;
179187
180- if ( src == undefined ) { return null }
188+ if ( src == undefined ) {
189+ return (
190+ React . createElement ( 'div' , { className : props . className , __self : this , __source : { fileName : _jsxFileName , lineNumber : 197 } } )
191+ )
192+ }
181193
182194 return (
183195 React . createElement ( 'img' , {
184196 className : props . className ,
185197 src : src ,
186- onError : handleLoadError , __self : this , __source : { fileName : _jsxFileName , lineNumber : 190 } }
198+ onError : handleLoadError , __self : this , __source : { fileName : _jsxFileName , lineNumber : 202 } }
187199 )
188200 )
189201} ;
0 commit comments