Skip to content

Commit d35f3da

Browse files
committed
Add Landing Page to differ logged vs. not logged in users on root
1 parent 5ebb870 commit d35f3da

File tree

7 files changed

+125
-45
lines changed

7 files changed

+125
-45
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import NavFrontendSpinner from 'nav-frontend-spinner';
2+
import React, { useEffect } from 'react';
3+
import { useDispatch, useSelector } from 'react-redux';
4+
import { Redirect } from 'react-router-dom';
5+
import InngangInnsendingDigital from '../../components/inngang/inngang-innsendingsvalg-digital';
6+
import { checkAuth, setValgtTema } from '../../store/actions';
7+
import { Store } from '../../store/reducer';
8+
import { CenteredContainer } from '../../styled-components/main-styled-components';
9+
import { Tema, TemaKey } from '../../types/tema';
10+
11+
const LandingPage = (temaKey: TemaKey, saksnummer: string | null = null) => {
12+
const { loading, person } = useSelector((state: Store) => state);
13+
const dispatch = useDispatch();
14+
15+
useEffect(() => {
16+
dispatch(checkAuth(false));
17+
}, [dispatch]);
18+
19+
useEffect(() => {
20+
dispatch(setValgtTema(temaKey));
21+
}, [dispatch, temaKey]);
22+
23+
if (loading) {
24+
return (
25+
<CenteredContainer>
26+
<NavFrontendSpinner type={'XL'} />
27+
</CenteredContainer>
28+
);
29+
}
30+
31+
if (person === null) {
32+
return InngangInnsendingDigital(temaKey, Tema[temaKey], saksnummer);
33+
}
34+
35+
const saksnummerQuery = saksnummer === null ? '' : `&saksnummer=${saksnummer}`;
36+
return <Redirect to={`/begrunnelse?tema=${temaKey}${saksnummerQuery}`} />;
37+
};
38+
39+
export default LandingPage;

src/pages/oppsummering-skjema-page/oppsummering-skjema-page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ const OppsummeringSkjemaPage = (props: Props) => {
6767
});
6868
};
6969

