Gå til innholdet

Session Timeout

Dette er tingen hver store organisasjon bygger selv, og gjør feil. Enten kommer det ingen advarsel, og brukeren mister et halvutfylt søknadsskjema. Eller dialogen stjeler fokus midt i en setning. Eller skjermleseren leser nedtellingen hvert eneste sekund.

// main.ts, kjøres én gang når appen starter
import { defineFsSessionTimeout } from "@fristil/designsystem/session-timeout"
import "@fristil/designsystem/tokens.css"
import "@fristil/designsystem/session-timeout.css"
defineFsSessionTimeout()

De fleste komponentene i Fristil rører ikke DOM-en serveren har sendt. Denne gjør, og grunnen er at nedtellingen er klientens klokke. Tallet endrer seg hvert sekund ut fra når brukeren sist rørte tastaturet, og det er en tilstand ingen server kan sende. Å patche den over en strøm hvert sekund ville vært meningsløst.

Derfor setter byggefunksjonen data-ignore-morph. Det ber Datastar la innholdet være, slik at en patch ikke river dialogen bort mens den står åpen. Se Markup og oppførsel for hele regelen.

<fs-session-timeout class="fs-session-timeout" warn-at="1500" expires-at="1800"
data-ignore-morph></fs-session-timeout>
AttributtBetydningStandard
warn-atSekunder uten aktivitet før varselet kommer1500 (25 minutter)
expires-atSekunder uten aktivitet før økten er ute1800 (30 minutter)

Aktivitet er tastetrykk, klikk og rulling, også rulling i en tabell eller et panel. Mens dialogen står åpen teller ikke aktivitet, ellers ville et tilfeldig museklikk forlenget økten uten at brukeren mente det. Escape i dialogen regnes derimot som «jeg er her», og gjør det samme som knappen: forlenger, og sender session-extend.

Er warn-at eller expires-at ikke et tall større enn eller lik null, brukes standardverdien, og er warn-at ikke mindre enn expires-at, kommer varselet aldri. Komponenten sier fra om begge deler i konsollen.

Etter session-expired og session-logout står komponenten stille til extend() eller reset() kalles. Uten det fikk en app som ikke navigerte bort ny dialog og ny session-expired hvert expires-at-sekund, for en økt som alt var borte.

HendelseNårHva du gjør
session-warnDialogen åpner segSom regel ingenting
session-extendBrukeren velger å fortsette, med knappen eller EscapeBe serveren forlenge økten
session-logoutBrukeren velger å logge utSend brukeren til utloggingen
session-expiredTiden er uteSend brukeren til innloggingen

Komponenten vet ikke hvordan økten din forlenges. Den sier fra, du gjør kallet.

MetodeHva den gjør
extend()Nullstiller klokka, lukker varselet og sender session-extend
reset()Nullstiller klokka og lukker varselet uten å sende noe. For en app som alt har forlenget økten selv, som når en autolagring gikk gjennom

extendSession(element) og resetSession(element) fra @fristil/designsystem/session-timeout gjør det samme, men venter først på at elementet er registrert.

KlasseHva det er
.fs-session-timeoutVertselementet. Ligger som display: contents og tar ingen plass
.fs-session-timeout__dialogSelve dialogen
.fs-session-timeout__titleOverskriften
.fs-session-timeout__textAvsnittet med nedtellingen i
.fs-session-timeout__countTallet som teller ned
.fs-session-timeout__actionsRaden med knapper

Form og størrelse leses fra komponentvariabler, med systemets verdi som reserve:

VariabelReserve
--fs-session-timeout-width26rem
--fs-session-timeout-paddingvar(--fs-spacing-5)
--fs-session-timeout-radiusvar(--fs-spacing-1)
.fs-session-timeout__dialog {
--fs-session-timeout-width: 32rem;
}

Dialogen er en ekte <dialog> åpnet med showModal(), så fokusfellen, Escape og topplaget kommer fra nettleseren. Den har role="alertdialog", fordi den avbryter noe brukeren ikke ba om å bli avbrutt i.

Tre ting er gjort med vilje, og alle tre er grunner til at dette er vanskelig å få riktig selv:

  • Fokus går tilbake dit brukeren var. Uten det starter neste tastetrykk på toppen av siden, midt i et skjema.
  • Nedtellingen leses ikke opp hvert sekund. Tallet på skjermen har aria-hidden, og et eget område melder fra ved to minutter, ett minutt, 30 sekunder og 10 sekunder. En opplesning i sekundet gjør dialogen ubrukelig.
  • Knappen som forlenger står først. Det er den de fleste vil ha, og den skal være det første tastaturet treffer.