Skip to content
This repository was archived by the owner on Apr 12, 2023. It is now read-only.

Commit da8fd1c

Browse files
committed
Client side loading Meldeperioder
1 parent 6e47a2f commit da8fd1c

File tree

2 files changed

+97
-58
lines changed

2 files changed

+97
-58
lines changed

src/pages/api/period/get.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import type { NextApiRequest, NextApiResponse } from "next";
2+
import { getSession } from "../../../auth.utils";
3+
import { v4 as uuid } from 'uuid';
4+
5+
export default async function handler(
6+
req: NextApiRequest,
7+
res: NextApiResponse
8+
) {
9+
try {
10+
const session = await getSession(req);
11+
12+
if (!session) {
13+
return res.status(401).end(); //skal aldri skje siden vi har wonderwall med enforcedlogin
14+
}
15+
16+
const audienceRappApi = `${process.env.NAIS_CLUSTER_NAME}:raptus:dp-rapp-api`;
17+
18+
const onBehalfOfToken = await session.apiToken(audienceRappApi);
19+
20+
const callId = uuid();
21+
const dpRappApiUrl = process.env.DP_RAPP_API_URL;
22+
const url = `${dpRappApiUrl}/api/v1/meldeperiode/hente`;
23+
const response = await fetch(url, {
24+
method: "GET",
25+
headers: {
26+
Accept: "application/json",
27+
Authorization: `Bearer ${onBehalfOfToken}`,
28+
"X-Request-ID": callId
29+
}
30+
})
31+
32+
if (!response.ok) {
33+
return res.status(500).send(`Unexpected response status: ${response.statusText}`)
34+
}
35+
36+
const json = await response.json();
37+
38+
return res.json(json);
39+
} catch (error) {
40+
return res.status(500).send(error);
41+
}
42+
}

src/pages/index.tsx

Lines changed: 55 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,69 @@ import { Table } from "@navikt/ds-react";
22
import Menu from "../../components/Menu";
33
import Spacer from "../../components/Spacer";
44
import NavPanel from "../../components/NavPanel";
5+
import CenteredLoader from "../../components/CenteredLoader";
56
import { format, getISOWeek, parseISO } from "date-fns";
67
import { useTranslation } from "react-i18next";
78
import { Meldeperiode } from "../../models/Meldeperiode";
9+
import { useEffect, useState } from "react";
810

9-
type InitialState = {
10-
periods: Meldeperiode[];
11-
}
11+
export default function Page() {
1212

13-
export async function getServerSideProps() {
14-
let periods: Meldeperiode[] = [];
13+
const { t } = useTranslation();
1514

16-
// Get saved values
17-
try {
18-
const response = await fetch(process.env.DP_RAPP_API_URL + '/api/v1/meldeperiode/hente');
19-
if (response.ok) {
20-
periods = await response.json();
21-
}
22-
} catch (e) {
23-
// Couldn't load period list
24-
}
15+
const [data, setData] = useState<Meldeperiode[] | null>(null);
16+
const [isLoading, setLoading] = useState(false)
2517

26-
// Data comes to page as props
27-
return {
28-
props: {
29-
periods
30-
},
31-
};
32-
}
18+
useEffect(() => {
19+
setLoading(true)
20+
fetch('/api/period/get')
21+
.then((res) => res.json())
22+
.then((data) => {
23+
const periods: Meldeperiode[] = data;
24+
setData(periods.map(period => ({
25+
meldeperiodeId: period.meldeperiodeId,
26+
fomDato: parseISO(period.fomDato + "T12:00:00"),
27+
tomDato: parseISO(period.tomDato + "T12:00:00"),
28+
frist: parseISO(period.frist + "T12:00:00")
29+
})))
30+
setLoading(false)
31+
}).catch((error) => {
32+
console.log(error)
33+
});
34+
}, [])
3335

34-
export default function Page(props: InitialState) {
36+
const dataTable = data && <>
37+
<Table zebraStripes>
38+
<Table.Header>
39+
<Table.Row>
40+
<Table.HeaderCell scope="col">{t('period')}</Table.HeaderCell>
41+
<Table.HeaderCell scope="col">{t('date')}</Table.HeaderCell>
42+
<Table.HeaderCell scope="col">{t('deadline')}</Table.HeaderCell>
43+
</Table.Row>
44+
</Table.Header>
45+
<Table.Body>
46+
{data.map(({ fomDato, tomDato, frist }) => {
47+
return (
48+
<Table.Row key={fomDato.getTime()}>
49+
<Table.HeaderCell scope="row">
50+
{t('week')} {getISOWeek(fomDato)} - {getISOWeek(tomDato)}
51+
</Table.HeaderCell>
52+
<Table.DataCell>
53+
{format(fomDato, "dd.MM.yyyy")} - {format(tomDato, "dd.MM.yyyy")}
54+
</Table.DataCell>
55+
<Table.DataCell>
56+
{format(frist, "dd.MM.yyyy")}
57+
</Table.DataCell>
58+
</Table.Row>
59+
);
60+
})}
61+
</Table.Body>
62+
</Table>
3563

36-
const { t } = useTranslation();
64+
<Spacer />
3765

38-
const data = props.periods.map(period => ({
39-
meldeperiodeId: period.meldeperiodeId,
40-
fomDato: parseISO(period.fomDato + "T12:00:00"),
41-
tomDato: parseISO(period.tomDato + "T12:00:00"),
42-
frist: parseISO(period.frist + "T12:00:00")
43-
}));
66+
<NavPanel nextHref="/form" nextText={t('startFillingOut')} />
67+
</>;
4468

4569
return (
4670
<main>
@@ -49,36 +73,9 @@ export default function Page(props: InitialState) {
4973
<h1>{t('indexTitle')}</h1>
5074
<p>{t('indexDescription')}</p>
5175

52-
<Table zebraStripes>
53-
<Table.Header>
54-
<Table.Row>
55-
<Table.HeaderCell scope="col">{t('period')}</Table.HeaderCell>
56-
<Table.HeaderCell scope="col">{t('date')}</Table.HeaderCell>
57-
<Table.HeaderCell scope="col">{t('deadline')}</Table.HeaderCell>
58-
</Table.Row>
59-
</Table.Header>
60-
<Table.Body>
61-
{data.map(({ fomDato, tomDato, frist }) => {
62-
return (
63-
<Table.Row key={fomDato.getTime()}>
64-
<Table.HeaderCell scope="row">
65-
{t('week')} {getISOWeek(fomDato)} - {getISOWeek(tomDato)}
66-
</Table.HeaderCell>
67-
<Table.DataCell>
68-
{format(fomDato, "dd.MM.yyyy")} - {format(tomDato, "dd.MM.yyyy")}
69-
</Table.DataCell>
70-
<Table.DataCell>
71-
{format(frist, "dd.MM.yyyy")}
72-
</Table.DataCell>
73-
</Table.Row>
74-
);
75-
})}
76-
</Table.Body>
77-
</Table>
76+
{isLoading && <CenteredLoader />}
77+
{!isLoading && dataTable}
7878

79-
<Spacer />
80-
81-
<NavPanel nextHref="/form" nextText={t('startFillingOut')} />
8279
</main>
8380
);
8481
}

0 commit comments

Comments
 (0)