{"version":3,"file":"632.4387f89e.chunk.js","mappings":"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","sources":["components/EventsTable/EventListTable.tsx","../node_modules/@mui/utils/esm/visuallyHidden.js","components/EventsTable/EventList.tsx","utils/setTitle.ts"],"sourcesContent":["import React from \"react\";\nimport { makeStyles } from \"@civicplus/preamble-ui/lib/Utilities/ThemeHelper\";\nimport List from \"@civicplus/preamble-ui/lib/List\";\nimport EventListRow from \"./EventListRow\";\nimport { EventMeeting } from \"../../types/types.event\";\nimport Button from \"@civicplus/preamble-ui/lib/Button\";\nimport { makeFullUrl, removeStringDateTimeZone } from \"../../utils\";\nimport { Link as RouterLink } from \"react-router-dom\";\nimport EventListRowSecondaryActions from \"./EventListRowSecondaryActions\";\nimport NoEventMessage from \"./NoEventMessage\";\n\nconst useStyles = makeStyles(theme => ({\n root: {\n padding: theme.spacing(1),\n \"& .prmbl-listItemText\": {\n margin: 0,\n },\n \"& .prmbl-listSubheader\": {\n background: theme.palette.background.default,\n marginLeft: -2,\n width: \"calc(100% + 4px)\",\n },\n },\n listItem: {\n background: theme.palette.background.paper,\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(2),\n boxShadow: theme.shadows[1],\n padding: \"0 !important\",\n textTransform: \"none\",\n letterSpacing: \"normal\",\n },\n errorMessage: {\n marginTop: theme.spacing(4),\n textAlign: \"center\",\n },\n secondaryAction: {\n top: \"auto\",\n bottom: theme.spacing(1.25),\n transform: \"none\",\n display: \"flex\",\n [theme.breakpoints.down(\"xs\")]: {\n bottom: theme.spacing(0.75),\n },\n },\n}));\n\ninterface EventListTableProps {\n events: EventMeeting[] | null;\n loading?: boolean;\n}\n\nconst EventListTable: React.FC = ({ events, loading }) => {\n const classes = useStyles();\n const today = new Date();\n // Sort the events into the relevant headers\n const renderedData: {\n [key: string]: Map;\n } = {\n \"Past Events\": new Map(),\n Today: new Map(),\n \"Coming Up\": new Map(),\n };\n\n React.useEffect(() => {\n /**\n * Focus management for the event list\n * - PAGE_UP move up by 1\n * - PAGE_DOWN move down by 1\n * - HOME move to top\n * - END move to bottom\n */\n\n const list = document.getElementById(\"scroll-wrap\");\n if (list) {\n const listItems = list.querySelectorAll(\n \"#startScreen, li>*[role='button'], #endScreen\"\n );\n const firstItem = listItems[0];\n const lastItem = listItems[listItems.length - 1];\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const activeElement = document.activeElement;\n if (\n activeElement?.tagName === \"A\" ||\n activeElement?.tagName === \"BUTTON\"\n ) {\n const activeIndex = Array.from(listItems).indexOf(activeElement);\n switch (e.key) {\n case \"PageUp\":\n e.preventDefault();\n if (activeIndex > 0) {\n (listItems[activeIndex - 1] as HTMLElement).focus();\n }\n break;\n case \"PageDown\":\n e.preventDefault();\n if (activeIndex < listItems.length - 1) {\n (listItems[activeIndex + 1] as HTMLElement).focus();\n }\n break;\n case \"Home\":\n e.preventDefault();\n (firstItem as HTMLElement).focus();\n break;\n case \"End\":\n e.preventDefault();\n (lastItem as HTMLElement).focus();\n break;\n }\n }\n };\n\n list.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n list.removeEventListener(\"keydown\", handleKeyDown);\n };\n }\n }, [events]);\n\n if (events === null) {\n return (\n ,\n },\n ListItemSecondaryActionProps: {\n className: classes.secondaryAction,\n },\n itemSecondaryAction: ,\n })}\n />\n );\n }\n\n if (events.length === 0) {\n return ;\n }\n\n events\n .sort((a, b) => {\n const dateComparison =\n new Date(a.startDateTime).getTime() -\n new Date(b.startDateTime).getTime();\n\n // If the dates are equal, then sort by createdOn date\n if (dateComparison === 0) {\n return (\n new Date(a.createdOn).getTime() - new Date(b.createdOn).getTime()\n );\n }\n\n // Otherwise, sort by date\n return dateComparison;\n })\n .forEach(event => {\n const startDate = new Date(removeStringDateTimeZone(event.startDateTime));\n const renderedId = event.id.toString();\n if (\n startDate.getFullYear() === today.getFullYear() &&\n startDate.getMonth() === today.getMonth() &&\n startDate.getDate() === today.getDate()\n ) {\n renderedData.Today.set(renderedId, event);\n } else {\n if (startDate < today) {\n renderedData[\"Past Events\"].set(renderedId, event);\n } else if (startDate > today) {\n renderedData[\"Coming Up\"].set(renderedId, event);\n }\n }\n });\n\n // Don't show empty sections\n Object.keys(renderedData).forEach(key => {\n if (renderedData[key].size === 0) {\n delete renderedData[key];\n }\n });\n\n if (Object.keys(renderedData).length === 0) {\n return ;\n }\n\n const filesPublicPortalPage = \"files\";\n const overviewPublicPortalPage = \"overview\";\n const videoPublicPortalPage = \"video\";\n\n const defaultPortalPage = (event: EventMeeting) => {\n return event.defaultPublicPortalPage === 0\n ? filesPublicPortalPage\n : event.defaultPublicPortalPage === 1 && !event.cpMediaOnly\n ? overviewPublicPortalPage\n : event.defaultPublicPortalPage === 9\n ? videoPublicPortalPage\n : !event.cpMediaOnly\n ? overviewPublicPortalPage\n : videoPublicPortalPage;\n };\n\n return (\n {\n const renderedListItems: React.ComponentProps<\n typeof List\n >[\"listItems\"] = [];\n renderedData[header].forEach(thisEvent => {\n // If the component is embedded, use anchor element/href, else use RouterLink/to\n const renderedButtonProps: Partial<\n React.ComponentProps\n > = {};\n if (process.env.REACT_APP_EMBED) {\n renderedButtonProps.href = makeFullUrl(\n `/event/${thisEvent.id}/${defaultPortalPage(thisEvent)}`\n );\n renderedButtonProps.openInNewWindow = true;\n } else {\n renderedButtonProps.component = RouterLink;\n renderedButtonProps.to = `/event/${\n thisEvent.id\n }/${defaultPortalPage(thisEvent)}`;\n }\n renderedListItems.push({\n button: true,\n role: \"button\",\n key: thisEvent.id,\n id: thisEvent.id.toString(),\n ...renderedButtonProps,\n // This works, but the type doesn't allow it normally\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n \"data-date\": thisEvent.eventDate,\n \"aria-labelledby\": `eventListRow-${thisEvent.id}-title`,\n \"aria-describedby\": `eventListRow-${thisEvent.id}-datetime`,\n \"data-id\": thisEvent.id,\n className: classes.listItem,\n itemText: {\n primary: ,\n },\n ListItemSecondaryActionProps: {\n className: classes.secondaryAction,\n },\n itemSecondaryAction: (\n \n ),\n });\n });\n return {\n children: header,\n listItems: renderedListItems,\n \"aria-hidden\": true,\n ListProps: {\n \"aria-labelledby\": `Event-list-listSubheader-${i}`,\n },\n };\n })}\n />\n );\n};\n\nexport default EventListTable;\n","const visuallyHidden = {\n border: 0,\n clip: 'rect(0 0 0 0)',\n height: '1px',\n margin: -1,\n overflow: 'hidden',\n padding: 0,\n position: 'absolute',\n whiteSpace: 'nowrap',\n width: '1px'\n};\nexport default visuallyHidden;","import React, {\n useEffect,\n useRef,\n useCallback,\n useState,\n useMemo,\n useLayoutEffect,\n} from \"react\";\nimport classNames from \"classnames\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useHistory } from \"react-router\";\nimport { makeStyles } from \"@civicplus/preamble-ui/lib/Utilities/ThemeHelper\";\nimport EventListTable from \"./EventListTable\";\nimport Loader from \"@civicplus/preamble-ui/lib/Loader\";\nimport { useSnackbar } from \"notistack\";\nimport { RootState, AppDispatch } from \"../../app/store\";\nimport {\n getEventsListAsync,\n cleanEventList,\n setLoading,\n setScrollToToday,\n} from \"../../actions\";\nimport useTitle from \"../../utils/setTitle\";\nimport { scroller } from \"react-scroll\";\nimport Typography from \"@civicplus/preamble-ui/lib/Typography\";\nimport {\n convertUtcDateToLocalDateWithoutTime,\n scrollToDate,\n} from \"../../utils\";\nimport { rowQuerySelector } from \"./EventListRow\";\nimport Grid from \"@civicplus/preamble-ui/lib/Grid\";\nimport { Fade } from \"@material-ui/core\";\nimport PopoverButton from \"@civicplus/preamble-ui/lib/PopoverButton\";\nimport InfoIcon from \"mdi-material-ui/InformationSlabSymbol\";\nimport { visuallyHidden } from \"@mui/utils\";\n\nconst useStyles = makeStyles(theme => ({\n tableWrapper: {\n container: \"eventListContainer / inline-size\",\n background: theme.palette.background.default,\n flexBasis: 0,\n flexGrow: 1,\n flexShrink: 1,\n \"-webkit-transform\": \"translate3d(0,0,0)\",\n overflow: \"auto\",\n \"&::-webkit-scrollbar-track\": {\n backgroundColor: theme.palette.grey[300],\n },\n \"&::-webkit-scrollbar\": {\n width: 10,\n },\n \"&::-webkit-scrollbar-thumb\": {\n minHeight: \"50px\",\n backgroundColor: theme.palette.grey[500],\n borderRadius: theme.shape.borderRadius,\n \"&:vertical\": {\n height: 20,\n width: 20,\n },\n \"&:hover\": {\n backgroundColor: theme.palette.grey[600],\n },\n },\n },\n eventListTable: {\n padding: theme.spacing(1),\n },\n loadPastMessage: {\n paddingTop: theme.spacing(2),\n },\n loadMoreButton: {\n padding: theme.spacing(1, 2),\n margin: theme.spacing(1, \"auto\"),\n position: \"relative\",\n textAlign: \"center\",\n display: \"block\",\n border: \"none\",\n },\n infiniteScrollEnd: {\n [theme.breakpoints.up(\"xs\")]: {\n height: \"calc(100vh - 390px)\",\n },\n [theme.breakpoints.up(\"md\")]: {\n height: \"calc(100vh - 410px)\",\n },\n [theme.breakpoints.up(\"lg\")]: {\n height: \"calc(100vh - 440px)\",\n },\n },\n loadMoreSpinner: {\n marginLeft: theme.spacing(1),\n },\n popoverButton: {\n maxWidth: \"300px\",\n },\n floatingButton: {\n position: \"absolute\",\n right: theme.spacing(2),\n transform: \"translateY(-50%)\",\n zIndex: theme.zIndex.appBar,\n boxShadow: theme.shadows[2],\n \"&:hover,&[aria-expanded='true']\": {\n animation: \"none\",\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n },\n },\n}));\n\nconst resultsNumber = 15; // The default pagination number from the API to retrieve events\n\nconst EventList: React.FC = () => {\n const dispatch = useDispatch();\n const scrollToToday = useSelector((state: RootState) => state.scrollToToday);\n const isLoading = useSelector((state: RootState) => state.isLoading);\n const eventList = useSelector((state: RootState) => state.eventsList);\n const filters = useSelector((state: RootState) => state.eventFilters);\n const isNextLink = useSelector((state: RootState) => state.isNextLink);\n const isPastLink = useSelector((state: RootState) => state.isPastLink);\n const history = useHistory();\n const classes = useStyles();\n const initialLoad = useRef(true);\n const firstRender = useRef(true);\n const startScreen = useRef(null);\n const endScreen = useRef(null);\n const [loadingPastEvents, setLoadingPastEvents] = useState(false);\n const [loadingNextEvents, setLoadingNextEvents] = useState(false);\n const [pastMessage, setPastMessage] = useState(\"\");\n const [upcomingMessage, setUpcomingMessage] = useState(\"\");\n const prevLoadingPastEvents = useRef(false);\n const prevLoadingNextEvents = useRef(false);\n const { enqueueSnackbar } = useSnackbar();\n const { setTitle } = useTitle();\n const [hasTriedLoadingPastEvents, setHasTriedLoadingPastEvents] =\n useState(false);\n const [noFutureEventsPublished, setNoFutureEventsPublished] = useState(false);\n\n const findFirstElementInViewPort = (elements: NodeListOf) =>\n Array.prototype.find.call(\n elements,\n element => element.getBoundingClientRect().y >= 85\n );\n const scrollTo = useMemo(() => {\n const events = document.querySelectorAll(rowQuerySelector);\n if (events) {\n return findFirstElementInViewPort(events);\n }\n return undefined;\n // We need this param to compute the last event only when this param is updated\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [eventList]);\n\n const maintainScroll = useCallback(() => {\n if (scrollTo) {\n // When past date is refreshed it goes back to last date displayed once it is new dates are loaded.\n scroller.scrollTo(scrollTo.id, {\n duration: 0,\n containerId: \"scroll-wrap\",\n smooth: true,\n offset: -124,\n });\n }\n }, [scrollTo]);\n\n useEffect(() => {\n if (\n noFutureEventsPublished &&\n filters.categories?.length === 0 &&\n (!filters.date || (!filters.date.from && !filters.date.to))\n ) {\n const filter = {\n loadPastDate: {\n from: null,\n to: new Date().toISOString(),\n },\n };\n dispatch(setLoading(true));\n getEventsListAsync(\n filter,\n true,\n false,\n false\n )(dispatch)\n .then(() => {\n dispatch(setLoading(false));\n setNoFutureEventsPublished(false);\n const today = new Date();\n today.setHours(0, 0, 0);\n return scrollToDate(today);\n })\n .catch(() => {\n dispatch(setLoading(false));\n enqueueSnackbar(`Unable to load past events.`, {\n variant: \"error\",\n });\n });\n }\n }, [filters, noFutureEventsPublished, enqueueSnackbar, dispatch]);\n\n useEffect(() => {\n const containerEvents = document.querySelector(\"#scroll-wrap\");\n if (\n containerEvents &&\n !loadingNextEvents &&\n !prevLoadingNextEvents.current\n ) {\n // Small offset to avoid trigger the infinite scroll for the past events after the page is reloaded\n containerEvents.scrollTop = 15;\n }\n if (eventList === null && !isLoading) {\n setHasTriedLoadingPastEvents(false);\n\n dispatch(setLoading(true));\n getEventsListAsync(\n filters,\n false,\n false,\n true\n )(dispatch)\n .then(() => {\n return dispatch(setLoading(false));\n })\n .catch(() => {\n dispatch(setLoading(false));\n enqueueSnackbar(`Unable to load events.`, {\n variant: \"error\",\n });\n });\n } else if (\n eventList &&\n eventList.length === 0 &&\n !hasTriedLoadingPastEvents\n ) {\n if (!filters.date || (!filters.date.from && !filters.date.to)) {\n getEventsListAsync(\n filters,\n true,\n false,\n false\n )(dispatch)\n .then(() => {\n return setHasTriedLoadingPastEvents(true);\n })\n .catch(() => {\n return setHasTriedLoadingPastEvents(true);\n });\n } else {\n return setHasTriedLoadingPastEvents(true);\n }\n } else if (\n eventList &&\n eventList.length === 0 &&\n hasTriedLoadingPastEvents\n ) {\n setNoFutureEventsPublished(true);\n }\n }, [\n dispatch,\n enqueueSnackbar,\n eventList,\n filters,\n hasTriedLoadingPastEvents,\n isLoading,\n loadingNextEvents,\n loadingPastEvents,\n maintainScroll,\n ]);\n\n useEffect(() => {\n // handle the respective scroll effect\n if (\n !isLoading &&\n eventList &&\n eventList.length > 0 &&\n prevLoadingPastEvents.current === loadingPastEvents &&\n prevLoadingNextEvents.current === loadingNextEvents &&\n !loadingPastEvents &&\n !loadingNextEvents\n ) {\n if (!filters.date?.from && filters.date?.to) {\n // if the user filtered for to-date only, then we start from the bottom\n const endScreenEl = document.getElementById(\"endScreen\");\n if (endScreenEl) {\n endScreenEl.scrollIntoView();\n }\n } else if (filters.date?.from) {\n // if the user filtered for from-date, then we start from the top\n const startScreenEl = document.getElementById(\n \"Event-list-listSubheader-0\"\n );\n if (startScreenEl) {\n startScreenEl.scrollIntoView();\n }\n } else {\n const li = document.getElementById(\"Event-list-listSubheader-0\");\n const id = (li?.childNodes[0] as Element | null)?.id;\n if (initialLoad.current || scrollToToday) {\n initialLoad.current = false;\n const isSecondSubheaderExist = document.getElementById(\n \"Event-list-listSubheader-1\"\n );\n // scroll to hide Load Past Events button\n scroller.scrollTo(\n isSecondSubheaderExist\n ? \"Event-list-listSubheader-1\"\n : \"Event-list-listSubheader-0\",\n {\n duration: 500,\n containerId: \"scroll-wrap\",\n smooth: true,\n offset: isSecondSubheaderExist ? -100 : 0,\n }\n );\n if (scrollToToday) {\n dispatch(setScrollToToday(false));\n }\n } else {\n // scroll to the top\n scroller.scrollTo(id || \"Event-list-listSubheader-0\", {\n duration: 500,\n containerId: \"scroll-wrap\",\n smooth: true,\n offset: -(li?.offsetTop || 0),\n });\n }\n }\n } else if (prevLoadingPastEvents.current) {\n maintainScroll();\n }\n prevLoadingPastEvents.current = loadingPastEvents;\n prevLoadingNextEvents.current = loadingNextEvents;\n // we don't want to run this effect when the filters change\n // The scroll effect should only run one time when the event list is updated\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n eventList,\n isLoading,\n loadingNextEvents,\n loadingPastEvents,\n maintainScroll,\n dispatch,\n ]);\n\n useEffect(() => {\n if (!firstRender.current) {\n if (!filters.search) {\n dispatch(cleanEventList());\n }\n } else {\n firstRender.current = false;\n }\n }, [dispatch, filters, history]);\n\n useEffect(() => {\n setTitle(\"Events\");\n }, [setTitle]);\n\n const loadPastEvents = useCallback(\n (tabNavigation = false) => {\n setPastMessage(\"\");\n if (!loadingPastEvents) {\n if (filters.date?.from && eventList && eventList?.length > 0) {\n setPastMessage(\"There are no past events for your selected filters\");\n return;\n } else if (isPastLink && eventList && eventList?.length > 0) {\n setPastMessage(\"There are no more past events\");\n return;\n }\n\n const currEvents = document.querySelectorAll(\n \"#event-list-table li>*[role='button']\"\n );\n const firstEvent = currEvents[0];\n if (firstEvent) {\n const firstEventId = firstEvent.getAttribute(\"id\");\n const endDate = filters.calendarDate\n ? new Date(filters.calendarDate)\n : new Date();\n endDate.setHours(0, 0, 0);\n\n // Calculate OData $skip value from current event list.\n let pastEventCount = 0;\n\n for (const event of currEvents) {\n const eventDate = event.getAttribute(\"data-date\");\n // This check is necessary to remove duplicates.\n const eventId = event.getAttribute(\"data-id\");\n\n if (eventDate && eventId) {\n if (new Date(eventDate) < endDate) {\n pastEventCount++;\n }\n }\n }\n const filter = {\n ...filters,\n loadPastDate: {\n from: filters.date?.from || null,\n to: endDate.toISOString(),\n skip: pastEventCount,\n },\n };\n\n setLoadingPastEvents(true);\n getEventsListAsync(\n filter,\n true,\n false,\n false\n )(dispatch)\n .then(() => {\n setLoadingPastEvents(false);\n if (tabNavigation) {\n const previousEvent = firstEventId\n ? document.getElementById(firstEventId)?.parentElement\n ?.previousElementSibling?.firstElementChild\n : null;\n if (previousEvent) (previousEvent as HTMLElement)?.focus();\n }\n return;\n })\n .catch(() => {\n // Show error\n enqueueSnackbar(`Unable to load past events.`, {\n variant: \"error\",\n });\n });\n }\n }\n },\n [\n dispatch,\n enqueueSnackbar,\n eventList,\n filters,\n isPastLink,\n loadingPastEvents,\n ]\n );\n\n const loadNextEvents = useCallback(\n (tabNavigation = false) => {\n if (!loadingNextEvents) {\n setUpcomingMessage(\"\");\n const currEvents = document.querySelectorAll(\n \"#event-list-table li>*[role='button']\"\n );\n const firstDate = eventList && eventList[0].startDateTime;\n\n // If the date filters are set, we prioritize those.\n const startDate = filters.date?.from\n ? new Date(filters.date.from)\n : filters.calendarDate\n ? new Date(filters.calendarDate)\n : new Date();\n startDate.setUTCHours(0, 0, 0);\n\n const endDate = filters.date?.to ? new Date(filters.date.to) : null;\n if (endDate instanceof Date && !isNaN(endDate.getTime())) {\n // Since this is the endDate, we want to include all events on that date.\n endDate.setUTCHours(23, 59, 59);\n }\n\n const latestEvent = currEvents[currEvents.length - 1];\n const latestEventDate = latestEvent.getAttribute(\"data-date\") || \"\";\n const latestEventDateFormat =\n convertUtcDateToLocalDateWithoutTime(latestEventDate);\n if (filters.date?.to && !isNextLink) {\n setUpcomingMessage(\n \"There are no upcoming events for your selected filters\"\n );\n return;\n } else if (!isNextLink) {\n if (latestEventDateFormat) {\n if (latestEventDateFormat >= new Date()) {\n setUpcomingMessage(\"There are no more upcoming events\");\n } else {\n setUpcomingMessage(\"No current or future events to display\");\n }\n }\n return;\n }\n\n let currentEventsLoadedCount = 0;\n\n if (eventList && eventList.length > 0) {\n if (firstDate) {\n // We need to check how many events in the current list\n // match the date ranges being sent to the API to get an\n // accurate $skip value.\n for (const event of currEvents) {\n const eventDate = event.getAttribute(\"data-date\");\n const eventId = event.getAttribute(\"data-id\");\n\n // Checking eventId can remove duplicates sometimes seen in the list.\n if (eventDate && eventId) {\n const eventDateObj = new Date(eventDate);\n if (\n startDate <= eventDateObj &&\n (!endDate || eventDateObj <= endDate)\n ) {\n currentEventsLoadedCount++;\n }\n }\n }\n }\n }\n\n const filter = {\n ...filters,\n skip: currentEventsLoadedCount,\n date: {\n from: startDate.toISOString(),\n to: filters.date?.to || null,\n },\n };\n\n setLoadingNextEvents(true);\n getEventsListAsync(\n filter,\n false,\n true,\n false\n )(dispatch)\n .then(() => {\n setLoadingNextEvents(false);\n if (tabNavigation && latestEvent) {\n const latestEventId = latestEvent.getAttribute(\"id\");\n const nextEvent = latestEventId\n ? document.getElementById(latestEventId)?.parentElement\n ?.nextElementSibling?.firstElementChild\n : null;\n if (nextEvent) (nextEvent as HTMLElement)?.focus();\n }\n return;\n })\n .catch(() => {\n // Show error\n enqueueSnackbar(`Unable to load new events.`, {\n variant: \"error\",\n });\n });\n }\n },\n [\n loadingNextEvents,\n eventList,\n filters,\n isNextLink,\n dispatch,\n enqueueSnackbar,\n ]\n );\n\n useEffect(() => {\n setUpcomingMessage(\"\");\n setPastMessage(\"\");\n }, [filters]);\n\n const handleObserverStartScreen = useCallback(\n entries => {\n const targetEl = entries[0];\n let hasListFocus = false;\n // Check if the event list has focus\n if (document.hasFocus()) {\n const list = document.getElementById(\"scroll-wrap\");\n const listButtons = list?.querySelectorAll(\n \"#startScreen, li>*[role='button'], #endScreen\"\n );\n listButtons?.forEach(button => {\n if (button === document.activeElement) {\n hasListFocus = true;\n }\n });\n }\n if (targetEl.isIntersecting && !hasListFocus) {\n loadPastEvents();\n }\n },\n [loadPastEvents]\n );\n\n const handleObserverEndScreen = useCallback(\n entries => {\n const targetEl = entries[0];\n let hasListFocus = false;\n // Check if the event list has focus\n if (document.hasFocus()) {\n const list = document.getElementById(\"scroll-wrap\");\n const listButtons = list?.querySelectorAll(\n \"#startScreen, li>*[role='button'], #endScreen\"\n );\n listButtons?.forEach(button => {\n if (button === document.activeElement) {\n hasListFocus = true;\n }\n });\n }\n if (targetEl.isIntersecting && !hasListFocus) {\n loadNextEvents();\n }\n },\n [loadNextEvents]\n );\n const observerOption = useMemo(\n () => ({\n root: null,\n rootMargin: \"100px\",\n threshold: 0.9,\n }),\n []\n );\n\n useLayoutEffect(() => {\n // Observers to handle infinite scroll\n const observerStart = new IntersectionObserver(\n handleObserverStartScreen,\n observerOption\n );\n if (startScreen.current) {\n observerStart.observe(startScreen.current);\n }\n const observerEnd = new IntersectionObserver(\n handleObserverEndScreen,\n observerOption\n );\n if (eventList && eventList.length >= resultsNumber) {\n if (endScreen.current) {\n observerEnd.observe(endScreen.current);\n }\n }\n\n return () => {\n observerStart.disconnect();\n observerEnd.disconnect();\n };\n }, [\n eventList,\n handleObserverStartScreen,\n handleObserverEndScreen,\n observerOption,\n loadNextEvents,\n ]);\n\n const infiniteScroll = (show: boolean, previous = false) => {\n if (eventList && eventList.length > 0) {\n return (\n \n \n \n {`${show ? \"Loading\" : \"Load\"} more ${\n previous ? \"previous\" : \"upcoming\"\n } events`}\n \n \n {`${\n previous\n ? \"You will be inserted to the previous event from the top of the current list, after loading\"\n : \"You will be inserted to the next event from the bottom of the current list, after loading\"\n }`}\n \n \n \n \n \n \n \n \n );\n }\n return <>;\n };\n return (\n <>\n \n \n Navigate the list of events with the scroll bar\n \n \n • Scroll up to see past events.\n \n \n • Scroll down to see upcoming events.\n \n \n }\n customHelperIcon={}\n type=\"fab\"\n PopoverProps={{\n classes: {\n paper: classes.popoverButton,\n },\n }}\n />\n \n {eventList?.length !== 0 && (\n \n {pastMessage ? (\n \n {pastMessage}\n \n ) : (\n loadPastEvents(true)}\n disabled={loadingPastEvents}\n aria-describedby=\"focusHelperMessage\"\n >\n {infiniteScroll(loadingPastEvents, true)}\n \n )}\n \n )}\n \n \n \n {eventList?.length !== 0 && (\n \n {upcomingMessage ? (\n \n {upcomingMessage}\n \n ) : (\n loadNextEvents(true)}\n disabled={loadingNextEvents}\n aria-describedby=\"focusHelperMessage\"\n >\n {infiniteScroll(loadingNextEvents)}\n \n )}\n \n )}\n \n \n );\n};\n\nexport default EventList;\n","import { RootState } from \"../app/store\";\nimport { useSelector } from \"react-redux\";\n\ninterface useTitleHook {\n setTitle: (title: string) => void;\n}\n\nexport const useTitle = (): useTitleHook => {\n const portalCustomization = useSelector(\n (state: RootState) => state.portalCustomization\n );\n return {\n setTitle: (title: string): void => {\n // Don't take over the page title when embedded\n if (process.env.REACT_APP_EMBED) {\n return;\n }\n document.title = `${title} • ${portalCustomization?.publicPortalName} • CivicClerk`;\n },\n };\n};\n\nexport default useTitle;\n"],"names":["useStyles","makeStyles","theme","root","padding","spacing","margin","background","palette","default","marginLeft","width","listItem","paper","borderRadius","shape","marginBottom","boxShadow","shadows","textTransform","letterSpacing","errorMessage","marginTop","textAlign","secondaryAction","_defineProperty","top","bottom","transform","display","breakpoints","down","_ref","events","loading","classes","today","Date","renderedData","Map","Today","React","list","document","getElementById","listItems","querySelectorAll","firstItem","lastItem","length","handleKeyDown","e","activeElement","tagName","activeIndex","Array","from","indexOf","key","preventDefault","focus","addEventListener","removeEventListener","_jsx","List","id","className","fill","itemText","primary","EventListRow","ListItemSecondaryActionProps","itemSecondaryAction","EventListRowSecondaryActions","NoEventMessage","sort","a","b","dateComparison","startDateTime","getTime","createdOn","forEach","event","startDate","removeStringDateTimeZone","renderedId","toString","getFullYear","getMonth","getDate","set","Object","keys","size","overviewPublicPortalPage","videoPublicPortalPage","undefined","subheaders","map","header","i","renderedListItems","thisEvent","renderedButtonProps","href","makeFullUrl","concat","defaultPublicPortalPage","cpMediaOnly","openInNewWindow","push","_objectSpread","button","role","eventDate","children","ListProps","border","clip","height","overflow","position","whiteSpace","_infiniteScrollEnd","tableWrapper","container","flexBasis","flexGrow","flexShrink","backgroundColor","grey","minHeight","eventListTable","loadPastMessage","paddingTop","loadMoreButton","infiniteScrollEnd","up","loadMoreSpinner","popoverButton","maxWidth","floatingButton","right","zIndex","appBar","animation","main","color","contrastText","dispatch","useDispatch","scrollToToday","useSelector","state","isLoading","eventList","eventsList","filters","eventFilters","isNextLink","isPastLink","history","useHistory","initialLoad","useRef","firstRender","startScreen","endScreen","_useState","useState","_useState2","_slicedToArray","loadingPastEvents","setLoadingPastEvents","_useState3","_useState4","loadingNextEvents","setLoadingNextEvents","_useState5","_useState6","pastMessage","setPastMessage","_useState7","_useState8","upcomingMessage","setUpcomingMessage","prevLoadingPastEvents","prevLoadingNextEvents","enqueueSnackbar","useSnackbar","setTitle","useTitle","_useState9","_useState10","hasTriedLoadingPastEvents","setHasTriedLoadingPastEvents","_useState11","_useState12","noFutureEventsPublished","setNoFutureEventsPublished","scrollTo","useMemo","elements","rowQuerySelector","prototype","find","call","element","getBoundingClientRect","y","maintainScroll","useCallback","scroller","duration","containerId","smooth","offset","useEffect","_filters$categories","categories","date","to","filter","loadPastDate","toISOString","setLoading","getEventsListAsync","then","setHours","scrollToDate","catch","variant","containerEvents","querySelector","current","scrollTop","_filters$date","_filters$date2","_filters$date3","startScreenEl","scrollIntoView","_li$childNodes$","li","childNodes","isSecondSubheaderExist","setScrollToToday","offsetTop","endScreenEl","search","cleanEventList","loadPastEvents","tabNavigation","arguments","_filters$date4","currEvents","firstEvent","_filters$date5","firstEventId","getAttribute","endDate","calendarDate","_step","pastEventCount","_iterator","_createForOfIteratorHelper","s","n","done","value","eventId","err","f","skip","_document$getElementB","_document$getElementB2","_document$getElementB3","previousEvent","parentElement","previousElementSibling","firstElementChild","loadNextEvents","_filters$date6","_filters$date7","_filters$date8","_filters$date9","firstDate","setUTCHours","isNaN","latestEvent","latestEventDate","latestEventDateFormat","convertUtcDateToLocalDateWithoutTime","currentEventsLoadedCount","_step2","_iterator2","eventDateObj","_document$getElementB4","_document$getElementB5","_document$getElementB6","latestEventId","nextEvent","nextElementSibling","handleObserverStartScreen","entries","targetEl","hasListFocus","hasFocus","listButtons","isIntersecting","handleObserverEndScreen","observerOption","rootMargin","threshold","useLayoutEffect","observerStart","IntersectionObserver","observe","observerEnd","disconnect","infiniteScroll","show","previous","_jsxs","Grid","alignItems","item","xs","Typography","style","visuallyHidden","Fade","in","unmountOnExit","Loader","verticallyCenter","_Fragment","PopoverButton","popoverText","gutterBottom","customHelperIcon","InfoIcon","type","PopoverProps","justifyContent","align","ref","onClick","disabled","EventListTable","classNames","portalCustomization","title"],"sourceRoot":""}