Newer
Older
CrypticOreWallet / src / pages / names / NameMobileItem.tsx
@Drew Lemmy Drew Lemmy on 29 Mar 2021 3 KB feat: mobile names list
// Copyright (c) 2020-2021 Drew Lemmy
// This file is part of KristWeb 2 under AGPL-3.0.
// Full details: https://github.com/tmpim/KristWeb2/blob/master/LICENSE.txt
import { useMemo } from "react";
import { Collapse, Tag } from "antd";

import { Trans } from "react-i18next";
import { useTFns } from "@utils/i18n";

import { KristName } from "@api/types";
import { useWallets } from "@wallets";

import { KristNameLink } from "@comp/names/KristNameLink";
import { ContextualAddress } from "@comp/addresses/ContextualAddress";
import { DateTime } from "@comp/DateTime";

import { OpenEditNameFn } from "./mgmt/NameEditModalLink";
import { OpenSendTxFn } from "@comp/transactions/SendTransactionModalLink";

import { NameMobileItemActions } from "./NameMobileItemActions";

interface Props {
  name: KristName;

  openNameEdit: OpenEditNameFn;
  openSendTx: OpenSendTxFn;
}

export function NameMobileItem({
  name,
  openNameEdit,
  openSendTx
}: Props): JSX.Element {
  const { t, tStr, tKey } = useTFns("names.");

  // Used to change the actions depending on whether or not we own the name
  const { walletAddressMap } = useWallets();
  const isOwn = !!walletAddressMap[name.owner];

  const hasARecord = !!name.a;
  const isUnpaid = name.unpaid > 0;
  const hasTags = hasARecord || isUnpaid;

  const itemHead = useMemo(() => (
    <div className="name-mobile-item-header">
      {/* Tags (A record, unpaid blocks) */}
      {hasTags && <div className="name-tags">
        {/* A record */}
        {hasARecord && <Tag>{tStr("mobileARecordTag")}</Tag>}

        {/* Unpaid blocks */}
        {isUnpaid && (
          <Tag color="CornFlowerBlue">
            {t(tKey("mobileUnpaidTag"), { count: name.unpaid })}
          </Tag>
        )}
      </div>}

      {/* Name */}
      <KristNameLink name={name.name} noLink className="name-name" />

      {/* Owner */}
      <div className="name-owner">
        <Trans i18nKey={tKey("mobileOwner")}>
          <span className="name-field">Owner:</span>
          <ContextualAddress address={name.owner} noLink noTooltip />
        </Trans>
      </div>

      {/* Original owner */}
      {name.original_owner && name.owner !== name.original_owner && (
        <div className="name-original-owner">
          <Trans i18nKey={tKey("mobileOriginalOwner")}>
            <span className="name-field">Original owner:</span>
            <ContextualAddress address={name.original_owner} noLink noTooltip />
          </Trans>
        </div>
      )}

      {/* Registered/updated date */}
      {name.updated
        ? (
          <div className="name-updated">
            <Trans i18nKey={tKey("mobileUpdated")}>
              Updated: <DateTime date={name.updated} />
            </Trans>
          </div>
        )
        : (
          <div className="name-registered">
            <Trans i18nKey={tKey("mobileRegistered")}>
              Registered: <DateTime date={name.registered} />
            </Trans>
          </div>
        )}
    </div>
  ), [
    t, tStr, tKey,
    hasTags, hasARecord, isUnpaid,
    name.name, name.unpaid, name.owner, name.original_owner,
    name.updated, name.registered
  ]);

  return <Collapse ghost className="card-list-item mobile-item-collapse name-mobile-item">
    <Collapse.Panel key={name.name} showArrow={false} header={itemHead}>
      <NameMobileItemActions
        name={name}
        isOwn={isOwn}
        openNameEdit={openNameEdit}
        openSendTx={openSendTx}
      />
    </Collapse.Panel>
  </Collapse>;
}