ImportQr.tsx 2.05 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, { useEffect, useState } from 'react'
import { createAccountExternal } from '../../messaging/uiActions'
Andrei Eres's avatar
Andrei Eres committed
import {
  addHeaderAction,
  cancelAndGoHomeHeaderAction,
  doneAndGoHomeHeaderAction,
Andrei Eres's avatar
Andrei Eres committed
  resetHeaderActions,
Andrei Eres's avatar
Andrei Eres committed
} from '../../stores/headerActions'
Andrei Eres's avatar
Andrei Eres committed
import { Address } from '../components/Address'
import { H1 } from '../components/H1'
Andrei Eres's avatar
Andrei Eres committed

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

Andrei Eres's avatar
Andrei Eres committed
export const ImportQr = () => {
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(() => {
    scanned.length === 0
      ? addHeaderAction(cancelAndGoHomeHeaderAction)
      : addHeaderAction(doneAndGoHomeHeaderAction)
Andrei Eres's avatar
Andrei Eres committed
    return () => resetHeaderActions()
  }, [scanned.length])
Andrei Eres's avatar
Andrei Eres committed

Andrei Eres's avatar
Andrei Eres committed
  return (
Andrei Eres's avatar
Andrei Eres committed
    <div className='flex flex-col'>
      <div className='flex w-full mb-4'>
        <div className='flex flex-col basis-1/2 justify-between'>
          <H1>
Andrei Eres's avatar
Andrei Eres committed
            Import
            <br />
            Signer
            <br />
            keys
Andrei Eres's avatar
Andrei Eres committed
          </H1>
Andrei Eres's avatar
Andrei Eres committed
          <div>
Andrei Eres's avatar
Andrei Eres committed
            <span className='block text-6xl leading-none'>
              {scanned.length}
            </span>
Andrei Eres's avatar
Andrei Eres committed
            imported
          </div>
        </div>
Andrei Eres's avatar
Andrei Eres committed
        <div className='flex flex-col basis-1/2 border-8 rounded'>
Andrei Eres's avatar
Andrei Eres committed
          <QrScanAddress onScan={onCreate} />
        </div>
      </div>
Andrei Eres's avatar
Andrei Eres committed
      <div className='space-y-2'>
Andrei Eres's avatar
Andrei Eres committed
        {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
  )
}