Newer
Older
CrypticOreWallet / src / shared-components / list-view / Formatters.tsx
@Drew Lemmy Drew Lemmy on 23 Sep 2020 1 KB feat: table data providers
/* eslint-disable react/display-name */
import React, { ReactNode } from "react";

import { ColumnKey } from "./DataProvider";
import { KristValue } from "@components/krist-value/KristValue";

function verify<DataT, T>(key: ColumnKey<DataT>, formatKey: ColumnKey<DataT>, value: DataT): T | undefined {
  const val = value[formatKey];
  if (key !== formatKey) return;
  return val as unknown as T; // I'm sorry
}

export function formatKristValue<T>(key: ColumnKey<T>): ((formatKey: ColumnKey<T>, value: T) => ReactNode) {
  return (formatKey, value) => {
    const val = verify<T, number>(key, formatKey, value);
    return val && <KristValue value={val} />;
  };
}

export function formatNumber<T>(key: ColumnKey<T>): ((formatKey: ColumnKey<T>, value: T) => ReactNode) {
  return (formatKey, value) => {
    const val = verify<T, number>(key, formatKey, value);
    return val && <span>{val.toLocaleString()}</span>;
  };
}

export function formatDateTime<T>(key: ColumnKey<T>): ((formatKey: ColumnKey<T>, value: T) => ReactNode) {
  return (formatKey, value) => {
    const val = verify<T, string>(key, formatKey, value);
    if (!val) return;
    const date = new Date(val);
    return <span title={val}>{date.toLocaleString()}</span>;
  };
}