Browse Source

restore right-side panel

update discussion feed relay selection
imwald
Silberengel 5 months ago
parent
commit
87cec27c53
  1. 88
      src/PageManager.tsx
  2. 7
      src/constants.ts
  3. 2
      src/i18n/locales/de.ts
  4. 2
      src/i18n/locales/en.ts
  5. 5
      src/pages/primary/DiscussionsPage/index.tsx
  6. 15
      src/pages/secondary/GeneralSettingsPage/index.tsx
  7. 18
      src/providers/UserPreferencesProvider.tsx
  8. 16
      src/services/local-storage.service.ts

88
src/PageManager.tsx

@ -13,7 +13,7 @@ import GeneralSettingsPage from '@/pages/secondary/GeneralSettingsPage' @@ -13,7 +13,7 @@ import GeneralSettingsPage from '@/pages/secondary/GeneralSettingsPage'
import TranslationPage from '@/pages/secondary/TranslationPage'
import { CurrentRelaysProvider } from '@/providers/CurrentRelaysProvider'
import { NotificationProvider } from '@/providers/NotificationProvider'
import { UserPreferencesProvider, useUserPreferences } from '@/providers/UserPreferencesProvider'
import { useUserPreferences } from '@/providers/UserPreferencesProvider'
import { TPageRef } from '@/types'
import {
cloneElement,
@ -118,12 +118,12 @@ export function usePrimaryNoteView() { @@ -118,12 +118,12 @@ export function usePrimaryNoteView() {
// Custom hook for intelligent note navigation
export function useSmartNoteNavigation() {
const { hideRecommendedRelaysPanel } = useUserPreferences()
const { showRecommendedRelaysPanel } = useUserPreferences()
const { push: pushSecondary } = useSecondaryPage()
const { setPrimaryNoteView } = usePrimaryNoteView()
const navigateToNote = (url: string) => {
if (hideRecommendedRelaysPanel) {
if (!showRecommendedRelaysPanel) {
// When right panel is hidden, show note in primary area
// Extract note ID from URL (e.g., "/notes/note1..." -> "note1...")
const noteId = url.replace('/notes/', '')
@ -139,12 +139,12 @@ export function useSmartNoteNavigation() { @@ -139,12 +139,12 @@ export function useSmartNoteNavigation() {
// Custom hook for intelligent relay navigation
export function useSmartRelayNavigation() {
const { hideRecommendedRelaysPanel } = useUserPreferences()
const { showRecommendedRelaysPanel } = useUserPreferences()
const { push: pushSecondary } = useSecondaryPage()
const { navigate: navigatePrimary } = usePrimaryPage()
const navigateToRelay = (url: string) => {
if (hideRecommendedRelaysPanel) {
if (!showRecommendedRelaysPanel) {
// When right panel is hidden, navigate to relay page in primary area
// Extract relay URL from the path (e.g., "/relays/wss%3A%2F%2F..." -> "wss://...")
const relayUrl = url.startsWith('/relays/') ? decodeURIComponent(url.replace('/relays/', '')) : url
@ -160,12 +160,12 @@ export function useSmartRelayNavigation() { @@ -160,12 +160,12 @@ export function useSmartRelayNavigation() {
// Custom hook for intelligent settings navigation
export function useSmartSettingsNavigation() {
const { hideRecommendedRelaysPanel } = useUserPreferences()
const { showRecommendedRelaysPanel } = useUserPreferences()
const { push: pushSecondary } = useSecondaryPage()
const { setPrimaryNoteView } = usePrimaryNoteView()
const navigateToSettings = (url: string) => {
if (hideRecommendedRelaysPanel) {
if (!showRecommendedRelaysPanel) {
// When right panel is hidden, show settings page in primary area
if (url === '/settings') {
setPrimaryNoteView(<SettingsPage index={0} hideTitlebar={true} />, 'settings')
@ -190,9 +190,9 @@ export function useSmartSettingsNavigation() { @@ -190,9 +190,9 @@ export function useSmartSettingsNavigation() {
}
function ConditionalHomePage() {
const { hideRecommendedRelaysPanel } = useUserPreferences()
const { showRecommendedRelaysPanel } = useUserPreferences()
if (hideRecommendedRelaysPanel) {
if (!showRecommendedRelaysPanel) {
return null
}
@ -214,16 +214,16 @@ function MainContentArea({ @@ -214,16 +214,16 @@ function MainContentArea({
primaryViewType: 'note' | 'settings' | 'settings-sub' | null
setPrimaryNoteView: (view: ReactNode | null, type?: 'note' | 'settings' | 'settings-sub') => void
}) {
const { hideRecommendedRelaysPanel } = useUserPreferences()
const { showRecommendedRelaysPanel } = useUserPreferences()
// If recommended relays panel is hidden, use single column layout
// Otherwise use two-column grid layout
const gridClass = hideRecommendedRelaysPanel ? "grid-cols-1" : "grid-cols-2"
// If recommended relays panel is shown, use two-column layout
// Otherwise use single column layout
const gridClass = showRecommendedRelaysPanel ? "grid-cols-2" : "grid-cols-1"
return (
<div className={`grid ${gridClass} gap-2 w-full pr-2 py-2`}>
<div className="rounded-lg shadow-lg bg-background overflow-hidden">
{hideRecommendedRelaysPanel && primaryNoteView ? (
{!showRecommendedRelaysPanel && primaryNoteView ? (
// Show note view with back button when right panel is hidden
<div className="flex flex-col h-full w-full">
<div className="flex gap-1 p-1 items-center justify-between font-semibold border-b">
@ -262,7 +262,7 @@ function MainContentArea({ @@ -262,7 +262,7 @@ function MainContentArea({
))
)}
</div>
{!hideRecommendedRelaysPanel && (
{showRecommendedRelaysPanel && (
<div className="rounded-lg shadow-lg bg-background overflow-hidden">
{secondaryStack.map((item, index) => (
<div
@ -507,39 +507,37 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) { @@ -507,39 +507,37 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) {
: 0
}}
>
<CurrentRelaysProvider>
<NotificationProvider>
<UserPreferencesProvider>
<PrimaryNoteViewContext.Provider value={{ setPrimaryNoteView }}>
{!!secondaryStack.length &&
secondaryStack.map((item, index) => (
<div
key={item.index}
style={{
display: index === secondaryStack.length - 1 ? 'block' : 'none'
}}
>
{item.component}
</div>
))}
{primaryPages.map(({ name, element, props }) => (
<CurrentRelaysProvider>
<NotificationProvider>
<PrimaryNoteViewContext.Provider value={{ setPrimaryNoteView }}>
{!!secondaryStack.length &&
secondaryStack.map((item, index) => (
<div
key={name}
key={item.index}
style={{
display:
secondaryStack.length === 0 && currentPrimaryPage === name ? 'block' : 'none'
display: index === secondaryStack.length - 1 ? 'block' : 'none'
}}
>
{props ? cloneElement(element as React.ReactElement, props) : element}
{item.component}
</div>
))}
<BottomNavigationBar />
<TooManyRelaysAlertDialog />
<CreateWalletGuideToast />
</PrimaryNoteViewContext.Provider>
</UserPreferencesProvider>
</NotificationProvider>
</CurrentRelaysProvider>
{primaryPages.map(({ name, element, props }) => (
<div
key={name}
style={{
display:
secondaryStack.length === 0 && currentPrimaryPage === name ? 'block' : 'none'
}}
>
{props ? cloneElement(element as React.ReactElement, props) : element}
</div>
))}
<BottomNavigationBar />
<TooManyRelaysAlertDialog />
<CreateWalletGuideToast />
</PrimaryNoteViewContext.Provider>
</NotificationProvider>
</CurrentRelaysProvider>
</SecondaryPageContext.Provider>
</PrimaryPageContext.Provider>
)
@ -562,8 +560,7 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) { @@ -562,8 +560,7 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) {
>
<CurrentRelaysProvider>
<NotificationProvider>
<UserPreferencesProvider>
<PrimaryNoteViewContext.Provider value={{ setPrimaryNoteView }}>
<PrimaryNoteViewContext.Provider value={{ setPrimaryNoteView }}>
<div className="flex flex-col items-center bg-surface-background">
<div
className="flex h-[var(--vh)] w-full bg-surface-background"
@ -584,8 +581,7 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) { @@ -584,8 +581,7 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) {
</div>
<TooManyRelaysAlertDialog />
<CreateWalletGuideToast />
</PrimaryNoteViewContext.Provider>
</UserPreferencesProvider>
</PrimaryNoteViewContext.Provider>
</NotificationProvider>
</CurrentRelaysProvider>
</SecondaryPageContext.Provider>

7
src/constants.ts

@ -45,7 +45,7 @@ export const StorageKey = { @@ -45,7 +45,7 @@ export const StorageKey = {
NOTIFICATION_LIST_STYLE: 'notificationListStyle',
MEDIA_AUTO_LOAD_POLICY: 'mediaAutoLoadPolicy',
SHOWN_CREATE_WALLET_GUIDE_TOAST_PUBKEYS: 'shownCreateWalletGuideToastPubkeys',
HIDE_RECOMMENDED_RELAYS_PANEL: 'hideRecommendedRelaysPanel',
SHOW_RECOMMENDED_RELAYS_PANEL: 'showRecommendedRelaysPanel',
MEDIA_UPLOAD_SERVICE: 'mediaUploadService', // deprecated
HIDE_UNTRUSTED_EVENTS: 'hideUntrustedEvents', // deprecated
ACCOUNT_RELAY_LIST_EVENT_MAP: 'accountRelayListEventMap', // deprecated
@ -65,10 +65,7 @@ export const BIG_RELAY_URLS = [ @@ -65,10 +65,7 @@ export const BIG_RELAY_URLS = [
'wss://theforest.nostr1.com',
'wss://orly-relay.imwald.eu',
'wss://nostr.land',
'wss://nostr.wine',
'wss://nostr.sovbit.host',
'wss://nostr21.com',
'wss://thecitadel.nostr1.com'
'wss://thecitadel.nostr1.com',
]
// Optimized relay list for read operations (includes aggregator)

2
src/i18n/locales/de.ts

@ -296,6 +296,8 @@ export default { @@ -296,6 +296,8 @@ export default {
Article: 'Artikel',
Unfavorite: 'Nicht mehr favorisieren',
'Recommended relays': 'Empfohlene Relays',
'Show recommended relays panel': 'Empfohlene Relays-Panel anzeigen',
'Display the right-side panel with recommended relays on desktop': 'Das rechte Panel mit empfohlenen Relays auf dem Desktop anzeigen',
'Blossom server URLs': 'Blossom-Server-URLs',
'You need to add at least one blossom server in order to upload media files.':
'Du musst mindestens einen Blossom-Server hinzufügen, um Mediendateien hochladen zu können.',

2
src/i18n/locales/en.ts

@ -301,6 +301,8 @@ export default { @@ -301,6 +301,8 @@ export default {
Article: 'Article',
Unfavorite: 'Unfavorite',
'Recommended relays': 'Recommended relays',
'Show recommended relays panel': 'Show recommended relays panel',
'Display the right-side panel with recommended relays on desktop': 'Display the right-side panel with recommended relays on desktop',
'Blossom server URLs': 'Blossom server URLs',
'You need to add at least one blossom server in order to upload media files.':
'You need to add at least one blossom server in order to upload media files.',

5
src/pages/primary/DiscussionsPage/index.tsx

@ -145,10 +145,11 @@ const DiscussionsPage = forwardRef((_, ref) => { @@ -145,10 +145,11 @@ const DiscussionsPage = forwardRef((_, ref) => {
}
}
// Use favorite relays from provider (includes stored relay sets) + user's read relays or fast read relays
// Use favorite relays from provider (includes stored relay sets) + user's read relays + fast read relays
const allRawRelays = [
...favoriteRelays,
...(userReadRelays.length > 0 ? userReadRelays : FAST_READ_RELAY_URLS)
...userReadRelays,
...FAST_READ_RELAY_URLS
]
// Normalize and deduplicate all relays

15
src/pages/secondary/GeneralSettingsPage/index.tsx

@ -30,7 +30,7 @@ const GeneralSettingsPage = forwardRef(({ index, hideTitlebar = false }: { index @@ -30,7 +30,7 @@ const GeneralSettingsPage = forwardRef(({ index, hideTitlebar = false }: { index
setMediaAutoLoadPolicy
} = useContentPolicy()
const { hideUntrustedNotes, updateHideUntrustedNotes } = useUserTrust()
const { notificationListStyle, updateNotificationListStyle } = useUserPreferences()
const { notificationListStyle, updateNotificationListStyle, showRecommendedRelaysPanel, updateShowRecommendedRelaysPanel } = useUserPreferences()
const handleLanguageChange = (value: TLanguage) => {
i18n.changeLanguage(value)
@ -151,6 +151,19 @@ const GeneralSettingsPage = forwardRef(({ index, hideTitlebar = false }: { index @@ -151,6 +151,19 @@ const GeneralSettingsPage = forwardRef(({ index, hideTitlebar = false }: { index
</Label>
<Switch id="show-nsfw" checked={defaultShowNsfw} onCheckedChange={setDefaultShowNsfw} />
</SettingItem>
<SettingItem>
<Label htmlFor="show-recommended-relays" className="text-base font-normal">
<div>{t('Show recommended relays panel')}</div>
<div className="text-muted-foreground">
{t('Display the right-side panel with recommended relays on desktop')}
</div>
</Label>
<Switch
id="show-recommended-relays"
checked={showRecommendedRelaysPanel}
onCheckedChange={updateShowRecommendedRelaysPanel}
/>
</SettingItem>
<SettingItem>
<div>
<a

18
src/providers/UserPreferencesProvider.tsx

@ -5,8 +5,8 @@ import { createContext, useContext, useState } from 'react' @@ -5,8 +5,8 @@ import { createContext, useContext, useState } from 'react'
type TUserPreferencesContext = {
notificationListStyle: TNotificationStyle
updateNotificationListStyle: (style: TNotificationStyle) => void
hideRecommendedRelaysPanel: boolean
updateHideRecommendedRelaysPanel: (hide: boolean) => void
showRecommendedRelaysPanel: boolean
updateShowRecommendedRelaysPanel: (show: boolean) => void
}
const UserPreferencesContext = createContext<TUserPreferencesContext | undefined>(undefined)
@ -23,8 +23,8 @@ export function UserPreferencesProvider({ children }: { children: React.ReactNod @@ -23,8 +23,8 @@ export function UserPreferencesProvider({ children }: { children: React.ReactNod
const [notificationListStyle, setNotificationListStyle] = useState(
storage.getNotificationListStyle()
)
const [hideRecommendedRelaysPanel, setHideRecommendedRelaysPanel] = useState(
storage.getHideRecommendedRelaysPanel()
const [showRecommendedRelaysPanel, setShowRecommendedRelaysPanel] = useState(
storage.getShowRecommendedRelaysPanel()
)
const updateNotificationListStyle = (style: TNotificationStyle) => {
@ -32,9 +32,9 @@ export function UserPreferencesProvider({ children }: { children: React.ReactNod @@ -32,9 +32,9 @@ export function UserPreferencesProvider({ children }: { children: React.ReactNod
storage.setNotificationListStyle(style)
}
const updateHideRecommendedRelaysPanel = (hide: boolean) => {
setHideRecommendedRelaysPanel(hide)
storage.setHideRecommendedRelaysPanel(hide)
const updateShowRecommendedRelaysPanel = (show: boolean) => {
setShowRecommendedRelaysPanel(show)
storage.setShowRecommendedRelaysPanel(show)
}
return (
@ -42,8 +42,8 @@ export function UserPreferencesProvider({ children }: { children: React.ReactNod @@ -42,8 +42,8 @@ export function UserPreferencesProvider({ children }: { children: React.ReactNod
value={{
notificationListStyle,
updateNotificationListStyle,
hideRecommendedRelaysPanel,
updateHideRecommendedRelaysPanel
showRecommendedRelaysPanel,
updateShowRecommendedRelaysPanel
}}
>
{children}

16
src/services/local-storage.service.ts

@ -49,7 +49,7 @@ class LocalStorageService { @@ -49,7 +49,7 @@ class LocalStorageService {
private hideContentMentioningMutedUsers: boolean = false
private notificationListStyle: TNotificationStyle = NOTIFICATION_LIST_STYLE.DETAILED
private mediaAutoLoadPolicy: TMediaAutoLoadPolicy = MEDIA_AUTO_LOAD_POLICY.ALWAYS
private hideRecommendedRelaysPanel: boolean = false
private showRecommendedRelaysPanel: boolean = true
private shownCreateWalletGuideToastPubkeys: Set<string> = new Set()
constructor() {
@ -165,8 +165,8 @@ class LocalStorageService { @@ -165,8 +165,8 @@ class LocalStorageService {
this.dismissedTooManyRelaysAlert =
window.localStorage.getItem(StorageKey.DISMISSED_TOO_MANY_RELAYS_ALERT) === 'true'
this.hideRecommendedRelaysPanel =
window.localStorage.getItem(StorageKey.HIDE_RECOMMENDED_RELAYS_PANEL) === 'true'
const storedValue = window.localStorage.getItem(StorageKey.SHOW_RECOMMENDED_RELAYS_PANEL)
this.showRecommendedRelaysPanel = storedValue !== 'false' // Default to true if not explicitly set to false
const showKindsStr = window.localStorage.getItem(StorageKey.SHOW_KINDS)
if (!showKindsStr) {
@ -460,13 +460,13 @@ class LocalStorageService { @@ -460,13 +460,13 @@ class LocalStorageService {
window.localStorage.setItem(StorageKey.DISMISSED_TOO_MANY_RELAYS_ALERT, dismissed.toString())
}
getHideRecommendedRelaysPanel() {
return this.hideRecommendedRelaysPanel
getShowRecommendedRelaysPanel() {
return this.showRecommendedRelaysPanel
}
setHideRecommendedRelaysPanel(hide: boolean) {
this.hideRecommendedRelaysPanel = hide
window.localStorage.setItem(StorageKey.HIDE_RECOMMENDED_RELAYS_PANEL, hide.toString())
setShowRecommendedRelaysPanel(show: boolean) {
this.showRecommendedRelaysPanel = show
window.localStorage.setItem(StorageKey.SHOW_RECOMMENDED_RELAYS_PANEL, show.toString())
}
getShowKinds() {

Loading…
Cancel
Save