Skip to content

Commit e7393a6

Browse files
committed
legg til ny applikasjons versjon markering
1 parent 3e301e1 commit e7393a6

File tree

6 files changed

+74
-5
lines changed

6 files changed

+74
-5
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ FROM europe-north1-docker.pkg.dev/cgr-nav/pull-through/nav.no/node:22-slim
22

33
LABEL org.opencontainers.image.source=https://github.com/navikt/fp-frontend
44
ENV TZ="Europe/Oslo"
5-
ENV NODE_ENV production
5+
ENV NODE_ENV=production
66

77
WORKDIR /app
88

apps/fp-frontend/src/app/components/Dekorator.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { notEmpty } from '@navikt/fp-utils';
1919

2020
import { initFetchOptions } from '../../data/fagsakApi';
2121
import { JOURNALFØRING_PATH, UTBETALINGSDATA_PATH } from '../paths';
22+
import { useAppVersjonDeteksjon } from './useAppVersjonDeteksjon';
2223

2324
type QueryStrings = {
2425
errorcode?: string;
@@ -43,6 +44,7 @@ export const Dekorator = ({
4344
setTheme,
4445
}: Props) => {
4546
const intl = useIntl();
47+
const nyVersjonTilgjengelig = useAppVersjonDeteksjon();
4648

4749
const errorMessages = useRestApiError();
4850
const { removeErrorMessages } = useRestApiErrorDispatcher();
@@ -54,6 +56,7 @@ export const Dekorator = ({
5456
const visLos = (e: React.SyntheticEvent) => {
5557
if (e.type === 'click') {
5658
void navigate('/');
59+
window.location.reload();
5760
}
5861
if (e.type === 'contextmenu') {
5962
globalThis.open('/', '_newtab');
@@ -115,6 +118,7 @@ export const Dekorator = ({
115118
eksterneLenker={eksterneLenker}
116119
theme={theme}
117120
setTheme={setTheme}
121+
nyVersjonTilgjengelig={nyVersjonTilgjengelig}
118122
/>
119123
);
120124
};
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { useEffect, useState } from 'react';
2+
3+
const POLLING_INTERVAL_MS = 10 * 60 * 1000;
4+
5+
export const useAppVersjonDeteksjon = () => {
6+
const [serverVersjon, setServerVersjon] = useState<string | null>(null);
7+
const [nyVersjonTilgjengelig, setNyVersjonTilgjengelig] = useState(false);
8+
9+
const [klientVersjon, setKlientVersjon] = useState<string | null>(null);
10+
11+
useEffect(() => {
12+
const sjekkServerVersjon = async () => {
13+
try {
14+
const res = await fetch('/version');
15+
16+
if (res.ok) {
17+
const data = (await res.json()) as { app_image?: string };
18+
19+
if (klientVersjon === null && data.app_image) {
20+
setKlientVersjon(data.app_image);
21+
}
22+
if (data.app_image && data.app_image !== serverVersjon) {
23+
setServerVersjon(data.app_image);
24+
25+
if (klientVersjon && data.app_image !== klientVersjon) {
26+
setNyVersjonTilgjengelig(true);
27+
}
28+
}
29+
}
30+
} catch (e) {
31+
// eslint-disable-next-line no-console
32+
console.error('Feilet med å hente app-versjon:', e);
33+
}
34+
};
35+
void sjekkServerVersjon();
36+
37+
const interval = setInterval(sjekkServerVersjon, POLLING_INTERVAL_MS);
38+
return () => clearInterval(interval);
39+
}, [klientVersjon, serverVersjon]);
40+
41+
return nyVersjonTilgjengelig;
42+
};

packages/sak/dekorator/i18n/nb_NO.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
"DekoratorMedFeilviserSakIndex.Vedtakslosningen": "Vedtaksløsningen",
88
"DekoratorMedFeilviserSakIndex.EksternLenke": "Ekstern lenke",
99
"DekoratorMedFeilviserSakIndex.EndreTilLysTema": "Endre til lyst tema",
10-
"DekoratorMedFeilviserSakIndex.EndreTilMorkTema": "Endre til mørkt tema"
10+
"DekoratorMedFeilviserSakIndex.EndreTilMorkTema": "Endre til mørkt tema",
11+
"DekoratorMedFeilviserSakIndex.NyVersjon": "Det finnes en ny versjon av applikasjonen. Klikk for å laste siden på nytt."
1112
}

packages/sak/dekorator/src/DekoratorMedFeilviserSakIndex.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import React, { type ComponentProps, useEffect, useRef } from 'react';
22
import { FormattedMessage, RawIntlProvider } from 'react-intl';
33

4-
import { ExternalLinkIcon, MenuGridIcon, MoonIcon, SunIcon } from '@navikt/aksel-icons';
5-
import { Dropdown, InternalHeader, Link, Spacer, Theme } from '@navikt/ds-react';
4+
import { ArrowCirclepathIcon, ExternalLinkIcon, MenuGridIcon, MoonIcon, SunIcon } from '@navikt/aksel-icons';
5+
import { Dropdown, InternalHeader, Link, Spacer, Theme, Tooltip } from '@navikt/ds-react';
66
import { createIntl } from '@navikt/ft-utils';
77

88
import { FeilmeldingPanel } from './components/FeilmeldingPanel';
@@ -27,6 +27,7 @@ interface Props {
2727
eksterneLenker: DekoratorLenke[];
2828
theme: ComponentProps<typeof Theme>['theme'];
2929
setTheme: (theme: NonNullable<ComponentProps<typeof Theme>['theme']>) => void;
30+
nyVersjonTilgjengelig?: boolean;
3031
}
3132

3233
/**
@@ -48,6 +49,7 @@ export const DekoratorMedFeilviserSakIndex = ({
4849
eksterneLenker,
4950
theme,
5051
setTheme,
52+
nyVersjonTilgjengelig,
5153
}: Props) => {
5254
const fixedHeaderRef = useRef<HTMLDivElement>(null);
5355
useEffect(() => {
@@ -64,10 +66,17 @@ export const DekoratorMedFeilviserSakIndex = ({
6466
{tittel}
6567
</InternalHeader.Title>
6668
<Spacer />
69+
{nyVersjonTilgjengelig && (
70+
<InternalHeader.Button>
71+
<Tooltip content={intl.formatMessage({ id: 'DekoratorMedFeilviserSakIndex.NyVersjon' })}>
72+
<ArrowCirclepathIcon fontSize="1.5rem" color="var(--ax-text-accent-subtle)" />
73+
</Tooltip>
74+
</InternalHeader.Button>
75+
)}
6776
<Dropdown>
6877
<InternalHeader.Button as={Dropdown.Toggle}>
6978
<MenuGridIcon
70-
style={{ fontSize: '1.5rem' }}
79+
fontSize="1.5rem"
7180
title={intl.formatMessage({ id: 'DekoratorMedFeilviserSakIndex.SystemerOgOppslagsverk' })}
7281
/>
7382
</InternalHeader.Button>

server/src/server.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,19 @@ function startApp() {
7878
// The routes below require the user to be authenticated
7979
server.use(verifyToken);
8080

81+
server.get(["/version"], async (_, res, next) => {
82+
try {
83+
res.set("Cache-Control", "no-store");
84+
res
85+
.json({
86+
app_image: process.env.NAIS_APP_IMAGE,
87+
})
88+
.send();
89+
} catch (error) {
90+
return next(error);
91+
}
92+
});
93+
8194
server.get(["/logout"], async (req, res) => {
8295
if (req.headers.authorization) {
8396
res.redirect("/oauth2/logout");

0 commit comments

Comments
 (0)