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 ( ); }