Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1333: Add activation route #1334

Merged
merged 8 commits into from
Apr 2, 2024
2 changes: 2 additions & 0 deletions administration/src/Router.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import DataPrivacyController from './bp-modules/regions/data-privacy-policy/Data
import DataPrivacyPolicy from './bp-modules/regions/data-privacy-policy/DataPrivacyPolicy'
import UserSettingsController from './bp-modules/user-settings/UserSettingsController'
import ManageUsersController from './bp-modules/users/ManageUsersController'
import ActivationPage from './mui-modules/activation/ActivationPage'
import ApplicationApplicantController from './mui-modules/application-verification/ApplicationApplicantController'
import ApplicationVerificationController from './mui-modules/application-verification/ApplicationVerificationController'
import ApplyController from './mui-modules/application/ApplyController'
Expand All @@ -43,6 +44,7 @@ const Router = () => {
{ path: '/forgot-password', element: <ForgotPasswordController /> },
{ path: '/reset-password/', element: <ResetPasswordController /> },
{ path: '/data-privacy-policy', element: <DataPrivacyPolicy /> },
{ path: '/activation/:activationCode', element: <ActivationPage /> },
...(projectConfig.applicationFeature
? [
{ path: '/beantragen', element: <ApplyController /> },
Expand Down
18 changes: 3 additions & 15 deletions administration/src/bp-modules/auth/Login.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import { Button, Card, H2, H3, H4 } from '@blueprintjs/core'
import { Card, H2, H3, H4 } from '@blueprintjs/core'
import React, { useContext } from 'react'
import { useNavigate } from 'react-router-dom'

import getMessageFromApolloError from '../../errors/getMessageFromApolloError'
import { SignInMutation, SignInPayload, useSignInMutation } from '../../generated/graphql'
import { ProjectConfigContext } from '../../project-configs/ProjectConfigContext'
import { setProjectConfigOverride } from '../../project-configs/getProjectConfig'
import { useAppToaster } from '../AppToaster'
import StandaloneCenter from '../StandaloneCenter'
import ProjectSwitcher from '../util/ProjectSwitcher'
import LoginForm from './LoginForm'

interface State {
Expand All @@ -16,7 +15,6 @@ interface State {
}

const Login = (props: { onSignIn: (payload: SignInPayload) => void }) => {
const navigate = useNavigate()
const config = useContext(ProjectConfigContext)
const appToaster = useAppToaster()
const [state, setState] = React.useState<State>({ email: '', password: '' })
Expand All @@ -35,11 +33,6 @@ const Login = (props: { onSignIn: (payload: SignInPayload) => void }) => {
},
})

const switchProject = (project: string) => {
setProjectConfigOverride(project)
navigate(0)
}

return (
<StandaloneCenter>
<Card style={{ width: '100%', maxWidth: '500px' }}>
Expand All @@ -54,12 +47,7 @@ const Login = (props: { onSignIn: (payload: SignInPayload) => void }) => {
onSubmit={onSubmit}
loading={mutationState.loading}
/>
{process.env.NODE_ENV === 'development' ? (
<>
<Button onClick={() => switchProject('nuernberg.sozialpass.app')}>Switch to Nürnberg</Button>
<Button onClick={() => switchProject('bayern.ehrenamtskarte.app')}>Switch to Ehrenamtskarte Bayern</Button>
</>
) : null}
<ProjectSwitcher />
</Card>
</StandaloneCenter>
)
Expand Down
25 changes: 25 additions & 0 deletions administration/src/bp-modules/util/ProjectSwitcher.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { Button } from '@blueprintjs/core'
import React, { ReactElement } from 'react'
import { useNavigate } from 'react-router-dom'

import { setProjectConfigOverride } from '../../project-configs/getProjectConfig'

const ProjectSwitcher = (): ReactElement | null => {
const navigate = useNavigate()
const switchProject = (project: string) => {
setProjectConfigOverride(project)
navigate(0)
}

if (process.env.NODE_ENV !== 'development') {
return null
}
return (
<>
<Button onClick={() => switchProject('nuernberg.sozialpass.app')}>Switch to Nürnberg</Button>
<Button onClick={() => switchProject('bayern.ehrenamtskarte.app')}>Switch to Ehrenamtskarte Bayern</Button>
</>
)
}

export default ProjectSwitcher
35 changes: 35 additions & 0 deletions administration/src/mui-modules/activation/ActivationPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Card } from '@mui/material'
import { styled } from '@mui/system'
import React, { ReactElement, useContext } from 'react'

import { ProjectConfigContext } from '../../project-configs/ProjectConfigContext'
import ActivationPageContent from './components/ActivationPageContent'

const CardContainer = styled(Card)`
margin: 20px;
padding: 20px;
max-width: 500px;
`

const StandaloneHorizontalCenter = styled('div')`
display: flex;
flex-grow: 1;
flex-direction: column;
justify-content: start;
align-items: center;
margin-top: 10%;
`

const ActivationPage = (): ReactElement | null => {
const config = useContext(ProjectConfigContext)

return (
<StandaloneHorizontalCenter>
<CardContainer>
<ActivationPageContent config={config} />
</CardContainer>
</StandaloneHorizontalCenter>
)
}

export default ActivationPage
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import React, { ReactElement } from 'react'

import ProjectSwitcher from '../../../bp-modules/util/ProjectSwitcher'
import { ProjectConfig } from '../../../project-configs/getProjectConfig'

const ActivationPageContent = ({ config }: { config: ProjectConfig }): ReactElement => {
if (!config.activation) {
return <ProjectSwitcher />
}
const { activationText, downloadLink } = config.activation

return <>{activationText(config.name, downloadLink)}</>
}

export default ActivationPageContent
28 changes: 28 additions & 0 deletions administration/src/project-configs/bayern/activationText.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { Typography } from '@mui/material'
f1sh1918 marked this conversation as resolved.
Show resolved Hide resolved
import React from 'react'

export const ActivationText = (applicationName: string, downloadLink: string) => (
<div>
<Typography variant='h6' mb='8px'>
Aktivierung nur in der App möglich
</Typography>
<ol>
<li>
Laden Sie sich die App <b>{applicationName}</b> im App- oder PlayStore auf Ihrem Smartphone herunter.
</li>
<li>
{' '}
Öffnen Sie dafür den folgenden Link auf Ihrem Smartphone:
<br />
<a href={downloadLink} target='_blank' rel='noreferrer'>
{downloadLink}
</a>
</li>
<li>
Öffnen Sie nach erfolgreicher Installation die PDF mit dem Aktivierungscode und führen Sie die Aktivierung
erneut durch. Gegebenenfalls müssen Sie dabei die heruntergeladene App auswählen, um den Vorgang in der App zu
starten.
</li>
</ol>
</div>
)
5 changes: 5 additions & 0 deletions administration/src/project-configs/bayern/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { JsonField, findValue } from '../../bp-modules/applications/JsonFieldVie
import BavariaCardTypeExtension from '../../cards/extensions/BavariaCardTypeExtension'
import RegionExtension from '../../cards/extensions/RegionExtension'
import { ProjectConfig } from '../getProjectConfig'
import { ActivationText } from './activationText'
import { DataPrivacyAdditionalBaseText, DataPrivacyBaseText, dataPrivacyBaseHeadline } from './dataPrivacyBase'
import pdfConfiguration from './pdf'

Expand Down Expand Up @@ -57,6 +58,10 @@ const config: ProjectConfig = {
dataPrivacyHeadline: dataPrivacyBaseHeadline,
dataPrivacyContent: DataPrivacyBaseText,
dataPrivacyAdditionalBaseContent: DataPrivacyAdditionalBaseText,
activation: {
activationText: ActivationText,
downloadLink: 'https://download.bayern.ehrenamtskarte.app/',
},
timezone: 'Europe/Berlin',
pdf: pdfConfiguration,
}
Expand Down
4 changes: 4 additions & 0 deletions administration/src/project-configs/getProjectConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ export interface ProjectConfig {
pdf: PdfConfig
timezone: string
activityLogConfig?: ActivityLogConfig
activation?: {
activationText: (applicationName: string, downloadLink: string) => ReactElement
downloadLink: string
}
}

export const setProjectConfigOverride = (hostname: string) => {
Expand Down