@ -9,7 +9,7 @@ import indexedDb from '@/services/indexed-db.service'
@@ -9,7 +9,7 @@ import indexedDb from '@/services/indexed-db.service'
import storage from '@/services/local-storage.service'
import { TRelaySet } from '@/types'
import { Event , kinds } from 'nostr-tools'
import { useEffect , useState } from 'react'
import { useCallback , use Effect , useMemo , useState } from 'react'
import { FavoriteRelaysContext } from './favorite-relays-context'
import { useNostr } from './NostrProvider'
@ -148,7 +148,8 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
@@ -148,7 +148,8 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
)
} , [ relaySetEvents , blockedRelays ] )
const addFavoriteRelays = async ( relayUrls : string [ ] ) = > {
const addFavoriteRelays = useCallback (
async ( relayUrls : string [ ] ) = > {
const normalizedUrls = relayUrls
. map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) )
. filter ( ( url ) = > ! ! url && ! favoriteRelays . includes ( url ) )
@ -160,9 +161,12 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
@@ -160,9 +161,12 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
)
const newFavoriteRelaysEvent = await publish ( draftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
}
} ,
[ favoriteRelays , relaySetEvents , publish , updateFavoriteRelaysEvent ]
)
const deleteFavoriteRelays = async ( relayUrls : string [ ] ) = > {
const deleteFavoriteRelays = useCallback (
async ( relayUrls : string [ ] ) = > {
const normalizedUrls = relayUrls
. map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) )
. filter ( ( url ) = > ! ! url && favoriteRelays . includes ( url ) )
@ -174,9 +178,12 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
@@ -174,9 +178,12 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
)
const newFavoriteRelaysEvent = await publish ( draftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
}
} ,
[ favoriteRelays , relaySetEvents , publish , updateFavoriteRelaysEvent ]
)
const createRelaySet = async ( relaySetName : string , relayUrls : string [ ] = [ ] ) = > {
const createRelaySet = useCallback (
async ( relaySetName : string , relayUrls : string [ ] = [ ] ) = > {
const normalizedUrls = relayUrls
. map ( ( url ) = > normalizeUrl ( url ) )
. filter ( ( url ) = > isWebsocketUrl ( url ) )
@ -195,29 +202,46 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
@@ -195,29 +202,46 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
] )
const newFavoriteRelaysEvent = await publish ( favoriteRelaysDraftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
}
} ,
[ favoriteRelays , relaySetEvents , publish , updateFavoriteRelaysEvent ]
)
const addRelaySets = async ( newRelaySetEvents : Event [ ] ) = > {
const addRelaySets = useCallback (
async ( newRelaySetEvents : Event [ ] ) = > {
const favoriteRelaysDraftEvent = createFavoriteRelaysDraftEvent ( favoriteRelays , [
. . . relaySetEvents ,
. . . newRelaySetEvents
] )
const newFavoriteRelaysEvent = await publish ( favoriteRelaysDraftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
}
} ,
[ favoriteRelays , relaySetEvents , publish , updateFavoriteRelaysEvent ]
)
const deleteRelaySet = async ( id : string ) = > {
const deleteRelaySet = useCallback (
async ( id : string ) = > {
const newRelaySetEvents = relaySetEvents . filter ( ( event ) = > {
return getReplaceableEventIdentifier ( event ) !== id
} )
if ( newRelaySetEvents . length === relaySetEvents . length ) return
const previousRelaySetEvents = relaySetEvents
setRelaySetEvents ( newRelaySetEvents )
try {
const draftEvent = createFavoriteRelaysDraftEvent ( favoriteRelays , newRelaySetEvents )
const newFavoriteRelaysEvent = await publish ( draftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
await updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
} catch ( e ) {
setRelaySetEvents ( previousRelaySetEvents )
throw e
}
} ,
[ favoriteRelays , relaySetEvents , publish , updateFavoriteRelaysEvent ]
)
const updateRelaySet = async ( newSet : TRelaySet ) = > {
const updateRelaySet = useCallback (
async ( newSet : TRelaySet ) = > {
const draftEvent = createRelaySetDraftEvent ( newSet )
const newRelaySetEvent = await publish ( draftEvent )
await indexedDb . putReplaceableEvent ( newRelaySetEvent )
@ -230,16 +254,22 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
@@ -230,16 +254,22 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
return event
} )
} )
}
} ,
[ publish ]
)
const reorderFavoriteRelays = async ( reorderedRelays : string [ ] ) = > {
const reorderFavoriteRelays = useCallback (
async ( reorderedRelays : string [ ] ) = > {
setFavoriteRelays ( reorderedRelays )
const draftEvent = createFavoriteRelaysDraftEvent ( reorderedRelays , relaySetEvents )
const newFavoriteRelaysEvent = await publish ( draftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
}
} ,
[ relaySetEvents , publish , updateFavoriteRelaysEvent ]
)
const addBlockedRelays = async ( relayUrls : string [ ] ) = > {
const addBlockedRelays = useCallback (
async ( relayUrls : string [ ] ) = > {
const normalizedUrls = relayUrls
. map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) )
. filter ( ( url ) = > ! ! url && ! blockedRelays . includes ( url ) )
@ -249,18 +279,24 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
@@ -249,18 +279,24 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
const draftEvent = createBlockedRelaysDraftEvent ( newBlockedRelays )
const newBlockedRelaysEvent = await publish ( draftEvent )
updateBlockedRelaysEvent ( newBlockedRelaysEvent )
}
} ,
[ blockedRelays , publish , updateBlockedRelaysEvent ]
)
const deleteBlockedRelays = async ( relayUrls : string [ ] ) = > {
const deleteBlockedRelays = useCallback (
async ( relayUrls : string [ ] ) = > {
const normalizedUrls = relayUrls . map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) ) . filter ( Boolean )
const newBlockedRelays = blockedRelays . filter ( ( relay ) = > ! normalizedUrls . includes ( relay ) )
setBlockedRelays ( newBlockedRelays )
const draftEvent = createBlockedRelaysDraftEvent ( newBlockedRelays )
const newBlockedRelaysEvent = await publish ( draftEvent )
updateBlockedRelaysEvent ( newBlockedRelaysEvent )
}
} ,
[ blockedRelays , publish , updateBlockedRelaysEvent ]
)
const reorderRelaySets = async ( reorderedSets : TRelaySet [ ] ) = > {
const reorderRelaySets = useCallback (
async ( reorderedSets : TRelaySet [ ] ) = > {
setRelaySets ( reorderedSets )
const draftEvent = createFavoriteRelaysDraftEvent (
favoriteRelays ,
@ -268,11 +304,12 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
@@ -268,11 +304,12 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
)
const newFavoriteRelaysEvent = await publish ( draftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
}
} ,
[ favoriteRelays , publish , updateFavoriteRelaysEvent ]
)
return (
< FavoriteRelaysContext.Provider
value = { {
const contextValue = useMemo (
( ) = > ( {
favoriteRelays ,
addFavoriteRelays ,
deleteFavoriteRelays ,
@ -286,8 +323,26 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
@@ -286,8 +323,26 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
deleteRelaySet ,
updateRelaySet ,
reorderRelaySets
} }
>
} ) ,
[
favoriteRelays ,
blockedRelays ,
relaySets ,
addFavoriteRelays ,
deleteFavoriteRelays ,
reorderFavoriteRelays ,
addBlockedRelays ,
deleteBlockedRelays ,
createRelaySet ,
addRelaySets ,
deleteRelaySet ,
updateRelaySet ,
reorderRelaySets
]
)
return (
< FavoriteRelaysContext.Provider value = { contextValue } >
{ children }
< / FavoriteRelaysContext.Provider >
)