Skip to content

Commit 59ba5c4

Browse files
authored
Merge pull request #813 from wickathou/update/pre-STAG
Update - Bringing #770 with merge conflicts solved
2 parents 39d956a + aa9c823 commit 59ba5c4

9 files changed

Lines changed: 144 additions & 117 deletions

File tree

frontend/src/App.js

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useState, useEffect, Suspense } from 'react'
22

3-
import { ConnectedRouter, push } from 'connected-react-router'
3+
import { ConnectedRouter } from 'connected-react-router'
44
import { useDispatch, useSelector } from 'react-redux'
55
import { ApolloProvider } from '@apollo/client'
66

@@ -38,21 +38,13 @@ export default ({ history, location }) => {
3838
if (isSessionExpired) {
3939
setLoading(true)
4040
console.log('renewing session now')
41-
dispatch(AuthActions.renewSession())
42-
.then(() => {
43-
setLoading(false)
44-
})
45-
.catch(err => {
46-
console.log(err)
47-
dispatch(SnackbarActions.error('Please, log in again'))
48-
})
49-
.finally(() => setLoading(false))
50-
} else {
51-
setLoading(false)
41+
dispatch(AuthActions.renewSession()).catch(err => {
42+
console.log(err)
43+
dispatch(SnackbarActions.error('Please, log in again'))
44+
})
5245
}
53-
} else {
54-
setLoading(false)
5546
}
47+
setLoading(false)
5648
}, [dispatch, isAuthenticated, isSessionExpired])
5749

