Skip to content
Snippets Groups Projects
Home.jsx 9.45 KiB
import React, { useState } from "react";
import { format } from "date-fns";

import {
  closeDiscussion,
  endProgramPoint,
  openDiscussion,
  renameProgramPoint,
} from "actions/program";
import Button from "components/Button";
import { DropdownMenu, DropdownMenuItem } from "components/dropdown-menu";
import ModalConfirm from "components/modals/ModalConfirm";
import ProgramEntryEditModal from "components/program/ProgramEntryEditModal";
import AddAnnouncementForm from "containers/AddAnnouncementForm";
import AddPostForm from "containers/AddPostForm";
import AnnouncementsContainer from "containers/AnnoucementsContainer";
import PostFilters from "containers/PostFilters";
import PostsContainer from "containers/PostsContainer";
import { useActionConfirm } from "hooks";
import { AuthStore, ProgramStore } from "stores";

const NotYetStarted = ({ startAt }) => (
  <article className="container container--wide py-8 md:py-16 lg:py-32">
    <div className="hidden md:inline-block flag bg-violet-400 text-white head-alt-base mb-4 py-4 px-5">
      Jejda ...
    </div>
    <h1 className="head-alt-base md:head-alt-md lg:head-alt-xl mb-2">
      Jednání ještě nebylo zahájeno :(
    </h1>
    <p className="text-xl leading-snug mb-8">
      <span>Jednání celostátního fóra ještě nezačalo. </span>
      {startAt && (
        <span>
          Mělo by být zahájeno <strong>{format(startAt, "d. M. Y")}</strong> v{" "}
          <strong>{format(startAt, "H:mm")}</strong>.{" "}
        </span>
      )}
      <span>Můžete si ale zobrazit program.</span>
    </p>
    <Button routerTo="/program" className="md:text-lg lg:text-xl" hoverActive>
      Zobrazit program
    </Button>
  </article>
);

const AlreadyFinished = () => (
  <article className="container container--wide py-8 md:py-16 lg:py-32">
    <div className="flex">
      <div>
        <i className="ico--anchor text-2xl md:text-6xl lg:text-9xl mr-4 lg:mr-8"></i>
      </div>
      <div>
        <h1 className="head-alt-base md:head-alt-md lg:head-alt-xl mb-2">
          Jednání už skočilo!
        </h1>
        <p className="text-xl leading-snug">
          Oficiální program již skončil. Těšíme se na viděnou zase příště.
        </p>
      </div>
    </div>
  </article>
);

const BreakInProgress = () => (
  <article className="container container--wide py-8 md:py-16 lg:py-32">
    <div className="flex">
      <div>
        <i className="ico--clock text-2xl md:text-6xl lg:text-9xl mr-4 lg:mr-8"></i>
      </div>
      <div>
        <h1 className="head-alt-base md:head-alt-md lg:head-alt-xl mb-2">
          Probíhá přestávka ...
        </h1>
        <p className="text-xl leading-snug mb-8">
          Jednání celostátního fóra je momentálně přerušeno. Můžete si ale
          zobrazit program.
        </p>
        <Button
          routerTo="/program"
          className="md:text-lg lg:text-xl"
          hoverActive
        >
          Zobrazit program
        </Button>
      </div>
    </div>
  </article>
);

const Home = () => {
  const {
    currentId,
    items: programEntries,
    scheduleIds,
  } = ProgramStore.useState();
  const { isAuthenticated, user } = AuthStore.useState();
  const programEntry = currentId ? programEntries[currentId] : null;
  const [showProgramEditModal, setShowProgramEditModal] = useState(false);
  const [
    showCloseDiscussion,
    setShowCloseDiscussion,
    onCloseDiscussionConfirm,
    onCloseDiscussionCancel,
  ] = useActionConfirm(closeDiscussion, programEntry);
  const [
    showOpenDiscussion,
    setShowOpenDiscussion,
    onOpenDiscussionConfirm,
    onOpenDiscussionCancel,
  ] = useActionConfirm(openDiscussion, programEntry);
  const [
    showEndProgramPoint,
    setShowEndProgramPoint,
    onEndProgramPointConfirm,
    onEndProgramPointCancel,
  ] = useActionConfirm(endProgramPoint, programEntry);

  const onEditProgramConfirm = async (newTitle) => {
    await renameProgramPoint.run({ programEntry, newTitle });
    setShowProgramEditModal(false);
  };
  const onEditProgramCancel = () => {
    setShowProgramEditModal(false);
  };

  const firstProgramEntry = scheduleIds.length
    ? programEntries[scheduleIds[0]]
    : null;

  const lastProgramEntry = scheduleIds.length
    ? programEntries[scheduleIds[0]]
    : null;

  if (!programEntry && new Date() < firstProgramEntry.expectedStartAt) {
    return <NotYetStarted startAt={firstProgramEntry.expectedStartAt} />;
  }

  if (!programEntry && new Date() > lastProgramEntry.expectedStartAt) {
    return <AlreadyFinished />;
  }

  if (!programEntry) {
    return <BreakInProgress />;
  }

  const displayActions = isAuthenticated && user.role === "chairman";

  return (
    <>
      <article className="container container--wide pt-8 lg:py-24 cf2021">
        <section className="cf2021__video space-y-8">
          <div className="flex items-center justify-between mb-4 lg:mb-8">
            <h1 className="head-alt-md lg:head-alt-lg mb-0">
              Bod č. {programEntry.number}: {programEntry.title}
            </h1>
            {displayActions && (
              <DropdownMenu right triggerSize="lg" className="pl-4">
                <DropdownMenuItem
                  onClick={() => setShowProgramEditModal(true)}
                  icon="ico--edit-pencil"
                  title="Přejmenovat bod programu"
                  titleSize="base"
                  iconSize="base"
                />
                {programEntry.discussionOpened && (
                  <DropdownMenuItem
                    onClick={() => setShowCloseDiscussion(true)}
                    icon="ico--bubbles"
                    title="Ukončit rozpravu"
                    titleSize="base"
                    iconSize="base"
                  />
                )}
                {!programEntry.discussionOpened && (
                  <DropdownMenuItem
                    onClick={() => setShowOpenDiscussion(true)}
                    icon="ico--bubbles"
                    title="Otevřít rozpravu"
                    titleSize="base"
                    iconSize="base"
                  />
                )}
                <DropdownMenuItem
                  onClick={() => setShowEndProgramPoint(true)}
                  icon="ico--switch"
                  title="Ukončit bod programu"
                  titleSize="base"
                  iconSize="base"
                />
              </DropdownMenu>
            )}
          </div>

          <iframe
            width="100%"
            height="500"
            src="https://www.youtube.com/embed/73jJLspL8o8"
            frameBorder="0"
            allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
            allowFullScreen=""
            title="Video stream"
          ></iframe>
        </section>

        <section className="cf2021__notifications">
          <div className="lg:card lg:elevation-10">
            <div className="lg:card__body pb-2 lg:py-6">
              <h2 className="head-heavy-sm">Oznámení</h2>
            </div>

            <AnnouncementsContainer className="container-padding--zero lg:container-padding--auto" />
            {isAuthenticated && user.role === "chairman" && (
              <AddAnnouncementForm className="lg:card__body pt-4 lg:py-6" />
            )}
          </div>
        </section>

        <section className="cf2021__posts">
          <div className="flex flex-col xl:flex-row xl:justify-between xl:items-center mb-4">
            <h2 className="head-heavy-sm whitespace-no-wrap">
              <span>Příspěvky v rozpravě</span>
              {!programEntry.discussionOpened && (
                <i
                  className="ico--lock text-black ml-1 opacity-50 hover:opacity-100 transition duration-500 text-xl"
                  title="Rozprava je uzavřena"
                />
              )}
              {programEntry.discussionOpened && (
                <i
                  className="ico--lock-open text-black ml-1 opacity-50 hover:opacity-100 transition duration-500 text-xl"
                  title="Probíhá rozprava"
                />
              )}
            </h2>
            <PostFilters />
          </div>

          <PostsContainer className="container-padding--zero lg:container-padding--auto" />
          {programEntry.discussionOpened && isAuthenticated && (
            <AddPostForm className="my-8 space-y-4" />
          )}
        </section>
      </article>
      <ProgramEntryEditModal
        isOpen={showProgramEditModal}
        onConfirm={onEditProgramConfirm}
        onCancel={onEditProgramCancel}
        programEntry={programEntry}
      />
      <ModalConfirm
        isOpen={showCloseDiscussion}
        onConfirm={onCloseDiscussionConfirm}
        onCancel={onCloseDiscussionCancel}
        title="Ukončit rozpravu?"
        yesActionLabel="Ukončit"
      >
        Opravdu chcete ukončit rozpravu?
      </ModalConfirm>
      <ModalConfirm
        isOpen={showOpenDiscussion}
        onConfirm={onOpenDiscussionConfirm}
        onCancel={onOpenDiscussionCancel}
        title="Otevřít rozpravu?"
        yesActionLabel="Otevřít"
      >
        Opravdu chcete otevřít rozpravu k tomuto bodu programu?
      </ModalConfirm>
      <ModalConfirm
        isOpen={showEndProgramPoint}
        onConfirm={onEndProgramPointConfirm}
        onCancel={onEndProgramPointCancel}
        title="Ukončit bod programu?"
        yesActionLabel="Ukončit bod programu"
      >
        Bod programu <strong>bude ukončen</strong>. Opravdu to chcete?
      </ModalConfirm>
    </>
  );
};

export default Home;