Gå til innholdet

Connection Status

En side som mister forbindelsen ser helt normal ut, men er frosset. Fyller brukeren ut et skjema inn i en død forbindelse, er alt borte når hun trykker send.

// main.ts, kjøres én gang når appen starter
import { defineFsConnectionStatus } from "@fristil/designsystem/connection-status"
import "@fristil/designsystem/connection-status.css"
defineFsConnectionStatus()

Serveren kan per definisjon ikke fortelle deg at den er utilgjengelig. Er den nede, kommer det ingenting derfra å rendre. Derfor lager komponenten innholdet selv, og byggefunksjonen setter data-ignore-morph så en senere patch ikke river linja bort i det øyeblikket forbindelsen er tilbake. Se Markup og oppførsel.

Nettleseren vet bare om maskinen har et nettverk, ikke om serveren svarer. Et kontornett uten utgang til internett, en server som er nede, eller en strøm som har røket teller alle som «online».

Derfor melder appen selv fra:

const status = document.querySelector("fs-connection-status")
try {
await fetch("/api/lagre", { method: "POST", body })
status.reportSuccess()
} catch {
status.reportFailure()
}
MetodeNår du kaller den
reportFailure()Et kall til serveren feilet
reportSuccess()Et kall lyktes igjen

Komponenten lytter i tillegg på nettleserens offline og online, så et nettverk som forsvinner fanges uten at du gjør noe.

AttributtStandard
offline-text«Ingen forbindelse. Det du skriver blir ikke lagret.»
online-text«Forbindelsen er tilbake.»
HendelseNår
connection-lostLinja kommer til syne
connection-restoredForbindelsen er tilbake
<fs-connection-status class="fs-connection-status" data-ignore-morph></fs-connection-status>
<script type="module">
import { defineFsConnectionStatus } from "@fristil/designsystem/connection-status"
defineFsConnectionStatus()
const status = document.querySelector("fs-connection-status")
async function lagre(body) {
try {
const svar = await fetch("/api/lagre", { method: "POST", body })
if (!svar.ok) throw new Error(svar.statusText)
status.reportSuccess()
} catch {
status.reportFailure()
}
}
</script>

Linja er role="status" med aria-live="polite", ikke alert. Beskjeden er viktig, men skal ikke avbryte midt i et ord. Den blir stående til forbindelsen er tilbake, så den som leser sakte rekker den.

Fargen alene bærer ikke beskjeden: teksten sier hva som er galt. I Windows’ høykontrastmodus fjernes egne farger og bakgrunner, og linja får derfor en ramme i CanvasText, ellers ville den vært usynlig.

KlasseHva det er
.fs-connection-statusVertselementet. Ligger som display: contents og tar ingen plass
.fs-connection-status__barSelve linja. Har data-state="offline" eller data-state="online"
VariabelReserve
--fs-connection-status-layer1000
--fs-connection-status-paddingvar(--size-2) var(--size-4)
.fs-connection-status__bar {
--fs-connection-status-layer: 9999;
}