From 8c3308331a5ea596c8916d936b1760c931910cb0 Mon Sep 17 00:00:00 2001 From: Ken Gullaksen Date: Thu, 5 Oct 2023 10:22:01 +0200 Subject: [PATCH] nny hook useUserInfo --- src/App/OrganisasjonerOgTilgangerProvider.tsx | 39 +++++++------- src/App/useUserInfo.ts | 51 +++++++++++++++++++ src/api/dnaApi.ts | 23 --------- vite.config.ts | 5 ++ 4 files changed, 76 insertions(+), 42 deletions(-) create mode 100644 src/App/useUserInfo.ts diff --git a/src/App/OrganisasjonerOgTilgangerProvider.tsx b/src/App/OrganisasjonerOgTilgangerProvider.tsx index 311b573b0..d116cd871 100644 --- a/src/App/OrganisasjonerOgTilgangerProvider.tsx +++ b/src/App/OrganisasjonerOgTilgangerProvider.tsx @@ -3,7 +3,6 @@ import { DigiSyfoOrganisasjon, hentRefusjonstatus, hentSyfoVirksomheter, - hentUserInfo, RefusjonStatus, } from '../api/dnaApi'; import * as Record from '../utils/Record'; @@ -17,6 +16,7 @@ import * as Sentry from '@sentry/browser'; import { byggOrganisasjonstre } from './ByggOrganisasjonstre'; import { useEffectfulAsyncFunction } from './hooks/useValueFromEffect'; import { Map, Set } from 'immutable'; +import { useUserInfo } from './useUserInfo'; type orgnr = string; @@ -167,24 +167,6 @@ export const OrganisasjonerOgTilgangerProvider: FunctionComponent = (props) => { tidMs, }); }, - hentUserInfo() - .then(({ organisasjoner, tilganger, altinnError }) => { - if (altinnError) { - setVisFeilmelding(true); - addAlert('TilgangerAltinn'); - } - setAltinnorganisasjoner(organisasjoner); - setAltinntilganger( - Record.fromEntries(tilganger.map((it) => [it.id, Set(it.organisasjoner)])) - ); - }) - .catch((error) => { - Sentry.captureException(error); - setAltinntilganger(Record.map(altinntjeneste, () => Set())); - setAltinnorganisasjoner([]); - setVisFeilmelding(true); - addAlert('TilgangerAltinn'); - }), hentAltinnTilgangssøknader() .then(setAltinnTilgangssøknader) .catch((error) => { @@ -219,6 +201,25 @@ export const OrganisasjonerOgTilgangerProvider: FunctionComponent = (props) => { }) ); }, []); + const userInfo = useUserInfo(); + useEffect(() => { + if (userInfo.altinnError) { + addAlert('TilgangerAltinn'); + setVisFeilmelding(true); + } + }, [userInfo.altinnError]); + useEffect(() => { + setAltinnorganisasjoner(userInfo.organisasjoner); + }, [userInfo.organisasjoner]); + useEffect(() => { + if (userInfo.tilganger.length > 0) { + setAltinntilganger( + Record.fromEntries(userInfo.tilganger.map((it) => [it.id, Set(it.organisasjoner)])) + ); + } else { + setAltinntilganger(Record.map(altinntjeneste, () => Set())); + } + }, [userInfo.tilganger]); const beregnOrganisasjonerArgs = [ altinnorganisasjoner, diff --git a/src/App/useUserInfo.ts b/src/App/useUserInfo.ts new file mode 100644 index 000000000..cd103ee0c --- /dev/null +++ b/src/App/useUserInfo.ts @@ -0,0 +1,51 @@ +import { z } from 'zod'; +import useSWR from 'swr'; +import * as Sentry from '@sentry/browser'; +import { Organisasjon } from '../altinn/organisasjon'; +import { AltinntjenesteId } from '../altinn/tjenester'; + +const UserInfoRespons = z.object({ + altinnError: z.boolean(), + organisasjoner: z.array(Organisasjon), + tilganger: z.array( + z.object({ + id: z.custom(), + tjenestekode: z.string(), + tjenesteversjon: z.string(), + organisasjoner: z.array(z.string()), + }) + ), +}); +const fallbackData = { + altinnError: false, + organisasjoner: [], + tilganger: [], +}; +type UserInfo = z.infer; +export const useUserInfo = (): UserInfo => { + const { data } = useSWR('/min-side-arbeidsgiver/api/userInfo/v1', fetcher, { + onErrorRetry: (error, key, config, revalidate, { retryCount }) => { + if ((error.status === 502 || error.status === 503) && retryCount <= 5) { + setTimeout(() => revalidate({ retryCount }), 500); + } else { + Sentry.captureMessage( + `hent userInfo fra min-side-arbeidsgiver feilet med ${ + error.status !== undefined ? `${error.status} ${error.statusText}` : error + }` + ); + } + }, + fallbackData, + }); + + return data ?? fallbackData; +}; + +const fetcher = async (url: string) => { + const respons = await fetch(url); + + if (respons.status === 401) return; + if (respons.status !== 200) throw respons; + + return UserInfoRespons.parse(await respons.json()); +}; diff --git a/src/api/dnaApi.ts b/src/api/dnaApi.ts index 43911c191..2c7a2f479 100644 --- a/src/api/dnaApi.ts +++ b/src/api/dnaApi.ts @@ -54,29 +54,6 @@ export const sjekkInnlogget = async (): Promise => { return ok; }; -const UserInfoRespons = z.object({ - altinnError: z.boolean(), - organisasjoner: z.array(Organisasjon), - tilganger: z.array( - z.object({ - id: z.custom(), - tjenestekode: z.string(), - tjenesteversjon: z.string(), - organisasjoner: z.array(z.string()), - }) - ), -}); -export type UserInfo = z.infer; -export async function hentUserInfo(): Promise { - const respons = await fetch('/min-side-arbeidsgiver/api/userInfo/v1'); - if (respons.ok) { - return UserInfoRespons.parse(await respons.json()); - } else { - throw new Error( - `Kall til '/min-side-arbeidsgiver/api/userInfo/v1' feilet med ${respons.status}:${respons.statusText}` - ); - } -} const storageUrl = `/min-side-arbeidsgiver/api/storage`; export async function getStorage(key: string): Promise { try { diff --git a/vite.config.ts b/vite.config.ts index d46ab1165..e1a5c62c8 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -18,5 +18,10 @@ export default defineConfig({ '/min-side-arbeidsgiver/tiltaksgjennomforing-api': 'http://localhost:8080', '/min-side-arbeidsgiver/presenterte-kandidater-api': 'http://localhost:8080', }, + headers: { + 'Cache-Control': 'private, no-cache, no-store, must-revalidate', + Expires: '-1', + Pragma: 'no-cache', + }, }, });