2026-06-14 11:24:04 -04:00
|
|
|
import React from 'react';
|
|
|
|
|
import { useAvatarDecoration } from '../../hooks/useAvatarDecoration';
|
|
|
|
|
import { decorationUrl } from '../../features/lotus/avatarDecorations';
|
|
|
|
|
|
2026-06-14 16:19:47 -04:00
|
|
|
const DEFAULT_INSET = 8;
|
2026-06-14 11:24:04 -04:00
|
|
|
|
|
|
|
|
type AvatarDecorationProps = {
|
|
|
|
|
userId: string;
|
|
|
|
|
children: React.ReactNode;
|
2026-06-14 16:19:47 -04:00
|
|
|
inset?: number;
|
2026-06-14 11:24:04 -04:00
|
|
|
};
|
|
|
|
|
|
2026-06-15 20:50:00 -04:00
|
|
|
export function AvatarDecoration({
|
|
|
|
|
userId,
|
|
|
|
|
children,
|
|
|
|
|
inset = DEFAULT_INSET,
|
|
|
|
|
}: AvatarDecorationProps) {
|
2026-06-14 11:24:04 -04:00
|
|
|
const slug = useAvatarDecoration(userId);
|
|
|
|
|
|
|
|
|
|
if (!slug) {
|
|
|
|
|
return <>{children}</>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div
|
|
|
|
|
style={{
|
|
|
|
|
position: 'relative',
|
|
|
|
|
display: 'inline-flex',
|
|
|
|
|
flexShrink: 0,
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{children}
|
|
|
|
|
<img
|
|
|
|
|
src={decorationUrl(slug)}
|
|
|
|
|
style={{
|
|
|
|
|
position: 'absolute',
|
2026-06-14 16:19:47 -04:00
|
|
|
top: -inset,
|
|
|
|
|
left: -inset,
|
|
|
|
|
right: -inset,
|
|
|
|
|
bottom: -inset,
|
|
|
|
|
width: `calc(100% + ${inset * 2}px)`,
|
|
|
|
|
height: `calc(100% + ${inset * 2}px)`,
|
2026-06-14 11:24:04 -04:00
|
|
|
pointerEvents: 'none',
|
|
|
|
|
zIndex: 10,
|
|
|
|
|
objectFit: 'contain',
|
|
|
|
|
}}
|
|
|
|
|
alt=""
|
|
|
|
|
aria-hidden="true"
|
|
|
|
|
loading="lazy"
|
|
|
|
|
decoding="async"
|
2026-06-14 12:02:50 -04:00
|
|
|
onError={(e) => {
|
|
|
|
|
(e.currentTarget as HTMLImageElement).style.display = 'none';
|
|
|
|
|
}}
|
2026-06-14 11:24:04 -04:00
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|