-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathEventPageContainer.tsx
More file actions
128 lines (121 loc) · 3.94 KB
/
Copy pathEventPageContainer.tsx
File metadata and controls
128 lines (121 loc) · 3.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import { Link } from '@city-of-helsinki/react-helsinki-headless-cms';
import {
LoadingSpinner,
useLocale,
addParamsToQueryString,
isEventClosed,
MAIN_CONTENT_ID,
useSuperEventLazyLoad,
EventClosedHero,
EventHero,
EventPageMeta,
RouteMeta,
BreadcrumbContainer,
} from '@events-helsinki/components';
import type { EventFields } from '@events-helsinki/components';
import type { BreadcrumbListItem } from 'hds-react';
import dynamic from 'next/dynamic';
import { useRouter } from 'next/router';
import { useTranslation } from 'next-i18next';
import React, { useState } from 'react';
import { ROUTES } from '../../constants';
import AppConfig from '../../domain/app/AppConfig';
import routerHelper from '../app/routerHelper';
import ErrorHero from '../error/ErrorHero';
import styles from './eventPage.module.scss';
import useSimilarEventsQueryVariables from './useSimilarEventsQueryVariables';
const SimilarEvents = dynamic(
() => import('@events-helsinki/components').then((mod) => mod.SimilarEvents),
{
ssr: false,
}
);
const EventContent = dynamic(
() => import('@events-helsinki/components').then((mod) => mod.EventContent),
{
ssr: false,
}
);
export interface EventPageContainerProps {
loading: boolean;
event?: EventFields;
showSimilarEvents?: boolean;
breadcrumbs?: BreadcrumbListItem[];
}
const EventPageContainer: React.FC<EventPageContainerProps> = ({
event,
loading,
showSimilarEvents = true,
breadcrumbs,
}) => {
const { t } = useTranslation('event');
const router = useRouter();
const locale = useLocale();
const search = addParamsToQueryString(router.asPath, {
returnPath: `/${locale}/${routerHelper.getLocalizedCmsItemUrl(
ROUTES.SEARCH,
{},
locale
)}`,
});
const { superEvent } = useSuperEventLazyLoad(event);
const [hasSimilarEvents, setHasSimilarEvents] = useState(false);
const handleSimilarEventsLoaded = (eventsCount: number) => {
setHasSimilarEvents(eventsCount > 0);
};
const eventClosed = !event || isEventClosed(event);
const moveToHomePage = () => {
router.push(routerHelper.getI18nPath('/', locale));
};
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const similarEventsFilters = useSimilarEventsQueryVariables(event!);
return (
<div className={styles.eventPageWrapper}>
{breadcrumbs && <BreadcrumbContainer breadcrumbs={breadcrumbs} />}
<main id={MAIN_CONTENT_ID}>
<LoadingSpinner isLoading={loading}>
{event ? (
<>
{/* Wait for data to be accessible before updating metadata */}
<RouteMeta origin={AppConfig.origin} />
<EventPageMeta event={event} />
{eventClosed ? (
<EventClosedHero onClick={moveToHomePage} />
) : (
<>
<EventHero event={event} superEvent={superEvent} />
<EventContent
event={event}
superEvent={superEvent}
hasSimilarEvents={hasSimilarEvents}
/>
</>
)}
{/* Hide similar event on SSR to make initial load faster */}
{showSimilarEvents && !eventClosed && similarEventsFilters && (
<SimilarEvents
event={event}
onEventsLoaded={handleSimilarEventsLoaded}
eventFilters={similarEventsFilters ?? {}}
/>
)}
</>
) : (
<ErrorHero text={t('notFound.text')} title={t('notFound.title')}>
<Link
href={`${routerHelper.getLocalizedCmsItemUrl(
ROUTES.SEARCH,
{},
locale
)}${search}`}
>
{t('notFound.linkSearchEvents')}
</Link>
</ErrorHero>
)}
</LoadingSpinner>
</main>
</div>
);
};
export default EventPageContainer;