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
375 Vorkommen in 210 Dateien. Betrifft Kommentare, Oberflaechentexte und die README; an keiner Stelle Bedeutung, nur Zeichensetzung.
51 lines
1.7 KiB
TypeScript
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'
|
|
)
|
|
}
|