import NextLink from "next/link"; import { Notepad, Prohibit } from "phosphor-react"; import { FC, ReactNode, useCallback, useLayoutEffect, useRef, useState } from "react"; import useStayScrolled from "react-stay-scrolled"; import regexifyString from "regexify-string"; import { useSnapshot } from "valtio"; import { Box, Button, Flex, Heading, Link, Pre, Text } from "."; import state, { ILog } from "../state"; import { AccountDialog } from "./Accounts"; import Container from "./Container"; import LogText from "./LogText"; interface ILogBox { title: string; clearLog?: () => void; logs: ILog[]; renderNav?: () => ReactNode; enhanced?: boolean; } const LogBox: FC = ({ title, clearLog, logs, children, renderNav, enhanced, }) => { const logRef = useRef(null); const { stayScrolled /*, scrollBottom*/ } = useStayScrolled(logRef); useLayoutEffect(() => { stayScrolled(); }, [stayScrolled, logs]); return ( {title} {renderNav?.()} {clearLog && ( )} {logs?.map((log, index) => ( ))} {children} ); }; export const Log: FC = ({ type, timestamp: timestamp, message: _message, link, linkText, defaultCollapsed, jsonData: _jsonData, }) => { const [expanded, setExpanded] = useState(!defaultCollapsed); const { accounts } = useSnapshot(state); const [dialogAccount, setDialogAccount] = useState(null); const enrichAccounts = useCallback( (str?: string): ReactNode => { if (!str) return null; const pattern = `(${accounts.map((acc) => acc.address).join("|")})`; const res = regexifyString({ pattern: new RegExp(pattern, "gim"), decorator: (match, idx) => { const name = accounts.find((acc) => acc.address === match)?.name; return ( setDialogAccount(match)} title={match} highlighted > {name || match} ); }, input: str, }); return <>{res}; }, [accounts] ); _message = _message.trim().replace(/\n /gi, "\n"); const message = enrichAccounts(_message); const jsonData = enrichAccounts(_jsonData); return ( <> {timestamp && ( {timestamp}{" "} )}
{message} 
{link && ( {linkText} )} {jsonData && ( setExpanded(!expanded)} as="a"> {expanded ? "Collapse" : "Expand"} )} {expanded && jsonData &&
{jsonData}
}

); }; export default LogBox;