Newer
Older
CrypticOreWallet / src / pages / addresses / AddressNamesCard.tsx
// Copyright (c) 2020-2021 Drew Lemmy
// This file is part of KristWeb 2 under GPL-3.0.
// Full details: https://github.com/tmpim/KristWeb2/blob/master/LICENSE.txt
import React, { useState, useEffect } from "react";
import classNames from "classnames";
import { Card, Skeleton, Empty, Row } from "antd";

import { useTranslation } from "react-i18next";
import { Link } from "react-router-dom";

import { NameItem } from "./NameItem";
import { lookupNames, LookupNamesResponse } from "../../krist/api/lookup";

import { useSyncNode } from "../../krist/api";

import { SmallResult } from "../../components/results/SmallResult";

import Debug from "debug";
const debug = Debug("kristweb:address-names-card");

async function fetchNames(address: string): Promise<LookupNamesResponse> {
  debug("fetching names");
  return lookupNames(
    [address],
    { limit: 5, orderBy: "registered", order: "DESC" }
  );
}

export function AddressNamesCard({ address }: { address: string }): JSX.Element {
  const { t } = useTranslation();
  const syncNode = useSyncNode();

  const [res, setRes] = useState<LookupNamesResponse | undefined>();
  const [error, setError] = useState<Error | undefined>();
  const [loading, setLoading] = useState(true);

  // Fetch names on page load or sync node reload
  useEffect(() => {
    if (!syncNode) return;

    // Remove the existing results in case the address changed
    setRes(undefined);
    setLoading(true);

    fetchNames(address)
      .then(setRes)
      .catch(setError)
      .finally(() => setLoading(false));
  }, [syncNode, address]);

  const isEmpty = !loading && (error || !res || res.count === 0);
  const classes = classNames("kw-card", "address-card-names", {
    "empty": isEmpty
  });

  return <Card title={t("address.cardNamesTitle")} className={classes}>
    <Skeleton paragraph={{ rows: 4 }} title={false} active loading={loading}>
      {error
        ? <SmallResult status="error" title={t("error")} subTitle={t("address.namesError")} />
        : (res && res.count > 0
          ? <>
            {/* Name listing */}
            {res.names.map(name => <NameItem key={name.name} name={name} />)}

            {/* See more link */}
            <Row className="card-more address-names-more">
              <Link to={`/network/addresses/${encodeURIComponent(address)}/names`}>
                {t("address.namesSeeMore", { count: res.total })}
              </Link>
            </Row>
          </>
          : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
        )}
    </Skeleton>
  </Card>;
}