ImportQr.tsx 2.22 KiB
Newer Older
Andrei Eres's avatar
Andrei Eres committed
import { QrScanAddress } from '@polkadot/react-qr'
Andrei Eres's avatar
Andrei Eres committed
import React, { useState, useEffect } from 'react'
Andrei Eres's avatar
Andrei Eres committed
import styled from 'styled-components'
Andrei Eres's avatar
Andrei Eres committed
import Address from '../components/Address'
Andrei Eres's avatar
Andrei Eres committed
import {
  addHeaderAction,
  goHomeHeaderAction,
  resetHeaderActions,
Andrei Eres's avatar
Andrei Eres committed
} from '../../stores/headerActions'
Andrei Eres's avatar
Andrei Eres committed
import { BaseProps } from '../types'
Andrei Eres's avatar
Andrei Eres committed
import { createAccountExternal } from '../../messaging/actions'
Andrei Eres's avatar
Andrei Eres committed

interface QrAccount {
  isAddress: boolean
  content: string
  genesisHash: string
  name?: string
}

Andrei Eres's avatar
Andrei Eres committed
const ImportQr: React.FC<BaseProps> = ({ className }) => {
Andrei Eres's avatar
Andrei Eres committed
  const [scanned, setScanned] = useState<QrAccount[]>([])
Andrei Eres's avatar
Andrei Eres committed

Andrei Eres's avatar
Andrei Eres committed
  const onCreate = (account: QrAccount) => {
    const alreadyScanned = scanned.find(
      (a) =>
        a.content === account.content && a.genesisHash === account.genesisHash
    )
    if (alreadyScanned) return
Andrei Eres's avatar
Andrei Eres committed

    createAccountExternal(
      account.name || 'Unknown',
      account.content,
      account.genesisHash
    )
      .then(() => setScanned((s) => [...s, account]))
      .catch(console.error)
Andrei Eres's avatar
Andrei Eres committed
  }

Andrei Eres's avatar
Andrei Eres committed
  useEffect(() => {
    addHeaderAction(goHomeHeaderAction)
    return () => resetHeaderActions()
  }, [])

Andrei Eres's avatar
Andrei Eres committed
  return (
Andrei Eres's avatar
Andrei Eres committed
    <div className={className}>
Andrei Eres's avatar
Andrei Eres committed
      <div className='row'>
        <div className='counter'>
          <h1>
            Import
            <br />
            Signer
            <br />
            keys
          </h1>
          <div>
            <span className='num'>{scanned.length}</span>
            imported
          </div>
        </div>
        <div className='scanner'>
          <QrScanAddress onScan={onCreate} />
        </div>
      </div>
      <div>
        {scanned.reverse().map((account) => (
          <Address
            {...account}
            address={account.content}
            name={account.name}
            key={account.content}
          />
        ))}
      </div>
Andrei Eres's avatar
Andrei Eres committed
    </div>
Andrei Eres's avatar
Andrei Eres committed
export default styled(ImportQr)`
  display: flex;
  flex-direction: column;
Andrei Eres's avatar
Andrei Eres committed

  .row {
    display: flex;
    flex-direction: row;
    width: 100%;
    margin-bottom: 1rem;
  }

  .row > div {
    display: flex;
    flex-direction: column;
    flex-basis: 50%;
  }

  .row .counter {
    justify-content: space-between;
  }

  .counter .num {
    display: block;
    font-size: 4rem;
    line-height: 1;
  }
Andrei Eres's avatar
Andrei Eres committed
`