Appearance
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
| Strategi | Default | Merknad |
|---|---|---|
localStorage | ✅ | Lagrer dismissed-tilstand under en nøkkel basert på surveyId |
sessionStorage | Lagrer dismissed-tilstand bare for gjeldende fane/session | |
none | Ingen 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
}}
/>| Property | Type | Default | Beskrivelse |
|---|---|---|---|
storageStrategy | "localStorage" | "sessionStorage" | "none" | "localStorage" | Hvordan dismissed-tilstand lagres |
consentResolver | LumiSurveyConsentResolver | — | Callback som avgjør om storage kan brukes |
storageAdapter | StorageAdapter | — | Custom lagringsadapter; overstyrer storageStrategy |
deduplicationKey | string | — | Opaque ikke-PII token for backend-deduplisering når browser storage er av |
dismissCooldownDays | number | 30 | Dager før surveyen vises igjen etter dismiss |
hideAfterSubmit | boolean | true | Skjul 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.
