import React from "react"; import { Link } from "react-router-dom"; import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; import "./viewed-documents.scss"; import { usePageVisibility } from "../hooks"; dayjs.extend(relativeTime); type Entry = { url: string; title: string; timestamp: number; }; export default function ViewedDocuments() { const isVisible = usePageVisibility(); // undefined - list is still being loaded // null - list could not be loaded (e.g., if localStorage is disabled) // Entry[] - list was loaded (but could be empty) const [entries, setEntries] = React.useState( undefined ); const VIEWED_DOCUMENTS_STORAGE_KEY = "viewed-documents"; React.useEffect(() => { if (isVisible) { try { const data = localStorage.getItem(VIEWED_DOCUMENTS_STORAGE_KEY); const previousVisits = JSON.parse(data || "[]"); const newEntries: Entry[] = []; for (const visit of previousVisits) { newEntries.push({ url: visit.url, title: visit.title, timestamp: visit.timestamp, }); } setEntries(newEntries); } catch (err) { // If localStorage is not supported, there are no viewed documents console.warn( "Failed to read recently viewed documents from localStorage", err ); setEntries(null); } } }, [isVisible]); return (

Recently viewed documents

{entries === undefined ? ( Loading recently viewed documents ) : entries === null ? ( This feature requires cookies ) : entries.length ? ( {entries.map((entry) => { return ( ); })}
Document When
{entry.title} {entry.url} {dayjs(new Date(entry.timestamp)).fromNow()}
) : ( No recently viewed documents at the moment )}
); } function Banner({ children }) { return

{children}

; }