Files
AfiS-Aktensystem/web/components/Avatar.tsx
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

53 lines
1.5 KiB
TypeScript

/**
* Profilbild einer Person.
*
* Die Quelle ist Discord: dort liegt das Bild ohnehin, die Anmeldung läuft
* über dieselbe Stelle, und ein eigener Zwischenspeicher wäre ein Dienst mehr
* im Stack für ein Bild von 64 Pixeln. Dafür steht `cdn.discordapp.com` in der
* Inhaltsrichtlinie, siehe middleware.ts.
*
* Ohne Bild - und das ist der Normalfall bei Konten ohne eigenes Profilbild -
* stehen die Anfangsbuchstaben da. Kein Platzhaltergesicht: ein leerer Kreis
* mit Initialen ist ehrlicher und lädt nichts nach.
*/
export function Avatar({
userId,
avatarHash,
displayName,
size = 28,
}: {
userId: string
avatarHash: string | null
displayName: string
size?: number
}) {
const kanten = { width: size, height: size, fontSize: Math.round(size * 0.4) }
if (!avatarHash) {
return (
<span aria-hidden className="avatar" style={kanten}>
{initialen(displayName)}
</span>
)
}
return (
// eslint-disable-next-line @next/next/no-img-element -- fremde Quelle, kein Layout-Nutzen durch next/image
<img
src={`https://cdn.discordapp.com/avatars/${userId}/${avatarHash}.png?size=64`}
alt=""
width={size}
height={size}
className="avatar"
style={kanten}
/>
)
}
function initialen(name: string): string {
const teile = name.trim().split(/\s+/).filter(Boolean)
if (teile.length === 0) return '?'
if (teile.length === 1) return teile[0]!.slice(0, 2).toUpperCase()
return (teile[0]![0]! + teile[teile.length - 1]![0]!).toUpperCase()
}