Skip to content
Snippets Groups Projects
Commit 14d92409 authored by xaralis's avatar xaralis
Browse files

feat: enable restarting onboarding tour

parent d87b7609
No related branches found
No related tags found
No related merge requests found
...@@ -7,7 +7,7 @@ import classNames from "classnames"; ...@@ -7,7 +7,7 @@ import classNames from "classnames";
import Button from "components/Button"; import Button from "components/Button";
import { AuthStore, GlobalInfoStore } from "stores"; import { AuthStore, GlobalInfoStore } from "stores";
const Navbar = () => { const Navbar = ({ onGetHelp }) => {
const { innerWidth } = useWindowSize(); const { innerWidth } = useWindowSize();
const [showMenu, setShowMenu] = useState(); const [showMenu, setShowMenu] = useState();
const { keycloak } = useKeycloak(); const { keycloak } = useKeycloak();
...@@ -36,7 +36,7 @@ const Navbar = () => { ...@@ -36,7 +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"> <div className="inline-flex items-center">
<span <span
className="relative inline-flex h-4 w-4 mr-4" className="relative inline-flex h-4 w-4 mr-4"
data-tip={connectionStateCaption} data-tip={connectionStateCaption}
...@@ -109,8 +109,10 @@ const Navbar = () => { ...@@ -109,8 +109,10 @@ const Navbar = () => {
</li> </li>
</ul> </ul>
</div> </div>
<div className="navbar__actions navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto self-start flex flex-row items-center"> <div className="navbar__actions navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto self-start flex flex-row items-center justify-between">
{connectionIndicator} <div className="order-last lg:order-first lg:mr-8">
{connectionIndicator}
</div>
{!isAuthenticated && ( {!isAuthenticated && (
<Button className="btn--white joyride-login" onClick={login}> <Button className="btn--white joyride-login" onClick={login}>
Přihlásit se Přihlásit se
......
...@@ -115,6 +115,38 @@ export const steps = [ ...@@ -115,6 +115,38 @@ export const steps = [
), ),
placement: "right", placement: "right",
}, },
{
target: ".joyride-filters",
content: (
<>
<h1 className="head-alt-sm mb-4">Filtrování a řazení příspěvků</h1>
<div className="leading-snug text-base space-y-2">
<p>
Příspěvky v rozpravě můžeš filtrovat <strong>podle typu</strong>{" "}
(návrhy/příspěvky), <strong>podle stavu</strong>{" "}
(aktivní/archivované) a můžeš taky přepínat jejich{" "}
<strong>řazení</strong> (podle podpory, podle času přidání).
</p>
</div>
</>
),
placement: "bottom",
},
{
target: ".joyride-pagination",
content: (
<>
<h1 className="head-alt-sm mb-4">Stránkování příspěvků</h1>
<div className="leading-snug text-base space-y-2">
<p>
Příspěvky jsou stránkované <strong>po dvaceti</strong>. Stránky
můžeš přepínat těmito šipkami.
</p>
</div>
</>
),
placement: "bottom",
},
{ {
target: ".joyride-announcements", target: ".joyride-announcements",
content: ( content: (
......
...@@ -65,7 +65,7 @@ const PostFilters = () => { ...@@ -65,7 +65,7 @@ const PostFilters = () => {
return ( return (
<div className="flex flex-col space-y-2 xl:space-y-0 xl:space-x-8 xl:flex-row xl:items-center"> <div className="flex flex-col space-y-2 xl:space-y-0 xl:space-x-8 xl:flex-row xl:items-center">
<div className="-mx-1"> <div className="-mx-1 joyride-filters">
<Dropdown <Dropdown
value={filters.flags} value={filters.flags}
onChange={onFlagsChange} onChange={onFlagsChange}
...@@ -86,7 +86,7 @@ const PostFilters = () => { ...@@ -86,7 +86,7 @@ const PostFilters = () => {
/> />
</div> </div>
<div> <div className="joyride-pagination">
<Chip <Chip
color="grey-125" color="grey-125"
className={ className={
......
import React, { useEffect, useState } from "react"; import React, { useCallback, useEffect, useState } from "react";
import { Helmet } from "react-helmet-async"; import { Helmet } from "react-helmet-async";
import Joyride, { EVENTS } from "react-joyride"; import Joyride, { EVENTS } from "react-joyride";
import ReactPlayer from "react-player/lazy"; import ReactPlayer from "react-player/lazy";
...@@ -45,6 +45,8 @@ const Home = () => { ...@@ -45,6 +45,8 @@ const Home = () => {
const programEntry = currentId ? programEntries[currentId] : null; const programEntry = currentId ? programEntries[currentId] : null;
const [showProgramEditModal, setShowProgramEditModal] = useState(false); const [showProgramEditModal, setShowProgramEditModal] = useState(false);
const [runJoyRide, setRunJoyride] = useState(false); const [runJoyRide, setRunJoyride] = useState(false);
// The easiest way to restart the joyride tour is by simply re-rendering the component.
const [joyrideRenderKey, setJoyrideRenderKey] = useState(0);
const { innerWidth } = useWindowSize(); const { innerWidth } = useWindowSize();
const isLg = innerWidth >= 1024; const isLg = innerWidth >= 1024;
const [ const [
...@@ -80,6 +82,11 @@ const Home = () => { ...@@ -80,6 +82,11 @@ const Home = () => {
setShowProgramEditModal(false); setShowProgramEditModal(false);
}; };
const showTutorial = useCallback(() => {
setRunJoyride(true);
setJoyrideRenderKey(joyrideRenderKey + 1);
}, [joyrideRenderKey, setRunJoyride, setJoyrideRenderKey]);
const handleJoyrideCallback = ({ action, index, status, type }) => { const handleJoyrideCallback = ({ action, index, status, type }) => {
if (type === EVENTS.TOUR_END) { if (type === EVENTS.TOUR_END) {
localStorage.setItem(tourLSKey, "COMPLETED"); localStorage.setItem(tourLSKey, "COMPLETED");
...@@ -148,6 +155,7 @@ const Home = () => { ...@@ -148,6 +155,7 @@ const Home = () => {
next: "Další", next: "Další",
skip: "Přeskočit intro", skip: "Přeskočit intro",
}} }}
key={joyrideRenderKey}
run={runJoyRide} run={runJoyRide}
showProgress={true} showProgress={true}
showSkipButton={true} showSkipButton={true}
...@@ -197,42 +205,53 @@ const Home = () => { ...@@ -197,42 +205,53 @@ const Home = () => {
{programEntry.number !== "" && `Bod č. ${programEntry.number}: `} {programEntry.number !== "" && `Bod č. ${programEntry.number}: `}
{programEntry.title} {programEntry.title}
</h1> </h1>
{displayActions && ( <div className="pl-4 pt-1 lg:pt-5">
<DropdownMenu right triggerSize="lg" className="pl-4 pt-1 lg:pt-5"> <div className="space-x-4 inline-flex items-center">
<DropdownMenuItem <button
onClick={() => setShowProgramEditModal(true)} className="ico--question text-grey-200 hover:text-black text-lg"
icon="ico--pencil" aria-label="Potřebuješ pomoc? Spusť si znovu nápovědu jak tuhle aplikaci používat."
title="Přejmenovat bod programu" data-tip="Potřebuješ pomoc? Spusť si znovu nápovědu jak tuhle aplikaci používat."
titleSize="base" data-tip-at="left"
iconSize="base" onClick={showTutorial}
/> />
{programEntry.discussionOpened && ( {displayActions && (
<DropdownMenuItem <DropdownMenu right triggerSize="lg">
onClick={() => setShowCloseDiscussion(true)} <DropdownMenuItem
icon="ico--bubbles" onClick={() => setShowProgramEditModal(true)}
title="Ukončit rozpravu" icon="ico--pencil"
titleSize="base" title="Přejmenovat bod programu"
iconSize="base" 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>
)} )}
{!programEntry.discussionOpened && ( </div>
<DropdownMenuItem </div>
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> </div>
<section className="cf2021__video"> <section className="cf2021__video">
<div className="container-padding--zero md:container-padding--auto"> <div className="container-padding--zero md:container-padding--auto">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment