Skip to content

Lagring

Widgeten husker at brukeren har lukket (dismissed) surveyen, og kan vente en cooldown-periode før den vises igjen. Du velger hvordan den husker dette med storageStrategy.

Strategier

StrategiDefaultMerknad
localStorageLagrer dismissed-tilstand under en nøkkel basert på surveyId
sessionStorageLagrer dismissed-tilstand bare for gjeldende fane/session
noneIngen persistering — surveyen vises ved hver sidelast

localStorage (default)

Standardvalget for vanlig bruk. Host-appen er ansvarlig for å avklare eventuell CMP-/cookie-samtykkevurdering før lagring brukes. Uten ekstra konfigurasjon lagrer widgeten dismissed-tilstand automatisk.

tsx
<LumiSurveyDock
  surveyId="min-flate"
  survey={survey}
  transport={transport}
  // localStorage er default — trenger ikke spesifiseres
/>

Nøkkelen i localStorage er basert på surveyId, så ulike surveys lagres uavhengig av hverandre.

sessionStorage

Bruk sessionStorage når dismissed-tilstand bare skal gjelde i den åpne fanen. Ved ny fane eller ny nettlesersesjon vises surveyen igjen.

tsx
<LumiSurveyDock
  surveyId="min-flate"
  survey={survey}
  transport={transport}
  behavior={{ storageStrategy: "sessionStorage" }}
/>

none

Ingen persistering — surveyen vises ved hver sidelast. Nyttig for utvikling, demoer, eller flater der browser storage ikke skal brukes.

tsx
<LumiSurveyDock
  surveyId="test-survey"
  survey={survey}
  transport={transport}
  behavior={{ storageStrategy: "none" }}
/>

Når storageStrategy er "none" har widgeten ikke et lokalt signal for at samme bruker allerede har svart. Hvis backend skal deduplisere slike innsendinger på tvers av sidelastinger, send en stabil behavior.deduplicationKey. Nøkkelen må være en opaque ikke-PII token, for eksempel en HMAC fra host-backenden.

tsx
<LumiSurveyDock
  surveyId="min-flate"
  survey={survey}
  transport={transport}
  behavior={{
    storageStrategy: "none",
    deduplicationKey: serverIssuedSurveyToken,
  }}
/>

Cooldown

Etter at brukeren lukker surveyen, venter widgeten en cooldown-periode før den vises igjen. Default er 30 dager.

tsx
<LumiSurveyDock
  surveyId="min-flate"
  survey={survey}
  transport={transport}
  behavior={{
    storageStrategy: "localStorage",
    dismissCooldownDays: 7, // Vis igjen etter 7 dager
  }}
/>
PropertyTypeDefaultBeskrivelse
storageStrategy"localStorage" | "sessionStorage" | "none""localStorage"Hvordan dismissed-tilstand lagres
consentResolverLumiSurveyConsentResolverCallback som avgjør om storage kan brukes
storageAdapterStorageAdapterCustom lagringsadapter; overstyrer storageStrategy
deduplicationKeystringOpaque ikke-PII token for backend-deduplisering når browser storage er av
dismissCooldownDaysnumber30Dager før surveyen vises igjen etter dismiss
hideAfterSubmitbooleantrueSkjul widgeten helt etter vellykket innsending

Samtykke

Pakken bygger ikke egen samtykke-UI. Hvis host-appen allerede har Cookiebot, OneTrust eller en annen CMP, send inn en consentResolver. Den evalueres lazily før lesing, skriving og sletting av dismissal-state.

tsx
const consentResolver = () => ({
  storage: window.CookieConsent?.hasConsent("functionality") === true,
});

<LumiSurveyDock
  surveyId="min-flate"
  survey={survey}
  transport={transport}
  behavior={{ consentResolver }}
/>

Når resolveren returnerer false eller { storage: false }, gjør widgeten ingen storage-operasjoner. Det er en bevisst no-op, ikke en feil. Eksisterende dismissal-nøkler ryddes heller ikke mens samtykke er nektet; de kan bli liggende til samtykke gis igjen eller host-appen sletter dem selv.

Custom adapter

Bruk storageAdapter hvis host-appen vil lagre dismissal-state i egen mekanisme. Adapteren overstyrer storageStrategy, men er fortsatt styrt av consentResolver hvis begge er satt.

tsx
const storageAdapter = {
  read: (key: string) => myStore.get(key) ?? null,
  write: (key: string, value: string) => {
    myStore.set(key, value);
  },
  remove: (key: string) => {
    myStore.delete(key);
  },
};

<LumiSurveyDock
  surveyId="min-flate"
  survey={survey}
  transport={transport}
  behavior={{ storageAdapter }}
/>

Hvis write returnerer void, tolkes det som vellykket lagring. Returner StorageWriteResult når adapteren må si eksplisitt at skriving var nektet, en bevisst no-op, eller feilet.

Når lagring feiler

localStorage og sessionStorage kan være utilgjengelig — for eksempel i privat nettlesing, når kvoten er full, eller i sandkasse-iframes. onDismissalPersistFailed fyres når widgeten forsøker å skrive dismissal-state og forsøket feiler. Det gjelder også når en custom adapter returnerer { persisted: false, allowed: false, error }, returnerer { persisted: false, allowed: true }, eller kaster fra write.

For adapter-resultater er regelen: eventet fyres når !result.persisted && (result.allowed || result.error !== undefined).

Eventet fyres ikke for bevisste no-op-stier: storageStrategy: "none", samtykke nektet, eller SSR/manglende window.

tsx
<LumiSurveyDock
  events={{
    onDismissalPersistFailed: (cause) => {
      console.warn("Kunne ikke lagre dismissed-tilstand:", cause);
    },
  }}
/>

Se Events for full event-referanse.

Lumi Analytics — bygget på navikt/lumi (MIT-lisens)