70-
if (typeof activeKlage === 'undefined') {
70+
if (typeof activeKlage === 'undefined' || person === null) {
7171
return null;
7272
}
7373

src/pages/root-with-query/root-with-query.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import React from 'react';
22
import { useLocation } from 'react-router-dom';
33
import queryString from 'query-string';
4-
import { ensureStringIsTema, Tema } from '../../types/tema';
4+
import { ensureStringIsTema } from '../../types/tema';
55
import InngangHovedkategorier from '../../components/inngang/inngang-hovedkategorier';
6-
import InngangInnsendingDigital from '../../components/inngang/inngang-innsendingsvalg-digital';
6+
import LandingPage from '../landing-page/landing-page';
77

88
const RootWithQuery = () => {
99
const { search } = useLocation();
10+
1011
const query = queryString.parse(search);
1112
const temaKey = ensureStringIsTema(getQueryValue(query.tema));
1213
if (temaKey === null) {
1314
return <InngangHovedkategorier />;
1415
}
16+
1517
const saksnummer = getQueryValue(query.saksnummer);
16-
return InngangInnsendingDigital(temaKey, Tema[temaKey], saksnummer);
18+
return LandingPage(temaKey, saksnummer);
1719
};
1820

1921
function getQueryValue(queryValue: string | string[] | null | undefined) {

src/store/actions.ts

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { Dispatch } from 'react';
2-
import { getUserDataUrl } from '../clients/apiUrls';
32
import { Klage, KlageSkjema, klageSkjemaToKlage, klageSkjemaToKlageDraft } from '../types/klage';
43
import { postKlage, putKlage, getKlage } from '../services/klageService';
54
import { Vedlegg, VedleggFile } from '../types/vedlegg';
@@ -8,6 +7,8 @@ import { logError } from '../utils/logger/frontendLogger';
87
import { StorageKey } from '../utils/get-resume-state';
98
import { AxiosError } from 'axios';
109
import { login } from '../utils/login';
10+
import { getUser, JsonParseError, NotLoggedInError, RequestError } from '../utils/get-user';
11+
import { TemaKey } from '../types/tema';
1112

1213
export type ActionTypes =
1314
| {
@@ -47,7 +48,7 @@ export type ActionTypes =
4748
}
4849
| {
4950
type: 'TEMA_SET';
50-
value: string;
51+
value: TemaKey;
5152
}
5253
| {
5354
type: 'KLAGE_ID_SET';
@@ -56,26 +57,32 @@ export type ActionTypes =
5657
| {
5758
type: 'SET_FINALIZED_DATE';
5859
value: string | null;
60+
}
61+
| {
62+
type: 'SET_LOADING';
63+
value: boolean;
5964
};
6065

61-
export function checkAuth() {
62-
return function (dispatch: Dispatch<ActionTypes>) {
63-
return fetch(getUserDataUrl(), {
64-
method: 'GET',
65-
credentials: 'include'
66-
})
67-
.then(response => sjekkAuth(response))
68-
.then(sjekkHttpFeil)
69-
.then(response => response.json() as Promise<Bruker>)
70-
.then(bruker => {
71-
dispatch({ type: 'CHECK_AUTH_SUCCESS', payload: bruker });
72-
})
73-
.catch(error => {
74-
if (error !== 401 && error !== 403) {
75-
dispatch({ type: 'CHECK_AUTH_ERROR' });
76-
logError(error, 'Login failed');
66+
export function checkAuth(required: boolean = true) {
67+
return async function (dispatch: Dispatch<ActionTypes>) {
68+
dispatch({ type: 'SET_LOADING', value: true });
69+
try {
70+
const user = await getUser();
71+
dispatch({ type: 'CHECK_AUTH_SUCCESS', payload: user });
72+
return user;
73+
} catch (error) {
74+
if (error instanceof NotLoggedInError) {
75+
if (required) {
76+
login();
77+
} else {
78+
dispatch({ type: 'SET_LOADING', value: false });
7779
}
78-
});
80+
} else if (error instanceof RequestError || error instanceof JsonParseError) {
81+
dispatch({ type: 'CHECK_AUTH_ERROR' });
82+
logError(error);
83+
}
84+
return null;
85+
}
7986
};
8087
}
8188

@@ -121,7 +128,7 @@ export function setValgtYtelse(ytelse: string) {
121128
};
122129
}
123130

124-
export function setValgtTema(tema: string) {
131+
export function setValgtTema(tema: TemaKey) {
125132
return function (dispatch: Dispatch<ActionTypes>) {
126133
return dispatch({ type: 'TEMA_SET', value: tema });
127134
};

src/store/reducer.ts

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export interface Store {
1212
chosenYtelse: string;
1313

1414
// Auth response
15-
person: Bruker;
15+
person: Bruker | null;
1616

1717
activeKlage?: Klage;
1818

@@ -33,21 +33,7 @@ export const initialState: Store = {
3333
chosenTema: null,
3434
chosenYtelse: '',
3535

36-
person: {
37-
navn: {
38-
fornavn: '',
39-
etternavn: ''
40-
},
41-
adresse: {
42-
adressenavn: '',
43-
postnummer: '',
44-
poststed: ''
45-
},
46-
folkeregisteridentifikator: {
47-
type: '',
48-
identifikasjonsnummer: ''
49-
}
50-
},
36+
person: null,
5137

5238
activeKlageSkjema: {
5339
id: null,
@@ -142,6 +128,11 @@ const reducer = (state = initialState, action: ActionTypes): Store => {
142128
...state,
143129
finalizedDate: action.value
144130
};
131+
case 'SET_LOADING':
132+
return {
133+
...state,
134+
loading: action.value
135+
};
145136
default:
146137
return state;
147138
}

src/utils/get-resume-state.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import queryString from 'query-string';
2-
import { ensureStringIsTema, getYtelseByTema, Tema } from '../types/tema';
2+
import { ensureStringIsTema, getYtelseByTema, Tema, TemaKey } from '../types/tema';
33

44
interface ResumeState {
55
klageId: string | null;
66
ytelse: string | null;
7-
tema: string | null;
7+
tema: TemaKey | null;
88
saksnummer: string | null;
99
}
1010

@@ -28,7 +28,7 @@ export function getResumeState(queryParams: string, storage: Storage, pathName:
2828
}
2929

3030
const storedKlageId = getStorageItem(StorageKey.KLAGE_ID, storage);
31-
const storedTema = getStorageItem(StorageKey.TEMA, storage);
31+
const storedTema = ensureStringIsTema(getStorageItem(StorageKey.TEMA, storage));
3232
const storedYtelse = getStorageItem(StorageKey.YTELSE, storage);
3333
const storedSaksnummer = getStorageItem(StorageKey.SAKSNUMMER, storage);
3434

@@ -41,7 +41,7 @@ export function getResumeState(queryParams: string, storage: Storage, pathName:
4141
};
4242
}
4343

44-
const queryTema = getQueryString(query, 'tema');
44+
const queryTema = ensureStringIsTema(getQueryString(query, 'tema'));
4545
const queryYtelse = getQueryString(query, 'ytelse') ?? getDefaultYtelse(queryTema);
4646
const querySaksnummer = getQueryString(query, 'saksnummer');
4747

@@ -61,7 +61,7 @@ export function getResumeState(queryParams: string, storage: Storage, pathName:
6161

6262
return {
6363
klageId: null,
64-
tema: ensureStringIsTema(queryTema),
64+
tema: queryTema,
6565
ytelse: queryYtelse,
6666
saksnummer: querySaksnummer
6767
};

src/utils/get-user.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { getUserDataUrl } from '../clients/apiUrls';
2+
import { Bruker } from '../types/bruker';
3+
4+
export async function getUser() {
5+
const response = await fetch(getUserDataUrl(), {
6+
method: 'GET',
7+
credentials: 'include'
8+
});
9+
if (response.status === 401 || response.status === 403) {
10+
throw new NotLoggedInError(response);
11+
}
12+
if (!response.ok) {
13+
throw new RequestError(response);
14+
}
15+
try {
16+
const user: Bruker = await response.json();
17+
return user;
18+
} catch (error) {
19+
throw new JsonParseError(`Failed to parse bosy as JSON. Got:\n${response.text()}`);
20+
}
21+
}
22+
23+
export class RequestError extends Error {
24+
public statusCode: number;
25+
26+
constructor(response: Response) {
27+
super(`Request error. Status code ${response.status}`);
28+
this.statusCode = response.status;
29+
}
30+
}
31+
32+
export class NotLoggedInError extends Error {
33+
public statusCode: number;
34+
35+
constructor(response: Response) {
36+
super(`User is not logged in. Response status: ${response.status}.`);
37+
this.statusCode = response.status;
38+
}
39+
}
40+
41+
export class JsonParseError extends Error {}

0 commit comments

Comments
 (0)