Profile API: Avatar Ring & Banner

useDreyloProfile Hook

// Verwendung in einer Komponente:
import { useDreyloProfile, getAvatarRingStyle, getBannerStyle }
  from "../../ui/components/features/profiles/useDreyloProfile";

function UserCard(props: { userId: string }) {
const dreylo = useDreyloProfile(() => props.userId);

return (
<div>
{/ Avatar mit Ring /}
<div style={getAvatarRingStyle(dreylo(), "#1e2530")}>
<Avatar src={avatarUrl} size={72} />
</div>

{/ Banner mit Farbe /}
<div style={{ background: getBannerStyle(dreylo(), false) }}>
Banner-Bereich
</div>
</div>
);
}

Ring-Typen

none      → Kein Ring
solid     → Einfarbiger Ring (box-shadow)
gradient  → Farbverlauf-Ring (border-box Trick)
animated  → Rotierender Farbverlauf (hue-rotate Animation)

CSS Gradient-Ring Technik

/ Gradient als Border-Ersatz /
border: 3px solid transparent;
background:
  linear-gradient(#hintergrund, #hintergrund) padding-box,
  linear-gradient(135deg, #farbe1, #farbe2) border-box;

ProfileCustomizer (Settings)

Datei: components/app/interface/settings/user/profile/ProfileCustomizer.tsx

Enthält:

  • Ring-Typ Auswahl

  • Farbpalette (12 Presets + Custom)

  • Gradient-Picker

  • Banner-Farbe

  • Live-Vorschau

API Calls aus Frontend

// Token holen
const [authHeader, authHeaderValue] = client().authenticationHeader;
// authHeader = "X-Session-Token"
// authHeaderValue = "SESSION_TOKEN_WERT"

// Profile speichern
const res = await fetch("/profile-api/api/profile/me", {
method: "PATCH",
headers: {
"Content-Type": "application/json",
[authHeader]: authHeaderValue,
},
body: JSON.stringify({
ring_type: "gradient",
ring_gradient: ["#ff6b6b", "#4ecdc4"],
}),
});

Server-Folder API

// Folder laden
const res = await fetch(/profile-api/api/folders/${userId});
const { folders, server_order } = await res.json();

// Folder speichern
await fetch("/profile-api/api/folders/me", {
method: "PUT",
headers: { "Content-Type": "application/json", [authHeader]: authHeaderValue },
body: JSON.stringify({ folders, server_order }),
});