Skip to content
Snippets Groups Projects
Commit 0705ba71 authored by xaralis's avatar xaralis
Browse files

feat: prepare jitsi invite popup card

parent b05f18b2
No related branches found
No related tags found
No related merge requests found
Pipeline #1919 passed
Showing
with 112 additions and 42 deletions
...@@ -4,6 +4,7 @@ import classNames from "classnames"; ...@@ -4,6 +4,7 @@ import classNames from "classnames";
const Button = ({ const Button = ({
className, className,
bodyClassName,
icon, icon,
color = "black", color = "black",
hoverActive = true, hoverActive = true,
...@@ -25,9 +26,11 @@ const Button = ({ ...@@ -25,9 +26,11 @@ const Button = ({
className className
); );
const bodyClass = classNames("btn__body", bodyClassName);
const inner = ( const inner = (
<div className="btn__body-wrap"> <div className="btn__body-wrap">
<div className="btn__body">{children}</div> <div className={bodyClass}>{children}</div>
{!!icon && ( {!!icon && (
<div className="btn__icon"> <div className="btn__icon">
<i className={icon}></i> <i className={icon}></i>
......
...@@ -36,6 +36,7 @@ const Navbar = () => { ...@@ -36,6 +36,7 @@ const Navbar = () => {
}; };
const connectionIndicator = ( const connectionIndicator = (
<div className="inline-flex items-center order-first md:order-last md:ml-8 lg:order-first lg:mr-8 lg:ml-0">
<span <span
className="relative inline-flex h-4 w-4 mr-4" className="relative inline-flex h-4 w-4 mr-4"
title={connectionStateCaption} title={connectionStateCaption}
...@@ -53,6 +54,10 @@ const Navbar = () => { ...@@ -53,6 +54,10 @@ const Navbar = () => {
)} )}
/> />
</span> </span>
<span className="hidden md:block text-grey-200">
{connectionStateCaption}
</span>
</div>
); );
return ( return (
...@@ -113,7 +118,10 @@ const Navbar = () => { ...@@ -113,7 +118,10 @@ const Navbar = () => {
alt="Avatar" alt="Avatar"
/> />
</div> </div>
<button onClick={logout}> <button
onClick={logout}
className="text-grey-200 hover:text-white"
>
<i className="ico--log-out"></i> <i className="ico--log-out"></i>
</button> </button>
</div> </div>
......
...@@ -105,13 +105,13 @@ const Announcement = ({ ...@@ -105,13 +105,13 @@ const Announcement = ({
{showEdit && ( {showEdit && (
<DropdownMenuItem <DropdownMenuItem
onClick={onEdit} onClick={onEdit}
icon="ico--edit-pencil" icon="ico--pencil"
title="Upravit" title="Upravit"
/> />
)} )}
<DropdownMenuItem <DropdownMenuItem
onClick={onDelete} onClick={onDelete}
icon="ico--trashcan" icon="ico--bin"
title="Smazat" title="Smazat"
/> />
</DropdownMenu> </DropdownMenu>
......
...@@ -72,7 +72,7 @@ const AnnouncementEditModal = ({ ...@@ -72,7 +72,7 @@ const AnnouncementEditModal = ({
<div className="flex items-center justify-between mb-4"> <div className="flex items-center justify-between mb-4">
<CardHeadline>Upravit oznámení</CardHeadline> <CardHeadline>Upravit oznámení</CardHeadline>
<button onClick={onCancel} type="button"> <button onClick={onCancel} type="button">
<i className="ico--close"></i> <i className="ico--cross"></i>
</button> </button>
</div> </div>
<MarkdownEditor <MarkdownEditor
...@@ -104,7 +104,7 @@ const AnnouncementEditModal = ({ ...@@ -104,7 +104,7 @@ const AnnouncementEditModal = ({
onChange={(evt) => onLinkInput(evt.target.value)} onChange={(evt) => onLinkInput(evt.target.value)}
/> />
<div className="text-input-addon text-input-addon--l order-first"> <div className="text-input-addon text-input-addon--l order-first">
<i className="ico--link1"></i> <i className="ico--link"></i>
</div> </div>
</div> </div>
{linkValid === false && ( {linkValid === false && (
......
...@@ -23,10 +23,23 @@ const AnnouncementList = ({ ...@@ -23,10 +23,23 @@ const AnnouncementList = ({
onSeen(announcement); onSeen(announcement);
}; };
const getClassName = (idx) => {
if (idx === 0) {
return "pt-4 lg:pt-8";
}
if (idx === items.length - 1) {
return "pb-4 lg:pb-8";
}
return "";
};
return ( return (
<div className={classNames("space-y-px", className)}> <div className={classNames("space-y-px", className)}>
{items.map((item) => ( {items.map((item, idx) => (
<Announcement <Announcement
className={getClassName(idx)}
key={item.id} key={item.id}
datetime={item.datetime} datetime={item.datetime}
type={item.type} type={item.type}
......
...@@ -30,7 +30,7 @@ const ModalConfirm = ({ ...@@ -30,7 +30,7 @@ const ModalConfirm = ({
<div className="flex items-center justify-between mb-4"> <div className="flex items-center justify-between mb-4">
<CardHeadline>{title}</CardHeadline> <CardHeadline>{title}</CardHeadline>
<button onClick={onCancel} type="button"> <button onClick={onCancel} type="button">
<i className="ico--close"></i> <i className="ico--cross"></i>
</button> </button>
</div> </div>
<CardBodyText>{children}</CardBodyText> <CardBodyText>{children}</CardBodyText>
......
...@@ -43,7 +43,7 @@ const PostEditModal = ({ ...@@ -43,7 +43,7 @@ const PostEditModal = ({
<div className="flex items-center justify-between mb-4"> <div className="flex items-center justify-between mb-4">
<CardHeadline>Upravit text příspěvku</CardHeadline> <CardHeadline>Upravit text příspěvku</CardHeadline>
<button onClick={onCancel} type="button"> <button onClick={onCancel} type="button">
<i className="ico--close"></i> <i className="ico--cross"></i>
</button> </button>
</div> </div>
<MarkdownEditor <MarkdownEditor
......
...@@ -6,6 +6,7 @@ import Post from "./Post"; ...@@ -6,6 +6,7 @@ import Post from "./Post";
const PostList = ({ const PostList = ({
className, className,
items, items,
showAddPostCta,
currentUser, currentUser,
canThumb, canThumb,
dimArchived, dimArchived,
...@@ -83,7 +84,7 @@ const PostList = ({ ...@@ -83,7 +84,7 @@ const PostList = ({
onSeen={onPostSeen(item)} onSeen={onPostSeen(item)}
/> />
))} ))}
{!items.length && ( {showAddPostCta && !items.length && (
<p className="p-4 lg:p-0 lg:py-3 leading-snug text-sm md:text-base"> <p className="p-4 lg:p-0 lg:py-3 leading-snug text-sm md:text-base">
Nikdo zatím žádný odpovídající příspěvek do rozpravy nepřidal. Budeš Nikdo zatím žádný odpovídající příspěvek do rozpravy nepřidal. Budeš
první? první?
......
...@@ -29,7 +29,7 @@ const ProgramEntryEditModal = ({ ...@@ -29,7 +29,7 @@ const ProgramEntryEditModal = ({
<div className="flex items-center justify-between mb-4"> <div className="flex items-center justify-between mb-4">
<CardHeadline>Upravit název programového bodu</CardHeadline> <CardHeadline>Upravit název programového bodu</CardHeadline>
<button onClick={onCancel}> <button onClick={onCancel}>
<i className="ico--close"></i> <i className="ico--cross"></i>
</button> </button>
</div> </div>
<div className="form-field"> <div className="form-field">
......
...@@ -135,7 +135,7 @@ const AddAnnouncementForm = ({ className }) => { ...@@ -135,7 +135,7 @@ const AddAnnouncementForm = ({ className }) => {
onChange={(evt) => onLinkInput(evt.target.value)} onChange={(evt) => onLinkInput(evt.target.value)}
/> />
<div className="text-input-addon text-input-addon--l order-first"> <div className="text-input-addon text-input-addon--l order-first">
<i className="ico--link1"></i> <i className="ico--link"></i>
</div> </div>
</div> </div>
{linkValid === false && ( {linkValid === false && (
......
import React from "react";
import Button from "components/Button";
import { Card, CardBody } from "components/cards";
import { AuthStore } from "stores";
const JitsiInviteCard = () => {
const { showJitsiInvitePopup } = AuthStore.useState();
if (!showJitsiInvitePopup) {
return null;
}
return (
<Card className="lg:card bg-violet-300 relative" elevation={16}>
<i className="ico--jitsi text-9xl mr-2 text-violet-500 absolute right-0 top-0 opacity-25 z-0" />
<CardBody className="text-white relative z-10">
<div className="flex items-center justify-between mb-4">
<h2 className="head-heavy-xs">
<span>Pozvánka do Jitsi</span>
</h2>
<button type="button">
<i className="ico--cross"></i>
</button>
</div>
<p className="leading-snug text-sm mb-4">
Někdo tě pozval do <strong>chráněného Jitsi kanálu</strong>{" "}
celeostátního fóra. Ke kanálu se připojíš kliknutím na tlačítko níže.
</p>
<Button color="violet-500" className="btn--fullwidth">
Otevřít Jitsi kanál
</Button>
</CardBody>
</Card>
);
};
export default JitsiInviteCard;
...@@ -22,7 +22,7 @@ import PostList from "components/posts/PostList"; ...@@ -22,7 +22,7 @@ import PostList from "components/posts/PostList";
import { useActionState, useItemActionConfirm } from "hooks"; import { useActionState, useItemActionConfirm } from "hooks";
import { AuthStore, PostStore } from "stores"; import { AuthStore, PostStore } from "stores";
const PostsContainer = ({ className }) => { const PostsContainer = ({ className, showAddPostCta }) => {
const [postToEdit, setPostToEdit] = useState(null); const [postToEdit, setPostToEdit] = useState(null);
const [confirmingEdit, setConfirmingEdit] = useState(false); const [confirmingEdit, setConfirmingEdit] = useState(false);
const [editError, setEditError] = useState(null); const [editError, setEditError] = useState(null);
...@@ -165,6 +165,7 @@ const PostsContainer = ({ className }) => { ...@@ -165,6 +165,7 @@ const PostsContainer = ({ className }) => {
)} )}
<PostList <PostList
items={windowItems.slice(sliceStart, sliceEnd)} items={windowItems.slice(sliceStart, sliceEnd)}
showAddPostCta={showAddPostCta}
canThumb={isAuthenticated} canThumb={isAuthenticated}
onLike={like.run} onLike={like.run}
onDislike={dislike.run} onDislike={dislike.run}
......
...@@ -17,6 +17,7 @@ import AddAnnouncementForm from "containers/AddAnnouncementForm"; ...@@ -17,6 +17,7 @@ import AddAnnouncementForm from "containers/AddAnnouncementForm";
import AddPostForm from "containers/AddPostForm"; import AddPostForm from "containers/AddPostForm";
import AnnouncementsContainer from "containers/AnnoucementsContainer"; import AnnouncementsContainer from "containers/AnnoucementsContainer";
import GlobalStats from "containers/GlobalStats"; import GlobalStats from "containers/GlobalStats";
import JitsiInviteCard from "containers/JitsiInviteCard";
import PostFilters from "containers/PostFilters"; import PostFilters from "containers/PostFilters";
import PostsContainer from "containers/PostsContainer"; import PostsContainer from "containers/PostsContainer";
import { useActionConfirm } from "hooks"; import { useActionConfirm } from "hooks";
...@@ -167,7 +168,7 @@ const Home = () => { ...@@ -167,7 +168,7 @@ const Home = () => {
> >
<DropdownMenuItem <DropdownMenuItem
onClick={() => setShowProgramEditModal(true)} onClick={() => setShowProgramEditModal(true)}
icon="ico--edit-pencil" icon="ico--pencil"
title="Přejmenovat bod programu" title="Přejmenovat bod programu"
titleSize="base" titleSize="base"
iconSize="base" iconSize="base"
...@@ -225,12 +226,10 @@ const Home = () => { ...@@ -225,12 +226,10 @@ const Home = () => {
</div> </div>
</section> </section>
<section className="cf2021__notifications"> <section className="cf2021__notifications space-y-8">
<div className="lg:card lg:elevation-10"> <JitsiInviteCard />
<div className="lg:card__body pb-2 lg:py-6">
<h2 className="head-heavy-xs md:head-heavy-sm">Oznámení</h2>
</div>
<div className="lg:card lg:elevation-10">
<AnnouncementsContainer className="container-padding--zero lg:container-padding--auto" /> <AnnouncementsContainer className="container-padding--zero lg:container-padding--auto" />
{isAuthenticated && user.role === "chairman" && ( {isAuthenticated && user.role === "chairman" && (
<AddAnnouncementForm className="lg:card__body pt-4 lg:py-6" /> <AddAnnouncementForm className="lg:card__body pt-4 lg:py-6" />
...@@ -248,17 +247,21 @@ const Home = () => { ...@@ -248,17 +247,21 @@ const Home = () => {
title="Rozprava je uzavřena" 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> </h2>
<PostFilters /> <PostFilters />
</div> </div>
<PostsContainer className="container-padding--zero lg:container-padding--auto" /> <PostsContainer
className="container-padding--zero lg:container-padding--auto"
showAddPostCta={programEntry.discussionOpened}
/>
{!programEntry.discussionOpened &&
isAuthenticated &&
!user.isBanned && (
<p className="leading-normal">
Rozprava je uzavřena - příspěvky teď nelze přidávat.
</p>
)}
{programEntry.discussionOpened && {programEntry.discussionOpened &&
isAuthenticated && isAuthenticated &&
!user.isBanned && <AddPostForm className="my-8 space-y-4" />} !user.isBanned && <AddPostForm className="my-8 space-y-4" />}
......
...@@ -15,6 +15,7 @@ export const GlobalInfoStore = new Store(globalInfoStoreInitial); ...@@ -15,6 +15,7 @@ export const GlobalInfoStore = new Store(globalInfoStoreInitial);
/** @type {CF2021.AuthStorePayload} */ /** @type {CF2021.AuthStorePayload} */
const authStoreInitial = { const authStoreInitial = {
isAuthenticated: false, isAuthenticated: false,
showJitsiInvitePopup: false,
}; };
export const AuthStore = new Store(authStoreInitial); export const AuthStore = new Store(authStoreInitial);
......
...@@ -49,6 +49,8 @@ declare namespace CF2021 { ...@@ -49,6 +49,8 @@ declare namespace CF2021 {
group?: string; group?: string;
secret?: string; secret?: string;
}; };
showJitsiInvitePopup: boolean;
jitsiInviteToken?: string;
} }
export type AuthStorePayload = export type AuthStorePayload =
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment