diff --git a/src/components/BottomNavigationBar/BottomNavigationBarItem.tsx b/src/components/BottomNavigationBar/BottomNavigationBarItem.tsx index a8f260bc..4d033fe5 100644 --- a/src/components/BottomNavigationBar/BottomNavigationBarItem.tsx +++ b/src/components/BottomNavigationBar/BottomNavigationBarItem.tsx @@ -10,7 +10,7 @@ export default function BottomNavigationBarItem({ }: { children: React.ReactNode active?: boolean - /** Slightly larger icon (e.g. favorites feed). */ + /** Slightly larger icon (e.g. home feed). */ prominent?: boolean onClick: MouseEventHandler }) { diff --git a/src/components/BottomNavigationBar/HomeButton.tsx b/src/components/BottomNavigationBar/HomeButton.tsx index fda2ffe5..7719cf32 100644 --- a/src/components/BottomNavigationBar/HomeButton.tsx +++ b/src/components/BottomNavigationBar/HomeButton.tsx @@ -1,10 +1,10 @@ import { cn } from '@/lib/utils' import { usePrimaryPage } from '@/contexts/primary-page-context' import { usePrimaryNoteView } from '@/contexts/primary-note-view-context' -import { Star } from 'lucide-react' +import { House } from 'lucide-react' import BottomNavigationBarItem from './BottomNavigationBarItem' -/** Favorites feed (primary “home” destination in the bar). */ +/** Home feed (primary timeline). */ export default function HomeButton() { const { navigate, current, display } = usePrimaryPage() const { primaryViewType, setPrimaryNoteView } = usePrimaryNoteView() @@ -23,7 +23,7 @@ export default function HomeButton() { } }} > - diff --git a/src/components/ContentPreview/FollowPackPreview.tsx b/src/components/ContentPreview/FollowPackPreview.tsx index fac67c65..725ff92d 100644 --- a/src/components/ContentPreview/FollowPackPreview.tsx +++ b/src/components/ContentPreview/FollowPackPreview.tsx @@ -2,7 +2,7 @@ import { getPubkeysFromPTags } from '@/lib/tag' import logger from '@/lib/logger' import { cn } from '@/lib/utils' import { useFollowList } from '@/providers/FollowListProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' import { Event } from 'nostr-tools' import { Users } from 'lucide-react' diff --git a/src/components/ContentPreview/index.tsx b/src/components/ContentPreview/index.tsx index 0c4ea7a2..f425bd99 100644 --- a/src/components/ContentPreview/index.tsx +++ b/src/components/ContentPreview/index.tsx @@ -2,7 +2,7 @@ import { ExtendedKind } from '@/constants' import { isMentioningMutedUsers } from '@/lib/event' import { cn } from '@/lib/utils' import { useContentPolicy } from '@/providers/ContentPolicyProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { Event, kinds } from 'nostr-tools' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/components/Explore/ExploreFavoriteRelays.tsx b/src/components/Explore/ExploreFavoriteRelays.tsx index f8bdd9ce..2a373da8 100644 --- a/src/components/Explore/ExploreFavoriteRelays.tsx +++ b/src/components/Explore/ExploreFavoriteRelays.tsx @@ -6,6 +6,7 @@ import { toRelay, toRelaySettings } from '@/lib/link' import { normalizeUrl, simplifyUrl } from '@/lib/url' import { usePrimaryPage } from '@/contexts/primary-page-context' import { useSecondaryPage, useSmartRelayNavigation } from '@/PageManager' +import { useFeed } from '@/providers/FeedProvider' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { cn } from '@/lib/utils' import { Newspaper, Settings } from 'lucide-react' @@ -60,6 +61,7 @@ export default function ExploreFavoriteRelays() { const { t } = useTranslation() const { navigate } = usePrimaryPage() const { push } = useSecondaryPage() + const { switchFeed } = useFeed() const { favoriteRelays, blockedRelays } = useFavoriteRelays() const blockedSet = useMemo( @@ -97,10 +99,12 @@ export default function ExploreFavoriteRelays() { variant="outline" size="sm" className="h-8 gap-1.5 px-2.5 font-medium" - onClick={() => navigate('feed')} + onClick={() => { + void switchFeed('all-favorites').then(() => navigate('feed')) + }} > - {t('Favorites Feed')} + {t('Favorite Relays')} + ) + + if (isSmallScreen) { + return ( +
+
+ +
+ {editSettingsButton} +
+ ) + } + + return ( +
+
+ + {urls.map((url) => { + const key = normalizeUrl(url) || url + const active = feedInfo.feedType === 'relay' && currentRelayKey === key + return ( + + ) + })} + {(relaySets.length > 0 || orphanRelaySetId) && ( +
+ )} + {relaySets.map((set) => { + const active = feedInfo.feedType === 'relays' && feedInfo.id === set.id + return ( + + ) + })} + {orphanRelaySetId ? ( + + ) : null} +
+ {editSettingsButton} +
+ ) +} diff --git a/src/components/FollowButton/index.tsx b/src/components/FollowButton/index.tsx index 2d685fcd..a486e287 100644 --- a/src/components/FollowButton/index.tsx +++ b/src/components/FollowButton/index.tsx @@ -12,7 +12,7 @@ import { import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' import { useFollowList } from '@/providers/FollowListProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/components/HideUntrustedContentButton/index.tsx b/src/components/HideUntrustedContentButton/index.tsx index 4496c88b..44a5b33d 100644 --- a/src/components/HideUntrustedContentButton/index.tsx +++ b/src/components/HideUntrustedContentButton/index.tsx @@ -10,7 +10,7 @@ import { AlertDialogTrigger } from '@/components/ui/alert-dialog' import { Button, buttonVariants } from '@/components/ui/button' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import { VariantProps } from 'class-variance-authority' import { Shield, ShieldCheck } from 'lucide-react' import { useTranslation } from 'react-i18next' diff --git a/src/components/LatestFromFollowsSection/index.tsx b/src/components/LatestFromFollowsSection/index.tsx index c07d9471..1cceee76 100644 --- a/src/components/LatestFromFollowsSection/index.tsx +++ b/src/components/LatestFromFollowsSection/index.tsx @@ -10,9 +10,9 @@ import { cn } from '@/lib/utils' import { useSecondaryPage } from '@/PageManager' import { useDeletedEvent } from '@/providers/DeletedEventProvider' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import { queryService, replaceableEventService } from '@/services/client.service' import type { TRelayList } from '@/types' import logger from '@/lib/logger' diff --git a/src/components/MuteButton/index.tsx b/src/components/MuteButton/index.tsx index 89e025d9..2071d9d8 100644 --- a/src/components/MuteButton/index.tsx +++ b/src/components/MuteButton/index.tsx @@ -7,7 +7,7 @@ import { DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' import { BellOff } from 'lucide-react' diff --git a/src/components/NormalFeed/index.tsx b/src/components/NormalFeed/index.tsx index ebf6a7e4..f2203469 100644 --- a/src/components/NormalFeed/index.tsx +++ b/src/components/NormalFeed/index.tsx @@ -2,7 +2,7 @@ import NoteList, { TNoteListRef } from '@/components/NoteList' import { RefreshButton } from '@/components/RefreshButton' import Tabs, { TabDefinition } from '@/components/Tabs' import { useKindFilter } from '@/providers/KindFilterProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import storage from '@/services/local-storage.service' import { TFeedSubRequest, TNoteListMode } from '@/types' import { forwardRef, useLayoutEffect, useMemo, useRef, useState } from 'react' diff --git a/src/components/Note/index.tsx b/src/components/Note/index.tsx index f037fd2f..fa9aed7a 100644 --- a/src/components/Note/index.tsx +++ b/src/components/Note/index.tsx @@ -6,7 +6,7 @@ import { toNote } from '@/lib/link' import logger from '@/lib/logger' import client from '@/services/client.service' import { useContentPolicy } from '@/providers/ContentPolicyProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useScreenSize } from '@/providers/ScreenSizeProvider' import type { HighlightData } from '@/components/PostEditor/HighlightEditor' import { Event, kinds } from 'nostr-tools' diff --git a/src/components/NoteBoostBadges/index.tsx b/src/components/NoteBoostBadges/index.tsx index 0b1fb5b3..92e7e391 100644 --- a/src/components/NoteBoostBadges/index.tsx +++ b/src/components/NoteBoostBadges/index.tsx @@ -2,7 +2,7 @@ import { ExtendedKind } from '@/constants' import { useNoteStatsById } from '@/hooks/useNoteStatsById' import { shouldHideInteractions } from '@/lib/event-filtering' import { cn } from '@/lib/utils' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import { Event } from 'nostr-tools' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' diff --git a/src/components/NoteCard/RepostNoteCard.tsx b/src/components/NoteCard/RepostNoteCard.tsx index 629783e8..661731a5 100644 --- a/src/components/NoteCard/RepostNoteCard.tsx +++ b/src/components/NoteCard/RepostNoteCard.tsx @@ -1,7 +1,7 @@ import { isMentioningMutedUsers } from '@/lib/event' import { tagNameEquals } from '@/lib/tag' import { useContentPolicy } from '@/providers/ContentPolicyProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import client from '@/services/client.service' import { eventService } from '@/services/client.service' import { Event, kinds, nip19, verifyEvent } from 'nostr-tools' diff --git a/src/components/NoteCard/index.tsx b/src/components/NoteCard/index.tsx index 5c783bdc..844fa548 100644 --- a/src/components/NoteCard/index.tsx +++ b/src/components/NoteCard/index.tsx @@ -1,7 +1,7 @@ import { Skeleton } from '@/components/ui/skeleton' import { isMentioningMutedUsers } from '@/lib/event' import { useContentPolicy } from '@/providers/ContentPolicyProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { Event, kinds } from 'nostr-tools' import { memo, useMemo } from 'react' import MainNoteCard from './MainNoteCard' diff --git a/src/components/NoteList/index.tsx b/src/components/NoteList/index.tsx index 299d9459..ccc1335a 100644 --- a/src/components/NoteList/index.tsx +++ b/src/components/NoteList/index.tsx @@ -19,9 +19,9 @@ import { getZapInfoFromEvent } from '@/lib/event-metadata' import { isTouchDevice } from '@/lib/utils' import { useContentPolicy } from '@/providers/ContentPolicyProvider' import { useDeletedEvent } from '@/providers/DeletedEventProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import { useZap } from '@/providers/ZapProvider' import client from '@/services/client.service' import { TFeedSubRequest } from '@/types' diff --git a/src/components/NoteOptions/useMenuActions.tsx b/src/components/NoteOptions/useMenuActions.tsx index e3e5f792..a3211195 100644 --- a/src/components/NoteOptions/useMenuActions.tsx +++ b/src/components/NoteOptions/useMenuActions.tsx @@ -10,7 +10,7 @@ import { buildPinListTagsAfterToggle, fetchLatestReplaceableListEvent } from '@/ import { generateBech32IdFromATag } from '@/lib/tag' import { useCurrentRelays } from '@/providers/CurrentRelaysProvider' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' import { FAST_READ_RELAY_URLS, FAST_WRITE_RELAY_URLS } from '@/constants' import client from '@/services/client.service' diff --git a/src/components/NoteStats/LikeButton.tsx b/src/components/NoteStats/LikeButton.tsx index 08d4695c..2e7b217c 100644 --- a/src/components/NoteStats/LikeButton.tsx +++ b/src/components/NoteStats/LikeButton.tsx @@ -12,7 +12,7 @@ import { createDeletionRequestDraftEvent, createReactionDraftEvent } from '@/lib import { getRootEventHexId } from '@/lib/event' import { useNostr } from '@/providers/NostrProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import { eventService } from '@/services/client.service' import noteStatsService from '@/services/note-stats.service' import { TEmoji } from '@/types' diff --git a/src/components/NoteStats/Likes.tsx b/src/components/NoteStats/Likes.tsx index 60a0a972..64961b28 100644 --- a/src/components/NoteStats/Likes.tsx +++ b/src/components/NoteStats/Likes.tsx @@ -7,7 +7,7 @@ import { shouldHideInteractions } from '@/lib/event-filtering' import { createReactionDraftEvent } from '@/lib/draft-event' import { cn } from '@/lib/utils' import { useNostr } from '@/providers/NostrProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import noteStatsService from '@/services/note-stats.service' import { TEmoji } from '@/types' import { Event } from 'nostr-tools' diff --git a/src/components/NoteStats/ReplyButton.tsx b/src/components/NoteStats/ReplyButton.tsx index 6ae9abaa..1ede701f 100644 --- a/src/components/NoteStats/ReplyButton.tsx +++ b/src/components/NoteStats/ReplyButton.tsx @@ -1,7 +1,7 @@ import { useNoteStatsById } from '@/hooks/useNoteStatsById' import { cn } from '@/lib/utils' import { useNostr } from '@/providers/NostrProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import { MessageCircle } from 'lucide-react' import { Event } from 'nostr-tools' import { useMemo, useState } from 'react' diff --git a/src/components/NoteStats/RepostButton.tsx b/src/components/NoteStats/RepostButton.tsx index 27af431b..6601c78f 100644 --- a/src/components/NoteStats/RepostButton.tsx +++ b/src/components/NoteStats/RepostButton.tsx @@ -13,7 +13,7 @@ import { getNoteBech32Id } from '@/lib/event' import { cn } from '@/lib/utils' import { useNostr } from '@/providers/NostrProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import noteStatsService from '@/services/note-stats.service' import { PencilLine, Repeat } from 'lucide-react' import { Event } from 'nostr-tools' diff --git a/src/components/PostEditor/Mentions.tsx b/src/components/PostEditor/Mentions.tsx index 858d1104..9c8acebb 100644 --- a/src/components/PostEditor/Mentions.tsx +++ b/src/components/PostEditor/Mentions.tsx @@ -1,6 +1,6 @@ import { Button } from '@/components/ui/button' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' import { eventService } from '@/services/client.service' import { NOSTR_URI_FOR_REPLY_PUBKEYS_REGEX } from '@/lib/content-patterns' diff --git a/src/components/Profile/SmartMuteLink.tsx b/src/components/Profile/SmartMuteLink.tsx index b9334bbc..c1fd23f7 100644 --- a/src/components/Profile/SmartMuteLink.tsx +++ b/src/components/Profile/SmartMuteLink.tsx @@ -1,6 +1,6 @@ import { toMuteList } from '@/lib/link' import { useSmartMuteListNavigation } from '@/PageManager' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useTranslation } from 'react-i18next' export default function SmartMuteLink() { diff --git a/src/components/ProfileOptions/index.tsx b/src/components/ProfileOptions/index.tsx index 754b6788..5698bf98 100644 --- a/src/components/ProfileOptions/index.tsx +++ b/src/components/ProfileOptions/index.tsx @@ -9,7 +9,7 @@ import { import { buildHiveTalkJoinUrl, roomIdForPubkeys } from '@/lib/hivetalk' import { formatPubkey, pubkeyToNpub } from '@/lib/pubkey' import { normalizeUrl } from '@/lib/url' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useCurrentRelays } from '@/providers/CurrentRelaysProvider' diff --git a/src/components/QuoteList/index.tsx b/src/components/QuoteList/index.tsx index 2b9f59dd..d06f6e76 100644 --- a/src/components/QuoteList/index.tsx +++ b/src/components/QuoteList/index.tsx @@ -3,7 +3,7 @@ import { getReplaceableCoordinateFromEvent, isReplaceableEvent } from '@/lib/eve import { normalizeUrl } from '@/lib/url' import { useCurrentRelays } from '@/providers/CurrentRelaysProvider' import { useNostr } from '@/providers/NostrProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import client from '@/services/client.service' import dayjs from 'dayjs' import { Event, kinds } from 'nostr-tools' diff --git a/src/components/RelayInfo/RelayReviewsPreview.tsx b/src/components/RelayInfo/RelayReviewsPreview.tsx index 2a87897a..49bee4e9 100644 --- a/src/components/RelayInfo/RelayReviewsPreview.tsx +++ b/src/components/RelayInfo/RelayReviewsPreview.tsx @@ -13,9 +13,9 @@ import { getStarsFromRelayReviewEvent } from '@/lib/event-metadata' import { toRelayReviews } from '@/lib/link' import { normalizeUrl } from '@/lib/url' import { cn, isTouchDevice } from '@/lib/utils' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import { queryService } from '@/services/client.service' import { WheelGesturesPlugin } from 'embla-carousel-wheel-gestures' import type { NostrEvent } from 'nostr-tools' diff --git a/src/components/ReplyNote/index.tsx b/src/components/ReplyNote/index.tsx index f364e4c8..7fbd420d 100644 --- a/src/components/ReplyNote/index.tsx +++ b/src/components/ReplyNote/index.tsx @@ -5,7 +5,7 @@ import { isMentioningMutedUsers } from '@/lib/event' import { toNote } from '@/lib/link' import client from '@/services/client.service' import { useContentPolicy } from '@/providers/ContentPolicyProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useScreenSize } from '@/providers/ScreenSizeProvider' import { Event } from 'nostr-tools' import { useMemo, useState } from 'react' diff --git a/src/components/ReplyNoteList/index.tsx b/src/components/ReplyNoteList/index.tsx index 554596bc..dfbd2a3d 100644 --- a/src/components/ReplyNoteList/index.tsx +++ b/src/components/ReplyNoteList/index.tsx @@ -17,10 +17,10 @@ import { toNote } from '@/lib/link' import { generateBech32IdFromETag } from '@/lib/tag' import { useSmartNoteNavigation, useSecondaryPage } from '@/PageManager' import { useContentPolicy } from '@/providers/ContentPolicyProvider' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' import { useReply } from '@/providers/ReplyProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import { useCurrentRelays } from '@/providers/CurrentRelaysProvider' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import client from '@/services/client.service' diff --git a/src/components/Sidebar/HomeButton.tsx b/src/components/Sidebar/HomeButton.tsx index 3ca2c101..bce63a3b 100644 --- a/src/components/Sidebar/HomeButton.tsx +++ b/src/components/Sidebar/HomeButton.tsx @@ -1,7 +1,7 @@ import { cn } from '@/lib/utils' import { usePrimaryPage } from '@/contexts/primary-page-context' import { usePrimaryNoteView } from '@/contexts/primary-note-view-context' -import { Star } from 'lucide-react' +import { House } from 'lucide-react' import { useTranslation } from 'react-i18next' import SidebarItem from './SidebarItem' @@ -13,7 +13,7 @@ export default function HomeButton() { return ( navigate('feed')} active={active} className={cn( @@ -22,7 +22,7 @@ export default function HomeButton() { active && 'bg-green-500/15 opacity-100 hover:bg-green-500/15 dark:bg-green-500/20' )} > - diff --git a/src/contexts/mute-list-context.tsx b/src/contexts/mute-list-context.tsx new file mode 100644 index 00000000..57badfe4 --- /dev/null +++ b/src/contexts/mute-list-context.tsx @@ -0,0 +1,27 @@ +import { createContext, useContext } from 'react' + +export type TMuteListContext = { + mutePubkeySet: Set + changing: boolean + getMutePubkeys: () => string[] + getMuteType: (pubkey: string) => 'public' | 'private' | null + mutePubkeyPublicly: (pubkey: string) => Promise + mutePubkeyPrivately: (pubkey: string) => Promise + unmutePubkey: (pubkey: string) => Promise + switchToPublicMute: (pubkey: string) => Promise + switchToPrivateMute: (pubkey: string) => Promise +} + +/** + * Dedicated module so lazy chunks share the same context as MuteListProvider (avoids duplicate + * createContext when useMuteList is imported from MuteListProvider.tsx in a lazy-loaded bundle). + */ +export const MuteListContext = createContext(undefined) + +export function useMuteList(): TMuteListContext { + const context = useContext(MuteListContext) + if (!context) { + throw new Error('useMuteList must be used within a MuteListProvider') + } + return context +} diff --git a/src/contexts/user-trust-context.tsx b/src/contexts/user-trust-context.tsx new file mode 100644 index 00000000..40119448 --- /dev/null +++ b/src/contexts/user-trust-context.tsx @@ -0,0 +1,26 @@ +import { createContext, useContext } from 'react' + +export type TUserTrustContext = { + hideUntrustedInteractions: boolean + hideUntrustedNotifications: boolean + hideUntrustedNotes: boolean + updateHideUntrustedInteractions: (hide: boolean) => void + updateHideUntrustedNotifications: (hide: boolean) => void + updateHideUntrustedNotes: (hide: boolean) => void + isUserTrusted: (pubkey: string) => boolean +} + +/** + * Lives in a dedicated module so lazy chunks (e.g. NoteListPage → NormalFeed) share the same + * context instance as App’s UserTrustProvider. Importing useUserTrust from UserTrustProvider into + * those chunks can duplicate the module and break Provider matching. + */ +export const UserTrustContext = createContext(undefined) + +export function useUserTrust(): TUserTrustContext { + const context = useContext(UserTrustContext) + if (!context) { + throw new Error('useUserTrust must be used within a UserTrustProvider') + } + return context +} diff --git a/src/i18n/locales/ar.ts b/src/i18n/locales/ar.ts index 93c0c2bb..d97c90d0 100644 --- a/src/i18n/locales/ar.ts +++ b/src/i18n/locales/ar.ts @@ -6,7 +6,8 @@ export default { Post: 'نشر', Home: 'الرئيسية', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'الريلايات المفضلة', + 'All favorite relays': 'جميع الريلايات المفضلة', 'Pinned note': 'Pinned note', 'Relay settings': 'إعدادات الريلاي', Settings: 'الإعدادات', @@ -419,7 +420,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'لا توجد مزيد من الردود', 'Relay sets': 'مجموعات الريلاي', - 'Favorite Relays': 'الريلايات المفضلة', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'المفضلات من المتابعين', @@ -894,7 +894,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/de.ts b/src/i18n/locales/de.ts index af240697..846b806c 100644 --- a/src/i18n/locales/de.ts +++ b/src/i18n/locales/de.ts @@ -8,7 +8,8 @@ export default { Post: 'Beitrag', Home: 'Startseite', Feed: 'Feed', - 'Favorites Feed': 'Favoriten', + 'Favorite Relays': 'Lieblings-Relays', + 'All favorite relays': 'Alle Lieblingsrelais', 'Pinned note': 'Angehefteter Beitrag', 'Relay settings': 'Relay-Einstellungen', Settings: 'Einstellungen', @@ -445,7 +446,6 @@ export default { '{{count}} externe Relays durchsucht; die Note wurde nicht gefunden.', 'no more replies': 'keine weiteren Antworten', 'Relay sets': 'Relay-Sets', - 'Favorite Relays': 'Lieblings-Relays', 'Search for Relays': 'Relays suchen', 'Using app default relays': 'Standard-Relays der App', "Following's Favorites": 'Favoriten der Folgenden', @@ -934,7 +934,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts index 789cfddc..293e72eb 100644 --- a/src/i18n/locales/en.ts +++ b/src/i18n/locales/en.ts @@ -6,7 +6,8 @@ export default { Post: 'Post', Home: 'Home', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'Favorite Relays', + 'All favorite relays': 'All favorite relays', 'Pinned note': 'Pinned note', 'Relay settings': 'Relays and Storage Settings', Settings: 'Settings', @@ -437,7 +438,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'no more replies', 'Relay sets': 'Relay sets', - 'Favorite Relays': 'Favorite Relays', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": "Following's Favorites", @@ -911,7 +911,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/es.ts b/src/i18n/locales/es.ts index 52da15bb..8effc386 100644 --- a/src/i18n/locales/es.ts +++ b/src/i18n/locales/es.ts @@ -6,7 +6,8 @@ export default { Post: 'Publicar', Home: 'Inicio', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'Relés favoritos', + 'All favorite relays': 'Todos los relés favoritos', 'Pinned note': 'Pinned note', 'Relay settings': 'Configuración de relés', Settings: 'Ajustes', @@ -423,7 +424,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'no hay más respuestas', 'Relay sets': 'Conjuntos de relés', - 'Favorite Relays': 'Relés favoritos', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'Favoritos de los seguidos', @@ -902,7 +902,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/fa.ts b/src/i18n/locales/fa.ts index d4ee0252..de2ca056 100644 --- a/src/i18n/locales/fa.ts +++ b/src/i18n/locales/fa.ts @@ -6,7 +6,8 @@ export default { Post: 'ارسال', Home: 'خانه', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'رله‌های مورد علاقه', + 'All favorite relays': 'همهٔ رله‌های مورد علاقه', 'Pinned note': 'Pinned note', 'Relay settings': 'تنظیمات رله', Settings: 'تنظیمات', @@ -422,7 +423,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'پاسخ بیشتری وجود ندارد', 'Relay sets': 'مجموعه‌های رله', - 'Favorite Relays': 'رله‌های مورد علاقه', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'مورد علاقه دنبال شونده‌ها', @@ -898,7 +898,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/fr.ts b/src/i18n/locales/fr.ts index bf8a28d6..472f0d0f 100644 --- a/src/i18n/locales/fr.ts +++ b/src/i18n/locales/fr.ts @@ -6,7 +6,8 @@ export default { Post: 'Publier', Home: 'Accueil', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'Relais favoris', + 'All favorite relays': 'Tous les relais favoris', 'Pinned note': 'Pinned note', 'Relay settings': 'Paramètres du relais', Settings: 'Paramètres', @@ -422,7 +423,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'aucune autre réponse', 'Relay sets': 'Groupes de relais', - 'Favorite Relays': 'Relais favoris', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": "Following's Favorites", @@ -907,7 +907,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/hi.ts b/src/i18n/locales/hi.ts index 4c14c82c..cf8a2a25 100644 --- a/src/i18n/locales/hi.ts +++ b/src/i18n/locales/hi.ts @@ -6,7 +6,8 @@ export default { Post: 'पोस्ट', Home: 'होम', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'पसंदीदा रिले', + 'All favorite relays': 'सभी पसंदीदा रिले', 'Pinned note': 'Pinned note', 'Relay settings': 'रिले सेटिंग्स', Settings: 'सेटिंग्स', @@ -423,7 +424,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'कोई और उत्तर नहीं', 'Relay sets': 'रिले सेट', - 'Favorite Relays': 'पसंदीदा रिले', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'फॉलोइंग के पसंदीदा', @@ -900,7 +900,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/it.ts b/src/i18n/locales/it.ts index 4ebb0f19..50569698 100644 --- a/src/i18n/locales/it.ts +++ b/src/i18n/locales/it.ts @@ -6,7 +6,8 @@ export default { Post: 'Pubblica', Home: 'Inizio', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'Relay preferiti', + 'All favorite relays': 'Tutti i relay preferiti', 'Pinned note': 'Pinned note', 'Relay settings': 'Impostazioni Relay', Settings: 'Impostazioni', @@ -423,7 +424,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'niente più repliche', 'Relay sets': 'Set di Relay', - 'Favorite Relays': 'Relay preferiti', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'Preferiti dei seguiti', @@ -903,7 +903,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/ja.ts b/src/i18n/locales/ja.ts index d945fdd3..a870ebc8 100644 --- a/src/i18n/locales/ja.ts +++ b/src/i18n/locales/ja.ts @@ -6,7 +6,8 @@ export default { Post: '投稿', Home: 'ホーム', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'お気に入りのリレイ', + 'All favorite relays': 'すべてのお気に入りリレイ', 'Pinned note': 'Pinned note', 'Relay settings': 'リレイ設定', Settings: '設定', @@ -420,7 +421,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'これ以上の返信はありません', 'Relay sets': 'リレイセット', - 'Favorite Relays': 'お気に入りのリレイ', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'フォロー中のお気に入り', @@ -898,7 +898,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/ko.ts b/src/i18n/locales/ko.ts index e7c17aa1..5e4c6ba3 100644 --- a/src/i18n/locales/ko.ts +++ b/src/i18n/locales/ko.ts @@ -6,7 +6,8 @@ export default { Post: '노트 게시', Home: '홈', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': '즐겨찾는 릴레이', + 'All favorite relays': '모든 즐겨찾는 릴레이', 'Pinned note': 'Pinned note', 'Relay settings': '릴레이 설정', Settings: '설정', @@ -419,7 +420,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': '더 이상 답글 없음', 'Relay sets': '릴레이 세트', - 'Favorite Relays': '즐겨찾는 릴레이', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": '팔로잉의 즐겨찾기', @@ -896,7 +896,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/pl.ts b/src/i18n/locales/pl.ts index 5004d69f..7ce8be41 100644 --- a/src/i18n/locales/pl.ts +++ b/src/i18n/locales/pl.ts @@ -6,7 +6,8 @@ export default { Post: 'Publikuj', Home: 'Strona Główna', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'Ulubione transmitery', + 'All favorite relays': 'Wszystkie ulubione transmitery', 'Pinned note': 'Pinned note', 'Relay settings': 'Ustawienia transmiterów', Settings: 'Ustawienia', @@ -420,7 +421,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'brak kolejnych odpowiedzi', 'Relay sets': 'Zestawy transmiterów', - 'Favorite Relays': 'Ulubione transmitery', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'Ulubione transmitery obserwowanych', @@ -901,7 +901,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/pt-BR.ts b/src/i18n/locales/pt-BR.ts index 3d4a8467..40fe205c 100644 --- a/src/i18n/locales/pt-BR.ts +++ b/src/i18n/locales/pt-BR.ts @@ -6,7 +6,8 @@ export default { Post: 'Postar', Home: 'Início', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'Relays favoritos', + 'All favorite relays': 'Todos os relays favoritos', 'Pinned note': 'Pinned note', 'Relay settings': 'Configurações de relay', Settings: 'Configurações', @@ -422,7 +423,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'não há mais respostas', 'Relay sets': 'Conjuntos de relay', - 'Favorite Relays': 'Relays favoritos', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'Favoritos de quem você segue', @@ -900,7 +900,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/pt-PT.ts b/src/i18n/locales/pt-PT.ts index dc3d9927..def8c50b 100644 --- a/src/i18n/locales/pt-PT.ts +++ b/src/i18n/locales/pt-PT.ts @@ -6,7 +6,8 @@ export default { Post: 'Postar', Home: 'Início', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'Relés Favoritos', + 'All favorite relays': 'Todos os relés favoritos', 'Pinned note': 'Pinned note', 'Relay settings': 'Configurações de Relé', Settings: 'Configurações', @@ -422,7 +423,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'não há mais respostas', 'Relay sets': 'Conjuntos de Relé', - 'Favorite Relays': 'Relés Favoritos', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'Favoritos de quem você segue', @@ -902,7 +902,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/ru.ts b/src/i18n/locales/ru.ts index 05f9a8c7..79b930c7 100644 --- a/src/i18n/locales/ru.ts +++ b/src/i18n/locales/ru.ts @@ -6,7 +6,8 @@ export default { Post: 'Опубликовать', Home: 'Главная', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'Избранные ретрансляторы', + 'All favorite relays': 'Все избранные ретрансляторы', 'Pinned note': 'Pinned note', 'Relay settings': 'Настройки ретрансляции', Settings: 'Настройки', @@ -423,7 +424,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'больше нет ответов', 'Relay sets': 'Наборы ретрансляторов', - 'Favorite Relays': 'Избранные ретрансляторы', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'Избранные ретрансляторы подписчиков', @@ -903,7 +903,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/th.ts b/src/i18n/locales/th.ts index fba9e4e9..477b743a 100644 --- a/src/i18n/locales/th.ts +++ b/src/i18n/locales/th.ts @@ -6,7 +6,8 @@ export default { Post: 'โพสต์', Home: 'หน้าหลัก', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': 'รีเลย์โปรด', + 'All favorite relays': 'รีเลย์โปรดทั้งหมด', 'Pinned note': 'Pinned note', 'Relay settings': 'การตั้งค่ารีเลย์', Settings: 'การตั้งค่า', @@ -419,7 +420,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': 'ไม่มีการตอบกลับเพิ่มเติม', 'Relay sets': 'ชุดรีเลย์', - 'Favorite Relays': 'รีเลย์โปรด', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": 'รายการโปรดของผู้ที่ติดตาม', @@ -893,7 +893,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/i18n/locales/zh.ts b/src/i18n/locales/zh.ts index be67108a..c4eee9c4 100644 --- a/src/i18n/locales/zh.ts +++ b/src/i18n/locales/zh.ts @@ -6,7 +6,8 @@ export default { Post: '发布笔记', Home: '主页', Feed: 'Feed', - 'Favorites Feed': 'Favorites Feed', + 'Favorite Relays': '收藏的服务器', + 'All favorite relays': '所有收藏服务器', 'Pinned note': 'Pinned note', 'Relay settings': '服务器设置', Settings: '设置', @@ -418,7 +419,6 @@ export default { 'Searched {{count}} external relays; the note was still not found.', 'no more replies': '没有更多回复了', 'Relay sets': '服务器组', - 'Favorite Relays': '收藏的服务器', 'Search for Relays': 'Search for Relays', 'Using app default relays': 'Using app default relays', "Following's Favorites": '关注人的收藏', @@ -888,7 +888,6 @@ export default { 'Adding…': 'Adding…', 'Advanced Options': 'Advanced Options', 'All Topics': 'All Topics', - 'All favorite relays': 'All favorite relays', 'All feeds from OPML file are already added': 'All feeds from OPML file are already added', 'All items deleted successfully': 'All items deleted successfully', 'Already blocked': 'Already blocked', diff --git a/src/pages/primary/NoteListPage/index.tsx b/src/pages/primary/NoteListPage/index.tsx index 64e89152..ea030e27 100644 --- a/src/pages/primary/NoteListPage/index.tsx +++ b/src/pages/primary/NoteListPage/index.tsx @@ -19,10 +19,12 @@ import React, { useCallback, useEffect, useImperativeHandle, + useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' +import FavoriteRelaysFeedPicker from '@/components/FavoriteRelaysFeedPicker' import HelpAndAccountMenu from '@/components/HelpAndAccountMenu' import FollowingFeed from './FollowingFeed' import RelaysFeed from './RelaysFeed' @@ -146,6 +148,34 @@ const NoteListPage = forwardRef((_, ref) => { ) } + const showFavoriteRelaysPicker = + isReady && + (feedInfo.feedType === 'all-favorites' || + feedInfo.feedType === 'relay' || + feedInfo.feedType === 'relays') + + const feedPageTitle = useMemo( + () => + feedInfo.feedType === 'following' + ? t('Following') + : feedInfo.feedType === 'bookmarks' + ? t('Bookmarks') + : feedInfo.feedType === 'relays' + ? t('relayType_relay_set') + : t('Favorite Relays'), + [feedInfo.feedType, t] + ) + + const subHeader = ( + <> +
+

{feedPageTitle}

+
+ {showFavoriteRelaysPicker ? : null} + {homeSubHeader} + + ) + return ( ((_, ref) => { } /> } - subHeader={homeSubHeader ?? undefined} + subHeader={subHeader} displayScrollToTopButton >
@@ -192,6 +222,7 @@ function NoteListPageTitlebar({ const { navigate, current, display } = usePrimaryPage() const { primaryViewType, setPrimaryNoteView } = usePrimaryNoteView() const exploreActive = display && current === 'explore' && primaryViewType === null + return (
@@ -214,7 +245,6 @@ function NoteListPageTitlebar({ )} -
{t('Favorites Feed')}
{isSmallScreen && (
diff --git a/src/pages/primary/SpellsPage/index.tsx b/src/pages/primary/SpellsPage/index.tsx index 7c3bb90a..8d4e8397 100644 --- a/src/pages/primary/SpellsPage/index.tsx +++ b/src/pages/primary/SpellsPage/index.tsx @@ -29,7 +29,7 @@ import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useKindFilter } from '@/providers/KindFilterProvider' import { useNostr } from '@/providers/NostrProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import client from '@/services/client.service' import indexedDb from '@/services/indexed-db.service' import storage from '@/services/local-storage.service' diff --git a/src/pages/secondary/GeneralSettingsPage/index.tsx b/src/pages/secondary/GeneralSettingsPage/index.tsx index 878e63b4..323ea8a8 100644 --- a/src/pages/secondary/GeneralSettingsPage/index.tsx +++ b/src/pages/secondary/GeneralSettingsPage/index.tsx @@ -16,7 +16,7 @@ import { useContentPolicy } from '@/providers/ContentPolicyProvider' import { useFontSize } from '@/providers/FontSizeProvider' import { useTheme } from '@/providers/ThemeProvider' import { useUserPreferences } from '@/providers/UserPreferencesProvider' -import { useUserTrust } from '@/providers/UserTrustProvider' +import { useUserTrust } from '@/contexts/user-trust-context' import { TMediaAutoLoadPolicy } from '@/types' import { SelectValue } from '@radix-ui/react-select' import { ExternalLink } from 'lucide-react' diff --git a/src/pages/secondary/MuteListPage/index.tsx b/src/pages/secondary/MuteListPage/index.tsx index 5176bbbc..400bca8a 100644 --- a/src/pages/secondary/MuteListPage/index.tsx +++ b/src/pages/secondary/MuteListPage/index.tsx @@ -8,7 +8,7 @@ import Username from '@/components/Username' import { useFetchProfile } from '@/hooks' import SecondaryPageLayout from '@/layouts/SecondaryPageLayout' import { usePrimaryNoteView } from '@/contexts/primary-note-view-context' -import { useMuteList } from '@/providers/MuteListProvider' +import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' import { Lock, Unlock } from 'lucide-react' import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react' diff --git a/src/providers/MuteListProvider.tsx b/src/providers/MuteListProvider.tsx index bffb21e7..3cc657b2 100644 --- a/src/providers/MuteListProvider.tsx +++ b/src/providers/MuteListProvider.tsx @@ -6,12 +6,13 @@ import { removePubkeyFromPTags } from '@/lib/replaceable-list-latest' import { getPubkeysFromPTags } from '@/lib/tag' +import { MuteListContext } from '@/contexts/mute-list-context' import client from '@/services/client.service' import indexedDb from '@/services/indexed-db.service' import { kinds } from 'nostr-tools' import dayjs from 'dayjs' import { Event } from 'nostr-tools' -import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react' +import { useCallback, useEffect, useMemo, useState, type ReactNode } from 'react' import { useTranslation } from 'react-i18next' import { toast } from 'sonner' import { z } from 'zod' @@ -19,29 +20,7 @@ import { useNostr } from './NostrProvider' import { useFavoriteRelays } from './FavoriteRelaysProvider' import logger from '@/lib/logger' -type TMuteListContext = { - mutePubkeySet: Set - changing: boolean - getMutePubkeys: () => string[] - getMuteType: (pubkey: string) => 'public' | 'private' | null - mutePubkeyPublicly: (pubkey: string) => Promise - mutePubkeyPrivately: (pubkey: string) => Promise - unmutePubkey: (pubkey: string) => Promise - switchToPublicMute: (pubkey: string) => Promise - switchToPrivateMute: (pubkey: string) => Promise -} - -const MuteListContext = createContext(undefined) - -export const useMuteList = () => { - const context = useContext(MuteListContext) - if (!context) { - throw new Error('useMuteList must be used within a MuteListProvider') - } - return context -} - -export function MuteListProvider({ children }: { children: React.ReactNode }) { +export function MuteListProvider({ children }: { children: ReactNode }) { const { t } = useTranslation() const { pubkey: accountPubkey, diff --git a/src/providers/UserTrustProvider.tsx b/src/providers/UserTrustProvider.tsx index 0d60006a..317face2 100644 --- a/src/providers/UserTrustProvider.tsx +++ b/src/providers/UserTrustProvider.tsx @@ -2,32 +2,13 @@ import { replaceableEventService } from '@/services/client.service' import { getPubkeysFromPTags } from '@/lib/tag' import { kinds } from 'nostr-tools' import storage from '@/services/local-storage.service' -import { createContext, useCallback, useContext, useEffect, useState } from 'react' +import { UserTrustContext } from '@/contexts/user-trust-context' +import { type ReactNode, useCallback, useEffect, useState } from 'react' import { useNostr } from './NostrProvider' -type TUserTrustContext = { - hideUntrustedInteractions: boolean - hideUntrustedNotifications: boolean - hideUntrustedNotes: boolean - updateHideUntrustedInteractions: (hide: boolean) => void - updateHideUntrustedNotifications: (hide: boolean) => void - updateHideUntrustedNotes: (hide: boolean) => void - isUserTrusted: (pubkey: string) => boolean -} - -const UserTrustContext = createContext(undefined) - -export const useUserTrust = () => { - const context = useContext(UserTrustContext) - if (!context) { - throw new Error('useUserTrust must be used within a UserTrustProvider') - } - return context -} - const wotSet = new Set() -export function UserTrustProvider({ children }: { children: React.ReactNode }) { +export function UserTrustProvider({ children }: { children: ReactNode }) { const { pubkey: currentPubkey } = useNostr() const [hideUntrustedInteractions, setHideUntrustedInteractions] = useState(() => storage.getHideUntrustedInteractions()