Files
AfiS-Aktensystem/web/lib/recent/track.ts
T
Harlekin e0b03ea336
Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
Gedankenstriche durch Bindestriche ersetzt
375 Vorkommen in 210 Dateien. Betrifft Kommentare, Oberflaechentexte und die
README; an keiner Stelle Bedeutung, nur Zeichensetzung.
2026-09-04 08:54:52 +02:00

51 lines
1.7 KiB
TypeScript

import { after } from 'next/server'
import { headers } from 'next/headers'
import { noteOpened } from '@/lib/recent/service'
import type { RecentTarget } from '@afis/db'
/**
* Einen Sprung vormerken, aus einer Seite heraus.
*
* Zwei Dinge macht diese Schicht, die die Datenschicht nicht machen kann:
*
* **Vorabrufe zählen nicht.** Next holt die Seiten hinter sichtbaren Links im
* Voraus. Ohne diese Prüfung stünde in der Liste, worüber jemand mit der Maus
* gefahren ist - die Übersicht allein würde sie mit zehn Akten füllen, die
* niemand geöffnet hat. Das wäre nicht nur falsch, es wäre die unangenehmere
* Sorte falsch: eine Aufzeichnung von Aufmerksamkeit statt von Handlung.
*
* **Es kostet die Seite nichts.** Der Schreibvorgang läuft in `after()`, also
* nachdem die Antwort raus ist. Eine Merkliste darf keine Akte langsamer
* machen; geht sie verloren, ist nichts verloren.
*/
export async function trackOpen(
userId: string,
targetType: RecentTarget,
targetId: string,
): Promise<void> {
if (await istVorabruf()) return
after(async () => {
try {
await noteOpened(userId, targetType, targetId)
} catch {
// Eine Merkliste ist kein Grund, eine Aktenansicht scheitern zu lassen.
}
})
}
/**
* Die Kopfzeilen, mit denen Next und die Browser einen Vorabruf ankündigen.
* Lieber eine zu viel geprüft als einen Sprung erfunden.
*/
async function istVorabruf(): Promise<boolean> {
const kopf = await headers()
return (
kopf.get('next-router-prefetch') === '1' ||
kopf.has('next-router-segment-prefetch') ||
kopf.get('purpose') === 'prefetch' ||
kopf.get('x-purpose') === 'prefetch' ||
kopf.get('x-moz') === 'prefetch'
)
}