fix: unable to publish to currently browsed relay
This commit is contained in:
@@ -2,6 +2,7 @@ import Sidebar from '@/components/Sidebar'
|
|||||||
import { cn } from '@/lib/utils'
|
import { cn } from '@/lib/utils'
|
||||||
import NoteListPage from '@/pages/primary/NoteListPage'
|
import NoteListPage from '@/pages/primary/NoteListPage'
|
||||||
import HomePage from '@/pages/secondary/HomePage'
|
import HomePage from '@/pages/secondary/HomePage'
|
||||||
|
import { CurrentRelaysProvider } from '@/providers/CurrentRelaysProvider'
|
||||||
import { TPageRef } from '@/types'
|
import { TPageRef } from '@/types'
|
||||||
import {
|
import {
|
||||||
cloneElement,
|
cloneElement,
|
||||||
@@ -291,32 +292,34 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) {
|
|||||||
: 0
|
: 0
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<NotificationProvider>
|
<CurrentRelaysProvider>
|
||||||
{!!secondaryStack.length &&
|
<NotificationProvider>
|
||||||
secondaryStack.map((item, index) => (
|
{!!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 }) => (
|
||||||
<div
|
<div
|
||||||
key={item.index}
|
key={name}
|
||||||
style={{
|
style={{
|
||||||
display: index === secondaryStack.length - 1 ? 'block' : 'none'
|
display:
|
||||||
|
secondaryStack.length === 0 && currentPrimaryPage === name ? 'block' : 'none'
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{item.component}
|
{props ? cloneElement(element as React.ReactElement, props) : element}
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
{primaryPages.map(({ name, element, props }) => (
|
<BottomNavigationBar />
|
||||||
<div
|
<TooManyRelaysAlertDialog />
|
||||||
key={name}
|
</NotificationProvider>
|
||||||
style={{
|
</CurrentRelaysProvider>
|
||||||
display:
|
|
||||||
secondaryStack.length === 0 && currentPrimaryPage === name ? 'block' : 'none'
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{props ? cloneElement(element as React.ReactElement, props) : element}
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
<BottomNavigationBar />
|
|
||||||
<TooManyRelaysAlertDialog />
|
|
||||||
</NotificationProvider>
|
|
||||||
</SecondaryPageContext.Provider>
|
</SecondaryPageContext.Provider>
|
||||||
</PrimaryPageContext.Provider>
|
</PrimaryPageContext.Provider>
|
||||||
)
|
)
|
||||||
@@ -337,45 +340,47 @@ export function PageManager({ maxStackSize = 5 }: { maxStackSize?: number }) {
|
|||||||
currentIndex: secondaryStack.length ? secondaryStack[secondaryStack.length - 1].index : 0
|
currentIndex: secondaryStack.length ? secondaryStack[secondaryStack.length - 1].index : 0
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<NotificationProvider>
|
<CurrentRelaysProvider>
|
||||||
<div className="flex h-screen overflow-hidden bg-surface-background">
|
<NotificationProvider>
|
||||||
<Sidebar />
|
<div className="flex h-screen overflow-hidden bg-surface-background">
|
||||||
<div className="grid grid-cols-2 gap-2 w-full pr-2">
|
<Sidebar />
|
||||||
<div className="flex rounded-lg my-2 max-h-screen shadow-md bg-background overflow-hidden">
|
<div className="grid grid-cols-2 gap-2 w-full pr-2">
|
||||||
{primaryPages.map(({ name, element, props }) => (
|
<div className="flex rounded-lg my-2 max-h-screen shadow-md bg-background overflow-hidden">
|
||||||
|
{primaryPages.map(({ name, element, props }) => (
|
||||||
|
<div
|
||||||
|
key={name}
|
||||||
|
className="w-full"
|
||||||
|
style={{
|
||||||
|
display: currentPrimaryPage === name ? 'block' : 'none'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{props ? cloneElement(element as React.ReactElement, props) : element}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="flex rounded-lg my-2 max-h-screen shadow-md bg-background overflow-hidden">
|
||||||
|
{secondaryStack.map((item, index) => (
|
||||||
|
<div
|
||||||
|
key={item.index}
|
||||||
|
className="w-full"
|
||||||
|
style={{ display: index === secondaryStack.length - 1 ? 'block' : 'none' }}
|
||||||
|
>
|
||||||
|
{item.component}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
<div
|
<div
|
||||||
key={name}
|
key="home"
|
||||||
className="w-full"
|
className="w-full"
|
||||||
style={{
|
style={{ display: secondaryStack.length === 0 ? 'block' : 'none' }}
|
||||||
display: currentPrimaryPage === name ? 'block' : 'none'
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
{props ? cloneElement(element as React.ReactElement, props) : element}
|
<HomePage />
|
||||||
</div>
|
</div>
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
<div className="flex rounded-lg my-2 max-h-screen shadow-md bg-background overflow-hidden">
|
|
||||||
{secondaryStack.map((item, index) => (
|
|
||||||
<div
|
|
||||||
key={item.index}
|
|
||||||
className="w-full"
|
|
||||||
style={{ display: index === secondaryStack.length - 1 ? 'block' : 'none' }}
|
|
||||||
>
|
|
||||||
{item.component}
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
<div
|
|
||||||
key="home"
|
|
||||||
className="w-full"
|
|
||||||
style={{ display: secondaryStack.length === 0 ? 'block' : 'none' }}
|
|
||||||
>
|
|
||||||
<HomePage />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<TooManyRelaysAlertDialog />
|
||||||
<TooManyRelaysAlertDialog />
|
</NotificationProvider>
|
||||||
</NotificationProvider>
|
</CurrentRelaysProvider>
|
||||||
</SecondaryPageContext.Provider>
|
</SecondaryPageContext.Provider>
|
||||||
</PrimaryPageContext.Provider>
|
</PrimaryPageContext.Provider>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover
|
|||||||
import { Switch } from '@/components/ui/switch'
|
import { Switch } from '@/components/ui/switch'
|
||||||
import { isProtectedEvent } from '@/lib/event'
|
import { isProtectedEvent } from '@/lib/event'
|
||||||
import { simplifyUrl } from '@/lib/url'
|
import { simplifyUrl } from '@/lib/url'
|
||||||
import { useFeed } from '@/providers/FeedProvider'
|
import { useCurrentRelays } from '@/providers/CurrentRelaysProvider'
|
||||||
import client from '@/services/client.service'
|
import client from '@/services/client.service'
|
||||||
import { Info } from 'lucide-react'
|
import { Info } from 'lucide-react'
|
||||||
import { Event } from 'nostr-tools'
|
import { Event } from 'nostr-tools'
|
||||||
@@ -20,12 +20,12 @@ export default function SendOnlyToSwitch({
|
|||||||
setSpecifiedRelayUrls: Dispatch<SetStateAction<string[] | undefined>>
|
setSpecifiedRelayUrls: Dispatch<SetStateAction<string[] | undefined>>
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const { relayUrls } = useFeed()
|
const { currentRelayUrls } = useCurrentRelays()
|
||||||
const [urls, setUrls] = useState<string[]>([])
|
const [urls, setUrls] = useState<string[]>([])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!parentEvent) {
|
if (!parentEvent) {
|
||||||
setUrls(relayUrls)
|
setUrls(currentRelayUrls)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const isProtected = isProtectedEvent(parentEvent)
|
const isProtected = isProtectedEvent(parentEvent)
|
||||||
@@ -34,9 +34,9 @@ export default function SendOnlyToSwitch({
|
|||||||
setSpecifiedRelayUrls(seenOn)
|
setSpecifiedRelayUrls(seenOn)
|
||||||
setUrls(seenOn)
|
setUrls(seenOn)
|
||||||
} else {
|
} else {
|
||||||
setUrls(relayUrls)
|
setUrls(currentRelayUrls)
|
||||||
}
|
}
|
||||||
}, [parentEvent, relayUrls])
|
}, [parentEvent, currentRelayUrls])
|
||||||
|
|
||||||
if (!urls.length) return null
|
if (!urls.length) return null
|
||||||
|
|
||||||
|
|||||||
@@ -2,12 +2,20 @@ import Relay from '@/components/Relay'
|
|||||||
import RelayPageControls from '@/components/RelayPageControls'
|
import RelayPageControls from '@/components/RelayPageControls'
|
||||||
import PrimaryPageLayout from '@/layouts/PrimaryPageLayout'
|
import PrimaryPageLayout from '@/layouts/PrimaryPageLayout'
|
||||||
import { normalizeUrl, simplifyUrl } from '@/lib/url'
|
import { normalizeUrl, simplifyUrl } from '@/lib/url'
|
||||||
|
import { useCurrentRelays } from '@/providers/CurrentRelaysProvider'
|
||||||
import { Server } from 'lucide-react'
|
import { Server } from 'lucide-react'
|
||||||
import { forwardRef, useMemo } from 'react'
|
import { forwardRef, useEffect, useMemo } from 'react'
|
||||||
|
|
||||||
const RelayPage = forwardRef(({ url }: { url?: string }, ref) => {
|
const RelayPage = forwardRef(({ url }: { url?: string }, ref) => {
|
||||||
|
const { setTemporaryRelayUrls } = useCurrentRelays()
|
||||||
const normalizedUrl = useMemo(() => (url ? normalizeUrl(url) : undefined), [url])
|
const normalizedUrl = useMemo(() => (url ? normalizeUrl(url) : undefined), [url])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (normalizedUrl) {
|
||||||
|
setTemporaryRelayUrls([normalizedUrl])
|
||||||
|
}
|
||||||
|
}, [normalizedUrl])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PrimaryPageLayout
|
<PrimaryPageLayout
|
||||||
pageName="relay"
|
pageName="relay"
|
||||||
|
|||||||
35
src/providers/CurrentRelaysProvider.tsx
Normal file
35
src/providers/CurrentRelaysProvider.tsx
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import { usePrimaryPage } from '@/PageManager'
|
||||||
|
import { createContext, useContext, useEffect, useState } from 'react'
|
||||||
|
import { useFeed } from './FeedProvider'
|
||||||
|
|
||||||
|
type TCurrentRelaysContext = {
|
||||||
|
currentRelayUrls: string[]
|
||||||
|
setTemporaryRelayUrls: (urls: string[]) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
const CurrentRelaysContext = createContext<TCurrentRelaysContext | undefined>(undefined)
|
||||||
|
|
||||||
|
export const useCurrentRelays = () => {
|
||||||
|
const context = useContext(CurrentRelaysContext)
|
||||||
|
if (!context) {
|
||||||
|
throw new Error('useCurrentRelays must be used within a CurrentRelaysProvider')
|
||||||
|
}
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
|
||||||
|
export function CurrentRelaysProvider({ children }: { children: React.ReactNode }) {
|
||||||
|
const { current } = usePrimaryPage()
|
||||||
|
const { relayUrls } = useFeed()
|
||||||
|
const [currentRelayUrls, setCurrentRelayUrls] = useState<string[]>([])
|
||||||
|
const [temporaryRelayUrls, setTemporaryRelayUrls] = useState<string[]>([])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setCurrentRelayUrls(current === 'relay' ? temporaryRelayUrls : relayUrls)
|
||||||
|
}, [temporaryRelayUrls, current, relayUrls])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<CurrentRelaysContext.Provider value={{ currentRelayUrls, setTemporaryRelayUrls }}>
|
||||||
|
{children}
|
||||||
|
</CurrentRelaysContext.Provider>
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user