otterscan/src/Home.tsx

102 lines
3.6 KiB
TypeScript
Raw Normal View History

2021-07-08 19:02:42 +00:00
import React, { useState, useContext } from "react";
2021-07-01 18:21:40 +00:00
import { NavLink, useHistory } from "react-router-dom";
import { commify } from "@ethersproject/units";
2021-07-30 08:18:28 +00:00
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faBurn } from "@fortawesome/free-solid-svg-icons/faBurn";
import { faQrcode } from "@fortawesome/free-solid-svg-icons/faQrcode";
2021-07-01 18:21:40 +00:00
import Logo from "./Logo";
import Timestamp from "./components/Timestamp";
2021-07-09 05:07:20 +00:00
import { RuntimeContext } from "./useRuntime";
import { useLatestBlock } from "./useLatestBlock";
import { blockURL } from "./url";
2021-07-01 18:21:40 +00:00
2021-10-21 07:10:49 +00:00
const CameraScanner = React.lazy(() => import("./search/CameraScanner"));
2021-07-01 18:21:40 +00:00
const Home: React.FC = () => {
2021-07-09 05:07:20 +00:00
const { provider } = useContext(RuntimeContext);
2021-07-01 18:21:40 +00:00
const [search, setSearch] = useState<string>();
const [canSubmit, setCanSubmit] = useState<boolean>(false);
const history = useHistory();
const handleChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {
setCanSubmit(e.target.value.trim().length > 0);
setSearch(e.target.value.trim());
};
const handleSubmit: React.FormEventHandler<HTMLFormElement> = (e) => {
e.preventDefault();
if (!canSubmit) {
return;
}
history.push(`/search?q=${search}`);
};
2021-07-08 19:02:42 +00:00
const latestBlock = useLatestBlock(provider);
const [isScanning, setScanning] = useState<boolean>(false);
2021-07-01 18:21:40 +00:00
document.title = "Home | Otterscan";
return (
2021-07-10 06:17:07 +00:00
<div className="m-auto">
{isScanning && <CameraScanner turnOffScan={() => setScanning(false)} />}
2021-07-10 06:17:07 +00:00
<Logo />
<form
className="flex flex-col"
onSubmit={handleSubmit}
autoComplete="off"
spellCheck={false}
>
<div className="flex mb-10">
<input
className="w-full border-l border-t border-b rounded-l focus:outline-none px-2 py-1"
type="text"
size={50}
placeholder="Search by address / txn hash / block number / ENS name"
onChange={handleChange}
autoFocus
/>
<button
2021-09-01 21:12:35 +00:00
className="border rounded-r bg-skin-button-fill hover:bg-skin-button-hover-fill focus:outline-none px-2 py-1 text-base text-skin-button flex justify-center items-center"
type="button"
onClick={() => setScanning(true)}
title="Scan an ETH address using your camera"
>
<FontAwesomeIcon icon={faQrcode} />
</button>
</div>
2021-07-10 06:17:07 +00:00
<button
2021-09-01 21:12:35 +00:00
className="mx-auto px-3 py-1 mb-10 rounded bg-skin-button-fill hover:bg-skin-button-hover-fill focus:outline-none"
2021-07-10 06:17:07 +00:00
type="submit"
2021-07-01 18:21:40 +00:00
>
2021-07-10 06:17:07 +00:00
Search
</button>
2021-07-29 04:24:39 +00:00
<div className="mx-auto mt-5 mb-5 text-lg text-link-blue hover:text-link-blue-hover font-bold">
<NavLink to="/special/london">
2021-07-30 08:18:28 +00:00
<div className="flex space-x-2 items-baseline text-orange-500 hover:text-orange-700 hover:underline">
<span>
<FontAwesomeIcon icon={faBurn} />
</span>
2021-07-30 21:02:11 +00:00
<span>Check out the special dashboard for EIP-1559</span>
2021-07-30 08:18:28 +00:00
<span>
<FontAwesomeIcon icon={faBurn} />
</span>
</div>
2021-07-29 04:24:39 +00:00
</NavLink>
</div>
2021-07-10 06:17:07 +00:00
{latestBlock && (
<NavLink
className="mx-auto flex flex-col items-center space-y-1 mt-5 text-sm text-gray-500 hover:text-link-blue"
to={blockURL(latestBlock.number)}
2021-07-01 18:21:40 +00:00
>
<div>Latest block: {commify(latestBlock.number)}</div>
2021-07-10 06:17:07 +00:00
<Timestamp value={latestBlock.timestamp} />
</NavLink>
)}
</form>
2021-07-01 18:21:40 +00:00
</div>
);
};
export default React.memo(Home);