manaba-enhanced-for-tsukuba/manaba-enhanced

View on GitHub
src/methods/checkPagePubDeadline.ts

Summary

Maintainability
D
2 days
Test Coverage
"use strict"

import dayjs from "dayjs"
import customParseFormat from "dayjs/plugin/customParseFormat"

import { checkLang } from "./checkLang"
import evalDiff from "./evalDiff"

dayjs.extend(customParseFormat)

const checkPagePubDeadline = (div: HTMLElement): void => {
  const match = new RegExp(
    "(\\d{4}-+\\d{2}-+\\d{2} \\d{2}:+\\d{2}:+\\d{2})",
    "g"
  )

  const timeStrings = div.innerText.match(match)

  if (timeStrings && timeStrings.length === 2) {
    const deadlineString = timeStrings[1]

    const now = dayjs()
    const deadline = dayjs(deadlineString, "YYYY-MM-DD HH:mm:ss")

    const lang = checkLang()

    const createMessage = (text: string, caution: boolean) => {
      const message = document.createElement("span")
      message.innerText = text
      message.style.marginLeft = "1em"
      message.style.padding = ".2em .5em"
      if (!caution) {
        message.style.backgroundColor = "#d3ebd3"
        message.style.color = "#244f24"
      } else {
        message.style.backgroundColor = "#ffdce0"
        message.style.color = "#5d000b"
      }
      div.appendChild(message)
    }

    const diff = evalDiff(now, deadline)

    if (diff.value > 0) {
      switch (diff.unit) {
        case "day":
          switch (lang) {
            case "ja":
              createMessage(
                `あと${diff.value}日`,
                diff.value > 7 ? false : true
              )
              break
            case "en":
              createMessage(
                diff.value > 1
                  ? `${diff.value} days remaining`
                  : `${diff.value} day remaining`,
                diff.value > 7 ? false : true
              )
              break
          }
          break
        case "hour":
          switch (lang) {
            case "ja":
              createMessage(`あと${diff.value}時間`, true)
              break
            case "en":
              createMessage(
                diff.value > 1
                  ? `${diff.value} hours remaining`
                  : `${diff.value} hour remaining`,
                true
              )
              break
          }
          break
        case "minute":
          switch (lang) {
            case "ja":
              createMessage(`あと${diff.value}分`, true)
              break
            case "en":
              createMessage(
                diff.value > 1
                  ? `${diff.value} minutes remaining`
                  : `${diff.value} minute remaining`,
                true
              )
              break
          }
          break
      }
    } else {
      switch (lang) {
        case "ja":
          createMessage("公開終了", true)
          break
        case "en":
          createMessage("Deadline is over", true)
          break
      }
    }
  }
}

export default checkPagePubDeadline