Add option to hide usernames

This commit is contained in:
hzrd149 2023-12-04 15:35:12 -06:00
parent c119e02a8a
commit bc71d92055
87 changed files with 145 additions and 98 deletions

View File

@ -0,0 +1,5 @@
---
"nostrudel": minor
---
Add option to hide usernames

View File

@ -10,7 +10,7 @@ import { NostrEvent } from "../../../types/nostr-event";
import { buildAppSelectUrl } from "../../../helpers/nostr/apps";
import { getSharableEventAddress } from "../../../helpers/nip19";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import Timestamp from "../../timestamp";
export default function EmbeddedArticle({ article, ...props }: Omit<CardProps, "children"> & { article: NostrEvent }) {

View File

@ -13,7 +13,7 @@ import {
} from "@chakra-ui/react";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { getSharableEventAddress } from "../../../helpers/nip19";
import { NostrEvent } from "../../../types/nostr-event";
import { getBadgeDescription, getBadgeImage, getBadgeName } from "../../../helpers/nostr/badges";

View File

@ -3,7 +3,7 @@ import { Box, Card, CardBody, CardFooter, CardHeader, CardProps, Flex, Heading,
import { nip19 } from "nostr-tools";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import { NostrEvent } from "../../../types/nostr-event";
import useChannelMetadata from "../../../hooks/use-channel-metadata";
import HoverLinkOverlay from "../../hover-link-overlay";

View File

@ -3,7 +3,7 @@ import { Card, CardFooter, CardHeader, CardProps, Heading, LinkBox, LinkOverlay,
import { nip19 } from "nostr-tools";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { NostrEvent } from "../../../types/nostr-event";
import { getCommunityImage, getCommunityName } from "../../../helpers/nostr/communities";

View File

@ -3,7 +3,7 @@ import { Card, CardBody, CardHeader, CardProps, LinkBox, Spacer, Text } from "@c
import { NostrEvent } from "../../../types/nostr-event";
import { TrustProvider } from "../../../providers/trust";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import Timestamp from "../../timestamp";
import DecryptPlaceholder from "../../../views/messages/decrypt-placeholder";
import { MessageContent } from "../../../views/messages/message";

View File

@ -16,7 +16,7 @@ import { Link as RouterLink } from "react-router-dom";
import { getSharableEventAddress } from "../../../helpers/nip19";
import { getEmojisFromPack, getPackName } from "../../../helpers/nostr/emoji-packs";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import EmojiPackFavoriteButton from "../../../views/emoji-packs/components/emoji-pack-favorite-button";
import EmojiPackMenu from "../../../views/emoji-packs/components/emoji-pack-menu";
import { NostrEvent } from "../../../types/nostr-event";

View File

@ -5,7 +5,7 @@ import { getSharableEventAddress } from "../../../helpers/nip19";
import { NostrEvent } from "../../../types/nostr-event";
import { getGoalName } from "../../../helpers/nostr/goal";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import GoalProgress from "../../../views/goals/components/goal-progress";
import GoalZapButton from "../../../views/goals/components/goal-zap-button";
import GoalTopZappers from "../../../views/goals/components/goal-top-zappers";

View File

@ -6,7 +6,7 @@ import { getListDescription, getListName, isSpecialListKind } from "../../../hel
import { createCoordinate } from "../../../services/replaceable-event-requester";
import { getSharableEventAddress } from "../../../helpers/nip19";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import ListFeedButton from "../../../views/lists/components/list-feed-button";
import { ListCardContent } from "../../../views/lists/components/list-card";

View File

@ -4,7 +4,7 @@ import { Link as RouterLink } from "react-router-dom";
import { NostrEvent } from "../../../types/nostr-event";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import { UserDnsIdentityIcon } from "../../user-dns-identity-icon";
import useSubject from "../../../hooks/use-subject";
import appSettings from "../../../services/settings/app-settings";

View File

@ -3,7 +3,7 @@ import { Card, CardProps, Flex, LinkBox, Spacer, Text } from "@chakra-ui/react";
import { NostrEvent } from "../../../types/nostr-event";
import { TrustProvider } from "../../../providers/trust";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import Timestamp from "../../timestamp";
import ReactionIcon from "../../event-reactions/reaction-icon";
import { NoteLink } from "../../note-link";

View File

@ -17,7 +17,7 @@ import {
import { NostrEvent } from "../../../types/nostr-event";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import { CompactNoteContent } from "../../compact-note-content";
import { getDownloadURL, getHashtags, getStreamURL } from "../../../helpers/nostr/stemstr";
import { DownloadIcon, ReplyIcon } from "../../icons";

View File

@ -2,7 +2,7 @@ import { Box, Card, CardProps, Divider, Flex, Link, Text } from "@chakra-ui/reac
import { Link as RouterLink } from "react-router-dom";
import { NostrEvent, isATag } from "../../../types/nostr-event";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import UserAvatar from "../../user-avatar";
import ChatMessageContent from "../../../views/streams/stream/stream-chat/chat-message-content";
import useReplaceableEvent from "../../../hooks/use-replaceable-event";

View File

@ -4,7 +4,7 @@ import { Link as RouterLink, useNavigate } from "react-router-dom";
import { parseStreamEvent } from "../../../helpers/nostr/stream";
import { NostrEvent } from "../../../types/nostr-event";
import StreamStatusBadge from "../../../views/streams/components/status-badge";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import UserAvatar from "../../user-avatar";
import useEventNaddr from "../../../hooks/use-event-naddr";
import Timestamp from "../../timestamp";

View File

@ -3,7 +3,7 @@ import { Link as RouterLink } from "react-router-dom";
import { NostrEvent } from "../../../types/nostr-event";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import useSubject from "../../../hooks/use-subject";
import appSettings from "../../../services/settings/app-settings";
import EventVerificationIcon from "../../event-verification-icon";

View File

@ -18,7 +18,7 @@ import { Link as RouterLink } from "react-router-dom";
import { getSharableEventAddress } from "../../../helpers/nip19";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import { NostrEvent } from "../../../types/nostr-event";
import Timestamp from "../../timestamp";
import Magnet from "../../icons/magnet";

View File

@ -3,7 +3,7 @@ import { Box, Button, Card, CardBody, CardHeader, CardProps, Flex, Link, Text, u
import { getSharableEventAddress } from "../../../helpers/nip19";
import { NostrEvent } from "../../../types/nostr-event";
import UserAvatarLink from "../../user-avatar-link";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import { truncatedId } from "../../../helpers/nostr/events";
import { buildAppSelectUrl } from "../../../helpers/nostr/apps";
import { UserDnsIdentityIcon } from "../../user-dns-identity-icon";

View File

@ -3,7 +3,7 @@ import { Link as RouterLink } from "react-router-dom";
import { EmbedableContent, embedJSX } from "../../helpers/embeds";
import { DraftNostrEvent, NostrEvent } from "../../types/nostr-event";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
import { getMatchHashtag, getMatchNostrLink, stripInvisibleChar } from "../../helpers/regexp";
import { safeDecode } from "../../helpers/nip19";
import { EmbedEventPointer } from "../embed-event";

View File

@ -16,7 +16,7 @@ import {
import { NostrEvent } from "../../types/nostr-event";
import UserAvatarLink from "../user-avatar-link";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
import { LightningIcon } from "../icons";
import { ParsedZap } from "../../helpers/nostr/zaps";
import { readablizeSats } from "../../helpers/bolt11";

View File

@ -4,7 +4,7 @@ import { useMemo } from "react";
import { NostrEvent } from "../../types/nostr-event";
import { groupReactions } from "../../helpers/nostr/reactions";
import UserAvatarLink from "../user-avatar-link";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
import ReactionIcon from "../event-reactions/reaction-icon";
function ShowMoreGrid({

View File

@ -3,7 +3,7 @@ import { Kind } from "nostr-tools";
import { NostrEvent } from "../../types/nostr-event";
import UserAvatarLink from "../user-avatar-link";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import useSubject from "../../hooks/use-subject";

View File

@ -28,7 +28,7 @@ import signingService from "../../services/signing";
import accountService from "../../services/account";
import PayStep from "./pay-step";
import { getInvoiceFromCallbackUrl } from "../../helpers/lnurl";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
import relayHintService from "../../services/event-relay-hint";
export type PayRequest = { invoice?: string; pubkey: string; error?: any };

View File

@ -10,7 +10,7 @@ import { EmbedEvent, EmbedProps } from "../embed-event";
import useAppSettings from "../../hooks/use-app-settings";
import CustomZapAmountOptions from "./zap-options";
import UserAvatar from "../user-avatar";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
function UserCard({ pubkey, percent }: { pubkey: string; percent?: number }) {
const { address } = useUserLNURLMetadata(pubkey);

View File

@ -3,7 +3,7 @@ import { Alert, Box, Button, ButtonGroup, Flex, IconButton, Spacer, useDisclosur
import { PayRequest } from ".";
import UserAvatar from "../user-avatar";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
import { ChevronDownIcon, ChevronUpIcon, CheckIcon, ErrorIcon, LightningIcon } from "../icons";
import { InvoiceModalContent } from "../invoice-modal";
import { PropsWithChildren, useEffect, useState } from "react";

View File

@ -9,7 +9,7 @@ import useCurrentAccount from "../../hooks/use-current-account";
import useSubject from "../../hooks/use-subject";
import accountService from "../../services/account";
import UserAvatar from "../user-avatar";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
import { GhostIcon } from "../icons";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useReadRelayUrls } from "../../hooks/use-client-relays";

View File

@ -31,7 +31,7 @@ declare module "yet-another-react-lightbox" {
import { NostrEvent } from "../types/nostr-event";
import UserAvatarLink from "./user-avatar-link";
import { UserLink } from "./user-link";
import UserLink from "./user-link";
import { UserDnsIdentityIcon } from "./user-dns-identity-icon";
import styled from "@emotion/styled";
import { getSharableEventAddress } from "../helpers/nip19";

View File

@ -31,7 +31,7 @@ import { getEventUID } from "../../helpers/nostr/events";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import useSubject from "../../hooks/use-subject";
import UserAvatarLink from "../user-avatar-link";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
import { useSigningContext } from "../../providers/signing-provider";
import relayScoreboardService from "../../services/relay-scoreboard";
import NostrPublishAction from "../../classes/nostr-publish-action";

View File

@ -20,7 +20,7 @@ import { Link as RouterLink } from "react-router-dom";
import NoteMenu from "./note-menu";
import { EventRelays } from "./note-relays";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
import { UserDnsIdentityIcon } from "../user-dns-identity-icon";
import NoteZapButton from "./note-zap-button";
import { ExpandProvider } from "../../providers/expanded";

View File

@ -17,7 +17,7 @@ import { EventSplit } from "../../helpers/nostr/zaps";
import { AddIcon } from "../icons";
import { normalizeToHex } from "../../helpers/nip19";
import UserAvatar from "../user-avatar";
import { UserLink } from "../user-link";
import UserLink from "../user-link";
import NpubAutocomplete from "../npub-autocomplete";
function getRemainingPercent(split: EventSplit) {

View File

@ -3,7 +3,7 @@ import { Flex, Text } from "@chakra-ui/react";
import { NostrEvent } from "../../../types/nostr-event";
import UserAvatar from "../../user-avatar";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import RelayCard from "../../../views/relays/components/relay-card";
import { safeRelayUrl } from "../../../helpers/url";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";

View File

@ -8,7 +8,7 @@ import { Note } from "../../note";
import NoteMenu from "../../note/note-menu";
import UserAvatar from "../../user-avatar";
import { UserDnsIdentityIcon } from "../../user-dns-identity-icon";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import { TrustProvider } from "../../../providers/trust";
import { useReadRelayUrls } from "../../../hooks/use-client-relays";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";

View File

@ -21,7 +21,7 @@ import { parseStreamEvent } from "../../../helpers/nostr/stream";
import useEventNaddr from "../../../hooks/use-event-naddr";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import UserAvatar from "../../user-avatar";
import { UserLink } from "../../user-link";
import UserLink from "../../user-link";
import StreamStatusBadge from "../../../views/streams/components/status-badge";
import { EventRelays } from "../../note/note-relays";
import { useAsync } from "react-use";

View File

@ -5,9 +5,9 @@ import { useAsync } from "react-use";
import { getIdenticon } from "../helpers/identicon";
import { safeUrl } from "../helpers/parse";
import appSettings from "../services/settings/app-settings";
import useSubject from "../hooks/use-subject";
import { getUserDisplayName } from "../helpers/user-metadata";
import useAppSettings from "../hooks/use-app-settings";
import useCurrentAccount from "../hooks/use-current-account";
export const UserIdenticon = memo(({ pubkey }: { pubkey: string }) => {
const { value: identicon } = useAsync(() => getIdenticon(pubkey), [pubkey]);
@ -21,9 +21,11 @@ export type UserAvatarProps = Omit<AvatarProps, "src"> & {
noProxy?: boolean;
};
export const UserAvatar = forwardRef<HTMLDivElement, UserAvatarProps>(({ pubkey, noProxy, relay, ...props }, ref) => {
const { imageProxy, proxyUserMedia } = useSubject(appSettings);
const { imageProxy, proxyUserMedia, hideUsernames } = useAppSettings();
const account = useCurrentAccount();
const metadata = useUserMetadata(pubkey, relay ? [relay] : undefined);
const picture = useMemo(() => {
if (hideUsernames && pubkey !== account?.pubkey) return undefined;
if (metadata?.picture) {
const src = safeUrl(metadata?.picture);
if (!noProxy) {
@ -36,7 +38,7 @@ export const UserAvatar = forwardRef<HTMLDivElement, UserAvatarProps>(({ pubkey,
}
return src;
}
}, [metadata?.picture, imageProxy]);
}, [metadata?.picture, imageProxy, hideUsernames, account]);
return (
<Avatar

View File

@ -4,6 +4,8 @@ import { nip19 } from "nostr-tools";
import { getUserDisplayName } from "../helpers/user-metadata";
import { useUserMetadata } from "../hooks/use-user-metadata";
import useAppSettings from "../hooks/use-app-settings";
import useCurrentAccount from "../hooks/use-current-account";
export type UserLinkProps = LinkProps & {
pubkey: string;
@ -11,13 +13,15 @@ export type UserLinkProps = LinkProps & {
tab?: string;
};
export const UserLink = ({ pubkey, showAt, tab, ...props }: UserLinkProps) => {
export default function UserLink({ pubkey, showAt, tab, ...props }: UserLinkProps) {
const metadata = useUserMetadata(pubkey);
const account = useCurrentAccount();
const { hideUsernames } = useAppSettings();
return (
<Link as={RouterLink} to={`/u/${nip19.npubEncode(pubkey)}` + (tab ? "/" + tab : "")} whiteSpace="nowrap" {...props}>
{showAt && "@"}
{getUserDisplayName(metadata, pubkey)}
{hideUsernames && pubkey !== account?.pubkey ? "Anon" : getUserDisplayName(metadata, pubkey)}
</Link>
);
};
}

View File

@ -2,13 +2,15 @@ import { Text, TextProps } from "@chakra-ui/react";
import { getUserDisplayName } from "../helpers/user-metadata";
import { useUserMetadata } from "../hooks/use-user-metadata";
import useAppSettings from "../hooks/use-app-settings";
export default function UserName({ pubkey, ...props }: Omit<TextProps, "children"> & { pubkey: string }) {
const metadata = useUserMetadata(pubkey);
const { hideUsernames } = useAppSettings();
return (
<Text as="span" whiteSpace="nowrap" fontWeight="bold" {...props}>
{getUserDisplayName(metadata, pubkey)}
{hideUsernames ? "Anon" : getUserDisplayName(metadata, pubkey)}
</Text>
);
}

View File

@ -37,8 +37,8 @@ const DecryptionContext = createContext<DecryptionContextType>({
getQueue: () => [],
});
export function useDecryptionContext(){
return useContext(DecryptionContext)
export function useDecryptionContext() {
return useContext(DecryptionContext);
}
export function useDecryptionContainer(pubkey: string, data: string) {
const { getOrCreateContainer, addToQueue, startQueue } = useContext(DecryptionContext);

View File

@ -39,7 +39,7 @@ import replaceableEventLoaderService from "../services/replaceable-event-request
import useUserMuteList from "../hooks/use-user-mute-list";
import { DraftNostrEvent } from "../types/nostr-event";
import UserAvatar from "../components/user-avatar";
import { UserLink } from "../components/user-link";
import UserLink from "../components/user-link";
import { ChevronDownIcon } from "../components/icons";
type MuteModalContextType = {

View File

@ -8,7 +8,7 @@ export type Account = {
relays?: string[];
secKey?: ArrayBuffer;
iv?: Uint8Array;
connectionType?: 'extension'|'serial';
connectionType?: "extension" | "serial";
localSettings?: AppSettings;
};

View File

@ -30,6 +30,7 @@ export type AppSettingsV1 = Omit<AppSettingsV0, "version"> & {
export type AppSettingsV2 = Omit<AppSettingsV1, "version"> & { version: 2; theme: string };
export type AppSettingsV3 = Omit<AppSettingsV2, "version"> & { version: 3; quickReactions: string[] };
export type AppSettingsV4 = Omit<AppSettingsV3, "version"> & { version: 4; loadOpenGraphData: boolean };
export type AppSettingsV5 = Omit<AppSettingsV4, "version"> & { version: 5; hideUsernames: boolean };
export function isV0(settings: { version: number }): settings is AppSettingsV0 {
return settings.version === undefined || settings.version === 0;
@ -46,15 +47,20 @@ export function isV3(settings: { version: number }): settings is AppSettingsV3 {
export function isV4(settings: { version: number }): settings is AppSettingsV4 {
return settings.version === 4;
}
export function isV5(settings: { version: number }): settings is AppSettingsV5 {
return settings.version === 5;
}
export type AppSettings = AppSettingsV4;
export type AppSettings = AppSettingsV5;
export const defaultSettings: AppSettings = {
version: 4,
version: 5,
theme: "default",
colorMode: "system",
maxPageWidth: "none",
blurImages: true,
// nostr:nevent1qqsxvkjgpc6zhydj4rxjpl0frev7hmgynruq027mujdgy2hwjypaqfspzpmhxue69uhkummnw3ezuamfdejszythwden5te0dehhxarjw4jjucm0d5sfntd0
hideUsernames: false,
autoShowMedia: true,
proxyUserMedia: false,
loadOpenGraphData: true,
@ -76,11 +82,12 @@ export const defaultSettings: AppSettings = {
};
export function upgradeSettings(settings: { version: number }): AppSettings | null {
if (isV0(settings)) return { ...defaultSettings, ...settings, version: 4 };
if (isV1(settings)) return { ...defaultSettings, ...settings, version: 4 };
if (isV2(settings)) return { ...defaultSettings, ...settings, version: 4 };
if (isV3(settings)) return { ...defaultSettings, ...settings, version: 4 };
if (isV4(settings)) return settings;
if (isV0(settings)) return { ...defaultSettings, ...settings, version: 5 };
if (isV1(settings)) return { ...defaultSettings, ...settings, version: 5 };
if (isV2(settings)) return { ...defaultSettings, ...settings, version: 5 };
if (isV3(settings)) return { ...defaultSettings, ...settings, version: 5 };
if (isV4(settings)) return { ...defaultSettings, ...settings, version: 5 };
if (isV5(settings)) return settings;
return null;
}

View File

@ -29,7 +29,7 @@ import useSubject from "../../hooks/use-subject";
import { NostrEvent } from "../../types/nostr-event";
import { getEventCoordinate } from "../../helpers/nostr/events";
import UserAvatarLink from "../../components/user-avatar-link";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import Timestamp from "../../components/timestamp";
import VerticalPageLayout from "../../components/vertical-page-layout";
import BadgeAwardCard from "./components/badge-award-card";

View File

@ -8,7 +8,7 @@ import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { getEventUID } from "../../../helpers/nostr/events";
import { getSharableEventAddress } from "../../../helpers/nip19";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import Timestamp from "../../../components/timestamp";
import UserAvatarLink from "../../../components/user-avatar-link";

View File

@ -3,7 +3,7 @@ import { Link as RouterLink, useNavigate } from "react-router-dom";
import { ButtonGroup, Card, CardBody, CardHeader, CardProps, Flex, Heading, Image, Link, Text } from "@chakra-ui/react";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { getSharableEventAddress } from "../../../helpers/nip19";
import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";

View File

@ -21,7 +21,7 @@ import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import HoverLinkOverlay from "../../../components/hover-link-overlay";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import useSingleEvent from "../../../hooks/use-single-event";
import { useReadRelayUrls } from "../../../hooks/use-client-relays";
import singleEventService from "../../../services/single-event";

View File

@ -3,7 +3,7 @@ import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { TrustProvider } from "../../../providers/trust";
import UserAvatar from "../../../components/user-avatar";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { memo, useMemo, useRef } from "react";
import { EmbedableContent, embedUrls } from "../../../helpers/embeds";
import {

View File

@ -22,7 +22,7 @@ import useTimelineLoader from "../../../hooks/use-timeline-loader";
import useSubject from "../../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../../hooks/use-timeline-cursor-intersection-callback";
import IntersectionObserverProvider from "../../../providers/intersection-observer";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import HoverLinkOverlay from "../../../components/hover-link-overlay";
import UserAvatar from "../../../components/user-avatar";
import { useRelaySelectionContext } from "../../../providers/relay-selection-provider";

View File

@ -20,7 +20,7 @@ import { useRegisterIntersectionEntity } from "../../../providers/intersection-o
import { getEventUID } from "../../../helpers/nostr/events";
import { getCommunityImage, getCommunityName } from "../../../helpers/nostr/communities";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import useCountCommunityMembers from "../../../hooks/use-count-community-members";
import { readablizeSats } from "../../../helpers/bolt11";
import User01 from "../../../components/icons/user-01";

View File

@ -30,7 +30,7 @@ import { SubmitHandler, useForm } from "react-hook-form";
import useCurrentAccount from "../../../hooks/use-current-account";
import UserAvatar from "../../../components/user-avatar";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { TrashIcon } from "../../../components/icons";
import Upload01 from "../../../components/icons/upload-01";
import { nostrBuildUploadImage } from "../../../helpers/nostr-build";

View File

@ -14,7 +14,7 @@ import {
import { NostrEvent } from "../../types/nostr-event";
import VerticalPageLayout from "../../components/vertical-page-layout";
import UserAvatarLink from "../../components/user-avatar-link";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import { AdditionalRelayProvider } from "../../providers/additional-relay-context";
import TrendUp01 from "../../components/icons/trend-up-01";

View File

@ -22,7 +22,7 @@ import IntersectionObserverProvider from "../../../providers/intersection-observ
import useSubject from "../../../hooks/use-subject";
import { useTimelineCurserIntersectionCallback } from "../../../hooks/use-timeline-cursor-intersection-callback";
import TimelineActionAndStatus from "../../../components/timeline-page/timeline-action-and-status";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { UserDnsIdentityIcon } from "../../../components/user-dns-identity-icon";
import UserAvatarLink from "../../../components/user-avatar-link";

View File

@ -24,7 +24,7 @@ import HoverLinkOverlay from "../../../components/hover-link-overlay";
import { CompactNoteContent } from "../../../components/compact-note-content";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import { getEventUID, parseHardcodedNoteContent } from "../../../helpers/nostr/events";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import UserAvatarLink from "../../../components/user-avatar-link";
import useUserMuteFilter from "../../../hooks/use-user-mute-filter";
import { useReadRelayUrls } from "../../../hooks/use-client-relays";

View File

@ -23,7 +23,7 @@ import {
} from "../../../helpers/nostr/communities";
import CommunityDescription from "../../communities/components/community-description";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { NostrEvent } from "../../../types/nostr-event";
import CommunityJoinButton from "../../communities/components/community-join-button";
import CommunityMenu from "./community-menu";

View File

@ -10,7 +10,7 @@ import {
} from "../../../helpers/nostr/communities";
import CommunityDescription from "../../communities/components/community-description";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { NostrEvent } from "../../../types/nostr-event";
import CommunityJoinButton from "../../communities/components/community-join-button";
import CommunityMenu from "./community-menu";

View File

@ -14,7 +14,7 @@ import {
} from "@chakra-ui/react";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { getSharableEventAddress } from "../../../helpers/nip19";
import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";

View File

@ -21,7 +21,7 @@ import {
Text,
} from "@chakra-ui/react";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import { ChevronLeftIcon } from "../../components/icons";
import useCurrentAccount from "../../hooks/use-current-account";
import { useDeleteEventContext } from "../../providers/delete-event-provider";

View File

@ -3,7 +3,7 @@ import { Link as RouterLink } from "react-router-dom";
import { ButtonGroup, Card, CardBody, CardHeader, CardProps, Flex, Heading, Link, Text } from "@chakra-ui/react";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { getSharableEventAddress } from "../../../helpers/nip19";
import { NostrEvent } from "../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";

View File

@ -5,7 +5,7 @@ import { getGoalRelays } from "../../../helpers/nostr/goal";
import useEventZaps from "../../../hooks/use-event-zaps";
import { NostrEvent } from "../../../types/nostr-event";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { readablizeSats } from "../../../helpers/bolt11";
import { LightningIcon } from "../../../components/icons";

View File

@ -4,7 +4,7 @@ import { getGoalRelays } from "../../../helpers/nostr/goal";
import useEventZaps from "../../../hooks/use-event-zaps";
import { NostrEvent } from "../../../types/nostr-event";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { readablizeSats } from "../../../helpers/bolt11";
import { LightningIcon } from "../../../components/icons";
import Timestamp from "../../../components/timestamp";

View File

@ -10,7 +10,7 @@ import useSingleEvent from "../../hooks/use-single-event";
import { isHexKey } from "../../helpers/nip19";
import { EventPointer } from "nostr-tools/lib/types/nip19";
import UserAvatar from "../../components/user-avatar";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import GoalContents from "./components/goal-contents";
import GoalZapList from "./components/goal-zap-list";
import { readablizeSats } from "../../helpers/bolt11";

View File

@ -16,7 +16,7 @@ import {
import { Kind } from "nostr-tools";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import {
getEventsFromList,
getListDescription,

View File

@ -10,7 +10,12 @@ import NostrPublishAction from "../../../classes/nostr-publish-action";
import clientRelaysService from "../../../services/client-relays";
import replaceableEventLoaderService from "../../../services/replaceable-event-requester";
import useFavoriteLists, { FAVORITE_LISTS_IDENTIFIER } from "../../../hooks/use-favorite-lists";
import { NOTE_LIST_KIND, isSpecialListKind, listAddCoordinate, listRemoveCoordinate } from "../../../helpers/nostr/lists";
import {
NOTE_LIST_KIND,
isSpecialListKind,
listAddCoordinate,
listRemoveCoordinate,
} from "../../../helpers/nostr/lists";
export default function ListFavoriteButton({
list,

View File

@ -1,7 +1,7 @@
import { useNavigate, useParams } from "react-router-dom";
import { Kind, nip19 } from "nostr-tools";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import { Box, Button, Flex, Heading, SimpleGrid, Spacer, Text } from "@chakra-ui/react";
import { ChevronLeftIcon } from "../../components/icons";
import useCurrentAccount from "../../hooks/use-current-account";

View File

@ -6,7 +6,7 @@ import { useNavigate, useParams } from "react-router-dom";
import { ChevronLeftIcon } from "../../components/icons";
import UserAvatar from "../../components/user-avatar";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import { isHexKey } from "../../helpers/nip19";
import useSubject from "../../hooks/use-subject";
import { useSigningContext } from "../../providers/signing-provider";

View File

@ -15,7 +15,7 @@ import {
} from "../../components/embed-types";
import { useRegisterIntersectionEntity } from "../../providers/intersection-observer";
import UserAvatar from "../../components/user-avatar";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import { getEventUID } from "../../helpers/nostr/events";
import Timestamp from "../../components/timestamp";

View File

@ -19,7 +19,7 @@ import { TrustProvider } from "../../../providers/trust";
import ReplyForm from "./reply-form";
import useClientSideMuteFilter from "../../../hooks/use-client-side-mute-filter";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import Timestamp from "../../../components/timestamp";
import { NoteContents } from "../../../components/note/text-note-contents";
import Expand01 from "../../../components/icons/expand-01";

View File

@ -22,7 +22,7 @@ import {
import { useState } from "react";
import { useRelayInfo } from "../../../hooks/use-relay-info";
import UserAvatar from "../../../components/user-avatar";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { safeRelayUrl } from "../../../helpers/url";
import { useDebounce } from "react-use";
import { UserDnsIdentityIcon } from "../../../components/user-dns-identity-icon";

View File

@ -29,7 +29,7 @@ import { Link as RouterLink } from "react-router-dom";
import { useRelayInfo } from "../../../hooks/use-relay-info";
import { RelayFavicon } from "../../../components/relay-favicon";
import { CodeIcon } from "../../../components/icons";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import UserAvatar from "../../../components/user-avatar";
import { useClientRelays } from "../../../hooks/use-client-relays";
import clientRelaysService from "../../../services/client-relays";

View File

@ -3,7 +3,7 @@ import { Card, CardBody, CardHeader, Link } from "@chakra-ui/react";
import { Link as RouterLink } from "react-router-dom";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { UserDnsIdentityIcon } from "../../../components/user-dns-identity-icon";
import StarRating from "../../../components/star-rating";
import { safeJson } from "../../../helpers/parse";

View File

@ -9,7 +9,7 @@ import { EmbedableContent, embedUrls } from "../../helpers/embeds";
import UserAvatar from "../../components/user-avatar";
import { UserDnsIdentityIcon } from "../../components/user-dns-identity-icon";
import { embedNostrLinks, renderGenericUrl } from "../../components/embed-types";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import trustedUserStatsService, { NostrBandUserStats } from "../../services/trusted-user-stats";
import { useRelaySelectionRelays } from "../../providers/relay-selection-provider";
import useTimelineLoader from "../../hooks/use-timeline-loader";

View File

@ -1,5 +1,6 @@
import { useMemo, useState } from "react";
import { UseControllerProps, useController, useFormContext } from "react-hook-form";
import { useFormContext } from "react-hook-form";
import { Link as RouterLink } from "react-router-dom";
import {
Flex,
FormControl,
@ -21,6 +22,7 @@ import {
useDisclosure,
IconButton,
Button,
Link,
} from "@chakra-ui/react";
import { matchSorter } from "match-sorter";
@ -173,6 +175,26 @@ export default function DisplaySettings() {
<span>Enabled: blur media from people you aren't following</span>
</FormHelperText>
</FormControl>
<FormControl>
<Flex alignItems="center">
<FormLabel htmlFor="hideUsernames" mb="0">
Hide Usernames (anon mode)
</FormLabel>
<Switch id="hideUsernames" {...register("hideUsernames")} />
</Flex>
<FormHelperText>
<span>
Enabled: hides usernames and pictures.{" "}
<Link
as={RouterLink}
color="blue.500"
to="/n/nevent1qqsxvkjgpc6zhydj4rxjpl0frev7hmgynruq027mujdgy2hwjypaqfspzpmhxue69uhkummnw3ezuamfdejszythwden5te0dehhxarjw4jjucm0d5sfntd0"
>
Details
</Link>
</span>
</FormHelperText>
</FormControl>
<FormControl>
<Flex alignItems="center">
<FormLabel htmlFor="show-content-warning" mb="0">

View File

@ -3,7 +3,7 @@ import { Link as RouterLink } from "react-router-dom";
import { useAsync } from "react-use";
import UserAvatarLink from "../../components/user-avatar-link";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import { containerProps } from "./common";
import { UserFollowButton } from "../../components/user-follow-button";
import { Kind0ParsedContent } from "../../helpers/user-metadata";

View File

@ -4,7 +4,7 @@ import { Box, Card, CardBody, CardProps, Flex, Heading, LinkBox, LinkOverlay, Te
import { ParsedStream } from "../../../helpers/nostr/stream";
import { Link as RouterLink } from "react-router-dom";
import UserAvatar from "../../../components/user-avatar";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import StreamStatusBadge from "./status-badge";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";
import useEventNaddr from "../../../hooks/use-event-naddr";

View File

@ -2,7 +2,7 @@ import { useMemo } from "react";
import { Flex, FlexProps, Text } from "@chakra-ui/react";
import { parseZapEvent } from "../../../helpers/nostr/zaps";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { LightningIcon } from "../../../components/icons";
import { readablizeSats } from "../../../helpers/bolt11";
import useStreamChatTimeline from "../stream/stream-chat/use-stream-chat-timeline";

View File

@ -26,7 +26,7 @@ import { unique } from "../../../helpers/array";
import { LiveVideoPlayer } from "../../../components/live-video-player";
import StreamChat, { ChatDisplayMode } from "./stream-chat";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import StreamSummaryContent from "../components/stream-summary-content";
import { ChevronLeftIcon, ExternalLinkIcon } from "../../../components/icons";
import useSetColorMode from "../../../hooks/use-set-color-mode";

View File

@ -3,7 +3,7 @@ import { Box, Text } from "@chakra-ui/react";
import { ParsedStream } from "../../../../helpers/nostr/stream";
import UserAvatar from "../../../../components/user-avatar";
import { UserLink } from "../../../../components/user-link";
import UserLink from "../../../../components/user-link";
import { NostrEvent } from "../../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../../providers/intersection-observer";
import { TrustProvider } from "../../../../providers/trust";

View File

@ -3,7 +3,7 @@ import { Box, Flex, Text } from "@chakra-ui/react";
import { ParsedStream } from "../../../../helpers/nostr/stream";
import UserAvatar from "../../../../components/user-avatar";
import { UserLink } from "../../../../components/user-link";
import UserLink from "../../../../components/user-link";
import { NostrEvent } from "../../../../types/nostr-event";
import { useRegisterIntersectionEntity } from "../../../../providers/intersection-observer";
import { LightningIcon } from "../../../../components/icons";

View File

@ -5,7 +5,7 @@ import useCurrentAccount from "../../hooks/use-current-account";
import RequireCurrentAccount from "../../providers/require-current-account";
import { useNetworkConnectionCount } from "../../hooks/use-user-network";
import UserAvatarLink from "../../components/user-avatar-link";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import { ChevronLeftIcon } from "../../components/icons";
import { useNavigate } from "react-router-dom";
import VerticalPageLayout from "../../components/vertical-page-layout";

View File

@ -6,7 +6,7 @@ import useSubject from "../../../hooks/use-subject";
import useCurrentAccount from "../../../hooks/use-current-account";
import useStreamChatTimeline from "../../streams/stream/stream-chat/use-stream-chat-timeline";
import UserAvatar from "../../../components/user-avatar";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import useUserMuteFunctions from "../../../hooks/use-user-mute-functions";
import { useMuteModalContext } from "../../../providers/mute-modal-provider";
import useUserMuteList from "../../../hooks/use-user-mute-list";

View File

@ -5,7 +5,7 @@ import { Link as RouterLink, useLocation } from "react-router-dom";
import { getTorrentMagnetLink, getTorrentSize, getTorrentTitle } from "../../../helpers/nostr/torrents";
import { NostrEvent } from "../../../types/nostr-event";
import Timestamp from "../../../components/timestamp";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import Magnet from "../../../components/icons/magnet";
import { getNeventForEventId } from "../../../helpers/nip19";
import { useRegisterIntersectionEntity } from "../../../providers/intersection-observer";

View File

@ -21,7 +21,7 @@ import {
} from "@chakra-ui/react";
import useClientSideMuteFilter from "../../../hooks/use-client-side-mute-filter";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import { UserDnsIdentityIcon } from "../../../components/user-dns-identity-icon";
import Timestamp from "../../../components/timestamp";
import Minus from "../../../components/icons/minus";

View File

@ -27,7 +27,7 @@ import VerticalPageLayout from "../../components/vertical-page-layout";
import { NostrEvent } from "../../types/nostr-event";
import { ErrorBoundary } from "../../components/error-boundary";
import UserAvatarLink from "../../components/user-avatar-link";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import {
TORRENT_COMMENT_KIND,
getTorrentFiles,

View File

@ -24,7 +24,7 @@ import { getEventCoordinate } from "../../../helpers/nostr/events";
import { NostrEvent } from "../../../types/nostr-event";
import { getSharableEventAddress } from "../../../helpers/nip19";
import UserAvatarLink from "../../../components/user-avatar-link";
import { UserLink } from "../../../components/user-link";
import UserLink from "../../../components/user-link";
import Timestamp from "../../../components/timestamp";
import { useState } from "react";

View File

@ -12,7 +12,7 @@ import VerticalPageLayout from "../../components/vertical-page-layout";
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
import { NostrEvent, isPTag } from "../../types/nostr-event";
import UserAvatarLink from "../../components/user-avatar-link";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import ArrowRight from "../../components/icons/arrow-right";
import { AtIcon } from "../../components/icons";
import Timestamp from "../../components/timestamp";

View File

@ -10,7 +10,7 @@ import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../
import TimelineActionAndStatus from "../../components/timeline-page/timeline-action-and-status";
import { useMemo, useRef } from "react";
import { getEventUID } from "../../helpers/nostr/events";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import UserAvatarLink from "../../components/user-avatar-link";
function FollowerItem({ event }: { event: Event }) {

View File

@ -3,7 +3,7 @@ import { Flex, Heading, Link, SimpleGrid } from "@chakra-ui/react";
import { Link as RouterLink, useOutletContext } from "react-router-dom";
import UserAvatarLink from "../../components/user-avatar-link";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import { MUTE_LIST_KIND, PEOPLE_LIST_KIND, getListName, getPubkeysFromList } from "../../helpers/nostr/lists";

View File

@ -13,7 +13,7 @@ import IntersectionObserverProvider, { useRegisterIntersectionEntity } from "../
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
import { TrustProvider } from "../../providers/trust";
import UserAvatar from "../../components/user-avatar";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import NoteMenu from "../../components/note/note-menu";
import { EmbedEventPointer } from "../../components/embed-event";
import { embedEmoji } from "../../components/embed-types";

View File

@ -4,7 +4,7 @@ import { useOutletContext } from "react-router-dom";
import { Kind } from "nostr-tools";
import { NoteLink } from "../../components/note-link";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import { filterTagsByContentRefs, getEventUID } from "../../helpers/nostr/events";
import useTimelineLoader from "../../hooks/use-timeline-loader";
import { isETag, isPTag, NostrEvent } from "../../types/nostr-event";

View File

@ -7,7 +7,7 @@ import { ErrorBoundary, ErrorFallback } from "../../components/error-boundary";
import { LightningIcon } from "../../components/icons";
import { NoteLink } from "../../components/note-link";
import UserAvatarLink from "../../components/user-avatar-link";
import { UserLink } from "../../components/user-link";
import UserLink from "../../components/user-link";
import { readablizeSats } from "../../helpers/bolt11";
import { isProfileZap, isNoteZap, parseZapEvent, totalZaps } from "../../helpers/nostr/zaps";
import useTimelineLoader from "../../hooks/use-timeline-loader";