5850
return (

frontend/src/components/events/EventHeroImage/index.js

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -110,37 +110,6 @@ export default ({
110110
</Grid>
111111
</Container>
112112

113-
{/* <Box className={classes.logoWrapper}>
114-
<FadeInWrapper enterDelay={0.3} verticalOffset={50}>
115-
<Box
116-
p={3}
117-
display="flex"
118-
flexDirection="column"
119-
alignItems="center"
120-
justifyContent="center"
121-
>
122-
<Typography
123-
className={classes.overline}
124-
variant="button"
125-
>
126-
{event?._eventTimeFormatted}
127-
</Typography>
128-
<Typography className={classes.title} variant="h3">
129-
{title ?? event?.name}
130-
</Typography>
131-
<Typography className={classes.title} variant="h4">
132-
{subheading}
133-
</Typography>
134-
135-
<Typography
136-
className={classes.overline}
137-
variant="button"
138-
>
139-
{event?._eventLocationFormatted}
140-
</Typography>
141-
</Box>
142-
</FadeInWrapper>
143-
</Box> */}
144113
<Container
145114
wrapperClass={classes.backButtonWrapper}
146115
className={classes.buttonInner}

frontend/src/hooks/useQuery.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { useLocation, useHistory } from 'react-router-dom'
2+
3+
export function useQuery() {
4+
const { search } = useLocation()
5+
const history = useHistory()
6+
7+
function getQuery(key) {
8+
const params = new URLSearchParams(search)
9+
return params.get(key)
10+
}
11+
12+
function setQuery(key, value) {
13+
const params = new URLSearchParams(search)
14+
params.set(key, value)
15+
history.push({ search: params.toString() })
16+
}
17+
18+
return { getQuery, setQuery }
19+
}

frontend/src/pages/_dashboard/renderDashboard/organiser/edit/default/index.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react'
22

3-
import { useDispatch, useSelector } from 'react-redux'
3+
import { useSelector } from 'react-redux'
44
import { Grid, Box, Typography } from '@material-ui/core'
55
import { FastField } from 'formik'
66

@@ -9,14 +9,15 @@ import FormControl from 'components/inputs/FormControl'
99
import TextInput from 'components/inputs/TextInput'
1010
import ImageUpload from 'components/inputs/ImageUpload'
1111
import Select from 'components/inputs/Select'
12-
import Timeline from '../timeline'
12+
import EventPageCustomizationPreviewModal from 'pages/_events/EventPageCustomizationPreviewModal'
1313

1414
import * as OrganiserSelectors from 'redux/organiser/selectors'
1515
import { useAllOrganizations } from 'graphql/queries/organization'
1616
import ColorSelect from 'components/inputs/Color'
1717
import Button from 'components/generic/Button'
18-
import { push } from 'connected-react-router'
1918
import { defaultEventStyles } from './const'
19+
import Timeline from '../timeline'
20+
import { useQuery } from 'hooks/useQuery'
2021

2122
const themeFields = [
2223
{
@@ -69,7 +70,14 @@ const themeFields = [
6970
export default () => {
7071
const event = useSelector(OrganiserSelectors.event)
7172
const [organizations] = useAllOrganizations()
72-
const dispatch = useDispatch()
73+
const { getQuery, setQuery } = useQuery()
74+
const isPreviewOpen = getQuery('preview') === 'true'
75+
76+
// Open the preview modal by setting the preview mode in URL
77+
const handlePreviewOpen = () => setQuery('preview', 'true')
78+
79+
// Close the preview modal by removing the preview mode from URL
80+
const handlePreviewClose = () => setQuery('preview', 'false')
7381

7482
return (
7583
<Grid container spacing={3}>
@@ -382,12 +390,7 @@ export default () => {
382390
</Grid>
383391
))}
384392
<Grid item xs={12}>
385-
<Button
386-
variant="contained"
387-
onClick={() =>
388-
dispatch(push('/events/' + event.slug))
389-
}
390-
>
393+
<Button variant="contained" onClick={handlePreviewOpen}>
391394
Preview
392395
</Button>
393396
<FastField name="theme">
@@ -407,6 +410,11 @@ export default () => {
407410
</Grid>
408411
</Grid>
409412
</Grid>
413+
<EventPageCustomizationPreviewModal
414+
open={isPreviewOpen}
415+
onClose={handlePreviewClose}
416+
eventSlug={event.slug}
417+
/>
410418
</Grid>
411419
)
412420
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import React from 'react'
2+
import {
3+
Dialog,
4+
DialogTitle,
5+
DialogContent,
6+
DialogActions,
7+
} from '@material-ui/core'
8+
import Button from 'components/generic/Button'
9+
10+
export default ({ open, onClose, eventSlug }) => {
11+
return (
12+
<Dialog
13+
fullWidth
14+
maxWidth="lg"
15+
open={open}
16+
onClose={onClose}
17+
aria-labelledby="preview-modal-title"
18+
>
19+
<DialogTitle id="preview-modal-title">Event Preview</DialogTitle>
20+
<DialogActions
21+
style={{ display: 'flex', justifyContent: 'center' }}
22+
>
23+
<Button onClick={onClose} color="primary" variant="contained">
24+
Close
25+
</Button>
26+
</DialogActions>
27+
<DialogContent>
28+
<iframe
29+
src={`/events/${eventSlug}?preview=true`}
30+
style={{ width: '100%', height: '80vh', border: 'none' }}
31+
title="Event Preview"
32+
/>
33+
</DialogContent>
34+
</Dialog>
35+
)
36+
}

frontend/src/pages/_events/slug/default/EventButtons/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ export default ({ event, registration }) => {
5050
<Button
5151
onClick={() =>
5252
dispatch(
53-
push(`/dashboard/event/${event.slug}`),
53+
push(
54+
`/dashboard/event/${event.slug}`,
55+
),
5456
)
5557
}
5658
variant="applicationsClosed"

frontend/src/pages/_events/slug/default/EventTimeline/index.js

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
} from '@material-ui/core'
1111
import { sortBy } from 'lodash-es'
1212
import moment from 'moment'
13-
import MiscUtils from 'utils/misc'
1413
import TimelineDot from 'components/generic/TimelineDot'
1514
import StepConnector from '@material-ui/core/StepConnector'
1615

@@ -105,29 +104,29 @@ const EventTimeline = ({ event, textColor, accentColor = undefined }) => {
105104
realItems.length > 0
106105
? realItems
107106
: [
108-
{
109-
date: moment(event.registrationStartTime).format(
110-
dateString,
111-
),
112-
dateValue: moment(event.registrationStartTime).unix(),
113-
completed: moment(
114-
event.registrationStartTime,
115-
).isBefore(),
116-
title: 'Application period begins',
117-
active: true,
118-
},
119-
{
120-
date: moment(event.registrationEndTime).format(
121-
dateString,
122-
),
123-
dateValue: moment(event.registrationEndTime).unix(),
124-
completed: moment(
125-
event.registrationEndTime,
126-
).isBefore(),
127-
title: 'Application period ends',
128-
active: true,
129-
},
130-
]
107+
{
108+
date: moment(event.registrationStartTime).format(
109+
dateString,
110+
),
111+
dateValue: moment(event.registrationStartTime).unix(),
112+
completed: moment(
113+
event.registrationStartTime,
114+
).isBefore(),
115+
title: 'Application period begins',
116+
active: true,
117+
},
118+
{
119+
date: moment(event.registrationEndTime).format(
120+
dateString,
121+
),
122+
dateValue: moment(event.registrationEndTime).unix(),
123+
completed: moment(
124+
event.registrationEndTime,
125+
).isBefore(),
126+
title: 'Application period ends',
127+
active: true,
128+
},
129+
]
131130

132131
if (realItems.length < 1) {
133132
if (

frontend/src/pages/_events/slug/default/index.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import EventHeroImage from 'components/events/EventHeroImage'
77
import Markdown from 'components/generic/Markdown'
88
import AnalyticsService from 'services/analytics'
99

10-
1110
import EventTimeline from './EventTimeline'
1211
import BannerCarousel from 'components/generic/BannerCarousel'
1312
import GradientBox from 'components/generic/GradientBox'
@@ -67,6 +66,7 @@ const useStyles = makeStyles({
6766
})
6867

6968
export default () => {
69+
// isPreview determines if the page is being previewed in the Preview modal
7070
const dispatch = useDispatch()
7171
const { slug, event, registration } = useContext(EventDetailContext)
7272
const classes = useStyles(event.theme)
@@ -177,7 +177,10 @@ export default () => {
177177
<StaggeredListItem>
178178
<Box mt={3} />
179179
<GradientBox color="theme_white" p={3}>
180-
<Typography variant="button" gutterBottom>
180+
<Typography
181+
variant="button"
182+
gutterBottom
183+
>
181184
Event Timeline
182185
</Typography>
183186
<hr className="tw-h-px tw-bg-gray-500 tw-border-0 tw-dark:bg-gray-900"></hr>
Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useContext } from 'react'
1+
import React, { useContext, useEffect, useState } from 'react'
22

33
import { Route, Switch, Redirect } from 'react-router-dom'
44
import { AnimatePresence } from 'framer-motion'
@@ -16,43 +16,42 @@ import EventDetailContext, { EventDetailProvider } from './context'
1616
const EventDetailRouter = () => {
1717
const match = useRouteMatch()
1818
const location = useLocation()
19-
const { eventLoading, eventError, isRegistrationOpen } =
20-
useContext(EventDetailContext)
21-
// TODO FIX errortext and desc to be from eventErro
19+
const [isPreview, setIsPreview] = useState(false)
20+
const { eventLoading, eventError, isRegistrationOpen } = useContext(EventDetailContext)
21+
22+
// Monitor changes to the preview query parameter and update state accordingly
23+
useEffect(() => {
24+
const searchParams = new URLSearchParams(location.search)
25+
setIsPreview(searchParams.get('preview') === 'true')
26+
}, [location.search])
27+
28+
// Conditional rendering for preview or non-preview mode
2229
return (
2330
<PageWrapper
2431
loading={eventLoading}
2532
error={!!eventError}
26-
errorText={`Oops, something went wrong`}
27-
errorDesc={`Please refresh the page to try again.`}
28-
header={() => <GlobalNavBar />}
29-
footer={() => <EventFooter />}
30-
render={() => {
31-
return (
32-
<AnimatePresence>
33-
<Switch location={location} key={location.pathname}>
34-
<Route
35-
exact
36-
path={`${match.url}`}
37-
component={EventDetail}
38-
/>
39-
{isRegistrationOpen && (
40-
<Route
41-
exact
42-
path={`${match.url}/register`}
43-
component={EventRegister}
44-
/>
45-
)}
46-
<Route
47-
exact
48-
path={`${match.url}/finalist-voting`}
49-
component={FinalistVoting}
50-
/>
51-
<Redirect to={`${match.url}`} />
52-
</Switch>
53-
</AnimatePresence>
54-
)
55-
}}
33+
errorText="Oops, something went wrong"
34+
errorDesc="Please refresh the page to try again."
35+
header={!isPreview ? () => <GlobalNavBar /> : undefined}
36+
footer={!isPreview ? () => <EventFooter /> : undefined}
37+
render={() => (
38+
<AnimatePresence>
39+
<Switch location={location} key={location.pathname}>
40+
<Route
41+
exact
42+
path={`${match.url}`}
43+
render={(props) => <EventDetail {...props} isPreview={isPreview} />}
44+
/>
45+
{isRegistrationOpen && !isPreview &&
46+
<Route exact path={`${match.url}/register`} component={EventRegister} />
47+
}
48+
{!isPreview &&
49+
<Route exact path={`${match.url}/finalist-voting`} component={FinalistVoting} />
50+
}
51+
<Redirect to={`${match.url}`} />
52+
</Switch>
53+
</AnimatePresence>
54+
)}
5655
/>
5756
)
5857
}
@@ -63,4 +62,4 @@ export default () => {
6362
<EventDetailRouter />
6463
</EventDetailProvider>
6564
)
66-
}
65+
}

0 commit comments

Comments
 (0)