Following mark
This commit is contained in:
@ -29,3 +29,24 @@
|
|||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background-color: rgba(0, 0, 0, 0.4);
|
background-color: rgba(0, 0, 0, 0.4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.avatar .icons {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
transform-origin: center;
|
||||||
|
transform: rotate(-135deg) translateY(50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.avatar .icons > .icon-circle {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
transform-origin: center;
|
||||||
|
padding: 4px;
|
||||||
|
border-radius: 100%;
|
||||||
|
background-color: var(--gray-superdark);
|
||||||
|
transform: rotate(135deg);
|
||||||
|
}
|
@ -14,8 +14,10 @@ interface AvatarProps {
|
|||||||
size?: number;
|
size?: number;
|
||||||
image?: string;
|
image?: string;
|
||||||
imageOverlay?: ReactNode;
|
imageOverlay?: ReactNode;
|
||||||
|
icons?: ReactNode;
|
||||||
}
|
}
|
||||||
const Avatar = ({ pubkey, user, size, onClick, image, imageOverlay }: AvatarProps) => {
|
|
||||||
|
const Avatar = ({ pubkey, user, size, onClick, image, imageOverlay, icons }: AvatarProps) => {
|
||||||
const [url, setUrl] = useState("");
|
const [url, setUrl] = useState("");
|
||||||
const { proxy } = useImgProxy();
|
const { proxy } = useImgProxy();
|
||||||
|
|
||||||
@ -39,6 +41,7 @@ const Avatar = ({ pubkey, user, size, onClick, image, imageOverlay }: AvatarProp
|
|||||||
className={`avatar${imageOverlay ? " with-overlay" : ""}`}
|
className={`avatar${imageOverlay ? " with-overlay" : ""}`}
|
||||||
data-domain={domain?.toLowerCase()}
|
data-domain={domain?.toLowerCase()}
|
||||||
title={getDisplayName(user, "")}>
|
title={getDisplayName(user, "")}>
|
||||||
|
{icons && <div className="icons">{icons}</div>}
|
||||||
{imageOverlay && <div className="overlay">{imageOverlay}</div>}
|
{imageOverlay && <div className="overlay">{imageOverlay}</div>}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
7
packages/app/src/Element/Following.css
Normal file
7
packages/app/src/Element/Following.css
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
span.following {
|
||||||
|
padding: 2px 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 11px;
|
||||||
|
color: var(--font-secondary-color);
|
||||||
|
background-color: var(--gray-superdark);
|
||||||
|
}
|
15
packages/app/src/Element/Following.tsx
Normal file
15
packages/app/src/Element/Following.tsx
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import "./Following.css";
|
||||||
|
import useLogin from "Hooks/useLogin";
|
||||||
|
import Icon from "Icons/Icon";
|
||||||
|
import { FormattedMessage } from "react-intl";
|
||||||
|
|
||||||
|
export function FollowingMark({ pubkey }: { pubkey: string }) {
|
||||||
|
const { follows } = useLogin();
|
||||||
|
const doesFollow = follows.item.includes(pubkey);
|
||||||
|
if (!doesFollow) return;
|
||||||
|
|
||||||
|
return <span className="following flex g4">
|
||||||
|
<Icon name="check" className="success" size={12} />
|
||||||
|
<FormattedMessage defaultMessage="following" />
|
||||||
|
</span>
|
||||||
|
}
|
@ -8,6 +8,8 @@ import { useUserProfile } from "@snort/system-react";
|
|||||||
import { hexToBech32, profileLink } from "SnortUtils";
|
import { hexToBech32, profileLink } from "SnortUtils";
|
||||||
import Avatar from "Element/Avatar";
|
import Avatar from "Element/Avatar";
|
||||||
import Nip05 from "Element/Nip05";
|
import Nip05 from "Element/Nip05";
|
||||||
|
import useLogin from "Hooks/useLogin";
|
||||||
|
import Icon from "Icons/Icon";
|
||||||
|
|
||||||
export interface ProfileImageProps {
|
export interface ProfileImageProps {
|
||||||
pubkey: HexKey;
|
pubkey: HexKey;
|
||||||
@ -22,6 +24,8 @@ export interface ProfileImageProps {
|
|||||||
size?: number;
|
size?: number;
|
||||||
onClick?: (e: React.MouseEvent) => void;
|
onClick?: (e: React.MouseEvent) => void;
|
||||||
imageOverlay?: ReactNode;
|
imageOverlay?: ReactNode;
|
||||||
|
showFollowingMark?: boolean;
|
||||||
|
icons?: ReactNode
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function ProfileImage({
|
export default function ProfileImage({
|
||||||
@ -37,9 +41,13 @@ export default function ProfileImage({
|
|||||||
size,
|
size,
|
||||||
imageOverlay,
|
imageOverlay,
|
||||||
onClick,
|
onClick,
|
||||||
|
showFollowingMark = true,
|
||||||
|
icons
|
||||||
}: ProfileImageProps) {
|
}: ProfileImageProps) {
|
||||||
const user = useUserProfile(profile ? "" : pubkey) ?? profile;
|
const user = useUserProfile(profile ? "" : pubkey) ?? profile;
|
||||||
const nip05 = defaultNip ? defaultNip : user?.nip05;
|
const nip05 = defaultNip ? defaultNip : user?.nip05;
|
||||||
|
const { follows } = useLogin();
|
||||||
|
const doesFollow = follows.item.includes(pubkey);
|
||||||
|
|
||||||
const name = useMemo(() => {
|
const name = useMemo(() => {
|
||||||
return overrideUsername ?? getDisplayName(user, pubkey);
|
return overrideUsername ?? getDisplayName(user, pubkey);
|
||||||
@ -56,7 +64,12 @@ export default function ProfileImage({
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="avatar-wrapper">
|
<div className="avatar-wrapper">
|
||||||
<Avatar pubkey={pubkey} user={user} size={size} imageOverlay={imageOverlay} />
|
<Avatar pubkey={pubkey} user={user} size={size} imageOverlay={imageOverlay} icons={((doesFollow && showFollowingMark) || icons) ? <>
|
||||||
|
{icons}
|
||||||
|
{showFollowingMark && <div className="icon-circle">
|
||||||
|
<Icon name="check" className="success" size={10} />
|
||||||
|
</div>}
|
||||||
|
</> : undefined} />
|
||||||
</div>
|
</div>
|
||||||
{showUsername && (
|
{showUsername && (
|
||||||
<div className="f-ellipsis">
|
<div className="f-ellipsis">
|
||||||
|
@ -18,4 +18,4 @@
|
|||||||
|
|
||||||
.profile-preview button {
|
.profile-preview button {
|
||||||
min-width: 98px;
|
min-width: 98px;
|
||||||
}
|
}
|
@ -63,6 +63,7 @@ export const ZapsSummary = ({ zaps }: ZapsSummaryProps) => {
|
|||||||
{sender && (
|
{sender && (
|
||||||
<ProfileImage
|
<ProfileImage
|
||||||
pubkey={anonZap ? "" : sender}
|
pubkey={anonZap ? "" : sender}
|
||||||
|
showFollowingMark={false}
|
||||||
overrideUsername={anonZap ? formatMessage({ defaultMessage: "Anonymous" }) : undefined}
|
overrideUsername={anonZap ? formatMessage({ defaultMessage: "Anonymous" }) : undefined}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
Reference in New Issue
Block a user