diff --git a/package-lock.json b/package-lock.json index 763ac65..ab4af7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "next": "12.3.1", "react": "18.2.0", "react-dom": "18.2.0", + "swr": "^1.3.0", "tiny-relative-date": "^1.3.0" }, "devDependencies": { @@ -6446,6 +6447,14 @@ "node": ">=10.13.0" } }, + "node_modules/swr": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-1.3.0.tgz", + "integrity": "sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==", + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/text-table": { "version": "0.2.0", "dev": true, @@ -10829,6 +10838,12 @@ "stable": "^0.1.8" } }, + "swr": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-1.3.0.tgz", + "integrity": "sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==", + "requires": {} + }, "text-table": { "version": "0.2.0", "dev": true diff --git a/package.json b/package.json index a732b71..ecf1295 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "next": "12.3.1", "react": "18.2.0", "react-dom": "18.2.0", + "swr": "^1.3.0", "tiny-relative-date": "^1.3.0" }, "devDependencies": { diff --git a/src/pages/index.tsx b/src/pages/index.tsx index d1eb46d..37caf59 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,6 +1,6 @@ import Head from 'next/head' -import React, { Fragment, ReactElement, useEffect, useState } from 'react' -import { State, Status } from '../@types' +import React, { Fragment, ReactElement } from 'react' +import { State } from '../@types' import styles from '../styles/Home.module.css' import { getData } from '../utils/getData' import LogoAsset from '../images/logo.svg' @@ -9,6 +9,7 @@ import GithubAsset from '../images/github.svg' import addresses from '@oceanprotocol/contracts/addresses/address.json' import { statusApiUri } from '../../app.config' import relativeDate from 'tiny-relative-date' +import useSWR from 'swr' function statusIcon(state: State): ReactElement { if (state === State.Normal) { @@ -31,20 +32,10 @@ function statusStyle(state: State) { } export default function HomePage(): ReactElement { - const [data, setData] = useState<{ [key: string]: Status }>() - const [isLoading, setIsloading] = useState() - const [error, setError] = useState() - - useEffect(() => { - async function getStatuses() { - setIsloading(true) - const data = await getData() - if (!data) setError(`Could not get data from ${statusApiUri}`) - setData(data) - setIsloading(false) - } - getStatuses() - }, []) + const { data, error } = useSWR(statusApiUri, getData, { + refreshInterval: 60000 + }) + const isLoading = !data && !error return (
diff --git a/src/utils/getData.ts b/src/utils/getData.ts index 342e2ec..bffc15a 100644 --- a/src/utils/getData.ts +++ b/src/utils/getData.ts @@ -1,10 +1,9 @@ import axios, { AxiosResponse } from 'axios' import { Status } from '../@types' -import { statusApiUri } from '../../app.config' -export async function getData(): Promise<{ [key: string]: Status }> { +export async function getData(url: string): Promise<{ [key: string]: Status }> { try { - const response: AxiosResponse = await axios.get(`${statusApiUri}`) + const response: AxiosResponse = await axios.get(url) if (!response?.data || response.status !== 200) throw Error('ERROR: no data recieved')