Add relay updates

This commit is contained in:
Jon Staab
2024-10-03 12:21:03 -07:00
parent 73a9b46f91
commit d63b556b24
3 changed files with 92 additions and 15 deletions
+67 -4
View File
@@ -1,5 +1,5 @@
import {uniqBy, sleep, chunk, equals, choice, append} from "@welshman/lib"
import {DELETE, MUTES, FOLLOWS, REACTION, getPubkeyTagValues, createEvent, displayProfile} from "@welshman/util"
import {uniqBy, sleep, chunk, equals, nthNe, choice, append} from "@welshman/lib"
import {DELETE, PROFILE, INBOX_RELAYS, RELAYS, MUTES, FOLLOWS, REACTION, isSignedEvent, getPubkeyTagValues, createEvent, displayProfile, normalizeRelayUrl} from "@welshman/util"
import type {TrustedEvent} from "@welshman/util"
import type {SubscribeRequestWithHandlers} from "@welshman/net"
import {
@@ -17,6 +17,8 @@ import {
tagEvent,
tagPubkey,
tagReactionTo,
getRelayUrls,
getInboxRelaySelections,
} from "@welshman/app"
import {tagRoom, MEMBERSHIPS, INDEXER_RELAYS} from "@app/state"
@@ -78,7 +80,21 @@ export const loadUserData = (
return promise
}
// Updates
// Synchronization
export const broadcastUserData = async (relays: string[]) => {
const authors = [pubkey.get()!]
const kinds = [RELAYS, INBOX_RELAYS, FOLLOWS, PROFILE]
const events = repository.query([{kinds, authors}])
for (const event of events) {
if (isSignedEvent(event)) {
await publishThunk(makeThunk({event, relays}))
}
}
}
// List updates
export type ModifyTags = (tags: string[][]) => string[][]
@@ -111,7 +127,6 @@ export const removeSpaceMembership = (url: string) =>
export const removeRoomMembership = (url: string, room: string) =>
updateList(MEMBERSHIPS, (tags: string[][]) => tags.filter(t => !equals(tagRoom(room, url), t)))
export const unfollowPerson = (pubkey: string) =>
updateList(FOLLOWS, tags => tags.filter(t => t[1] !== pubkey))
@@ -124,6 +139,54 @@ export const unmutePerson = (pubkey: string) =>
export const mutePerson = (pubkey: string) =>
updateList(MUTES, tags => append(tagPubkey(pubkey), tags))
export const setRelayPolicy = (url: string, read: boolean, write: boolean) =>
updateList(RELAYS, tags => {
tags = tags.filter(t => normalizeRelayUrl(t[1]) !== url)
if (read && write) {
tags.push(["r", url])
} else if (read) {
tags.push(["r", url, "read"])
} else if (write) {
tags.push(["r", url, "write"])
}
console.log(tags)
return tags
})
export const setInboxRelayPolicy = (url: string, enabled: boolean) => {
const urls = getRelayUrls(getInboxRelaySelections(pubkey.get()!))
// Only update inbox policies if they already exist or we're adding them
if (enabled || urls.includes(url)) {
updateList(INBOX_RELAYS, tags => {
tags = tags.filter(t => normalizeRelayUrl(t[1]) !== url)
if (enabled) {
tags.push(["relay", url])
}
return tags
})
}
}
export const joinRelay = async (url: string, claim?: string) => {
if (claim) {
await publishThunk(
makeThunk({
event: createEvent(28934, {tags: [["claim", claim]]}),
relays: [url],
})
)
}
await setRelayPolicy(url, true, true)
await broadcastUserData([url])
}
// Actions
export const publishReaction = ({relays, event, content, tags = []}: {
+1 -3
View File
@@ -8,10 +8,8 @@
import RelayItem from "@app/components/RelayItem.svelte"
import {discoverRelays} from "@app/state"
export let mode: string
export let relays: Readable<string[]>
const addRelay = (url: string) => null
export let addRelay: (url: string) => void
let term = ""
let limit = 20
+24 -8
View File
@@ -8,19 +8,35 @@
import RelayItem from "@app/components/RelayItem.svelte"
import RelayAdd from "@app/components/RelayAdd.svelte"
import {pushModal} from '@app/modal'
import {setRelayPolicy, setInboxRelayPolicy} from '@app/commands'
const readRelayUrls = derived(userRelaySelections, getReadRelayUrls)
const writeRelayUrls = derived(userRelaySelections, getWriteRelayUrls)
const inboxRelayUrls = derived(userInboxRelaySelections, getRelayUrls)
const addRelay = (mode: string, relays: Readable<string[]>) =>
pushModal(RelayAdd, {mode, relays})
const addReadRelay = () =>
pushModal(RelayAdd, {
relays: readRelayUrls,
addRelay: (url: string) => setRelayPolicy(url, true, $writeRelayUrls.includes(url)),
})
const removeReadRelay = (url: string) => null
const addWriteRelay = () =>
pushModal(RelayAdd, {
relays: writeRelayUrls,
addRelay: (url: string) => setRelayPolicy(url, $readRelayUrls.includes(url), true),
})
const removeWriteRelay = (url: string) => null
const addInboxRelay = () =>
pushModal(RelayAdd, {
relays: inboxRelayUrls,
addRelay: (url: string) => setInboxRelayPolicy(url, true),
})
const removeInboxRelay = (url: string) => null
const removeReadRelay = (url: string) => setRelayPolicy(url, false, $writeRelayUrls.includes(url))
const removeWriteRelay = (url: string) => setRelayPolicy(url, $readRelayUrls.includes(url), false)
const removeInboxRelay = (url: string) => setInboxRelayPolicy(url, false)
</script>
<div class="content column gap-4">
@@ -47,7 +63,7 @@
{:else}
<p class="text-center text-sm">No relays found</p>
{/each}
<Button class="btn btn-primary mt-2" on:click={() => addRelay('write', writeRelayUrls)}>
<Button class="btn btn-primary mt-2" on:click={addWriteRelay}>
<Icon icon="add-circle" />
Add Relay
</Button>
@@ -76,7 +92,7 @@
{:else}
<p class="text-center text-sm">No relays found</p>
{/each}
<Button class="btn btn-primary mt-2" on:click={() => addRelay('read', readRelayUrls)}>
<Button class="btn btn-primary mt-2" on:click={addReadRelay}>
<Icon icon="add-circle" />
Add Relay
</Button>
@@ -105,7 +121,7 @@
{:else}
<p class="text-center text-sm">No relays found</p>
{/each}
<Button class="btn btn-primary mt-2" on:click={() => addRelay('inbox', inboxRelayUrls)}>
<Button class="btn btn-primary mt-2" on:click={addInboxRelay}>
<Icon icon="add-circle" />
Add Relay
</Button>