import React, { useEffect, useState } from 'react'; import { Avgiver } from 'svv-hradm-dinside-brukerhandtering'; import { Feil, Feilboks, Formatering, Knapp, ledetekst, Ramme, Spinner, } from '..'; const byttBrukerUrl = '/dinside/oversikt/avgiver/arbeidsvarsling'; function getMiljo() { const miljo: Miljo = (function () { let windowEnv = (window as any).ENV as string; if (windowEnv === undefined) { windowEnv = 'prod'; } switch (windowEnv) { case 'prod': case 'test': case 'utv': case 'dev': return windowEnv; default: throw Error('Ikke godkjent kjøremiljø: ' + windowEnv); } })(); return miljo; } interface Tilgang { harTilgang: boolean; erPrivatperson?: boolean; feil?: string | unknown; } async function harTilgang(soknadUrl, loggklient): Promise { const tilgangsUrl = soknadUrl + 'soknad/tilgang'; try { const avgiver = await Avgiver.hent(); if (avgiver.type !== 'enhet') { if (loggklient && loggklient._logg) { loggklient.info( 'Bruker har ikke tilgang til apv-arbeidsvarsling som privatperson, og blir bedt om å bytte bruker.' ); } return { harTilgang: false, erPrivatperson: true, }; } const orgnr = avgiver.id; const svar = await fetch(`${tilgangsUrl}/${orgnr}`, { credentials: 'include', }); const tilgang = await svar.json(); // vi sjekker om svaret er 1. 200-range, og 2. returnerer en json-enkodet boolean. // hvis ikke er det et problem med kallet til tilgangssjekken if (!svar.ok || typeof tilgang !== typeof true) { return { harTilgang: false, feil: `Fikk ikke kontakt med tilgangsendepunktet (${tilgangsUrl}): ${svar.status} - ${svar.statusText}`, }; } return { harTilgang: tilgang, erPrivatperson: false, }; } catch (e) { return { harTilgang: false, feil: e, }; } } function useTilgang(soknadUrl, loggklient) { const [tilgang, setTilgang] = useState({ harTilgang: false, erPrivatperson: false, }); const [laster, setLaster] = useState(true); useEffect(() => { setLaster(true); harTilgang(soknadUrl, loggklient).then((svar) => { setLaster(false); setTilgang(svar); }); }, [soknadUrl]); return { tilgang, laster }; } type Miljo = 'dev' | 'utv' | 'test' | 'prod'; function AltinnRolleSjekk(props) { const { children, tittel, soknadUrl, vedFeil, loggklient, featureToggles } = props; const isEnabled = featureToggles?.(); const miljo = getMiljo(); const { tilgang, laster } = useTilgang(soknadUrl, loggklient); useEffect(() => { if (!laster && tilgang.feil && vedFeil) { const feil = new Feil('Feil under sjekking av tilganger').med( 'feilmelding', tilgang.feil ); vedFeil(feil); } }, [laster, tilgang.feil, vedFeil]); useEffect(() => { if (!tilgang.harTilgang && !laster && tilgang.erPrivatperson) { window.location.href = getAktiveringLoginUrl(miljo); } }, [isEnabled, tilgang, laster]); if (laster) { return ( ); } if (tilgang.harTilgang) { return children; } return (

{tittel || ledetekst.getTekst( 'arbeidsvarsling.frontendkomponenter.avgiverkontroll.tittel' )}

(window.location.href = byttBrukerUrl)} > {ledetekst.getTekst( 'arbeidsvarsling.frontendkomponenter.avgiverkontroll.byttbruker' )}
); } function getAktiveringLoginUrl(miljo: Miljo): string { switch (miljo) { case 'dev': return 'http://localhost:4000/#/login'; case 'utv': return 'https://www.utv.vegvesen.no/dinside/veg/arbeidsvarsling/aktiver/#/login'; case 'test': return 'https://www.test.vegvesen.no/dinside/veg/arbeidsvarsling/aktiver/#/login'; case 'prod': return 'https://www.vegvesen.no/dinside/veg/arbeidsvarsling/aktiver/#/login'; default: return 'https://www.vegvesen.no/dinside/veg/arbeidsvarsling/aktiver/#/login'; } } export { AltinnRolleSjekk };