all repos — caroster @ 1361276a89549d6339e2dda712b9021072c46f7f

[Octree] Group carpool to your event https://caroster.io

fix: 🐛  Broken link to a 404 page instead of alert for anonymous users in Caroster plus
Simon Mulquin simon@octree.ch
Thu, 30 May 2024 18:35:02 +0900
commit

1361276a89549d6339e2dda712b9021072c46f7f

parent

036d5c633879bc5d207a01dff01636cc3103715a

M frontend/containers/Alerts/AlertsHead.tsxfrontend/containers/Alerts/AlertsHead.tsx

@@ -23,11 +23,13 @@

const eventId = event.id; const handleToggleClick = async () => { - await handleCreateTripAlert({ - eventId, - enabled: !disabled, - }); - handleToggle(); + if (!disabled) { + await handleCreateTripAlert({ + eventId, + enabled: !switchChecked, + }); + handleToggle(); + } }; return (

@@ -35,7 +37,11 @@ <Box display="flex" alignItems="center" justifyContent="space-between">

<Typography variant="h5">{t('alert.title')}</Typography> <FormControlLabel control={ - <Toggle activate={handleToggleClick} checked={switchChecked} /> + <Toggle + activate={handleToggleClick} + checked={switchChecked} + disabled={disabled} + /> } label="" sx={{m: 0}}
M frontend/containers/Alerts/index.tsxfrontend/containers/Alerts/index.tsx

@@ -1,11 +1,12 @@

import {useReducer} from 'react'; import {Box, Container, Paper, Typography, useMediaQuery} from '@mui/material'; +import {useTranslation} from 'react-i18next'; import theme from '../../theme'; -import {EventEntity, TripAlertEntity} from '../../generated/graphql'; - +import usePermissions from '../../hooks/usePermissions'; +import LoginToAttend from '../LoginToAttend/LoginToAttend'; import AlertsHeader from './AlertsHead'; import AlertsForm from './AlertsForm'; -import {useTranslation} from 'react-i18next'; +import {EventEntity, TripAlertEntity} from '../../generated/graphql'; interface Props { event: EventEntity;

@@ -13,29 +14,37 @@ tripAlertEntity: TripAlertEntity;

} const Alerts = ({event, tripAlertEntity}: Props) => { + const { + userPermissions: {canSetAlert}, + } = usePermissions(); + const {t} = useTranslation(); const isMobile = useMediaQuery(theme.breakpoints.down('md')); const [switchChecked, handleToggle] = useReducer( i => !i, tripAlertEntity?.attributes.enabled || false ); - const {t} = useTranslation(); return ( <Container maxWidth="sm" sx={{mt: 11, mx: 0, px: isMobile ? 2 : 4}}> + {!canSetAlert() && ( + <Box sx={{width: '480px', maxWidth: '100%', position: 'relative'}}> + <LoginToAttend title={t('event.loginToSetAlert')}/> + </Box> + )} <Paper sx={{width: '480px', maxWidth: '100%', position: 'relative'}}> <Box p={2}> <AlertsHeader event={event} switchChecked={switchChecked} handleToggle={handleToggle} - disabled={switchChecked} + disabled={!canSetAlert()} /> <Typography sx={{mt: 2}} variant="body2"> {t('alert.description')} </Typography> <AlertsForm event={event} - disabled={!switchChecked} + disabled={!canSetAlert || !switchChecked} tripAlertEntity={tripAlertEntity} /> </Box>
M frontend/containers/TravelColumns/LoginToAttend.tsxfrontend/containers/LoginToAttend/LoginToAttend.tsx

@@ -5,23 +5,23 @@ import Typography from '@mui/material/Typography';

import {useRouter} from 'next/router'; import {useTranslation} from 'react-i18next'; -const LoginToAttend = () => { +const LoginToAttend = ({title}) => { const {t} = useTranslation(); const router = useRouter(); return ( <Box my={4} mx="auto" maxWidth="100%" width={340}> <Typography variant="h6" align="center" color="textSecondary"> - {t('event.loginToAttend')} + {title} </Typography> <Typography - sx={{whiteSpace: 'pre-line', mt: 2}} + sx={{whiteSpace: 'pre-line', mt: 1}} align="center" color="textSecondary" > {t('event.loginToAttend.desc')} </Typography> - <Box display='flex' justifyContent='space-between' pt={2}> + <Box display='flex' justifyContent='space-between' pt={2} gap={1}> <Link href={`/auth/login?redirectPath=${router.asPath}`} passHref
M frontend/containers/TravelColumns/index.tsxfrontend/containers/TravelColumns/index.tsx

@@ -15,7 +15,7 @@ import NoCar from './NoCar';

import {TravelEntity} from '../../generated/graphql'; import {AddPassengerToTravel} from '../NewPassengerDialog'; import MasonryContainer from './MasonryContainer'; -import LoginToAttend from './LoginToAttend'; +import LoginToAttend from '../LoginToAttend/LoginToAttend'; import usePermissions from '../../hooks/usePermissions'; import useDisplayTravels from './useDisplayTravels'; import useDisplayMarkers from './useDisplayMarkers';

@@ -119,7 +119,7 @@ >

<Masonry columns={{xl: 4, lg: 3, md: 2, sm: 2, xs: 1}} spacing={0}> {!canAddTravel() && ( <MasonryContainer key="no_other_travel"> - <LoginToAttend /> + <LoginToAttend title={t('event.loginToAttend')}/> </MasonryContainer> )} {displayedTravels?.map(travel => {
M frontend/hooks/usePermissions.tsfrontend/hooks/usePermissions.ts

@@ -6,6 +6,7 @@ interface UserPermissions {

canEditEventOptions: () => boolean; canEditEventDetails: () => boolean; canEditWaitingList: () => boolean; + canSetAlert: () => boolean; canAddTravel: () => boolean; canEditTravel: (travel: TravelEntity) => boolean; canJoinTravels: () => boolean;

@@ -18,6 +19,7 @@ const noPermissions = {

canEditEventOptions: () => false, canEditEventDetails: () => false, canEditWaitingList: () => false, + canSetAlert: () => false, canAddTravel: () => false, canEditTravel: () => false, canJoinTravels: () => false,

@@ -39,6 +41,7 @@ const allPermissions: UserPermissions = {

canEditEventOptions: () => true, canEditEventDetails: () => true, canEditWaitingList: () => true, + canSetAlert: () => true, canAddTravel: () => true, canEditTravel: () => true, canJoinTravels: () => true,

@@ -61,8 +64,10 @@ const travelCreatorId =

travel.attributes.user?.data?.id || travel.attributes.user; return travelCreatorId === userId; }, + canJoinTravels: () => true, canAddTravel: () => true, + canSetAlert: () => true, canDeletePassenger: passenger => { const travel = event?.travels?.data?.find(travel => travel.attributes.passengers.data.some(

@@ -91,6 +96,7 @@ ...allPermissions,

canSeePassengerDetails: () => false, canDeletePassenger: () => true, canEditEventOptions: () => userIsEventCreator, + canSetAlert: () => false, canJoinTravels: () => connected, }, };
M frontend/locales/en.jsonfrontend/locales/en.json

@@ -69,6 +69,7 @@ "event.fields.share": "Share",

"event.filter.allDates": "All dates", "event.filter.dates": "Multiple dates", "event.filter.title": "Filter dates", + "event.loginToSetAlert": "Alerts are only available to the attendees of this carpool.", "event.loginToAttend": "Do you want to attend this event ?", "event.loginToAttend.desc": "Signup or log in to carpool to the event", "event.loginToAttend.login": "$t(menu.login)",
M frontend/locales/fr.jsonfrontend/locales/fr.json

@@ -69,6 +69,7 @@ "event.fields.share": "Partager",

"event.filter.allDates": "Toutes les dates", "event.filter.dates": "Dates multiples", "event.filter.title": "Filtrer par dates", + "event.loginToSetAlert": "Les alertes ne sont disponibles que pour les participants à ce covoiturage.", "event.loginToAttend": "Voulez-vous rejoindre cet évÚnement ?", "event.loginToAttend.desc": "Créez un compte ou connectez-vous pour covoiturer à l'événement", "event.loginToAttend.login": "$t(menu.login)",
M frontend/locales/nl.jsonfrontend/locales/nl.json

@@ -69,6 +69,7 @@ "event.fields.share": "Delen",

"event.filter.allDates": "Alle datums", "event.filter.dates": "Meerdere datums", "event.filter.title": "Datums filteren", + "event.loginToSetAlert": "Waarschuwingen zijn alleen beschikbaar voor de deelnemers aan deze carpool.", "event.loginToAttend": "Wilt u deelnemen aan deze afspraak?", "event.loginToAttend.desc": "Registreer of log in om deel te nemen", "event.loginToAttend.login": "$t(menu.login)",
M frontend/pages/e/[uuid]/alerts.tsxfrontend/pages/e/[uuid]/alerts.tsx

@@ -55,13 +55,6 @@ notFound: true,

}; } - const isCarosterPlus = - event?.attributes?.enabled_modules?.includes('caroster-plus'); - if (!isCarosterPlus) - return { - notFound: true, - }; - try { const {data} = await apolloClient.query({ query: TripAlertDocument,

@@ -69,9 +62,7 @@ variables: {eventId: event.id},

}); tripAlertEntity = data.eventTripAlert.data; } catch (error) { - return { - notFound: true, - }; + tripAlertEntity = null; } return {