Newer
Older
CrypticOreWallet / src / utils / commonmeta.ts
@Drew Lemmy Drew Lemmy on 23 Mar 2021 1 KB perf: memo ContextualAddress
// 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 { getNameParts } from "./currency";

export interface CommonMeta {
  metaname?: string;
  name?: string;
  recipient?: string;

  return?: string;
  returnMetaname?: string;
  returnName?: string;
  returnRecipient?: string;

  custom: Record<string, string>;
}

export function parseCommonMeta(
  nameSuffix: string,
  metadata: string | undefined | null
): CommonMeta | null {
  if (!metadata) return null;

  const custom: Record<string, string> = {};
  const out: CommonMeta = { custom };

  const metaParts = metadata.split(";");
  if (metaParts.length <= 0) return null;

  const nameParts = getNameParts(nameSuffix, metaParts[0]);
  if (nameParts) {
    out.metaname = nameParts.metaname;
    out.name = nameParts.nameWithSuffix;

    out.recipient = nameParts.metaname
      ? nameParts.metaname + "@" + nameParts.nameWithSuffix
      : nameParts.nameWithSuffix;
  }

  for (let i = 0; i < metaParts.length; i++) {
    const metaPart = metaParts[i];
    const kv = metaPart.split("=", 2);

    if (i === 0 && nameParts) continue;

    if (kv.length === 1) {
      custom[i.toString()] = kv[0];
    } else {
      custom[kv[0]] = kv.slice(1).join("=");
    }
  }

  const rawReturn = out.return = custom.return;
  if (rawReturn) {
    const returnParts = getNameParts(nameSuffix, rawReturn);
    if (returnParts) {
      out.returnMetaname = returnParts.metaname;
      out.returnName = returnParts.nameWithSuffix;

      out.returnRecipient = returnParts.metaname
        ? returnParts.metaname + "@" + returnParts.nameWithSuffix
        : returnParts.nameWithSuffix;
    }
  }

  return out;
}