74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { FC, useState } from 'react'
 | 
						|
import regexifyString from 'regexify-string'
 | 
						|
import { useSnapshot } from 'valtio'
 | 
						|
import { Link } from '.'
 | 
						|
import state from '../state'
 | 
						|
import { AccountDialog } from './Accounts'
 | 
						|
import Tooltip from './Tooltip'
 | 
						|
import hookSetCodes from '../content/hook-set-codes.json'
 | 
						|
import { capitalize } from '../utils/helpers'
 | 
						|
 | 
						|
interface EnrichLogProps {
 | 
						|
  str?: string
 | 
						|
}
 | 
						|
 | 
						|
const EnrichLog: FC<EnrichLogProps> = ({ str }) => {
 | 
						|
  const { accounts } = useSnapshot(state)
 | 
						|
  const [dialogAccount, setDialogAccount] = useState<string | null>(null)
 | 
						|
  if (!str || !accounts.length) return <>{str}</>
 | 
						|
 | 
						|
  const addrs = accounts.map(acc => acc.address)
 | 
						|
  const regex = `(${addrs.join('|')}|HookSet\\(\\d+\\))`
 | 
						|
  const res = regexifyString({
 | 
						|
    pattern: new RegExp(regex, 'gim'),
 | 
						|
    decorator: (match, idx) => {
 | 
						|
      if (match.startsWith('r')) {
 | 
						|
        // Account
 | 
						|
        const name = accounts.find(acc => acc.address === match)?.name
 | 
						|
        return (
 | 
						|
          <Link
 | 
						|
            key={match + idx}
 | 
						|
            as="a"
 | 
						|
            onClick={() => setDialogAccount(match)}
 | 
						|
            title={match}
 | 
						|
            highlighted
 | 
						|
          >
 | 
						|
            {name || match}
 | 
						|
          </Link>
 | 
						|
        )
 | 
						|
      }
 | 
						|
      if (match.startsWith('HookSet')) {
 | 
						|
        const code = match.match(/^HookSet\((\d+)\)/)?.[1]
 | 
						|
        const val = hookSetCodes.find(v => code && v.code === +code)
 | 
						|
        console.log({ code, val })
 | 
						|
        if (!val) return match
 | 
						|
 | 
						|
        const content = capitalize(val.description) || 'No hint available!'
 | 
						|
        return (
 | 
						|
          <>
 | 
						|
            HookSet(
 | 
						|
            <Tooltip content={content}>
 | 
						|
              <Link>{val.identifier}</Link>
 | 
						|
            </Tooltip>
 | 
						|
            )
 | 
						|
          </>
 | 
						|
        )
 | 
						|
      }
 | 
						|
      return match
 | 
						|
    },
 | 
						|
    input: str
 | 
						|
  })
 | 
						|
 | 
						|
  return (
 | 
						|
    <>
 | 
						|
      {res}
 | 
						|
      <AccountDialog
 | 
						|
        setActiveAccountAddress={setDialogAccount}
 | 
						|
        activeAccountAddress={dialogAccount}
 | 
						|
      />
 | 
						|
    </>
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
export default EnrichLog
 |