wongjiahau/ttap-web

View on GitHub
src/ts/react/fgoView.tsx

Summary

Maintainability
A
3 hrs
Test Coverage
import Button from "@material-ui/core/Button";
import * as React from "react";
import { Redirect } from "react-router";
import { RawSlot } from "../model/rawSlot";
import { ParseFgoHtmlToRawSlot_v1 } from "../parser/parseFgoHtmlToRawSlot";
import { ParseFgoHtmlToRawSlot_v2 } from "../parser/parseFgoHtmlToRawSlot_v2";
import { ToggleLoadingScreen } from "./app";
import { StackPanel } from "./panels/stackPanel";
import { VerticalAlign } from "./panels/verticalAlign";

const ParseFgoHtmlToRawSlot = (() => {
  const currentYear = new Date().getFullYear();
  if (currentYear > 2019) {
    console.log("Using ParseFgoHtmlToRawSlot_v2");
    return ParseFgoHtmlToRawSlot_v2;
  } else {
    console.log("Using ParseFgoHtmlToRawSlot_v1");
    return ParseFgoHtmlToRawSlot_v1;
  }
})();

export interface IFgoViewDispatchProps {
  handleLoadSlot: (rawSlots: RawSlot[]) => void;
}

interface IFgoViewStateProps {
  redirect: boolean;
}

export class FgoView extends React.Component<
  IFgoViewDispatchProps,
  IFgoViewStateProps
> {
  public constructor(props: IFgoViewDispatchProps) {
    super(props);
    this.state = {
      redirect: false,
    };
  }
  public render() {
    if (this.state.redirect) {
      return <Redirect push={true} to="/play" />;
    }
    return (
      <VerticalAlign>
        <StackPanel orientation="vertical" horizontalAlignment="center">
          <textarea
            style={{ height: "500px", width: "500px" }}
            id="fgotextarea"
            placeholder="Paste HTML here"
          />
          <Button
            color="primary"
            variant="contained"
            onClick={() => {
              ToggleLoadingScreen("Parsing HTML", () => {
                try {
                  const textarea = document.getElementById(
                    "fgotextarea"
                  ) as HTMLTextAreaElement;
                  this.props.handleLoadSlot(
                    ParseFgoHtmlToRawSlot(textarea.value)
                  );
                  this.setState({ redirect: true });
                } catch (error) {
                  alert("Error loading data: " + error.message);
                }
              });
            }}
          >
            Load Data
          </Button>
        </StackPanel>
      </VerticalAlign>
    );
  }
}