forked from coracle/flotilla
Compare commits
3 Commits
f4ebc4e99e
..
dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 1d5f91fb6c | |||
| ef18655776 | |||
| b786e858d9 |
+76
-45
@@ -8,7 +8,6 @@ import {
|
|||||||
on,
|
on,
|
||||||
gt,
|
gt,
|
||||||
max,
|
max,
|
||||||
find,
|
|
||||||
spec,
|
spec,
|
||||||
call,
|
call,
|
||||||
first,
|
first,
|
||||||
@@ -815,19 +814,20 @@ export const deriveOtherRooms = (url: string) =>
|
|||||||
|
|
||||||
// Space/room memberships
|
// Space/room memberships
|
||||||
|
|
||||||
export const deriveSpaceMembers = (url: string) =>
|
const getSpaceMembers = (_url: string, events: TrustedEvent[]) => {
|
||||||
derived(
|
|
||||||
deriveRelaySignedEvents(url, [{kinds: [RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER, RELAY_MEMBERS]}]),
|
|
||||||
$events => {
|
|
||||||
const membersEvent = $events.find(spec({kind: RELAY_MEMBERS}))
|
|
||||||
|
|
||||||
if (membersEvent) {
|
|
||||||
return uniq(getTagValues("member", membersEvent.tags))
|
|
||||||
}
|
|
||||||
|
|
||||||
const members = new Set<string>()
|
const members = new Set<string>()
|
||||||
|
|
||||||
for (const event of sortBy(e => e.created_at, $events)) {
|
for (const event of sortEventsAsc(events)) {
|
||||||
|
if (event.kind === RELAY_MEMBERS) {
|
||||||
|
members.clear()
|
||||||
|
|
||||||
|
for (const pubkey of uniq(getTagValues("member", event.tags))) {
|
||||||
|
members.add(pubkey)
|
||||||
|
}
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
const pubkeys = getPubkeyTagValues(event.tags)
|
const pubkeys = getPubkeyTagValues(event.tags)
|
||||||
|
|
||||||
if (event.kind === RELAY_ADD_MEMBER) {
|
if (event.kind === RELAY_ADD_MEMBER) {
|
||||||
@@ -844,7 +844,48 @@ export const deriveSpaceMembers = (url: string) =>
|
|||||||
}
|
}
|
||||||
|
|
||||||
return Array.from(members)
|
return Array.from(members)
|
||||||
},
|
}
|
||||||
|
|
||||||
|
const getRoomMembers = (_url: string, h: string, events: TrustedEvent[]) => {
|
||||||
|
const members = new Set<string>()
|
||||||
|
|
||||||
|
for (const event of sortEventsAsc(events)) {
|
||||||
|
if (event.kind === ROOM_MEMBERS && getTagValue("d", event.tags) === h) {
|
||||||
|
members.clear()
|
||||||
|
|
||||||
|
for (const pubkey of uniq(getPubkeyTagValues(event.tags))) {
|
||||||
|
members.add(pubkey)
|
||||||
|
}
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getTagValue("h", event.tags) !== h) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
const pubkeys = getPubkeyTagValues(event.tags)
|
||||||
|
|
||||||
|
if (event.kind === ROOM_ADD_MEMBER) {
|
||||||
|
for (const pubkey of pubkeys) {
|
||||||
|
members.add(pubkey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.kind === ROOM_REMOVE_MEMBER) {
|
||||||
|
for (const pubkey of pubkeys) {
|
||||||
|
members.delete(pubkey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Array.from(members)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const deriveSpaceMembers = (url: string) =>
|
||||||
|
derived(
|
||||||
|
deriveRelaySignedEvents(url, [{kinds: [RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER, RELAY_MEMBERS]}]),
|
||||||
|
$events => getSpaceMembers(url, $events),
|
||||||
)
|
)
|
||||||
|
|
||||||
export type BannedPubkeyItem = {
|
export type BannedPubkeyItem = {
|
||||||
@@ -871,33 +912,7 @@ export const deriveRoomMembers = (url: string, h: string) => {
|
|||||||
{kinds: [ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER], "#h": [h]},
|
{kinds: [ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER], "#h": [h]},
|
||||||
]
|
]
|
||||||
|
|
||||||
return derived(deriveEventsForUrl(url, filters), $events => {
|
return derived(deriveEventsForUrl(url, filters), $events => getRoomMembers(url, h, $events))
|
||||||
const membersEvent = find(spec({kind: ROOM_MEMBERS}), $events)
|
|
||||||
|
|
||||||
if (membersEvent) {
|
|
||||||
return uniq(getPubkeyTagValues(membersEvent.tags))
|
|
||||||
}
|
|
||||||
|
|
||||||
const members = new Set<string>()
|
|
||||||
|
|
||||||
for (const event of sortEventsAsc($events)) {
|
|
||||||
const pubkeys = getPubkeyTagValues(event.tags)
|
|
||||||
|
|
||||||
if (event.kind === ROOM_ADD_MEMBER) {
|
|
||||||
for (const pubkey of pubkeys) {
|
|
||||||
members.add(pubkey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event.kind === ROOM_REMOVE_MEMBER) {
|
|
||||||
for (const pubkey of pubkeys) {
|
|
||||||
members.delete(pubkey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Array.from(members)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const deriveRoomAdmins = (url: string, h: string) => {
|
export const deriveRoomAdmins = (url: string, h: string) => {
|
||||||
@@ -921,7 +936,7 @@ export const deriveSpaceActionItems = (url: string) =>
|
|||||||
derived(
|
derived(
|
||||||
deriveEventsForUrl(url, [
|
deriveEventsForUrl(url, [
|
||||||
{
|
{
|
||||||
kinds: [REPORT, ROOM_JOIN, ROOM_LEAVE, ROOM_MEMBERS],
|
kinds: [REPORT, ROOM_JOIN, ROOM_LEAVE, ROOM_MEMBERS, ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER],
|
||||||
},
|
},
|
||||||
]),
|
]),
|
||||||
$events => {
|
$events => {
|
||||||
@@ -936,8 +951,10 @@ export const deriveSpaceActionItems = (url: string) =>
|
|||||||
|
|
||||||
const roomJoins = roomEvents.filter(spec({kind: ROOM_JOIN}))
|
const roomJoins = roomEvents.filter(spec({kind: ROOM_JOIN}))
|
||||||
const roomLeaves = roomEvents.filter(spec({kind: ROOM_LEAVE}))
|
const roomLeaves = roomEvents.filter(spec({kind: ROOM_LEAVE}))
|
||||||
const roomMembersEvent = roomEvents.find(spec({kind: ROOM_MEMBERS}))
|
const roomMembershipEvents = roomEvents.filter(event =>
|
||||||
const roomMembers = getTagValues("p", roomMembersEvent?.tags ?? [])
|
[ROOM_MEMBERS, ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER].includes(event.kind),
|
||||||
|
)
|
||||||
|
const roomMembers = new Set(getRoomMembers(url, h, roomMembershipEvents))
|
||||||
|
|
||||||
pendingJoins.push(
|
pendingJoins.push(
|
||||||
...removeUndefined(
|
...removeUndefined(
|
||||||
@@ -945,8 +962,22 @@ export const deriveSpaceActionItems = (url: string) =>
|
|||||||
.map(sortEventsDesc)
|
.map(sortEventsDesc)
|
||||||
.map(first),
|
.map(first),
|
||||||
).filter(({pubkey, created_at}) => {
|
).filter(({pubkey, created_at}) => {
|
||||||
if (roomMembers.includes(pubkey)) return false
|
if (roomMembers.has(pubkey)) return false
|
||||||
if (gt(roomMembersEvent?.created_at, created_at)) return false
|
if (
|
||||||
|
roomMembershipEvents.some(event => {
|
||||||
|
if (event.created_at <= created_at) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.kind === ROOM_MEMBERS) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return getPubkeyTagValues(event.tags).includes(pubkey)
|
||||||
|
})
|
||||||
|
) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
if (roomLeaves.some(e => e.pubkey === pubkey && e.created_at > created_at)) return false
|
if (roomLeaves.some(e => e.pubkey === pubkey && e.created_at > created_at)) return false
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|||||||
+16
-3
@@ -13,6 +13,8 @@ import {
|
|||||||
ROOM_MEMBERS,
|
ROOM_MEMBERS,
|
||||||
ROOM_ADD_MEMBER,
|
ROOM_ADD_MEMBER,
|
||||||
ROOM_REMOVE_MEMBER,
|
ROOM_REMOVE_MEMBER,
|
||||||
|
ROOM_JOIN,
|
||||||
|
ROOM_LEAVE,
|
||||||
ROOM_CREATE_PERMISSION,
|
ROOM_CREATE_PERMISSION,
|
||||||
RELAY_MEMBERS,
|
RELAY_MEMBERS,
|
||||||
RELAY_ADD_MEMBER,
|
RELAY_ADD_MEMBER,
|
||||||
@@ -278,8 +280,13 @@ const syncSpace = (url: string, rooms: string[]) => {
|
|||||||
url,
|
url,
|
||||||
signal: controller.signal,
|
signal: controller.signal,
|
||||||
filters: [
|
filters: [
|
||||||
|
{kinds: [ROOM_META, ROOM_ADMINS, ROOM_MEMBERS], "#d": [room]},
|
||||||
{kinds: MESSAGE_KINDS, since, "#h": [room]},
|
{kinds: MESSAGE_KINDS, since, "#h": [room]},
|
||||||
makeCommentFilter(CONTENT_KINDS, {since, "#h": [room]}),
|
makeCommentFilter(CONTENT_KINDS, {since, "#h": [room]}),
|
||||||
|
{
|
||||||
|
kinds: [ROOM_DELETE, ROOM_JOIN, ROOM_LEAVE, ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER],
|
||||||
|
"#h": [room],
|
||||||
|
},
|
||||||
{kinds: [PollResponse], since},
|
{kinds: [PollResponse], since},
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
@@ -292,7 +299,7 @@ const syncSpace = (url: string, rooms: string[]) => {
|
|||||||
|
|
||||||
const relayKinds = [RELAY_MEMBERS, RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER]
|
const relayKinds = [RELAY_MEMBERS, RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER]
|
||||||
const roomMetaKinds = [ROOM_META, ROOM_ADMINS, ROOM_MEMBERS, LIVEKIT_PARTICIPANTS]
|
const roomMetaKinds = [ROOM_META, ROOM_ADMINS, ROOM_MEMBERS, LIVEKIT_PARTICIPANTS]
|
||||||
const roomMemberKinds = [ROOM_DELETE, ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER]
|
const roomMemberKinds = [ROOM_DELETE, ROOM_JOIN, ROOM_LEAVE, ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER]
|
||||||
|
|
||||||
pullAndListen({
|
pullAndListen({
|
||||||
url,
|
url,
|
||||||
@@ -325,9 +332,10 @@ const syncSpaces = () => {
|
|||||||
|
|
||||||
const unsubscribe = store.subscribe(([$userGroupList, $page]) => {
|
const unsubscribe = store.subscribe(([$userGroupList, $page]) => {
|
||||||
const urls = new Set(getSpaceUrlsFromGroupList($userGroupList))
|
const urls = new Set(getSpaceUrlsFromGroupList($userGroupList))
|
||||||
|
const currentUrl = $page.params.relay ? decodeRelay($page.params.relay) : undefined
|
||||||
|
|
||||||
if ($page.params.relay) {
|
if (currentUrl) {
|
||||||
urls.add(decodeRelay($page.params.relay))
|
urls.add(currentUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop syncing removed spaces
|
// Stop syncing removed spaces
|
||||||
@@ -342,6 +350,11 @@ const syncSpaces = () => {
|
|||||||
// Start or restart syncing for each space
|
// Start or restart syncing for each space
|
||||||
for (const url of urls) {
|
for (const url of urls) {
|
||||||
const rooms = getSpaceRoomsFromGroupList(url, $userGroupList)
|
const rooms = getSpaceRoomsFromGroupList(url, $userGroupList)
|
||||||
|
|
||||||
|
if (currentUrl === url && $page.params.h && !rooms.includes($page.params.h)) {
|
||||||
|
rooms.push($page.params.h)
|
||||||
|
}
|
||||||
|
|
||||||
const roomsKey = rooms.join(",")
|
const roomsKey = rooms.join(",")
|
||||||
|
|
||||||
if (unsubscribersByUrl.has(url) && roomsByUrl.get(url) === roomsKey) continue
|
if (unsubscribersByUrl.has(url) && roomsByUrl.get(url) === roomsKey) continue
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
import Close from "@assets/icons/close.svg?dataurl"
|
import Close from "@assets/icons/close.svg?dataurl"
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
import Icon from "@lib/components/Icon.svelte"
|
||||||
import Button from "@lib/components/Button.svelte"
|
import Button from "@lib/components/Button.svelte"
|
||||||
import {clearModals} from "@app/util/modal"
|
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
onClose?: any
|
onClose?: any
|
||||||
@@ -56,7 +55,7 @@
|
|||||||
<div class={wrapperClass}>
|
<div class={wrapperClass}>
|
||||||
<div class={innerClass} transition:fly>
|
<div class={innerClass} transition:fly>
|
||||||
{#if !noEscape}
|
{#if !noEscape}
|
||||||
<Button class={buttonClass} onclick={clearModals}>
|
<Button class={buttonClass} onclick={onClose}>
|
||||||
<Icon icon={Close} size={6} />
|
<Icon icon={Close} size={6} />
|
||||||
</Button>
|
</Button>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -4,13 +4,15 @@
|
|||||||
import Dialog from "@lib/components/Dialog.svelte"
|
import Dialog from "@lib/components/Dialog.svelte"
|
||||||
import SpaceInviteAccept from "@app/components/SpaceInviteAccept.svelte"
|
import SpaceInviteAccept from "@app/components/SpaceInviteAccept.svelte"
|
||||||
|
|
||||||
|
const close = () => goto("/home")
|
||||||
|
|
||||||
const children = {
|
const children = {
|
||||||
component: SpaceInviteAccept,
|
component: SpaceInviteAccept,
|
||||||
props: {
|
props: {
|
||||||
invite: $page.url.href,
|
invite: $page.url.href,
|
||||||
back: () => goto("/home"),
|
back: close,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Dialog {children} />
|
<Dialog {children} onClose={close} />
|
||||||
|
|||||||
@@ -172,9 +172,9 @@
|
|||||||
</strong>
|
</strong>
|
||||||
<Button onclick={() => (showAdvanced = !showAdvanced)}>
|
<Button onclick={() => (showAdvanced = !showAdvanced)}>
|
||||||
{#if showAdvanced}
|
{#if showAdvanced}
|
||||||
<Icon icon={AltArrowDown} />
|
|
||||||
{:else}
|
|
||||||
<Icon icon={AltArrowUp} />
|
<Icon icon={AltArrowUp} />
|
||||||
|
{:else}
|
||||||
|
<Icon icon={AltArrowDown} />
|
||||||
{/if}
|
{/if}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user