@ -9,7 +9,7 @@ import indexedDb from '@/services/indexed-db.service'
import storage from '@/services/local-storage.service'
import storage from '@/services/local-storage.service'
import { TRelaySet } from '@/types'
import { TRelaySet } from '@/types'
import { Event , kinds } from 'nostr-tools'
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 { FavoriteRelaysContext } from './favorite-relays-context'
import { useNostr } from './NostrProvider'
import { useNostr } from './NostrProvider'
@ -148,146 +148,201 @@ export function FavoriteRelaysProvider({ children }: { children: React.ReactNode
)
)
} , [ relaySetEvents , blockedRelays ] )
} , [ relaySetEvents , blockedRelays ] )
const addFavoriteRelays = async ( relayUrls : string [ ] ) = > {
const addFavoriteRelays = useCallback (
const normalizedUrls = relayUrls
async ( relayUrls : string [ ] ) = > {
. map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) )
const normalizedUrls = relayUrls
. filter ( ( url ) = > ! ! url && ! favoriteRelays . includes ( url ) )
. map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) )
if ( ! normalizedUrls . length ) return
. filter ( ( url ) = > ! ! url && ! favoriteRelays . includes ( url ) )
if ( ! normalizedUrls . length ) return
const draftEvent = createFavoriteRelaysDraftEvent (
const draftEvent = createFavoriteRelaysDraftEvent (
[ . . . favoriteRelays , . . . normalizedUrls ] ,
[ . . . favoriteRelays , . . . normalizedUrls ] ,
relaySetEvents
relaySetEvents
)
)
const newFavoriteRelaysEvent = await publish ( draftEvent )
const newFavoriteRelaysEvent = await publish ( draftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
}
} ,
[ favoriteRelays , relaySetEvents , publish , updateFavoriteRelaysEvent ]
const deleteFavoriteRelays = async ( relayUrls : string [ ] ) = > {
)
const normalizedUrls = relayUrls
. map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) )
const deleteFavoriteRelays = useCallback (
. filter ( ( url ) = > ! ! url && favoriteRelays . includes ( url ) )
async ( relayUrls : string [ ] ) = > {
if ( ! normalizedUrls . length ) return
const normalizedUrls = relayUrls
. map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) )
const draftEvent = createFavoriteRelaysDraftEvent (
. filter ( ( url ) = > ! ! url && favoriteRelays . includes ( url ) )
favoriteRelays . filter ( ( url ) = > ! normalizedUrls . includes ( url ) ) ,
if ( ! normalizedUrls . length ) return
relaySetEvents
)
const draftEvent = createFavoriteRelaysDraftEvent (
const newFavoriteRelaysEvent = await publish ( draftEvent )
favoriteRelays . filter ( ( url ) = > ! normalizedUrls . includes ( url ) ) ,
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
relaySetEvents
}
)
const newFavoriteRelaysEvent = await publish ( draftEvent )
const createRelaySet = async ( relaySetName : string , relayUrls : string [ ] = [ ] ) = > {
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
const normalizedUrls = relayUrls
} ,
. map ( ( url ) = > normalizeUrl ( url ) )
[ favoriteRelays , relaySetEvents , publish , updateFavoriteRelaysEvent ]
. filter ( ( url ) = > isWebsocketUrl ( url ) )
)
const id = randomString ( )
const relaySetDraftEvent = createRelaySetDraftEvent ( {
const createRelaySet = useCallback (
id ,
async ( relaySetName : string , relayUrls : string [ ] = [ ] ) = > {
name : relaySetName ,
const normalizedUrls = relayUrls
relayUrls : normalizedUrls
. map ( ( url ) = > normalizeUrl ( url ) )
} )
. filter ( ( url ) = > isWebsocketUrl ( url ) )
const newRelaySetEvent = await publish ( relaySetDraftEvent )
const id = randomString ( )
await indexedDb . putReplaceableEvent ( newRelaySetEvent )
const relaySetDraftEvent = createRelaySetDraftEvent ( {
id ,
const favoriteRelaysDraftEvent = createFavoriteRelaysDraftEvent ( favoriteRelays , [
name : relaySetName ,
. . . relaySetEvents ,
relayUrls : normalizedUrls
newRelaySetEvent
] )
const newFavoriteRelaysEvent = await publish ( favoriteRelaysDraftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
}
const addRelaySets = async ( newRelaySetEvents : Event [ ] ) = > {
const favoriteRelaysDraftEvent = createFavoriteRelaysDraftEvent ( favoriteRelays , [
. . . relaySetEvents ,
. . . newRelaySetEvents
] )
const newFavoriteRelaysEvent = await publish ( favoriteRelaysDraftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
}
const deleteRelaySet = async ( id : string ) = > {
const newRelaySetEvents = relaySetEvents . filter ( ( event ) = > {
return getReplaceableEventIdentifier ( event ) !== id
} )
if ( newRelaySetEvents . length === relaySetEvents . length ) return
const draftEvent = createFavoriteRelaysDraftEvent ( favoriteRelays , newRelaySetEvents )
const newFavoriteRelaysEvent = await publish ( draftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
}
const updateRelaySet = async ( newSet : TRelaySet ) = > {
const draftEvent = createRelaySetDraftEvent ( newSet )
const newRelaySetEvent = await publish ( draftEvent )
await indexedDb . putReplaceableEvent ( newRelaySetEvent )
setRelaySetEvents ( ( prev ) = > {
return prev . map ( ( event ) = > {
if ( getReplaceableEventIdentifier ( event ) === newSet . id ) {
return newRelaySetEvent
}
return event
} )
} )
} )
const newRelaySetEvent = await publish ( relaySetDraftEvent )
}
await indexedDb . putReplaceableEvent ( newRelaySetEvent )
const reorderFavoriteRelays = async ( reorderedRelays : string [ ] ) = > {
const favoriteRelaysDraftEvent = createFavoriteRelaysDraftEvent ( favoriteRelays , [
setFavoriteRelays ( reorderedRelays )
. . . relaySetEvents ,
const draftEvent = createFavoriteRelaysDraftEvent ( reorderedRelays , relaySetEvents )
newRelaySetEvent
const newFavoriteRelaysEvent = await publish ( draftEvent )
] )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
const newFavoriteRelaysEvent = await publish ( favoriteRelaysDraftEvent )
}
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
} ,
const addBlockedRelays = async ( relayUrls : string [ ] ) = > {
[ favoriteRelays , relaySetEvents , publish , updateFavoriteRelaysEvent ]
const normalizedUrls = relayUrls
)
. map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) )
. filter ( ( url ) = > ! ! url && ! blockedRelays . includes ( url ) )
const addRelaySets = useCallback (
if ( ! normalizedUrls . length ) return
async ( newRelaySetEvents : Event [ ] ) = > {
const newBlockedRelays = [ . . . blockedRelays , . . . normalizedUrls ]
const favoriteRelaysDraftEvent = createFavoriteRelaysDraftEvent ( favoriteRelays , [
setBlockedRelays ( newBlockedRelays )
. . . relaySetEvents ,
const draftEvent = createBlockedRelaysDraftEvent ( newBlockedRelays )
. . . newRelaySetEvents
const newBlockedRelaysEvent = await publish ( draftEvent )
] )
updateBlockedRelaysEvent ( newBlockedRelaysEvent )
const newFavoriteRelaysEvent = await publish ( favoriteRelaysDraftEvent )
}
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
} ,
const deleteBlockedRelays = async ( relayUrls : string [ ] ) = > {
[ favoriteRelays , relaySetEvents , publish , updateFavoriteRelaysEvent ]
const normalizedUrls = relayUrls . map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) ) . filter ( Boolean )
)
const newBlockedRelays = blockedRelays . filter ( ( relay ) = > ! normalizedUrls . includes ( relay ) )
setBlockedRelays ( newBlockedRelays )
const deleteRelaySet = useCallback (
const draftEvent = createBlockedRelaysDraftEvent ( newBlockedRelays )
async ( id : string ) = > {
const newBlockedRelaysEvent = await publish ( draftEvent )
const newRelaySetEvents = relaySetEvents . filter ( ( event ) = > {
updateBlockedRelaysEvent ( newBlockedRelaysEvent )
return getReplaceableEventIdentifier ( event ) !== id
}
} )
if ( newRelaySetEvents . length === relaySetEvents . length ) return
const reorderRelaySets = async ( reorderedSets : TRelaySet [ ] ) = > {
setRelaySets ( reorderedSets )
const previousRelaySetEvents = relaySetEvents
const draftEvent = createFavoriteRelaysDraftEvent (
setRelaySetEvents ( newRelaySetEvents )
try {
const draftEvent = createFavoriteRelaysDraftEvent ( favoriteRelays , newRelaySetEvents )
const newFavoriteRelaysEvent = await publish ( draftEvent )
await updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
} catch ( e ) {
setRelaySetEvents ( previousRelaySetEvents )
throw e
}
} ,
[ favoriteRelays , relaySetEvents , publish , updateFavoriteRelaysEvent ]
)
const updateRelaySet = useCallback (
async ( newSet : TRelaySet ) = > {
const draftEvent = createRelaySetDraftEvent ( newSet )
const newRelaySetEvent = await publish ( draftEvent )
await indexedDb . putReplaceableEvent ( newRelaySetEvent )
setRelaySetEvents ( ( prev ) = > {
return prev . map ( ( event ) = > {
if ( getReplaceableEventIdentifier ( event ) === newSet . id ) {
return newRelaySetEvent
}
return event
} )
} )
} ,
[ publish ]
)
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 = useCallback (
async ( relayUrls : string [ ] ) = > {
const normalizedUrls = relayUrls
. map ( ( relayUrl ) = > normalizeUrl ( relayUrl ) )
. filter ( ( url ) = > ! ! url && ! blockedRelays . includes ( url ) )
if ( ! normalizedUrls . length ) return
const newBlockedRelays = [ . . . blockedRelays , . . . normalizedUrls ]
setBlockedRelays ( newBlockedRelays )
const draftEvent = createBlockedRelaysDraftEvent ( newBlockedRelays )
const newBlockedRelaysEvent = await publish ( draftEvent )
updateBlockedRelaysEvent ( newBlockedRelaysEvent )
} ,
[ blockedRelays , publish , updateBlockedRelaysEvent ]
)
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 = useCallback (
async ( reorderedSets : TRelaySet [ ] ) = > {
setRelaySets ( reorderedSets )
const draftEvent = createFavoriteRelaysDraftEvent (
favoriteRelays ,
reorderedSets . map ( ( set ) = > set . aTag )
)
const newFavoriteRelaysEvent = await publish ( draftEvent )
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
} ,
[ favoriteRelays , publish , updateFavoriteRelaysEvent ]
)
const contextValue = useMemo (
( ) = > ( {
favoriteRelays ,
favoriteRelays ,
reorderedSets . map ( ( set ) = > set . aTag )
addFavoriteRelays ,
)
deleteFavoriteRelays ,
const newFavoriteRelaysEvent = await publish ( draftEvent )
reorderFavoriteRelays ,
updateFavoriteRelaysEvent ( newFavoriteRelaysEvent )
blockedRelays ,
}
addBlockedRelays ,
deleteBlockedRelays ,
relaySets ,
createRelaySet ,
addRelaySets ,
deleteRelaySet ,
updateRelaySet ,
reorderRelaySets
} ) ,
[
favoriteRelays ,
blockedRelays ,
relaySets ,
addFavoriteRelays ,
deleteFavoriteRelays ,
reorderFavoriteRelays ,
addBlockedRelays ,
deleteBlockedRelays ,
createRelaySet ,
addRelaySets ,
deleteRelaySet ,
updateRelaySet ,
reorderRelaySets
]
)
return (
return (
< FavoriteRelaysContext.Provider
< FavoriteRelaysContext.Provider value = { contextValue } >
value = { {
favoriteRelays ,
addFavoriteRelays ,
deleteFavoriteRelays ,
reorderFavoriteRelays ,
blockedRelays ,
addBlockedRelays ,
deleteBlockedRelays ,
relaySets ,
createRelaySet ,
addRelaySets ,
deleteRelaySet ,
updateRelaySet ,
reorderRelaySets
} }
>
{ children }
{ children }
< / FavoriteRelaysContext.Provider >
< / FavoriteRelaysContext.Provider >
)
)