Forked from
TO / cf-online-ui
139 commits behind the upstream repository.
Program.jsx 3.69 KiB
import React from "react";
import { Link } from "react-router-dom";
import classNames from "classnames";
import { format } from "date-fns";
import { activateProgramPoint } from "actions/program";
import Button from "components/Button";
import Chip from "components/Chip";
import ModalConfirm from "components/modals/ModalConfirm";
import { useActionState, useItemActionConfirm } from "hooks";
import { AuthStore, ProgramStore } from "stores";
const Schedule = () => {
const { isAuthenticated, user } = AuthStore.useState();
const { currentId, scheduleIds, items } = ProgramStore.useState();
const [
entryToActivate,
setEntryToActivate,
onActivateConfirm,
onActivateCancel,
] = useItemActionConfirm(activateProgramPoint);
const [activating, activationError] = useActionState(
activateProgramPoint,
entryToActivate
);
return (
<article className="container container--wide py-8 lg:py-24">
<h1 className="head-alt-md lg:head-alt-lg mb-8">Program zasedání</h1>
<div className="flex flex-col">
{scheduleIds.map((id) => {
const isCurrent = id === currentId;
const entry = items[id];
return (
<div
className={classNames(
"flex flex-col md:flex-row my-4 hover:opacity-100 transition duration-300",
{
"text-black": isCurrent,
"text-black opacity-50": !isCurrent,
}
)}
key={entry.id}
>
<div className="w-28 md:text-right">
{isCurrent && (
<Chip condensed className="mt-2 mr-2" color="red-600">
Právě probíhá
</Chip>
)}
</div>
<div className="w-full md:w-32 flex flex-row md:flex-col items-center md:items-stretch md:text-right md:pr-8">
<p className="head-heavy-xs md:head-heavy-base">
{format(entry.expectedStartAt, "H:mm")}
</p>
<p className="ml-auto md:ml-0 head-heavy-xs md:head-heavy-xs md:text-grey-200 whitespace-no-wrap">
{format(entry.expectedStartAt, "d. M. Y")}
</p>
</div>
<div className="flex-grow w-full">
<h2 className="head-heavy-xs md:head-heavy-base mb-1">
<Link to="/">{entry.title}</Link>
</h2>
<div className="flex space-x-2">
<strong>Navrhovatel:</strong>
<span>{entry.proposer}</span>
</div>
{entry.description && <p>{entry.description}</p>}
{isAuthenticated &&
user.role === "chairman" &&
entry.id !== currentId && (
<div className="mt-4">
<Button
onClick={() => setEntryToActivate(entry)}
color="grey-125"
className="text-xs"
>
Aktivovat tento bod programu
</Button>
</div>
)}
</div>
</div>
);
})}
</div>
<ModalConfirm
isOpen={!!entryToActivate}
onConfirm={onActivateConfirm}
onCancel={onActivateCancel}
confirming={activating}
error={activationError}
title="Aktivovat bod programu?"
yesActionLabel="Aktivovat"
>
Pogramovaný bod{" "}
<strong>{entryToActivate && entryToActivate.title}</strong> bude
aktivován. Chcete pokračovat?
</ModalConfirm>
</article>
);
};
export default Schedule;