feat: user profile customization with banner, accent color, bio, and full profile modal
Add banner image, accent color, and bio fields to user profiles with full-stack support: schema migration, API validation (hex color format, 190-char bio limit), sanitizeUser propagation, and new GET /users/:id/mutuals endpoint. Rewrite AccountPanel with live preview card, avatar/banner upload via ImageCropModal, 16-preset accent color picker, and bio editor. Enhance UserProfilePopout with banner display, accent-colored names, bio rendering, and mutual counts. Add new UserProfileModal with About/Mutual Friends/Mutual Spaces tabs and friend action buttons.
This commit is contained in:
@@ -14,11 +14,14 @@ export function resolveAssetUrl(filename: string | null | undefined, origin: str
|
||||
* Rewrite the avatar field on a user-like object for remote origins.
|
||||
* Mutates in-place for efficiency (called on arrays of members/messages).
|
||||
*/
|
||||
export function normalizeUserAssets<T extends { avatar?: string | null }>(user: T, origin: string): T {
|
||||
export function normalizeUserAssets<T extends { avatar?: string | null; banner?: string | null }>(user: T, origin: string): T {
|
||||
if (!origin) return user;
|
||||
if (user.avatar) {
|
||||
user.avatar = resolveAssetUrl(user.avatar, origin) ?? user.avatar;
|
||||
}
|
||||
if (user.banner) {
|
||||
user.banner = resolveAssetUrl(user.banner, origin) ?? user.banner;
|
||||
}
|
||||
// Qualify users local to the remote instance with their origin domain.
|
||||
// These users have no homeInstance (they're native there), so the client
|
||||
// can't distinguish them from its own local users without this step.
|
||||
|
||||
Reference in New Issue
Block a user