{"version":3,"file":"static/js/632.f3de412e.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","defaultPortalPage","defaultPublicPortalPage","cpMediaOnly","undefined","subheaders","map","header","i","renderedListItems","thisEvent","renderedButtonProps","process","REACT_APP_EMBED","component","RouterLink","to","concat","href","makeFullUrl","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","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","publicPortalName"],"sourceRoot":""}