From 5c2a016d4b25cfdf960ada16b693a640d03256b1 Mon Sep 17 00:00:00 2001 From: codytseng Date: Sun, 19 Oct 2025 15:46:45 +0800 Subject: [PATCH] refactor: move bookmarks entry location --- src/PageManager.tsx | 7 ++-- src/components/FeedSwitcher/index.tsx | 20 +---------- src/components/Sidebar/BookmarkButton.tsx | 20 +++++++++++ src/components/Sidebar/index.tsx | 4 +++ src/lib/link.ts | 3 +- src/pages/primary/BookmarkPage/index.tsx | 35 +++++++++++++++++++ src/pages/primary/MePage/index.tsx | 8 +++-- src/pages/primary/NoteListPage/FeedButton.tsx | 13 ++----- src/pages/primary/NoteListPage/index.tsx | 13 ------- src/pages/secondary/BookmarkPage/index.tsx | 16 +++++++++ src/providers/FeedProvider.tsx | 19 ---------- src/routes.tsx | 4 ++- src/types/index.d.ts | 2 +- 13 files changed, 95 insertions(+), 69 deletions(-) create mode 100644 src/components/Sidebar/BookmarkButton.tsx create mode 100644 src/pages/primary/BookmarkPage/index.tsx create mode 100644 src/pages/secondary/BookmarkPage/index.tsx diff --git a/src/PageManager.tsx b/src/PageManager.tsx index 5bd5bfad..e4ebfb62 100644 --- a/src/PageManager.tsx +++ b/src/PageManager.tsx @@ -20,6 +20,7 @@ import BottomNavigationBar from './components/BottomNavigationBar' import CreateWalletGuideToast from './components/CreateWalletGuideToast' import TooManyRelaysAlertDialog from './components/TooManyRelaysAlertDialog' import { normalizeUrl } from './lib/url' +import BookmarkPage from './pages/primary/BookmarkPage' import ExplorePage from './pages/primary/ExplorePage' import MePage from './pages/primary/MePage' import NotificationListPage from './pages/primary/NotificationListPage' @@ -61,7 +62,8 @@ const PRIMARY_PAGE_REF_MAP = { me: createRef(), profile: createRef(), relay: createRef(), - search: createRef() + search: createRef(), + bookmark: createRef() } const PRIMARY_PAGE_MAP = { @@ -71,7 +73,8 @@ const PRIMARY_PAGE_MAP = { me: , profile: , relay: , - search: + search: , + bookmark: } const PrimaryPageContext = createContext(undefined) diff --git a/src/components/FeedSwitcher/index.tsx b/src/components/FeedSwitcher/index.tsx index d9c76593..bd094856 100644 --- a/src/components/FeedSwitcher/index.tsx +++ b/src/components/FeedSwitcher/index.tsx @@ -4,7 +4,7 @@ import { SecondaryPageLink } from '@/PageManager' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useFeed } from '@/providers/FeedProvider' import { useNostr } from '@/providers/NostrProvider' -import { BookmarkIcon, UsersRound } from 'lucide-react' +import { UsersRound } from 'lucide-react' import { useTranslation } from 'react-i18next' import RelayIcon from '../RelayIcon' import RelaySetCard from '../RelaySetCard' @@ -35,24 +35,6 @@ export default function FeedSwitcher({ close }: { close?: () => void }) { )} - {pubkey && ( - { - if (!pubkey) return - switchFeed('bookmarks', { pubkey }) - close?.() - }} - > -
-
- -
-
{t('Bookmarks')}
-
-
- )} -
checkLogin(() => navigate('bookmark'))} + active={current === 'bookmark'} + collapse={collapse} + > + + + ) +} diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx index 2d71de8b..b3f6fa9f 100644 --- a/src/components/Sidebar/index.tsx +++ b/src/components/Sidebar/index.tsx @@ -1,11 +1,13 @@ import Icon from '@/assets/Icon' import Logo from '@/assets/Logo' import { cn } from '@/lib/utils' +import { useNostr } from '@/providers/NostrProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' import { useTheme } from '@/providers/ThemeProvider' import { useUserPreferences } from '@/providers/UserPreferencesProvider' import { ChevronsLeft, ChevronsRight } from 'lucide-react' import AccountButton from './AccountButton' +import BookmarkButton from './BookmarkButton' import RelaysButton from './ExploreButton' import HomeButton from './HomeButton' import NotificationsButton from './NotificationButton' @@ -18,6 +20,7 @@ export default function PrimaryPageSidebar() { const { isSmallScreen } = useScreenSize() const { themeSetting } = useTheme() const { sidebarCollapse, updateSidebarCollapse, enableSingleColumnLayout } = useUserPreferences() + const { pubkey } = useNostr() if (isSmallScreen) return null @@ -43,6 +46,7 @@ export default function PrimaryPageSidebar() { + {pubkey && }
diff --git a/src/lib/link.ts b/src/lib/link.ts index c799d3ee..1cf80405 100644 --- a/src/lib/link.ts +++ b/src/lib/link.ts @@ -1,6 +1,6 @@ +import { TSearchParams } from '@/types' import { Event, nip19 } from 'nostr-tools' import { getNoteBech32Id } from './event' -import { TSearchParams } from '@/types' export const toHome = () => '/' export const toNote = (eventOrId: Event | string) => { @@ -76,6 +76,7 @@ export const toRelay = (url: string) => `/relays/${encodeURIComponent(url)}` export const toRelayReviews = (url: string) => `/relays/${encodeURIComponent(url)}/reviews` export const toMuteList = () => '/mutes' export const toRizful = () => '/rizful' +export const toBookmarks = () => '/bookmarks' export const toChachiChat = (relay: string, d: string) => { return `https://chachi.chat/${relay.replace(/^wss?:\/\//, '').replace(/\/$/, '')}/${d}` diff --git a/src/pages/primary/BookmarkPage/index.tsx b/src/pages/primary/BookmarkPage/index.tsx new file mode 100644 index 00000000..9cc5a27f --- /dev/null +++ b/src/pages/primary/BookmarkPage/index.tsx @@ -0,0 +1,35 @@ +import BookmarkList from '@/components/BookmarkList' +import PrimaryPageLayout from '@/layouts/PrimaryPageLayout' +import { TPageRef } from '@/types' +import { BookmarkIcon } from 'lucide-react' +import { forwardRef, useImperativeHandle, useRef } from 'react' +import { useTranslation } from 'react-i18next' + +const BookmarkPage = forwardRef((_, ref) => { + const layoutRef = useRef(null) + useImperativeHandle(ref, () => layoutRef.current) + + return ( + } + displayScrollToTopButton + > + + + ) +}) +BookmarkPage.displayName = 'BookmarkPage' +export default BookmarkPage + +function BookmarkPageTitlebar() { + const { t } = useTranslation() + + return ( +
+ +
{t('Bookmarks')}
+
+ ) +} diff --git a/src/pages/primary/MePage/index.tsx b/src/pages/primary/MePage/index.tsx index e4ba3d68..dcb842d8 100644 --- a/src/pages/primary/MePage/index.tsx +++ b/src/pages/primary/MePage/index.tsx @@ -1,19 +1,20 @@ import AccountManager from '@/components/AccountManager' import LoginDialog from '@/components/LoginDialog' import LogoutDialog from '@/components/LogoutDialog' -import PubkeyCopy from '@/components/PubkeyCopy' import NpubQrCode from '@/components/NpubQrCode' +import PubkeyCopy from '@/components/PubkeyCopy' import { Button } from '@/components/ui/button' import { Separator } from '@/components/ui/separator' import { SimpleUserAvatar } from '@/components/UserAvatar' import { SimpleUsername } from '@/components/Username' import PrimaryPageLayout from '@/layouts/PrimaryPageLayout' -import { toProfile, toRelaySettings, toSettings, toWallet } from '@/lib/link' +import { toBookmarks, toProfile, toRelaySettings, toSettings, toWallet } from '@/lib/link' import { cn } from '@/lib/utils' import { useSecondaryPage } from '@/PageManager' import { useNostr } from '@/providers/NostrProvider' import { ArrowDownUp, + Bookmark, ChevronRight, LogOut, Server, @@ -75,6 +76,9 @@ const MePage = forwardRef((_, ref) => { push(toRelaySettings())}> {t('Relays')} + push(toBookmarks())}> + {t('Bookmarks')} + push(toWallet())}> {t('Wallet')} diff --git a/src/pages/primary/NoteListPage/FeedButton.tsx b/src/pages/primary/NoteListPage/FeedButton.tsx index c3389586..5c50ff77 100644 --- a/src/pages/primary/NoteListPage/FeedButton.tsx +++ b/src/pages/primary/NoteListPage/FeedButton.tsx @@ -6,7 +6,7 @@ import { cn } from '@/lib/utils' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useFeed } from '@/providers/FeedProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' -import { BookmarkIcon, ChevronDown, Server, UsersRound } from 'lucide-react' +import { ChevronDown, Server, UsersRound } from 'lucide-react' import { forwardRef, HTMLAttributes, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' @@ -62,9 +62,6 @@ const FeedSwitcherTrigger = forwardRef - {feedInfo.feedType === 'following' ? ( - - ) : feedInfo.feedType === 'bookmarks' ? ( - - ) : ( - - )} + {feedInfo.feedType === 'following' ? : }
{title}
diff --git a/src/pages/primary/NoteListPage/index.tsx b/src/pages/primary/NoteListPage/index.tsx index 5af33a59..9c4f020d 100644 --- a/src/pages/primary/NoteListPage/index.tsx +++ b/src/pages/primary/NoteListPage/index.tsx @@ -1,5 +1,4 @@ import { useSecondaryPage } from '@/PageManager' -import BookmarkList from '@/components/BookmarkList' import PostEditor from '@/components/PostEditor' import RelayInfo from '@/components/RelayInfo' import { Button } from '@/components/ui/button' @@ -60,18 +59,6 @@ const NoteListPage = forwardRef((_, ref) => { ) - } else if (feedInfo.feedType === 'bookmarks') { - if (!pubkey) { - content = ( -
- -
- ) - } else { - content = - } } else if (feedInfo.feedType === 'following') { content = } else { diff --git a/src/pages/secondary/BookmarkPage/index.tsx b/src/pages/secondary/BookmarkPage/index.tsx new file mode 100644 index 00000000..574e04fe --- /dev/null +++ b/src/pages/secondary/BookmarkPage/index.tsx @@ -0,0 +1,16 @@ +import BookmarkList from '@/components/BookmarkList' +import SecondaryPageLayout from '@/layouts/SecondaryPageLayout' +import { forwardRef } from 'react' +import { useTranslation } from 'react-i18next' + +const BookmarkPage = forwardRef(({ index }: { index?: number }, ref) => { + const { t } = useTranslation() + + return ( + + + + ) +}) +BookmarkPage.displayName = 'BookmarkPage' +export default BookmarkPage diff --git a/src/providers/FeedProvider.tsx b/src/providers/FeedProvider.tsx index c9256682..492d7445 100644 --- a/src/providers/FeedProvider.tsx +++ b/src/providers/FeedProvider.tsx @@ -69,10 +69,6 @@ export function FeedProvider({ children }: { children: React.ReactNode }) { if (feedInfo.feedType === 'following' && pubkey) { return await switchFeed('following', { pubkey }) } - - if (feedInfo.feedType === 'bookmarks' && pubkey) { - return await switchFeed('bookmarks', { pubkey }) - } } init() @@ -147,21 +143,6 @@ export function FeedProvider({ children }: { children: React.ReactNode }) { setIsReady(true) return } - if (feedType === 'bookmarks') { - if (!options.pubkey) { - setIsReady(true) - return - } - - const newFeedInfo = { feedType } - setFeedInfo(newFeedInfo) - feedInfoRef.current = newFeedInfo - storage.setFeedInfo(newFeedInfo, pubkey) - - setRelayUrls([]) - setIsReady(true) - return - } setIsReady(true) } diff --git a/src/routes.tsx b/src/routes.tsx index db4f745f..7cb9e053 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -1,6 +1,7 @@ import { match } from 'path-to-regexp' import { isValidElement } from 'react' import AppearanceSettingsPage from './pages/secondary/AppearanceSettingsPage' +import BookmarkPage from './pages/secondary/BookmarkPage' import FollowingListPage from './pages/secondary/FollowingListPage' import GeneralSettingsPage from './pages/secondary/GeneralSettingsPage' import MuteListPage from './pages/secondary/MuteListPage' @@ -39,7 +40,8 @@ const ROUTES = [ { path: '/settings/translation', element: }, { path: '/profile-editor', element: }, { path: '/mutes', element: }, - { path: '/rizful', element: } + { path: '/rizful', element: }, + { path: '/bookmarks', element: } ] export const routes = ROUTES.map(({ path, element }) => ({ diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 82d52804..bb91f332 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -106,7 +106,7 @@ export type TAccount = { export type TAccountPointer = Pick -export type TFeedType = 'following' | 'relays' | 'relay' | 'bookmarks' +export type TFeedType = 'following' | 'relays' | 'relay' export type TFeedInfo = { feedType: TFeedType; id?: string } export type TLanguage = 'en' | 'zh' | 'pl'