{"version":3,"sources":["serviceWorker.ts","browserHistory.ts","shared/components/PageError/index.tsx","shared/constants/authConstants.ts","shared/constants/localStorageVariables.ts","axiosConfig.ts","shared/services/authService.ts","Auth/AuthContext.tsx","Auth/Callback.tsx","shared/models/BBL.ts","Auth/Logout.tsx","Auth/SilentRenew.tsx","App/Header/styles.ts","App/Header/User/index.tsx","shared/store/user/selectors.ts","shared/store/user/actionTypes.ts","App/Header/index.tsx","shared/hooks/useBroadcast.tsx","shared/constants/broadcastChannels.ts","App/Footer/styles.ts","App/Footer/index.tsx","shared/store/bbl/selectors.ts","shared/constants/customtexts.ts","shared/store/customtexts/selectors.ts","Modules/Home/Header/styles.ts","Modules/Home/Header/index.tsx","Modules/Home/ProductCard/ProductCardSkeleton/styles.ts","Modules/Home/ProductCard/ProductCardSkeleton/index.tsx","Modules/Home/ProductCard/styles.ts","Modules/Home/ProductCard/index.tsx","Modules/Home/styles.ts","Modules/Home/index.tsx","Auth/AfterLogout.tsx","shared/components/LoaderWrapper/styles.ts","Auth/Cleanup.tsx","shared/api/bbl.api.ts","Modules/NoAccess/styles.ts","Modules/NoAccess/NoAccessInformation/index.tsx","Modules/NoAccess/NoAccessActions/styles.ts","Modules/NoAccess/NoAccessActions/index.tsx","Modules/NoAccess/index.tsx","shared/utils/urlParams.ts","App/Routes.tsx","App/GlobalStyles.tsx","shared/utils/theme.ts","shared/store/bbl/actionTypes.ts","shared/store/customtexts/actionTypes.ts","App/index.tsx","shared/api/user.api.ts","shared/store/user/sagas.ts","shared/store/user/reducer.ts","shared/store/bbl/sagas.ts","shared/store/bbl/reducer.ts","shared/api/customtext.api.ts","shared/store/customtexts/sagas.ts","shared/store/customtexts/reducer.ts","shared/store/sagas.ts","shared/store/store.ts","index.tsx","shared/constants/styles.ts","shared/services/telemetryService.ts","shared/components/Layout/index.tsx"],"names":["isLocalhost","Boolean","window","location","hostname","match","registerValidSW","swUrl","config","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","console","log","onUpdate","onSuccess","catch","error","history","createBrowserHistory","basename","Wrapper","styled","div","PageError","level","bblCode","bblidUrl","urls","bblidBaseUrl","appUrl","origin","client","clientConfigs","find","x","BblCode","toLowerCase","IDENTITY_CONFIG","authority","client_id","ClientId","redirect_uri","silent_redirect_uri","post_logout_redirect_uri","response_type","automaticSilentRenew","loadUserInfo","scope","response_mode","revokeAccessTokenOnSignout","client_secret","includeIdTokenInSilentRenew","LOCALSTORAGE_IDENTITY_PREFIX","setAxiosLoggedInDefaults","fromStorage","localStorage","getItem","oidcStorage","JSON","parse","axios","defaults","baseURL","api","url","headers","post","common","subscription","access_token","AuthService","UserManager","signinRedirect","setItem","pathname","search","signinSilent","err","signinSilentCallback","createSigninRequest","signinRedirectCallback","e","redirectUri","replace","getUser","a","getToken","user","parseJwt","token","base64","split","atob","navigateToScreen","isAuthenticated","expires","expires_at","now","Date","getTime","logout","signoutRedirect","id_token_hint","clearStaleState","signoutRedirectCallback","removeItem","baseUrl","cleanup","Object","entries","forEach","key","includes","this","userStore","WebStorageStateStore","prefix","store","Log","logger","ERROR","events","addUserLoaded","href","indexOf","addAccessTokenExpired","addSilentRenewError","AuthContext","React","createContext","undefined","AuthProvider","props","Provider","value","children","useAuthContext","context","useContext","Error","PortalTypesEnum","LoaderWrapper","Callback","authContext","useEffect","Logout","bbl","SilentRenew","header","backgroundStyle","css","Content","styles","maxWidth","RightWrapper","User","onLogout","onGoToProfile","firstname","name","surname","email","trackingName","outline","onClick","USER_FETCH_REQUESTED","USER_FETCH_SUCCESS","USER_FETCH_FAILED","Header","brandingcode","useHistory","useState","top","isTop","data","useSelector","dispatch","useDispatch","val","options","setState","channel","useRef","listeners","BroadcastChannel","current","onmessage","subscribe","listener","close","send","postMessage","callback","push","splice","useBroadcast","sub","isLoggedOut","removeUser","profile","navneregisterid","type","payload","document","addEventListener","pageYOffset","passive","nostyle","height","style","cursor","alt","src","themesUrl","toLocaleLowerCase","minSideUrl","beforeIcon","small","semibold","FooterWrapper","footer","CustomLink","Link","LandingFooter","phone","settings","phoneNumberForGeneralQuestions","emailForGeneralQuestions","currentYear","getFullYear","getFormatedPhone","commonPreemptionInformationUrl","preemptionInformationUrl","becomeAMemberUrl","bblUrl","ifexists","getUrlWithProtocol","shortName","color","customPrivacyStatementUrl","getBbl","getBblSettings","isPortalActive","applications","findIndex","Portal","isMinSideActive","MinSide","isForkjopActive","Forkjop","CUSTOMTEXT_HEADER","CUSTOMTEXT_FORKJOP","CUSTOMTEXT_INGRESS","CUSTOMTEXT_MINSIDE","CUSTOMTEXT_PORTAL","getCustomtextHeader","customtexts","fieldName","text","getCustomtextIngress","getCustomtextPortal","getCustomtextMinside","getCustomtextForkjop","HeaderWrapper","IngressWrapper","HomeHeader","customtextHeader","customtextIngress","width","ProductCardSkeleton","TextWrapper","IconWrapper","ContentWrapper","BorderRadiusStyle","ProductCard","headerIcon","headerText","theme","useTheme","largePadding","shadow","withhover","paragraph","primary","CardsWrapper","Home","preemptionBblCode","customtextForkjop","customtextPortal","customtextMinside","hasPortal","hasMinSide","hasForkjop","bblSettings","size","secondaryDarkText","forkjopUrl","newPortal","portalUrl","AfterLogout","Cleanup","get","getBblApplications","NoAccessInformation","fullName","ButtonWrapper","NoAccessActions","returnUrl","idp","isRequestLoading","isRequestSent","onSendRequest","loading","disabled","highlight","bblidClientUrl","subtle","NoAccess","setIdp","setFullName","requestLoading","setRequestLoading","requestMessage","setRequestMessage","setError","paramname","params","URLSearchParams","getParamBothLowerUppercase","getIdp","res","full_name","brandingCode","success","onClose","bblidApiBaseUrl","finally","ApplicationLoading","Layout","danger","TelemetryProvider","lazy","PrivacyPage","main","Routes","isReady","setIsReady","gtmCodes","gtm","bblPivotalGtmCode","siteName","appName","analyticsSettings","setAnalyticsSettings","gtmId","setTimeout","fallback","instrumentationKey","ai","after","getAppInsights","path","component","render","exact","GlobalStyles","getTheme","code","transformRequest","BBL_FETCH_REQUESTED","BBL_FETCH_SUCCESS","BBL_FETCH_FAILED","CUSTOMTEXTS_FETCH_REQUESTED","CUSTOMTEXTS_FETCH_SUCCESS","CUSTOMTEXTS_FETCH_FAILED","App","setTheme","favicon","querySelector","setFavicon","ApplicationLoaded","defaultTextColor","request","method","getUserRoles","fetchUser","userSaga","all","call","userRoles","put","roles","takeEvery","initialState","reducer","action","fetchBbl","bblSaga","bblApplications","getCustomtext","id","fetchCustomtexts","customtextsSaga","ids","map","response","c","rootSaga","root","fork","rootReducer","combineReducers","UserReducer","BblReducer","CustomtextsReducer","sagaMiddleware","createSagaMiddleware","composeEnhancer","compose","createStore","applyMiddleware","run","apiProxyUrl","ReactDOM","getElementById","URL","process","fetch","contentType","status","ready","unregister","reload","checkValidServiceWorker","reactPlugin","ReactPlugin","appInsights","initialize","browserHistory","ApplicationInsights","disableFetchTracking","enableCorsCorrelation","extensions","extensionConfig","identifier","loadAppInsights","addTelemetryInitializer","envelope","tags","role","fullsize","bp"],"mappings":"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","file":"static/js/main.e6a144a3.chunk.js","sourcesContent":["// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.0/8 are considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n)\n\ntype Config = {\n  onSuccess?: (registration: ServiceWorkerRegistration) => void\n  onUpdate?: (registration: ServiceWorkerRegistration) => void\n}\n\nexport function register(config?: Config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href)\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${window.location.origin}/sw.js`\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config)\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit https://bit.ly/CRA-PWA'\n          )\n        })\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config)\n      }\n    })\n  }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then((registration) => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing\n        if (installingWorker == null) {\n          return\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                'New content is available and will be used when all ' +\n                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n              )\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration)\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.')\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration)\n              }\n            }\n          }\n        }\n      }\n    })\n    .catch((error) => {\n      console.error('Error during service worker registration:', error)\n    })\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: { 'Service-Worker': 'script' },\n  })\n    .then((response) => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type')\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then((registration) => {\n          registration.unregister().then(() => {\n            window.location.reload()\n          })\n        })\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config)\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      )\n    })\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then((registration) => {\n      registration.unregister()\n    })\n  }\n}\n","import { createBrowserHistory } from 'history'\n\nconst history = createBrowserHistory({ basename: '/' })\n\nexport default history\n","import React from 'react'\nimport styled from '@emotion/styled'\nimport { IllustrationError, Header } from '@bbl-digital/snorre'\n\nconst Wrapper = styled.div`\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  text-align: center;\n  padding: 2em 0;\n  & > div {\n    height: 210px;\n  }\n  & > h4 {\n    margin: 1em 0;\n  }\n`\n\nconst PageError: React.FC = () => {\n  return (\n    <Wrapper>\n      <IllustrationError />\n      <Header level={4}>Det skjedde en feil</Header>\n    </Wrapper>\n  )\n}\n\nexport default PageError\n","const bblCode = window.config?.bblCode\nconst bblidUrl = window.config?.urls.bblidBaseUrl + 'host/core'\nconst appUrl = window.location.origin\n\nconst client = window.clientConfigs?.find((x) => {\n  return x.BblCode.toLowerCase() === bblCode?.toLowerCase()\n})\n\nexport const IDENTITY_CONFIG = {\n  authority: bblidUrl,\n  client_id: client?.ClientId,\n  redirect_uri: appUrl + '/signin-oidc',\n  silent_redirect_uri: appUrl + '/silentredirect', // COMMENTED OUT UNTIL WE GOT SUPPORT FOR SILENT REDIRECT\n  post_logout_redirect_uri: appUrl + '/afterlogout',\n  // audience: process.env.REACT_APP_AUDIENCE,\n  response_type: 'code',\n  automaticSilentRenew: true,\n  loadUserInfo: false,\n  scope: 'openid api profile offline_access',\n  response_mode: 'query',\n  revokeAccessTokenOnSignout: true,\n  client_secret: 'xWUSy5y3TRdte9jp',\n  includeIdTokenInSilentRenew: true,\n}\n","export const LOCALSTORAGE_IDENTITY_PREFIX = 'ngtlanding.'\nexport const LOCALSTORAGE_IDENTITY_MS = 'ngtms.'\nexport const LOCALSTORAGE_IDENTITY_PORTAL = 'ngtportal.'\nexport const LOCALSTORAGE_IDENTITY_PREEMPTION = 'ngtpreemption.'\n","import axios from 'axios'\nimport { IDENTITY_CONFIG } from 'shared/constants/authConstants'\nimport { LOCALSTORAGE_IDENTITY_PREFIX } from 'shared/constants/localStorageVariables'\n\nexport const setAxiosDefaults = () => {\n  axios.defaults.baseURL = window.config.api.apiProxyUrl\n\n  axios.defaults.headers.common['bblCode'] = window.config.bblCode\n  axios.defaults.headers.common['APIM-BBLCode'] = window.config.bblCode\n}\n\nexport const setAxiosLoggedInDefaults = () => {\n  const fromStorage = localStorage.getItem(\n    `${LOCALSTORAGE_IDENTITY_PREFIX}user:${IDENTITY_CONFIG.authority}:${IDENTITY_CONFIG.client_id}`\n  )\n  const oidcStorage = JSON.parse(fromStorage ? fromStorage : '{}')\n\n  axios.defaults.baseURL = window.config.api.url\n  axios.defaults.headers.post['x-api-version'] = axios.defaults.headers.common[\n    'Ocp-Apim-Subscription-Key'\n  ] = window.config.api.subscription\n  axios.defaults.headers.common['APIM-BBLCode'] = window.config.bblCode\n  axios.defaults.headers.common['Authorization'] =\n    'Bearer ' + oidcStorage.access_token\n}\n","import axios from 'axios'\nimport { setAxiosLoggedInDefaults } from 'axiosConfig'\nimport { UserManager, WebStorageStateStore, Log } from 'oidc-client'\nimport { IDENTITY_CONFIG } from 'shared/constants/authConstants'\nimport {\n  LOCALSTORAGE_IDENTITY_PREFIX,\n  LOCALSTORAGE_IDENTITY_MS,\n  LOCALSTORAGE_IDENTITY_PORTAL,\n  LOCALSTORAGE_IDENTITY_PREEMPTION,\n} from 'shared/constants/localStorageVariables'\n\nexport default class AuthService {\n  UserManager: UserManager\n\n  constructor() {\n    this.UserManager = new UserManager({\n      ...IDENTITY_CONFIG,\n      userStore: new WebStorageStateStore({\n        prefix: LOCALSTORAGE_IDENTITY_PREFIX,\n        store: window.localStorage,\n      }),\n    })\n    // Logger\n    Log.logger = console\n    Log.level = Log.ERROR\n\n    /**\n     * Event user loaded\n     */\n    this.UserManager.events.addUserLoaded((user) => {\n      if (window.location.href.indexOf('signin-oidc') !== -1) {\n        this.navigateToScreen()\n      }\n    })\n\n    /**\n     * Event token expired\n     */\n    this.UserManager.events.addAccessTokenExpired(() => {\n      this.signinSilent()\n    })\n\n    /**\n     * Event silent renew error\n     */\n    this.UserManager.events.addSilentRenewError((e) => {\n      console.log('addSilentRenewError', e)\n    })\n\n    /**\n     * Init, if not authenticated try signin silent\n     */\n    if (\n      window.location.pathname.indexOf('silentredirect') === -1 &&\n      window.location.pathname.indexOf('signin-oidc') === -1 &&\n      !this.isAuthenticated()\n    ) {\n      this.signinSilent()\n    }\n  }\n\n  signinRedirect = () => {\n    localStorage.setItem(\n      'redirectUri',\n      window.location.pathname + window.location.search\n    )\n    this.UserManager.signinRedirect({})\n  }\n\n  signinSilent = () => {\n    this.UserManager.signinSilent().catch((err) => {})\n  }\n\n  signinSilentCallback = () => {\n    this.UserManager.signinSilentCallback()\n  }\n\n  createSigninRequest = () => {\n    return this.UserManager.createSigninRequest()\n  }\n\n  signinRedirectCallback = () => {\n    this.UserManager.signinRedirectCallback()\n      .then((e) => {\n        const redirectUri = localStorage.getItem('redirectUri')\n        window.location.replace(redirectUri ? redirectUri : '/')\n      })\n      .catch(() => {\n        const redirectUri = localStorage.getItem('redirectUri')\n        window.location.replace(redirectUri ? redirectUri : '/')\n      })\n  }\n\n  getUser = async () => {\n    axios.defaults.headers.common['Authorization'] = 'Bearer ' + this.getToken()\n    const user = await this.UserManager.getUser()\n    if (!user) {\n      return await this.UserManager.signinRedirectCallback()\n    } else {\n      setAxiosLoggedInDefaults()\n    }\n    return user\n  }\n\n  parseJwt = (token: string) => {\n    const base64Url = token.split('.')[1]\n    const base64 = base64Url.replace('-', '+').replace('_', '/')\n    return JSON.parse(window.atob(base64))\n  }\n\n  navigateToScreen = () => {\n    window.location.replace('')\n  }\n\n  isAuthenticated = () => {\n    const fromStorage = localStorage.getItem(\n      `${LOCALSTORAGE_IDENTITY_PREFIX}user:${IDENTITY_CONFIG.authority}:${IDENTITY_CONFIG.client_id}`\n    )\n    const oidcStorage = JSON.parse(fromStorage ? fromStorage : '{}')\n    const expires = oidcStorage.expires_at * 1000\n    const now = new Date().getTime()\n    return !!oidcStorage && !!oidcStorage.access_token && expires > now\n  }\n\n  getToken = () => {\n    const fromStorage = localStorage.getItem(\n      `${LOCALSTORAGE_IDENTITY_PREFIX}user:${IDENTITY_CONFIG.authority}:${IDENTITY_CONFIG.client_id}`\n    )\n    const oidcStorage = JSON.parse(fromStorage ? fromStorage : '{}')\n    return oidcStorage.access_token\n  }\n\n  logout = (bblCode: string) => {\n    localStorage.setItem('bblCode', bblCode)\n\n    this.UserManager.signoutRedirect({\n      id_token_hint: localStorage.getItem('id_token'),\n    })\n    this.UserManager.clearStaleState()\n  }\n\n  signoutRedirectCallback = (url?: string) => {\n    this.UserManager.signoutRedirectCallback().then(() => {\n      localStorage.removeItem(\n        `${LOCALSTORAGE_IDENTITY_PREFIX}user:${IDENTITY_CONFIG.authority}:${IDENTITY_CONFIG.client_id}`\n      )\n      if (url) {\n        window.location.replace(url)\n      } else {\n        window.location.replace(window.config.baseUrl + window.config.bblCode)\n      }\n    })\n    this.UserManager.clearStaleState()\n  }\n\n  cleanup = () => {\n    Object.entries(localStorage).forEach(([key]) => {\n      if (\n        key.includes(LOCALSTORAGE_IDENTITY_PREFIX) ||\n        key.includes(LOCALSTORAGE_IDENTITY_MS) ||\n        key.includes(LOCALSTORAGE_IDENTITY_PORTAL) ||\n        key.includes(LOCALSTORAGE_IDENTITY_PREEMPTION)\n      ) {\n        localStorage.removeItem(key)\n      }\n    })\n\n    this.UserManager.clearStaleState()\n  }\n}\n","import React, { useContext } from 'react'\nimport AuthService from 'shared/services/authService'\n\ntype Service = AuthService\n\nconst AuthContext = React.createContext<Service | undefined>(undefined)\n\ntype AuthProviderProps = { children: React.ReactNode }\n\nconst AuthProvider: React.FC<AuthProviderProps> = (props) => {\n  return (\n    <AuthContext.Provider value={new AuthService()}>\n      {props.children}\n    </AuthContext.Provider>\n  )\n}\n\nfunction useAuthContext() {\n  const context = useContext(AuthContext)\n  if (context === undefined) {\n    throw new Error('useAuthContext must be used within a AuthProvider')\n  }\n  return context\n}\n\nexport { AuthProvider, useAuthContext }\n","import React, { useEffect } from 'react'\nimport { useAuthContext } from 'Auth/AuthContext'\nimport { AppLoader } from '@bbl-digital/snorre'\nimport styled from '@emotion/styled'\n\nconst LoaderWrapper = styled.div`\n  height: calc(98vh - 300px);\n  width: 99vw;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n`\n\nconst Callback: React.FC = () => {\n  const authContext = useAuthContext()\n  useEffect(() => {\n    authContext.signinRedirectCallback()\n  })\n  return (\n    <LoaderWrapper>\n      <AppLoader />\n    </LoaderWrapper>\n  )\n}\n\nexport default Callback\n","export interface IBBL {\n  name: string\n  shortName: string\n  phone: string\n  email: string\n  companyNumber: string\n  clientNr: number\n  externalPartnerNr: string\n  businessAddress: string\n  brandingCode: string\n  settings: IBBLSettings\n  gtmCode: string\n  applications: IBBLApplications[]\n}\n\nexport interface IBBLUrls {\n  myPage: string\n  oldMyPage: string\n  financeInfocenter: string\n  digitalCourseForResidents: string\n  membershipTransfer: string\n  newHousingProjects: string\n  digitalCourseForBoard: string\n  bevarHms: string\n  bevarVedlikehold: string\n  vedlikeholdSystem: string\n  hmsSystem: string\n  newPortal: string\n  plussplan: string\n}\n\nexport interface IBBLSettings {\n  bblUrl: string\n  urls: IBBLUrls\n  afterLogoutRedirectUrl: string\n  preemptionInformationUrl: string\n  commonPreemptionInformationUrl: string\n  emailForGeneralQuestions: string\n  emailForPortalQuestions: string\n  phoneNumberForGeneralQuestions: string\n  phoneNumberForPortalQuestions: string\n  becomeAMemberUrl: string\n  customPrivacyStatementUrl: string\n  gtmId: string\n}\n\nexport interface IBBLApplications {\n  name: PortalTypesEnum\n}\n\n// Model representing TableStorage entity\nexport interface IBBLSummary {\n  bblCode: string\n  name: string\n  url: string\n  hasPreemption: Boolean\n  brandingCode: string\n  shortName: string\n}\n\nexport enum PortalTypesEnum {\n  Forkjop = 'Forkjøp',\n  Portal = 'Portalen',\n  MinSide = 'Min side',\n}\n","import React, { useEffect } from 'react'\nimport { useAuthContext } from 'Auth/AuthContext'\nimport { IBBL } from 'shared/models/BBL'\nimport { AppLoader } from '@bbl-digital/snorre'\nimport styled from '@emotion/styled'\n\nconst LoaderWrapper = styled.div`\n  height: calc(98vh - 300px);\n  width: 99vw;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n`\n\ninterface IProps {\n  bbl: IBBL | undefined\n}\n\nconst Logout: React.FC<IProps> = ({ bbl }) => {\n  const authContext = useAuthContext()\n\n  useEffect(() => {\n    authContext.signoutRedirectCallback()\n  })\n\n  return (\n    <LoaderWrapper>\n      <AppLoader />\n    </LoaderWrapper>\n  )\n}\n\nexport default Logout\n","import React from 'react'\n\n/**\n *\n * NOT IN USE\n *\n *\n * SEE INDEX.TSX\n *\n */\nconst SilentRenew: React.FC = () => {\n  return <p>Nothing here</p>\n}\n\nexport default SilentRenew\n","import styled from '@emotion/styled'\nimport { css } from '@emotion/react'\nimport { styles } from 'shared/constants/styles'\n\nexport const Wrapper = styled.header`\n  display: flex;\n  justify-content: space-between;\n  height: 70px;\n  position: sticky;\n  z-index: 1000;\n  top: 0;\n  transition: background-color 0.2s ease-in-out;\n`\n\nexport const backgroundStyle = css`\n  background-color: white;\n`\n\nexport const Content = styled.div`\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  max-width: ${styles.maxWidth};\n  margin: 0 auto;\n  padding: 0 1em;\n  width: 100%;\n\n  @media screen and (max-width: 1170px) {\n    padding: 0 1em;\n  }\n`\n\nexport const RightWrapper = styled.div`\n  display: flex;\n  align-items: center;\n  & > *:nth-of-type(1) {\n    margin-right: 1em;\n  }\n`\n","/** @jsxImportSource @emotion/react */\nimport React from 'react'\nimport { UserMenu, UserMenuOption, Button } from '@bbl-digital/snorre'\nimport { IUser } from 'shared/models/User'\n\ninterface IProps {\n  user: IUser\n  onLogout: () => void\n  onGoToProfile: () => void\n}\n\nconst User: React.FC<IProps> = ({ user, onLogout, onGoToProfile }) => {\n  const firstname = user.firstname ? user.firstname + ' ' : ''\n  return (\n    <UserMenu\n      name={firstname + user.surname}\n      email={user.email}\n      logout={\n        <Button trackingName=\"Usermenu - Logout\" outline onClick={onLogout}>\n          Logg ut\n        </Button>\n      }\n    >\n      <UserMenuOption onClick={onGoToProfile}>Profil</UserMenuOption>\n    </UserMenu>\n  )\n}\n\nexport default User\n","import { SystemState } from './types'\n\nexport const getUser = (state: SystemState) => state.user\n","export const USER_FETCH_REQUESTED = 'USER_FETCH_REQUESTED'\nexport const USER_FETCH_SUCCESS = 'USER_FETCH_SUCCESS'\nexport const USER_FETCH_FAILED = 'USER_FETCH_FAILED'\n","/** @jsxImportSource @emotion/react */\nimport React, { useEffect, useState } from 'react'\nimport { Text, Button, IconLock, Link } from '@bbl-digital/snorre'\nimport { Wrapper, Content, backgroundStyle, RightWrapper } from './styles'\nimport { useAuthContext } from 'Auth/AuthContext'\nimport User from './User'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { getUser } from 'shared/store/user/selectors'\nimport { USER_FETCH_REQUESTED } from 'shared/store/user/actionTypes'\nimport { useHistory } from 'react-router-dom'\nimport { useBroadcast } from 'shared/hooks/useBroadcast'\nimport { CHANNEL_LOGOUT } from 'shared/constants/broadcastChannels'\n\ninterface IProps {\n  brandingcode: string\n}\n\nconst Header: React.FC<IProps> = ({ brandingcode }) => {\n  const history = useHistory()\n  const [top, isTop] = useState(true)\n  const { data } = useSelector(getUser)\n  const dispatch = useDispatch()\n  const { send, subscribe } = useBroadcast<boolean>(CHANNEL_LOGOUT, false, {\n    subscribe: true,\n  })\n\n  const bblCode = window.config.bblCode\n\n  const authContext = useAuthContext()\n\n  const login = () => {\n    authContext.signinRedirect()\n  }\n\n  const logout = () => {\n    authContext.logout(bblCode)\n    send(true)\n  }\n\n  useEffect(() => {\n    const sub = subscribe(async (isLoggedOut) => {\n      if (isLoggedOut) {\n        await authContext.UserManager!.removeUser()\n        await authContext.UserManager!.clearStaleState()\n        await authContext.UserManager!.signoutRedirect()\n      }\n    })\n\n    return () => sub()\n  }, [])\n\n  useEffect(() => {\n    if (authContext.isAuthenticated()) {\n      authContext.getUser().then((user: any) => {\n        if (user.profile.navneregisterid) {\n          dispatch({\n            type: USER_FETCH_REQUESTED,\n            payload: user.profile.navneregisterid,\n          })\n        } else {\n          // DO STUFF WHEN USER DOES NOT HAVE AN NAVNEREGISTERID\n\n          history.push(\n            '/ikketilgang?returnUrl=' + window.location.origin + '/logout'\n          )\n\n          // window.location.href =\n          //   window.config.urls.bblidBaseUrl +\n          //   'useradmin/profile/noaccess?returnUrl=' +\n          //   window.location.origin +\n          //   '/logout'\n        }\n      })\n    }\n  }, [authContext, dispatch, history])\n\n  useEffect(() => {\n    const handleScroll = () => {\n      if (window.pageYOffset > 0) {\n        isTop(false)\n      } else {\n        isTop(true)\n      }\n    }\n\n    document.addEventListener('scroll', handleScroll, { passive: true })\n  }, [top])\n\n  const goToNoAccess = () => {}\n\n  const goToProfile = () => {\n    window.location.replace(\n      `${window.config.urls.minSideUrl}/profil?endreProfil=true&returnUrl=${window.location.href}`\n    )\n  }\n\n  return (\n    <Wrapper css={!top ? backgroundStyle : null}>\n      <Content>\n        <Link nostyle>\n          <img\n            height=\"40px\"\n            style={{ cursor: 'pointer' }}\n            alt=\"logo\"\n            src={`${\n              window.config.urls.themesUrl\n            }${brandingcode.toLocaleLowerCase()}/logo.png`}\n          />\n        </Link>\n        {window.location.pathname !== '/ikketilgang' && (\n          <RightWrapper>\n            {data && (\n              <User user={data} onLogout={logout} onGoToProfile={goToProfile} />\n            )}\n            {!authContext.isAuthenticated() && (\n              <Button nostyle beforeIcon={<IconLock />} onClick={login}>\n                <Text small semibold>\n                  Logg inn\n                </Text>\n              </Button>\n            )}\n            {authContext.isAuthenticated() && !data && (\n              <Button nostyle beforeIcon={<IconLock />} onClick={goToNoAccess}>\n                <Text small semibold>\n                  Logg inn\n                </Text>\n              </Button>\n            )}\n          </RightWrapper>\n        )}\n      </Content>\n    </Wrapper>\n  )\n}\n\nexport default Header\n","import { useEffect, useRef, useState } from 'react'\n\n/**\n *\n * Our hook will return an object with three properties:\n * - send: a function that will send a message to all other tabs\n * - state: the current state of the broadcast\n * - subscribe: a function that will subscribe to the broadcast (Only if options.subscribe is true)\n */\nexport type UseBroadcastReturn<T> = {\n  send: (val: T) => void\n  state: T | undefined\n  subscribe: (callback: (e: T) => void) => () => void\n}\n\n/**\n * The options for the useBroadcast hook\n */\nexport type UseBroadcastOptions = {\n  subscribe?: boolean\n}\n\n/**\n * @see https://github.com/Romainlg29/use-broadcast/tree/main\n *\n * @param name The name of the broadcast channel\n * @param val The initial value of the broadcast\n * @returns Returns an object with three properties: send, state and subscribe\n */\nexport const useBroadcast = <T,>(\n  name: string,\n  val?: T,\n  options?: UseBroadcastOptions\n): UseBroadcastReturn<T> => {\n  /**\n   * Store the state of the broadcast\n   */\n  const [state, setState] = useState<T | undefined>(val)\n\n  /**\n   * Store the BroadcastChannel instance\n   */\n  const channel = useRef<BroadcastChannel | null>(null)\n\n  /**\n   * Store the listeners\n   */\n  const listeners = useRef<((e: T) => void)[]>([])\n\n  /**\n   * This function send the value to all the other tabs\n   * @param val The value to send\n   */\n  const send = (val: T) => {\n    if (!channel.current) {\n      return\n    }\n\n    /**\n     * Send the value to all the other tabs\n     */\n    channel.current.postMessage(val)\n\n    if (!options?.subscribe) {\n      setState(val)\n    }\n\n    /**\n     * Dispatch the event to the listeners\n     */\n    listeners.current.forEach((listener) => listener(val))\n  }\n\n  /**\n   * This function subscribe to the broadcast\n   * @param callback The callback function\n   * @returns Returns a function that unsubscribe the callback\n   */\n  const subscribe = (callback: (e: T) => void) => {\n    /**\n     * Add the callback to the listeners\n     */\n    listeners.current.push(callback)\n\n    /**\n     * Return a function that unsubscribe the callback\n     */\n    return () =>\n      listeners.current.splice(listeners.current.indexOf(callback), 1)\n  }\n\n  useEffect(() => {\n    /**\n     * If BroadcastChannel is not supported, we log an error and return\n     */\n    if (typeof window === 'undefined') {\n      console.error('Window is undefined!')\n      return\n    }\n\n    if (!window.BroadcastChannel) {\n      console.error('BroadcastChannel is not supported!')\n      return\n    }\n\n    /**\n     * If the channel is null, we create a new one\n     */\n    if (!channel.current) {\n      channel.current = new BroadcastChannel(name)\n    }\n\n    /**\n     * Subscribe to the message event\n     * @param e The message event\n     */\n    channel.current.onmessage = (e) => {\n      /**\n       * Update the state\n       */\n      if (!options?.subscribe) {\n        setState(e.data)\n      }\n\n      /**\n       * Dispatch an event to the listeners\n       */\n      listeners.current.forEach((listener) => listener(e.data))\n    }\n\n    /**\n     * Cleanup\n     */\n    return () => {\n      if (!channel.current) {\n        return\n      }\n\n      channel.current.close()\n      channel.current = null\n    }\n  }, [name, options])\n\n  return { send, state, subscribe }\n}\n","export const CHANNEL_LOGOUT = 'channel-logout'\n","import styled from '@emotion/styled'\nimport Link from '@bbl-digital/snorre/lib/core/Link'\n\nexport const FooterWrapper = styled.footer`\n  position: relative;\n  margin-top: -20px;\n\n  @media screen and (max-width: 770px) {\n    margin-top: -10px;\n  }\n\n  & > div {\n    &:nth-of-type(2) {\n      padding: 2em 1em;\n      width: calc(100% - 2em);\n    }\n\n    & > svg {\n      margin-left: -10px;\n      height: 100%;\n      margin-bottom: -7px;\n      z-index: -1;\n    }\n  }\n`\n\nexport const CustomLink = styled(Link)`\n  background-color: transparent;\n  border: none;\n  padding: 0;\n  color: white;\n  font-size: 16px;\n  font-weight: normal;\n  text-decoration: underline;\n  margin-bottom: 6px;\n  cursor: pointer;\n  font-family: 'Source Sans Pro', sans-serif;\n  text-align: left;\n`\n","import React, { Fragment } from 'react'\nimport {\n  FooterLink,\n  FooterLabel,\n  FooterGroup,\n  FooterCol,\n  Text,\n  Footer,\n  IllustrationHousesBackgroundWithComposition,\n  getFormatedPhone,\n  getUrlWithProtocol,\n} from '@bbl-digital/snorre'\nimport { FooterWrapper, CustomLink } from './styles'\nimport { IBBL } from 'shared/models/BBL'\nimport { useHistory } from 'react-router-dom'\n\ninterface IProps {\n  bbl?: IBBL\n}\n\nconst LandingFooter: React.FC<IProps> = ({ bbl }) => {\n  const history = useHistory()\n\n  const phone = bbl?.settings?.phoneNumberForGeneralQuestions\n  const email = bbl?.settings?.emailForGeneralQuestions\n\n  const hasAnyUrl = (): boolean => {\n    if (!bbl?.settings) return false\n    return bbl.settings.commonPreemptionInformationUrl ||\n      bbl.settings.preemptionInformationUrl ||\n      bbl.settings.becomeAMemberUrl\n      ? true\n      : false\n  }\n\n  const goToPrivacy = () => {\n    history.push('/personvern')\n  }\n\n  const currentYear = new Date().getFullYear()\n\n  return (\n    <FooterWrapper>\n      <IllustrationHousesBackgroundWithComposition height=\"159px\" />\n      <Footer>\n        {bbl && bbl.settings && (\n          <Fragment>\n            <FooterCol>\n              {phone && (\n                <FooterGroup>\n                  <FooterLabel>Telefon</FooterLabel>\n                  <FooterLink href={'tel:' + phone}>\n                    {getFormatedPhone(phone)}\n                  </FooterLink>\n                </FooterGroup>\n              )}\n              {email && (\n                <FooterGroup>\n                  <FooterLabel>E-post</FooterLabel>\n                  <FooterLink href={`mailto:${email}`}>{email}</FooterLink>\n                </FooterGroup>\n              )}\n            </FooterCol>\n\n            <FooterCol>\n              {hasAnyUrl() && (\n                <FooterGroup>\n                  <FooterLabel>Nyttige lenker</FooterLabel>\n                  {bbl.settings.bblUrl && (\n                    <FooterLink\n                      ifexists\n                      href={getUrlWithProtocol(bbl.settings.bblUrl)}\n                    >\n                      {bbl.shortName || bbl.name}\n                    </FooterLink>\n                  )}\n                  {bbl.settings.becomeAMemberUrl && (\n                    <FooterLink\n                      ifexists\n                      href={getUrlWithProtocol(bbl.settings.becomeAMemberUrl)}\n                    >\n                      Bli medlem\n                    </FooterLink>\n                  )}\n                </FooterGroup>\n              )}\n            </FooterCol>\n\n            <FooterCol>\n              <FooterGroup>\n                <Text color={'white'}>BBL Pivotal © {currentYear}</Text>\n                {bbl.settings.customPrivacyStatementUrl && (\n                  <FooterLink\n                    small\n                    ifexists\n                    href={getUrlWithProtocol(\n                      bbl.settings.customPrivacyStatementUrl\n                    )}\n                  >\n                    Personvern og informasjonskapsler\n                  </FooterLink>\n                )}\n                {!bbl.settings.customPrivacyStatementUrl && (\n                  <CustomLink nostyle onClick={goToPrivacy}>\n                    Personvern og informasjonskapsler\n                  </CustomLink>\n                )}\n              </FooterGroup>\n            </FooterCol>\n          </Fragment>\n        )}\n      </Footer>\n    </FooterWrapper>\n  )\n}\n\nexport default LandingFooter\n","import { PortalTypesEnum } from 'shared/models/BBL'\nimport { SystemState } from './types'\n\nexport const getBbl = (state: SystemState) => state.bbl\n\nexport const getBblSettings = (state: SystemState) => {\n  const bbl = getBbl(state)\n  return bbl.data?.settings\n}\n\nexport const isPortalActive = (state: SystemState) =>\n  state.bbl.data?.applications.findIndex(\n    (x) => x.name === PortalTypesEnum.Portal\n  ) !== -1\n\nexport const isMinSideActive = (state: SystemState) =>\n  state.bbl.data?.applications.findIndex(\n    (x) => x.name === PortalTypesEnum.MinSide\n  ) !== -1\n\nexport const isForkjopActive = (state: SystemState) =>\n  state.bbl.data?.applications.findIndex(\n    (x) => x.name === PortalTypesEnum.Forkjop\n  ) !== -1\n","export const CUSTOMTEXT_HEADER = 'Landingsside_Overskrift'\nexport const CUSTOMTEXT_FORKJOP = 'Landingsside_Forkjop'\nexport const CUSTOMTEXT_INGRESS = 'Landingsside_Ingress'\nexport const CUSTOMTEXT_MINSIDE = 'Landingsside_MinSide'\nexport const CUSTOMTEXT_PORTAL = 'Landingsside_Styreportalen'\n","import {\n  CUSTOMTEXT_FORKJOP,\n  CUSTOMTEXT_HEADER,\n  CUSTOMTEXT_INGRESS,\n  CUSTOMTEXT_MINSIDE,\n  CUSTOMTEXT_PORTAL,\n} from 'shared/constants/customtexts'\nimport { SystemState } from './types'\n\nexport const getCustomtexts = (state: SystemState) => state.customtexts\n\nexport const getCustomtextHeader = (state: SystemState) =>\n  state.customtexts.data?.find((x) => x.fieldName === CUSTOMTEXT_HEADER)?.text\n\nexport const getCustomtextIngress = (state: SystemState) =>\n  state.customtexts.data?.find((x) => x.fieldName === CUSTOMTEXT_INGRESS)?.text\n\nexport const getCustomtextPortal = (state: SystemState) =>\n  state.customtexts.data?.find((x) => x.fieldName === CUSTOMTEXT_PORTAL)?.text\n\nexport const getCustomtextMinside = (state: SystemState) =>\n  state.customtexts.data?.find((x) => x.fieldName === CUSTOMTEXT_MINSIDE)?.text\n\nexport const getCustomtextForkjop = (state: SystemState) =>\n  state.customtexts.data?.find((x) => x.fieldName === CUSTOMTEXT_FORKJOP)?.text\n","import styled from '@emotion/styled'\n\nexport const HeaderWrapper = styled.div`\n  h2 {\n    margin-bottom: 0.5em;\n  }\n  span {\n    font-size: 20px;\n  }\n`\n\nexport const IngressWrapper = styled.div`\n  display: flex;\n  align-items: center;\n  min-height: 50px;\n  max-width: 500px;\n  flex-wrap: wrap;\n`\n","import { Header, Skeleton, Text } from '@bbl-digital/snorre'\nimport React, { Fragment } from 'react'\nimport { useSelector } from 'react-redux'\nimport {\n  getCustomtextHeader,\n  getCustomtextIngress,\n} from 'shared/store/customtexts/selectors'\nimport { HeaderWrapper, IngressWrapper } from './styles'\n\nconst HomeHeader: React.FC = () => {\n  const customtextHeader = useSelector(getCustomtextHeader)\n  const customtextIngress = useSelector(getCustomtextIngress)\n  return (\n    <HeaderWrapper>\n      <Header level={2}>{customtextHeader || 'Velkommen'}</Header>\n      <IngressWrapper>\n        {customtextIngress ? (\n          <Text>{customtextIngress}</Text>\n        ) : (\n          <Fragment>\n            <Skeleton width=\"100%\" />\n            <Skeleton width=\"60%\" />\n          </Fragment>\n        )}\n      </IngressWrapper>\n    </HeaderWrapper>\n  )\n}\n\nexport default HomeHeader\n","import styled from '@emotion/styled'\n\nexport const Wrapper = styled.div`\n  display: grid;\n  grid-template-columns: 1fr;\n  grid-row-gap: 0.2em;\n  margin-top: 1em;\n`\n","import React from 'react'\nimport { Skeleton } from '@bbl-digital/snorre'\nimport { Wrapper } from './styles'\n\ninterface IProps {}\n\nconst ProductCardSkeleton: React.FC<IProps> = () => {\n  return (\n    <Wrapper>\n      <Skeleton width=\"90%\" />\n      <Skeleton width=\"90%\" />\n      <Skeleton width=\"70%\" />\n    </Wrapper>\n  )\n}\n\nexport default ProductCardSkeleton\n","import { css } from '@emotion/react'\nimport styled from '@emotion/styled'\n\nexport const TextWrapper = styled.div`\n  min-height: 60px;\n  margin-top: 0.5em;\n  margin-bottom: 1em;\n\n  @media screen and (max-width: 768px) {\n    display: none;\n    margin-top: 0em;\n    margin-bottom: 0em;\n  }\n`\n\nexport const IconWrapper = styled.div`\n  display: flex;\n  justify-content: flex-end;\n`\n\nexport const ContentWrapper = styled.div`\n  @media screen and (max-width: 768px) {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n  }\n`\n\nexport const BorderRadiusStyle = css`\n  @media screen and (max-width: 768px) {\n    padding: 1.5em 1em;\n    border-radius: 15px;\n  }\n`\n","import { Card, Header, IconArrowRight, Link, Text } from '@bbl-digital/snorre'\nimport { useTheme } from '@emotion/react'\nimport React from 'react'\nimport ProductCardSkeleton from './ProductCardSkeleton'\nimport {\n  BorderRadiusStyle,\n  ContentWrapper,\n  IconWrapper,\n  TextWrapper,\n} from './styles'\n\ninterface IProps {\n  headerIcon: React.ReactNode\n  headerText: string\n  text?: string\n  url: string\n}\n\nconst ProductCard: React.FC<IProps> = ({\n  headerIcon,\n  headerText,\n  text,\n  url,\n}) => {\n  const theme: any = useTheme()\n\n  return (\n    <Link nostyle href={url}>\n      <Card largePadding shadow withhover css={BorderRadiusStyle}>\n        <ContentWrapper>\n          <Header level={3}>\n            {headerIcon}\n            {headerText}\n          </Header>\n          <TextWrapper>\n            {text ? <Text paragraph>{text}</Text> : <ProductCardSkeleton />}\n          </TextWrapper>\n          <IconWrapper>\n            <IconArrowRight color={theme.primary} />\n          </IconWrapper>\n        </ContentWrapper>\n      </Card>\n    </Link>\n  )\n}\n\nexport default ProductCard\n","import styled from '@emotion/styled'\n\nexport const Wrapper = styled.div`\n  display: grid;\n  grid-row-gap: 4em;\n  grid-template-columns: 1fr;\n  grid-template-rows: min-content min-content;\n  max-width: 1170px;\n  margin: 0 auto;\n  min-height: calc(\n    100vh - 194px - 10vw - 70px\n  ); // Minus footer, topbar and illustration\n  padding-top: 10vh;\n\n  @media screen and (max-width: 568px) {\n    grid-row-gap: 2em;\n    margin-top: 5vh;\n    margin-bottom: 5vh;\n  }\n\n  @media screen and (max-width: 1170px) {\n    padding: 0 1em;\n  }\n`\n\nexport const CardsWrapper = styled.div`\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(250px, 365px));\n  grid-column-gap: 2em;\n  grid-row-gap: 2em;\n\n  @media screen and (max-width: 768px) {\n    grid-row-gap: 1em;\n    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n  }\n\n  h3 {\n    display: flex;\n    align-items: center;\n\n    svg {\n      margin-right: 0.5em;\n    }\n  }\n`\n","import {\n  getUrlWithProtocol,\n  IconApartment,\n  IconBoard,\n  IconUser,\n} from '@bbl-digital/snorre'\nimport { useTheme } from '@emotion/react'\nimport React from 'react'\nimport { useSelector } from 'react-redux'\nimport {\n  isForkjopActive,\n  isMinSideActive,\n  isPortalActive,\n  getBblSettings,\n} from 'shared/store/bbl/selectors'\nimport {\n  getCustomtextForkjop,\n  getCustomtextMinside,\n  getCustomtextPortal,\n} from 'shared/store/customtexts/selectors'\nimport HomeHeader from './Header'\nimport ProductCard from './ProductCard'\nimport { CardsWrapper, Wrapper } from './styles'\n\nconst Home: React.FC = () => {\n  const theme: any = useTheme()\n\n  const preemptionBblCode =\n    window.config.bblCode === 'sbbl'\n      ? 'sobo'\n      : window.config.bblCode === 'moborana'\n      ? 'helgelandbbl'\n      : window.config.bblCode === 'pbbl'\n      ? 'gbbl'\n      : window.config.bblCode\n\n  const customtextForkjop = useSelector(getCustomtextForkjop)\n  const customtextPortal = useSelector(getCustomtextPortal)\n  const customtextMinside = useSelector(getCustomtextMinside)\n\n  const hasPortal = useSelector(isPortalActive)\n  const hasMinSide = useSelector(isMinSideActive)\n  const hasForkjop = useSelector(isForkjopActive)\n\n  const bblSettings = useSelector(getBblSettings)\n\n  return (\n    <Wrapper>\n      <HomeHeader />\n\n      <CardsWrapper>\n        {hasForkjop && (\n          <ProductCard\n            headerIcon={\n              <IconApartment size=\"32px\" color={theme.secondaryDarkText} />\n            }\n            headerText=\"Forkjøp\"\n            text={customtextForkjop}\n            url={window.config.urls.forkjopUrl + preemptionBblCode}\n          />\n        )}\n        {hasMinSide && (\n          <ProductCard\n            headerIcon={\n              <IconUser size=\"32px\" color={theme.secondaryDarkText} />\n            }\n            headerText=\"Min side\"\n            text={customtextMinside}\n            url={window.config.urls.minSideUrl}\n          />\n        )}\n        {hasPortal && (\n          <ProductCard\n            headerIcon={\n              <IconBoard size=\"32px\" color={theme.secondaryDarkText} />\n            }\n            headerText=\"Portal\"\n            text={customtextPortal}\n            url={getUrlWithProtocol(\n              bblSettings?.urls.newPortal ||\n                window.config.bblCode.toLowerCase() +\n                  window.config.urls.portalUrl\n            )}\n          />\n        )}\n      </CardsWrapper>\n    </Wrapper>\n  )\n}\n\nexport default Home\n","import React, { useEffect } from 'react'\nimport { useAuthContext } from 'Auth/AuthContext'\nimport { AppLoader, getUrlWithProtocol } from '@bbl-digital/snorre'\nimport styled from '@emotion/styled'\nimport { IBBL } from 'shared/models/BBL'\n\nconst LoaderWrapper = styled.div`\n  height: 98vh;\n  width: 99vw;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n`\n\ninterface IProps {\n  bbl: IBBL | undefined\n}\n\nconst AfterLogout: React.FC<IProps> = ({ bbl }) => {\n  const authContext = useAuthContext()\n\n  useEffect(() => {\n    const url = bbl?.settings?.bblUrl\n      ? getUrlWithProtocol(bbl.settings.bblUrl)\n      : undefined\n\n    authContext.signoutRedirectCallback(url)\n  })\n\n  return (\n    <LoaderWrapper>\n      <AppLoader></AppLoader>\n    </LoaderWrapper>\n  )\n}\n\nexport default AfterLogout\n","import styled from '@emotion/styled'\n\nexport const LoaderWrapper = styled.div`\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  background-color: white;\n  transition: 0.5s opacity ease-out;\n  transition-delay: 0.5s;\n  z-index: 9999;\n\n  &.overlay-exit-active {\n    opacity: 0;\n  }\n`\n","import React, { useEffect } from 'react'\nimport { useAuthContext } from 'Auth/AuthContext'\nimport { LoaderWrapper } from 'shared/components/LoaderWrapper/styles'\nimport { AppLoader } from '@bbl-digital/snorre'\n\nconst Cleanup: React.FC = () => {\n  const authContext = useAuthContext()\n  useEffect(() => {\n    authContext.cleanup()\n  })\n  return (\n    <LoaderWrapper>\n      <AppLoader></AppLoader>\n    </LoaderWrapper>)\n}\n\nexport default Cleanup\n","import axios from 'axios'\n\nexport const getBbl = () => {\n  return axios.get(axios.defaults.baseURL + 'bbl/bbl')\n}\n\nexport const getBblSettings = () => {\n  return axios.get(axios.defaults.baseURL + 'bbl/bbl/settings')\n}\n\nexport const getBblApplications = () => {\n  return axios.get(axios.defaults.baseURL + 'bbl/bbl/applications')\n}\n\nexport const sendRequestToBbl = () => {\n  return axios.get(window.config.urls.bblidApiBaseUrl + '/api/user/request')\n}\n","import styled from '@emotion/styled'\n\nexport const Wrapper = styled.div`\n  margin: 10vh auto;\n  max-width: 450px;\n\n  h2 {\n    margin-bottom: 1em;\n  }\n\n  p {\n    margin-bottom: 2em;\n  }\n\n  p + div {\n    margin-bottom: 2em;\n  }\n\n  & > div {\n    padding: 3em;\n  }\n`\n","import React, { Fragment } from 'react'\nimport { Header, Text } from '@bbl-digital/snorre'\nimport { IBBL } from 'shared/models/BBL'\n\ninterface IProps {\n  bbl: IBBL | null\n  fullName: string | undefined\n}\n\nconst NoAccessInformation: React.FC<IProps> = ({ fullName, bbl }) => {\n  return (\n    <Fragment>\n      <Header level={2}>Hei {fullName}</Header>\n      <Text paragraph>\n        Vi klarte dessverre ikke å automatisk koble din bruker i {bbl?.name}{' '}\n        sine systemer.\n      </Text>\n      <Text paragraph>\n        Om du finnes i {bbl?.name} sine systemer kan vårt kundesenter gjerne\n        hjelpe deg videre med opprettingen.\n      </Text>\n      <Text paragraph>\n        Trykk på knappen under for å sende en forespørsel med dine\n        brukerdetaljer til vårt kundesenter hos {bbl?.name}.\n      </Text>\n    </Fragment>\n  )\n}\n\nexport default NoAccessInformation\n","import styled from '@emotion/styled'\n\nexport const ButtonWrapper = styled.div`\n  display: flex;\n  flex-direction: column;\n\n  button {\n    margin-bottom: 1em;\n  }\n\n  a {\n    margin-top: 1em;\n    margin-bottom: 2em;\n    text-align: center;\n  }\n`\n","import React from 'react'\nimport { Text, Button, Link } from '@bbl-digital/snorre'\nimport { ButtonWrapper } from './styles'\nimport { IBBL } from 'shared/models/BBL'\n\ninterface IProps {\n  returnUrl: string | undefined\n  bbl: IBBL | null\n  idp: string | undefined\n  isRequestLoading: boolean\n  isRequestSent: boolean\n  onSendRequest: () => void\n  onLogout: () => void\n}\n\nconst NoAccessActions: React.FC<IProps> = ({\n  returnUrl,\n  bbl,\n  idp,\n  isRequestLoading,\n  isRequestSent,\n  onSendRequest,\n  onLogout,\n}) => {\n  return (\n    <ButtonWrapper>\n      <Button\n        loading={isRequestLoading}\n        disabled={isRequestSent}\n        highlight\n        onClick={onSendRequest}\n      >\n        Send forespørsel\n      </Button>\n      {returnUrl && (\n        <Button highlight outline onClick={onLogout}>\n          Logg ut\n        </Button>\n      )}\n      {idp === 'oidc2' && (\n        <Link\n          href={\n            window.config.urls.bblidClientUrl +\n            `profil?bbl=${window.config.bblCode}&returnUrl=${returnUrl}`\n          }\n        >\n          Min brukerprofil\n        </Link>\n      )}\n\n      <Text subtle>\n        Du kan ringe oss på {bbl?.phone} for en raskere behandling, men vi\n        oppfordrer deg uansett til å trykke på knappen over, slik at vi kan se\n        hva du har oppgitt som dine brukerdetaljer.\n      </Text>\n    </ButtonWrapper>\n  )\n}\n\nexport default NoAccessActions\n","import React, { Fragment, useEffect, useState } from 'react'\nimport { Card, Alert, AppLoader } from '@bbl-digital/snorre'\nimport Layout from 'shared/components/Layout'\nimport { sendRequestToBbl } from 'shared/api/bbl.api'\nimport { Wrapper } from './styles'\nimport { useAuthContext } from 'Auth/AuthContext'\nimport NoAccessInformation from './NoAccessInformation'\nimport NoAccessActions from './NoAccessActions'\nimport { getBbl } from 'shared/store/bbl/selectors'\nimport { useSelector } from 'react-redux'\nimport { LoaderWrapper } from 'shared/components/LoaderWrapper/styles'\nimport axios from 'axios'\nimport { getParamBothLowerUppercase } from 'shared/utils/urlParams'\n\ninterface IProps {}\n\nconst NoAccess: React.FC<IProps> = () => {\n  const authContext = useAuthContext()\n  const bbl = useSelector(getBbl)\n  const [idp, setIdp] = useState<string | undefined>()\n  const [fullName, setFullName] = useState<string | undefined>()\n  const [requestLoading, setRequestLoading] = useState(false)\n  const [requestMessage, setRequestMessage] = useState<string | undefined>(\n    undefined\n  )\n  const [error, setError] = useState<string | null>(null)\n  const returnUrl = getParamBothLowerUppercase('returnUrl')\n\n  useEffect(() => {\n    if (!authContext.isAuthenticated()) {\n      authContext.signinRedirect()\n      return\n    }\n\n    getUser()\n    getIdp()\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [])\n\n  const getIdp = () => {\n    authContext.getUser().then((res) => {\n      setIdp(res.profile.idp)\n    })\n  }\n\n  const getUser = () => {\n    authContext.getUser().then((res) => {\n      setFullName(res.profile.full_name)\n    })\n  }\n\n  const onSendRequest = () => {\n    setRequestLoading(true)\n\n    sendRequestToBbl()\n      .then(() => {\n        setRequestMessage('En forespørsel er sendt.')\n      })\n      .catch(() => {\n        setError('En feil skjedde.')\n      })\n      .finally(() => {\n        setRequestLoading(false)\n      })\n  }\n\n  const onLogout = () => {\n    authContext.logout(window.config.bblCode)\n  }\n\n  if (bbl && bbl.data?.brandingCode === 'bate') {\n    window.location.href =\n      window.config.urls.bblidClientUrl +\n      'ikketilgang?bbl=bate&returnurl=' +\n      window.location.origin +\n      '/logout'\n\n    return null\n  }\n\n  const Content = (\n    <Fragment>\n      <NoAccessInformation fullName={fullName} bbl={bbl.data} />\n      {requestMessage && (\n        <Alert success onClose={() => setRequestMessage(undefined)}>\n          {requestMessage}\n        </Alert>\n      )}\n      <NoAccessActions\n        bbl={bbl.data}\n        returnUrl={returnUrl ? returnUrl : window.location.href}\n        idp={idp}\n        isRequestSent={!!requestMessage}\n        isRequestLoading={requestLoading}\n        onSendRequest={onSendRequest}\n        onLogout={onLogout}\n      />\n    </Fragment>\n  )\n\n  const ApplicationLoading = (\n    <LoaderWrapper>\n      <AppLoader />\n    </LoaderWrapper>\n  )\n\n  return bbl.loading ? (\n    ApplicationLoading\n  ) : (\n    <Layout>\n      <Wrapper>\n        <Card shadow largePadding>\n          {error ? <Alert danger>{error}</Alert> : Content}\n        </Card>\n      </Wrapper>\n    </Layout>\n  )\n}\n\nexport default NoAccess\n","export const getParamBothLowerUppercase = (paramname: string) => {\n  const search = window.location.search\n  const params = new URLSearchParams(search)\n  let returnUrlParam = params.get(paramname)\n\n  if (returnUrlParam) {\n    return returnUrlParam\n  } else {\n    return params.get(paramname.toLowerCase())\n  }\n}\n","import React, { useState, useEffect, Suspense, Fragment } from 'react'\nimport { Router, Switch, Route } from 'react-router-dom'\nimport history from 'browserHistory'\nimport styled from '@emotion/styled'\nimport { AnalyticsProvider } from '@bbld/bbl-analytics'\n\n// import TelemetryProvider from 'shared/tracking/telemetryProvider'\nimport { getAppInsights } from 'shared/services/telemetryService'\nimport PageError from 'shared/components/PageError'\nimport Callback from 'Auth/Callback'\nimport Logout from 'Auth/Logout'\nimport SilentRenew from 'Auth/SilentRenew'\nimport Header from './Header'\nimport LandingFooter from './Footer'\nimport { IBBL } from 'shared/models/BBL'\nimport Home from 'Modules/Home'\nimport AfterLogout from 'Auth/AfterLogout'\nimport Cleanup from 'Auth/Cleanup'\nimport NoAccess from 'Modules/NoAccess'\n\n/** Lazy load modules */\nconst TelemetryProvider = React.lazy(\n  () => import('shared/tracking/telemetryProvider')\n)\nconst PrivacyPage = React.lazy(() => import('Modules/PrivacyPage'))\n\nconst Wrapper = styled.main`\n  min-height: calc(100vh - 210px);\n`\n\ninterface IProps {\n  brandingcode: string\n  bbl: IBBL\n}\n\nconst Routes: React.FC<IProps> = ({ bbl, brandingcode, ...props }) => {\n  const [isReady, setIsReady] = useState(false)\n  const [analyticsSettings, setAnalyticsSettings] = useState<any>({\n    gtmCodes: [window.config.gtm.bblPivotalGtmCode],\n    siteName: window.config.appName,\n    bblCode: window.config.bblCode,\n  })\n\n  useEffect(() => {\n    console.log('analytics settings')\n    if (bbl.settings.gtmId) {\n      setAnalyticsSettings({\n        ...analyticsSettings,\n        gtmCodes: [...analyticsSettings.gtmCodes, 'GTM-' + bbl.settings.gtmId],\n      })\n    }\n    setTimeout(() => {\n      setIsReady(true)\n    })\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [])\n\n  // eslint-disable-next-line\n  let appInsights: any | null = null\n\n  return (\n    <Wrapper>\n      <Suspense fallback={<Fragment />}>\n        {isReady && (\n          <AnalyticsProvider settings={analyticsSettings} history={history}>\n            <Router history={history}>\n              <TelemetryProvider\n                instrumentationKey={window.config.ai.instrumentationKey}\n                after={() => {\n                  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n                  appInsights = getAppInsights()\n                }}\n              >\n                <Header brandingcode={brandingcode} />\n                <Switch>\n                  {/* Auth routes */}\n                  <Route path=\"/silentrenew\" component={SilentRenew} />\n                  <Route path=\"/signin-oidc\" component={Callback} />\n                  <Route path=\"/cleanup\" component={Cleanup} />\n                  <Route\n                    path=\"/logout\"\n                    render={(props) => <Logout bbl={bbl} />}\n                  />\n                  <Route\n                    path=\"/afterlogout\"\n                    render={(props) => <AfterLogout bbl={bbl} />}\n                  />\n\n                  <Route path=\"/\" exact component={Home} />\n                  <Route path=\"/ikketilgang\" exact component={NoAccess} />\n                  <Route path=\"/personvern\" exact component={PrivacyPage} />\n                  {/* Error routes */}\n                  <Route component={PageError} />\n                </Switch>\n                <LandingFooter bbl={bbl} />\n              </TelemetryProvider>\n            </Router>\n          </AnalyticsProvider>\n        )}\n      </Suspense>\n    </Wrapper>\n  )\n}\n\nexport default Routes\n","import React from 'react'\nimport { Global, css } from '@emotion/react'\n\nconst GlobalStyles: React.FC = () => (\n  <Global\n    styles={css`\n      @font-face {\n        font-family: 'Source Sans Pro';\n        src: url('assets/fonts/SourceSansPro-Regular.ttf');\n        font-weight: normal;\n        font-display: swap;\n      }\n      @font-face {\n        font-family: 'Source Sans Pro';\n        src: url('assets/fonts/SourceSansPro-BlackItalic.ttf');\n        font-weight: normal;\n        font-style: italic;\n        font-display: swap;\n      }\n\n      @font-face {\n        font-family: 'Source Sans Pro';\n        src: url('assets/fonts/SourceSansPro-SemiBold.ttf');\n        font-weight: 600;\n        font-display: swap;\n      }\n      @font-face {\n        font-family: 'Source Sans Pro';\n        src: url('assets/fonts/SourceSansPro-SemiBoldItalic.ttf');\n        font-weight: 600;\n        font-style: italic;\n        font-display: swap;\n      }\n\n      @font-face {\n        font-family: 'Source Sans Pro';\n        src: url('assets/fonts/SourceSansPro-Bold.ttf');\n        font-weight: 700;\n        font-display: swap;\n      }\n      @font-face {\n        font-family: 'Source Sans Pro';\n        src: url('assets/fonts/SourceSansPro-BoldItalic.ttf');\n        font-weight: 700;\n        font-style: italic;\n        font-display: swap;\n      }\n\n      * {\n        font-family: 'Source Sans Pro', sans-serif;\n      }\n      body {\n        margin: 0;\n        font-family: 'Source Sans Pro', sans-serif;\n        -webkit-font-smoothing: antialiased;\n        -moz-osx-font-smoothing: grayscale;\n        overflow: overlay;\n        overflow-x: hidden;\n      }\n      /* Customize website's scrollbar like Mac OS\n      Not supports in Firefox and IE */\n\n      /* total width */\n      body::-webkit-scrollbar {\n        background-color: transparent;\n        width: 8px;\n      }\n\n      /* background of the scrollbar except button or resizer */\n      body::-webkit-scrollbar-track {\n        background-color: transparent;\n      }\n\n      /* scrollbar itself */\n      body::-webkit-scrollbar-thumb {\n        background-color: #babac0;\n        border-radius: 16px;\n        border: 4px solid transparent;\n      }\n\n      /* set button(top and bottom of the scrollbar) */\n      body::-webkit-scrollbar-button {\n        display: none;\n      }\n    `}\n  />\n)\n\nexport default GlobalStyles\n","import axios from 'axios'\nexport const getTheme = async (brandingCode: string) => {\n  const code = brandingCode.toLowerCase()\n\n  const style: any = await axios.get(\n    window.config.urls.themesUrl + code + '/styles.json',\n    {\n      transformRequest: (data, headers) => {\n        delete headers.common['Authorization']\n      },\n    }\n  )\n\n  return style.data\n}\n\nexport const setFavicon = (code: string) => {\n  const favicon: any = document.querySelector(\"link[rel*='icon']\")\n  if (!favicon) return\n  favicon.href = `${\n    window.config.urls.themesUrl\n  }${code.toLocaleLowerCase()}/favicon.ico`\n}\n","export const BBL_FETCH_REQUESTED = 'BBL_FETCH_REQUESTED'\nexport const BBL_FETCH_SUCCESS = 'BBL_FETCH_SUCCESS'\nexport const BBL_FETCH_FAILED = 'BBL_FETCH_FAILED'\n","export const CUSTOMTEXTS_FETCH_REQUESTED = 'CUSTOMTEXTS_FETCH_REQUESTED'\nexport const CUSTOMTEXTS_FETCH_SUCCESS = 'CUSTOMTEXTS_FETCH_SUCCESS'\nexport const CUSTOMTEXTS_FETCH_FAILED = 'CUSTOMTEXTS_FETCH_FAILED'\n","import React, { Fragment, useState, useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { AppShell, AppLoader } from '@bbl-digital/snorre'\nimport Routes from './Routes'\nimport GlobalStyles from './GlobalStyles'\nimport { getTheme, setFavicon } from 'shared/utils/theme'\nimport { LoaderWrapper } from 'shared/components/LoaderWrapper/styles'\nimport { getBbl } from 'shared/store/bbl/selectors'\nimport { BBL_FETCH_REQUESTED } from 'shared/store/bbl/actionTypes'\nimport { useAuthContext } from 'Auth/AuthContext'\nimport { CUSTOMTEXTS_FETCH_REQUESTED } from 'shared/store/customtexts/actionTypes'\nimport { IBBL } from 'shared/models/BBL'\n\ninterface IResponse {\n  bbl?: IBBL\n  error?: any\n}\n\nconst App: React.FC<IResponse> = () => {\n  const { data, loading, error } = useSelector(getBbl)\n  const dispatch = useDispatch()\n  const [theme, setTheme] = useState<any>()\n  const authContext = useAuthContext()\n\n  useEffect(() => {\n    dispatch({ type: BBL_FETCH_REQUESTED })\n    dispatch({ type: CUSTOMTEXTS_FETCH_REQUESTED })\n\n    if (authContext.isAuthenticated()) {\n      authContext.getUser().then((user: any) => {\n        dispatch({\n          type: BBL_FETCH_REQUESTED,\n          payload: user.profile.navneregisterid,\n        })\n      })\n    }\n  }, [authContext, dispatch])\n\n  useEffect(() => {\n    if (data) {\n      getTheme(data.brandingCode).then((res: any) => {\n        setTheme(res)\n      })\n      setFavicon(data.brandingCode)\n    }\n  }, [data])\n\n  const ApplicationLoading = (\n    <LoaderWrapper>\n      <AppLoader />\n    </LoaderWrapper>\n  )\n  const ApplicationLoaded = (\n    <AppShell theme={theme} defaultTextColor={theme?.secondaryDarkText}>\n      <GlobalStyles />\n      {data && data?.brandingCode && (\n        <Routes bbl={data} brandingcode={data.brandingCode} />\n      )}\n    </AppShell>\n  )\n\n  return (\n    <Fragment>\n      {!loading && theme ? ApplicationLoaded : ApplicationLoading}\n      {error ? <span>Noe gikk galt...</span> : null}\n    </Fragment>\n  )\n}\n\nexport default App\n","import axios from 'axios'\n\nexport const getUser = () => {\n  return axios.request({\n    method: 'get',\n    url: `personv2/Person/`,\n    headers: {\n      'x-api-version': '2.0',\n    },\n  })\n}\n\nexport const getUserRoles = () => {\n  return axios.get('/roles/Role')\n}\n","import { all, call, put, takeEvery } from 'redux-saga/effects'\nimport {\n  USER_FETCH_SUCCESS,\n  USER_FETCH_FAILED,\n  USER_FETCH_REQUESTED,\n} from './actionTypes'\nimport { getUser, getUserRoles } from 'shared/api/user.api'\n\nfunction* fetchUser(): any {\n  try {\n    const [user, userRoles] = yield all([\n      call(getUser as any),\n      call(getUserRoles as any),\n    ])\n    yield all([\n      put({\n        type: USER_FETCH_SUCCESS,\n        payload: { ...user.data, roles: { ...userRoles.data } },\n      }),\n    ])\n  } catch (e) {\n    yield put({ type: USER_FETCH_FAILED, payload: e })\n  }\n}\n\nfunction* userSaga() {\n  yield takeEvery(USER_FETCH_REQUESTED, fetchUser)\n}\n\nexport default userSaga\n","import {\n  USER_FETCH_REQUESTED,\n  USER_FETCH_SUCCESS,\n  USER_FETCH_FAILED,\n} from './actionTypes'\nimport { UserActionTypes } from './types'\n\nconst initialState = {\n  data: null,\n  loading: false,\n  error: null,\n}\n\nconst reducer = (state = initialState, action: UserActionTypes) => {\n  switch (action.type) {\n    case USER_FETCH_REQUESTED:\n      return { ...state, loading: true }\n    case USER_FETCH_SUCCESS:\n      return { ...state, loading: false, data: action.payload }\n    case USER_FETCH_FAILED:\n      return { ...state, loading: false, error: action.payload }\n    default:\n      return state\n  }\n}\n\nexport default reducer\n","import { all, call, put, takeEvery } from 'redux-saga/effects'\nimport { getBbl, getBblApplications, getBblSettings } from 'shared/api/bbl.api'\nimport {\n  BBL_FETCH_REQUESTED,\n  BBL_FETCH_FAILED,\n  BBL_FETCH_SUCCESS,\n} from './actionTypes'\n\nfunction* fetchBbl(): any {\n  try {\n    const [bbl, bblSettings, bblApplications] = yield all([\n      call(getBbl),\n      call(getBblSettings),\n      call(getBblApplications),\n    ])\n    yield put({\n      type: BBL_FETCH_SUCCESS,\n      payload: {\n        ...bbl.data,\n        settings: { ...bblSettings.data },\n        applications: [...bblApplications.data],\n      },\n    })\n  } catch (e) {\n    yield put({ type: BBL_FETCH_FAILED, payload: e })\n  }\n}\n\nfunction* bblSaga() {\n  yield takeEvery(BBL_FETCH_REQUESTED, fetchBbl)\n}\n\nexport default bblSaga\n","import {\n  BBL_FETCH_REQUESTED,\n  BBL_FETCH_SUCCESS,\n  BBL_FETCH_FAILED,\n} from './actionTypes'\nimport { BblActionTypes } from './types'\n\nconst initialState = {\n  data: null,\n  loading: false,\n  error: null,\n}\n\nconst reducer = (state = initialState, action: BblActionTypes) => {\n  switch (action.type) {\n    case BBL_FETCH_REQUESTED:\n      return { ...state, loading: true }\n    case BBL_FETCH_SUCCESS:\n      return { ...state, loading: false, data: action.payload }\n    case BBL_FETCH_FAILED:\n      return { ...state, loading: false, error: action.payload }\n    default:\n      return state\n  }\n}\n\nexport default reducer\n","import axios from 'axios'\n\nexport const getCustomtext = (id: string) => {\n  return axios.get(\n    axios.defaults.baseURL + 'customtext/bbltexts/Landingsside/' + id\n  )\n}\n","import { all, call, put, takeEvery } from 'redux-saga/effects'\nimport { getCustomtext } from 'shared/api/customtext.api'\nimport {\n  CUSTOMTEXT_HEADER,\n  CUSTOMTEXT_FORKJOP,\n  CUSTOMTEXT_INGRESS,\n  CUSTOMTEXT_MINSIDE,\n  CUSTOMTEXT_PORTAL,\n} from 'shared/constants/customtexts'\nimport { ICustomtext } from 'shared/models/Customtext'\nimport {\n  CUSTOMTEXTS_FETCH_FAILED,\n  CUSTOMTEXTS_FETCH_REQUESTED,\n  CUSTOMTEXTS_FETCH_SUCCESS,\n} from './actionTypes'\n\nfunction* fetchCustomtexts(): any {\n  try {\n    const ids = [\n      CUSTOMTEXT_HEADER,\n      CUSTOMTEXT_FORKJOP,\n      CUSTOMTEXT_INGRESS,\n      CUSTOMTEXT_MINSIDE,\n      CUSTOMTEXT_PORTAL,\n    ]\n    const response = yield all(ids.map((x) => call(getCustomtext, x)))\n    const customtexts: ICustomtext[] = response.map((c: any) => c.data)\n\n    yield put({\n      type: CUSTOMTEXTS_FETCH_SUCCESS,\n      payload: customtexts,\n    })\n  } catch (e) {\n    yield put({ type: CUSTOMTEXTS_FETCH_FAILED, payload: e })\n  }\n}\n\nfunction* customtextsSaga() {\n  yield takeEvery(CUSTOMTEXTS_FETCH_REQUESTED, fetchCustomtexts)\n}\n\nexport default customtextsSaga\n","import {\n  CUSTOMTEXTS_FETCH_FAILED,\n  CUSTOMTEXTS_FETCH_REQUESTED,\n  CUSTOMTEXTS_FETCH_SUCCESS,\n} from './actionTypes'\nimport { CustomtextsActionTypes } from './types'\n\nconst initialState = {\n  data: [],\n  loading: false,\n  error: null,\n}\n\nconst reducer = (state = initialState, action: CustomtextsActionTypes) => {\n  switch (action.type) {\n    case CUSTOMTEXTS_FETCH_REQUESTED:\n      return { ...state, loading: true }\n    case CUSTOMTEXTS_FETCH_SUCCESS:\n      return { ...state, loading: false, data: action.payload }\n    case CUSTOMTEXTS_FETCH_FAILED:\n      return { ...state, loading: false, error: action.payload }\n    default:\n      return state\n  }\n}\n\nexport default reducer\n","import { all, fork } from 'redux-saga/effects'\nimport { bblSaga } from './bbl'\nimport { customtextsSaga } from './customtexts'\nimport { userSaga } from './user'\n\nexport const rootSaga = function* root() {\n  yield all([fork(userSaga), fork(bblSaga), fork(customtextsSaga)])\n}\n","import { combineReducers, createStore, compose, applyMiddleware } from 'redux'\nimport createSagaMiddleware from 'redux-saga'\nimport { UserReducer } from './user'\nimport { rootSaga } from './sagas'\nimport { BblReducer } from './bbl'\nimport { CustomtextsReducer } from './customtexts'\n\nconst rootReducer = combineReducers({\n  user: UserReducer,\n  bbl: BblReducer,\n  customtexts: CustomtextsReducer,\n})\n\nconst sagaMiddleware = createSagaMiddleware()\n\nconst composeEnhancer =\n  (process.env.NODE_ENV !== 'production' &&\n    (window as any)['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__']) ||\n  compose\n\nconst store = createStore(\n  rootReducer,\n  {},\n  composeEnhancer(applyMiddleware(sagaMiddleware))\n)\n\nsagaMiddleware.run(rootSaga)\n\nexport default store\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport * as serviceWorker from './serviceWorker'\nimport App from 'App'\nimport { AuthProvider } from 'Auth/AuthContext'\nimport { UserManager } from 'oidc-client'\nimport { Provider } from 'react-redux'\nimport store from 'shared/store/store'\nimport { setAxiosDefaults } from 'axiosConfig'\nimport { LOCALSTORAGE_IDENTITY_PREFIX } from 'shared/constants/localStorageVariables'\nimport { IDENTITY_CONFIG } from 'shared/constants/authConstants'\n\nsetAxiosDefaults()\n\nif (window.location.pathname.indexOf('/silentredirect') !== -1) {\n  new UserManager({}).signinSilentCallback().then()\n} else if (window.location.pathname.indexOf('/cleanup') !== -1) {\n  // Iframe cleanup call\n  localStorage.removeItem(\n    `${LOCALSTORAGE_IDENTITY_PREFIX}user:${IDENTITY_CONFIG.authority}:${IDENTITY_CONFIG.client_id}`\n  )\n  new UserManager({}).clearStaleState()\n} else {\n  ReactDOM.render(\n    <AuthProvider>\n      <Provider store={store}>\n        <App />\n      </Provider>\n    </AuthProvider>,\n    document.getElementById('root')\n  )\n}\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.register()\n\ndeclare global {\n  interface Window {\n    clientConfigs: [\n      {\n        BblCode: string\n        ClientId: string\n      }\n    ]\n    config: {\n      bblCode: string\n      appName: string\n      baseUrl: string\n      urls: {\n        bblidBaseUrl: string\n        bblidClientUrl: string\n        bblidApiBaseUrl: string\n        minSideUrl: string\n        forkjopUrl: string\n        portalUrl: string\n        themesUrl: string\n      }\n      api: {\n        apiProxyUrl: string\n        url: string\n        subscription: string\n        version: string\n      }\n      gtm: {\n        bblPivotalGtmCode: string\n      }\n      gmaps: {\n        googleMapKey: string\n      }\n      ai: {\n        instrumentationKey: string\n        role: string\n      }\n    }\n  }\n}\n","export const styles = {\n  maxWidth: '1170px',\n}\n","import {\n  ApplicationInsights,\n  ITelemetryItem,\n} from '@microsoft/applicationinsights-web'\nimport { ReactPlugin } from '@microsoft/applicationinsights-react-js'\n\nlet reactPlugin: ReactPlugin = new ReactPlugin()\nlet appInsights: ApplicationInsights | null = null\n\n/**\n * Create the App Insights Telemetry Service\n * @return {{reactPlugin: ReactPlugin, appInsights: Object, initialize: Function}} - Object\n */\nconst createTelemetryService = () => {\n  /**\n   * Initialize the Application Insights class\n   * @param {string} instrumentationKey - Application Insights Instrumentation Key\n   * @param {Object} browserHistory - client's browser history, supplied by the withRouter HOC\n   * @return {void}\n   */\n  const initialize = (instrumentationKey: string, browserHistory: History) => {\n    if (!browserHistory) {\n      throw new Error('Could not initialize Telemetry Service')\n    }\n    if (!instrumentationKey) {\n      throw new Error(\n        'Instrumentation key not provided in ./src/telemetry-provider.jsx'\n      )\n    }\n\n    reactPlugin = new ReactPlugin()\n\n    appInsights = new ApplicationInsights({\n      config: {\n        instrumentationKey: instrumentationKey,\n        disableFetchTracking: false,\n        enableCorsCorrelation: true,\n        extensions: [reactPlugin],\n        extensionConfig: {\n          [reactPlugin.identifier]: {\n            history: browserHistory,\n          },\n        },\n      },\n    })\n\n    appInsights.loadAppInsights()\n    appInsights.addTelemetryInitializer((envelope: ITelemetryItem) => {\n      if (!envelope || !envelope.tags) return\n      envelope.tags['ai.cloud.role'] = window.config.ai.role\n    })\n  }\n\n  return { reactPlugin, appInsights, initialize }\n}\n\nexport const ai = createTelemetryService()\nexport const getAppInsights = () => appInsights\n","import React from 'react'\nimport styled from '@emotion/styled'\nimport bp from '@bbl-digital/snorre/lib/globals/styles/breakpoints'\nimport { styles } from 'shared/constants/styles'\n\nconst Wrapper = styled.div<IProps>`\n  max-width: ${(props) => (props.fullsize ? 'none' : styles.maxWidth)};\n  margin: 0 auto;\n  /* padding: ${(props) => (props.fullsize ? '0' : '0 0')}; */\n\n  @media screen and (max-width: ${bp.small}) {\n    padding: ${(props) => (props.fullsize ? '0' : '1em 0')};\n  }\n`\n\ninterface IProps {\n  fullsize?: boolean\n}\n\nconst Layout: React.FC<IProps> = (props) => {\n  return <Wrapper fullsize={props.fullsize}>{props.children}</Wrapper>\n}\n\nexport default Layout\n"],"sourceRoot":""}