47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
import { ImageWithFallback } from '@components/imageWithFallback';
|
|
|
|
import { DEFAULT_AVATAR } from '@stores/constants';
|
|
|
|
import { truncate } from '@utils/truncate';
|
|
|
|
import { useCallback, useEffect, useState } from 'react';
|
|
|
|
export const UserFollow = ({ pubkey }: { pubkey: string }) => {
|
|
const [profile, setProfile] = useState(null);
|
|
|
|
const getCachedMetadata = useCallback(async () => {
|
|
const { getFollowByPubkey } = await import('@utils/bindings');
|
|
getFollowByPubkey({ pubkey: pubkey })
|
|
.then((res) => {
|
|
if (res) {
|
|
const metadata = JSON.parse(res.metadata);
|
|
setProfile(metadata);
|
|
}
|
|
})
|
|
.catch(console.error);
|
|
}, [pubkey]);
|
|
|
|
useEffect(() => {
|
|
getCachedMetadata().catch(console.error);
|
|
}, [getCachedMetadata]);
|
|
|
|
return (
|
|
<div className="flex items-center gap-2">
|
|
<div className="relative h-11 w-11 shrink overflow-hidden rounded-full border border-white/10">
|
|
<ImageWithFallback
|
|
src={profile?.picture || DEFAULT_AVATAR}
|
|
alt={pubkey}
|
|
fill={true}
|
|
className="rounded-full object-cover"
|
|
/>
|
|
</div>
|
|
<div className="flex w-full flex-1 flex-col items-start text-start">
|
|
<span className="truncate font-medium leading-tight text-zinc-200">
|
|
{profile?.display_name || profile?.name}
|
|
</span>
|
|
<span className="text-sm leading-tight text-zinc-400">{truncate(pubkey, 16, ' .... ')}</span>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|