redbadger/pride-london-app

View on GitHub
src/data/formatters.js

Summary

Maintainability
A
0 mins
Test Coverage
// @flow

import {
  toLondonFormat as formatDate,
  FORMAT_DAY_MONTH,
  FORMAT_TIME_24
} from "../lib/date";
import type { DateRange } from "./date-time";
import text from "../constants/text";
import { isFree } from "../selectors/event";

export const formatDateRange = (dateRange: DateRange) =>
  dateRange.startDate !== dateRange.endDate
    ? [
        formatDate(dateRange.startDate, FORMAT_DAY_MONTH),
        formatDate(dateRange.endDate, FORMAT_DAY_MONTH)
      ].join(" - ")
    : formatDate(dateRange.startDate, FORMAT_DAY_MONTH);

export const formatTime = (value: string) => formatDate(value, FORMAT_TIME_24);

export const formatContentfulDate = (
  year: string,
  month: string,
  day: string,
  time?: string
) => {
  const correctedDay = day.padStart(2, "0");
  const correctedMonth = month.padStart(2, "0");
  const correctedYear = year.padStart(4, "20");
  const correctedTime = time ? `T${time}` : "";
  return `${correctedYear}-${correctedMonth}-${correctedDay}${correctedTime}`;
};

export const formatPrice = (price: number) => {
  if (price === Math.trunc(price)) {
    return String(price);
  }
  return price.toFixed(2);
};

export const formatShortEventPrice = (
  eventPriceLow: number,
  eventPriceHigh: number
) => {
  if (isFree(eventPriceLow, eventPriceHigh)) {
    return `${text.isFreePrice}`;
  }
  if (eventPriceLow === eventPriceHigh) {
    return `£${formatPrice(eventPriceLow)}`;
  }
  return `${text.eventFromPrice} £${formatPrice(eventPriceLow)}`;
};

export const formatLongEventPrice = (
  eventPriceLow: number,
  eventPriceHigh: number
) => {
  if (isFree(eventPriceLow, eventPriceHigh)) return text.isFreePrice;
  if (eventPriceHigh && eventPriceHigh > eventPriceLow)
    return `£${formatPrice(eventPriceLow)} — £${formatPrice(eventPriceHigh)}`;
  return `£${formatPrice(eventPriceLow)}`;
};