From f2ecc1803f3ea294a0c6b7915b61348ed0395b26 Mon Sep 17 00:00:00 2001 From: Marcin Zelent Date: Wed, 16 Nov 2022 15:16:38 +0100 Subject: Remade and extended the app using React --- src/components/Sidebar/Sidebar.tsx | 152 +++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 src/components/Sidebar/Sidebar.tsx (limited to 'src/components/Sidebar/Sidebar.tsx') diff --git a/src/components/Sidebar/Sidebar.tsx b/src/components/Sidebar/Sidebar.tsx new file mode 100644 index 0000000..b4ddaa9 --- /dev/null +++ b/src/components/Sidebar/Sidebar.tsx @@ -0,0 +1,152 @@ +import React, { useEffect, useRef, useState } from 'react'; + +import { Group, Trip } from '../../models'; + +import styles from './Sidebar.module.css'; + +interface Props { + trips: Trip[]; + currentTrip: Trip; + groups: Group[]; + currentGroup: Group | undefined; + headline?: string; + asideOpen: boolean; + handleClose: () => void; + handleGroupChange: (groupIndex: number, openGallery?: boolean) => void; + handleTripChange: (tripIndex: number) => void; +} + +export default function Sidebar({ + trips, + currentTrip, + groups, + currentGroup, + asideOpen, + handleClose, + handleGroupChange, + handleTripChange, +}: Props): JSX.Element { + const [tripListOpen, setTripListOpen] = useState(false); + const wrapperRef = useRef(null); + + useEffect(() => { + function handleClickOutside(e: Event): void { + if ( + wrapperRef.current !== null && + e.target !== null && + !wrapperRef.current.contains(e.target as Node) + ) { + handleClose(); + } + } + + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [wrapperRef]); + + function groupChangeHandler(groupIndex: number, openGallery?: boolean): void { + handleGroupChange(groupIndex, openGallery); + handleClose(); + } + + function tripChangeHandler(tripIndex: number): void { + handleTripChange(tripIndex); + setTripListOpen(false); + } + + function buildGroupDescription( + template: string | undefined, + tokens: { [key: string]: string | number } | undefined, + ): string { + if (template === undefined) { + return ''; + } + + let description = template; + + if (tokens === undefined) { + return description; + } + + Object.keys(tokens).forEach((key) => { + description = description.replaceAll(`{${key}}`, `${tokens[key]}`); + }); + + return description; + } + + const asideStyle = asideOpen ? `${styles.aside} ${styles.asideOpen}` : styles.aside; + + return ( + + ); +} -- cgit v1.2.3