diff --git a/explorer/.npmrc b/explorer/.npmrc new file mode 100644 index 00000000..cffe8cde --- /dev/null +++ b/explorer/.npmrc @@ -0,0 +1 @@ +save-exact=true diff --git a/explorer/package-lock.json b/explorer/package-lock.json index 0d7021a5..035414c0 100644 --- a/explorer/package-lock.json +++ b/explorer/package-lock.json @@ -22,6 +22,7 @@ "antd": "^4.15.4", "babel-plugin-module-resolver": "^4.0.0", "bridge": "file:./wasm/core", + "bs58": "4.0.1", "core-js": "2.6.10", "dotenv": "^8.2.0", "esm": "^3.2.25", @@ -42,7 +43,7 @@ "react": "^16.12.0", "react-dom": "^16.12.0", "react-helmet": "^5.2.1", - "react-time-ago": "^6.2.2", + "react-time-ago": "^7.1.3", "token_bridge": "file:./wasm/token" }, "devDependencies": { @@ -54,6 +55,7 @@ "@storybook/react": "^5.3.13", "@testing-library/jest-dom": "^5.1.1", "@testing-library/react": "^9.4.0", + "@types/bs58": "4.0.1", "@types/google-protobuf": "^3.15.2", "@types/javascript-time-ago": "^2.0.2", "@types/jest": "^25.1.3", @@ -6178,6 +6180,15 @@ "@types/node": "*" } }, + "node_modules/@types/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA==", + "dev": true, + "dependencies": { + "base-x": "^3.0.6" + } + }, "node_modules/@types/common-tags": { "version": "1.8.0", "integrity": "sha512-htRqZr5qn8EzMelhX/Xmx142z218lLyGaeZ3YR8jlze4TATRU9huKKvuBmAJEW4LCC4pnY1N6JAm6p85fMHjhg==" @@ -18535,10 +18546,12 @@ } }, "node_modules/javascript-time-ago": { - "version": "2.3.5", - "integrity": "sha512-e1/cNro8WnheBWc6PTN5zYqZUmtu96AmH7xjAYkBL1TN8C8lJm0PDvt4g5DlYwkMlRWyzD++xoPS3ldmV6Aj8A==", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/javascript-time-ago/-/javascript-time-ago-2.3.10.tgz", + "integrity": "sha512-eeZx3B8ACZpFTiaow4Xl3YTIG9UjebwVjHEDnKyzJ1NBve1ZqJIgy97yoT9Esw+Vf+XgSk4YCpOsyK5X/ByRzQ==", + "peer": true, "dependencies": { - "relative-time-format": "^1.0.5" + "relative-time-format": "^1.0.6" } }, "node_modules/jayson": { @@ -24712,14 +24725,15 @@ } }, "node_modules/react-time-ago": { - "version": "6.2.2", - "integrity": "sha512-8X4GDw3V9sUs4DJtGDkNzasmT2+TPrP911SYlnQpcY8qj4Byk1JwLhgjlhN8zP1ugrTxOUFuEeYi5pZLlYmMpg==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/react-time-ago/-/react-time-ago-7.1.3.tgz", + "integrity": "sha512-H+mhWft++gNt2x8Y9eAZ9vYwL6giPDnVIo68Ty7xFTJ2L+Tt7cyZ1sbMkTMKzHeeaQ+J8F2vt3PatdW6mFJmWQ==", "dependencies": { - "javascript-time-ago": "^2.3.3", "prop-types": "^15.7.2", "raf": "^3.4.1" }, "peerDependencies": { + "javascript-time-ago": "^2.3.7", "react": ">=0.16.8", "react-dom": ">=0.16.8" } @@ -25020,8 +25034,10 @@ } }, "node_modules/relative-time-format": { - "version": "1.0.5", - "integrity": "sha512-MAgx/YKcUQYJpIaWcfetPstElnWf26JxVis4PirdwVrrymFdbxyCSm6yENpfB1YuwFbtHSHksN3aBajVNxk10Q==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/relative-time-format/-/relative-time-format-1.0.6.tgz", + "integrity": "sha512-voemOJLxlKun4P1fAo4PEg2WXNGjhqfE/G8Xen4gcy24Hyu/djn5bT5axmhx4MnjynoZ8f0HCOjk3RZpsY6X/g==", + "peer": true }, "node_modules/remark-mdx": { "version": "2.0.0-next.9", @@ -34874,6 +34890,15 @@ "@types/node": "*" } }, + "@types/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA==", + "dev": true, + "requires": { + "base-x": "^3.0.6" + } + }, "@types/common-tags": { "version": "1.8.0", "integrity": "sha512-htRqZr5qn8EzMelhX/Xmx142z218lLyGaeZ3YR8jlze4TATRU9huKKvuBmAJEW4LCC4pnY1N6JAm6p85fMHjhg==" @@ -44653,10 +44678,12 @@ } }, "javascript-time-ago": { - "version": "2.3.5", - "integrity": "sha512-e1/cNro8WnheBWc6PTN5zYqZUmtu96AmH7xjAYkBL1TN8C8lJm0PDvt4g5DlYwkMlRWyzD++xoPS3ldmV6Aj8A==", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/javascript-time-ago/-/javascript-time-ago-2.3.10.tgz", + "integrity": "sha512-eeZx3B8ACZpFTiaow4Xl3YTIG9UjebwVjHEDnKyzJ1NBve1ZqJIgy97yoT9Esw+Vf+XgSk4YCpOsyK5X/ByRzQ==", + "peer": true, "requires": { - "relative-time-format": "^1.0.5" + "relative-time-format": "^1.0.6" } }, "jayson": { @@ -49424,10 +49451,10 @@ } }, "react-time-ago": { - "version": "6.2.2", - "integrity": "sha512-8X4GDw3V9sUs4DJtGDkNzasmT2+TPrP911SYlnQpcY8qj4Byk1JwLhgjlhN8zP1ugrTxOUFuEeYi5pZLlYmMpg==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/react-time-ago/-/react-time-ago-7.1.3.tgz", + "integrity": "sha512-H+mhWft++gNt2x8Y9eAZ9vYwL6giPDnVIo68Ty7xFTJ2L+Tt7cyZ1sbMkTMKzHeeaQ+J8F2vt3PatdW6mFJmWQ==", "requires": { - "javascript-time-ago": "^2.3.3", "prop-types": "^15.7.2", "raf": "^3.4.1" } @@ -49666,8 +49693,10 @@ "dev": true }, "relative-time-format": { - "version": "1.0.5", - "integrity": "sha512-MAgx/YKcUQYJpIaWcfetPstElnWf26JxVis4PirdwVrrymFdbxyCSm6yENpfB1YuwFbtHSHksN3aBajVNxk10Q==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/relative-time-format/-/relative-time-format-1.0.6.tgz", + "integrity": "sha512-voemOJLxlKun4P1fAo4PEg2WXNGjhqfE/G8Xen4gcy24Hyu/djn5bT5axmhx4MnjynoZ8f0HCOjk3RZpsY6X/g==", + "peer": true }, "remark-mdx": { "version": "2.0.0-next.9", diff --git a/explorer/package.json b/explorer/package.json index 1a9be026..445bae35 100644 --- a/explorer/package.json +++ b/explorer/package.json @@ -61,6 +61,7 @@ "antd": "^4.15.4", "babel-plugin-module-resolver": "^4.0.0", "bridge": "file:./wasm/core", + "bs58": "4.0.1", "core-js": "2.6.10", "dotenv": "^8.2.0", "esm": "^3.2.25", @@ -81,7 +82,7 @@ "react": "^16.12.0", "react-dom": "^16.12.0", "react-helmet": "^5.2.1", - "react-time-ago": "^6.2.2", + "react-time-ago": "^7.1.3", "token_bridge": "file:./wasm/token" }, "devDependencies": { @@ -93,6 +94,7 @@ "@storybook/react": "^5.3.13", "@testing-library/jest-dom": "^5.1.1", "@testing-library/react": "^9.4.0", + "@types/bs58": "4.0.1", "@types/google-protobuf": "^3.15.2", "@types/javascript-time-ago": "^2.0.2", "@types/jest": "^25.1.3", diff --git a/explorer/src/components/ExplorerStats/ExplorerStats.tsx b/explorer/src/components/ExplorerStats/ExplorerStats.tsx index 1edcf25a..6d0beb11 100644 --- a/explorer/src/components/ExplorerStats/ExplorerStats.tsx +++ b/explorer/src/components/ExplorerStats/ExplorerStats.tsx @@ -135,8 +135,10 @@ const Stats: React.FC = ({ emitterChain, emitterAddress }) => { const { signal } = newController; // start polling let interval = setInterval(() => { - getData({ emitterChain, emitterAddress }, baseUrl, signal) - }, 4000) + getData({ emitterChain, emitterAddress }, baseUrl, signal).catch(err => { + console.error('failed fetching data. err: ', err) + }) + }, 5000) setPollInterval(interval) } } diff --git a/explorer/src/components/ExplorerStats/RecentMessages.tsx b/explorer/src/components/ExplorerStats/RecentMessages.tsx index ae66e07c..686cd2d7 100644 --- a/explorer/src/components/ExplorerStats/RecentMessages.tsx +++ b/explorer/src/components/ExplorerStats/RecentMessages.tsx @@ -19,6 +19,7 @@ import { ReactComponent as EthereumIcon } from '~/icons/ethereum.svg'; import { ReactComponent as SolanaIcon } from '~/icons/solana.svg'; import { ReactComponent as TerraIcon } from '~/icons/terra.svg'; import { ReactComponent as PolygonIcon } from '~/icons/polygon.svg' +import { formatQuorumDate } from '~/utils/misc/utils'; interface RecentMessagesProps { recent: Recent @@ -77,7 +78,7 @@ const RecentMessages = (props: RecentMessagesProps) => { title: "attested", dataIndex: "QuorumTime", key: "time", - render: QuorumTime => + render: QuorumTime => }, { diff --git a/explorer/src/utils/misc/utils.ts b/explorer/src/utils/misc/utils.ts new file mode 100644 index 00000000..37e88e2d --- /dev/null +++ b/explorer/src/utils/misc/utils.ts @@ -0,0 +1,11 @@ + +type ISOString = string +const formatQuorumDate = (date: string): ISOString | string => { + if (date.includes(" +0000 UTC")) { + const formatted = date.replace(" +0000 UTC", "Z").replace(" ", "T") + return formatted + } + return date +} + +export { formatQuorumDate }