diff --git a/src/app/core/state.ts b/src/app/core/state.ts
index 99b4adb4..97fe3d18 100644
--- a/src/app/core/state.ts
+++ b/src/app/core/state.ts
@@ -806,18 +806,29 @@ export enum MembershipStatus {
Granted,
}
+export const deriveUserIsSpaceAdmin = (url: string) => {
+ const store = writable(false)
+
+ manageRelay(url, {method: ManagementMethod.SupportedMethods, params: []}).then(res =>
+ store.set(Boolean(res.result?.length)),
+ )
+
+ return store
+}
+
export const deriveUserSpaceMembershipStatus = (url: string) =>
derived(
[
pubkey,
deriveSpaceMembers(url),
deriveEventsForUrl(url, [{kinds: [RELAY_JOIN, RELAY_LEAVE]}]),
+ deriveUserIsSpaceAdmin(url),
],
- ([$pubkey, $members, $events]) => {
- const isMember = $members.includes($pubkey)
+ ([$pubkey, $members, $events, $isAdmin]) => {
+ const isMember = $members.includes($pubkey) || $isAdmin
for (const event of $events) {
- if (!getPubkeyTagValues(event.tags).includes($pubkey!)) {
+ if (event.pubkey !== $pubkey) {
continue
}
@@ -834,18 +845,25 @@ export const deriveUserSpaceMembershipStatus = (url: string) =>
},
)
+export const deriveUserIsRoomAdmin = (url: string, h: string) =>
+ derived(
+ [pubkey, deriveRoomAdmins(url, h), deriveUserIsSpaceAdmin(url)],
+ ([$pubkey, $admins, $isSpaceAdmin]) => $isSpaceAdmin || $admins.includes($pubkey!),
+ )
+
export const deriveUserRoomMembershipStatus = (url: string, h: string) =>
derived(
[
pubkey,
deriveRoomMembers(url, h),
deriveEventsForUrl(url, [{kinds: [ROOM_JOIN, ROOM_LEAVE], "#h": [h]}]),
+ deriveUserIsRoomAdmin(url, h),
],
- ([$pubkey, $members, $events]) => {
- const isMember = $members.includes($pubkey)
+ ([$pubkey, $members, $events, $isAdmin]) => {
+ const isMember = $members.includes($pubkey) || $isAdmin
for (const event of $events) {
- if (!getPubkeyTagValues(event.tags).includes($pubkey!)) {
+ if (event.pubkey !== $pubkey) {
continue
}
@@ -872,19 +890,6 @@ export const deriveUserCanCreateRoom = (url: string) =>
},
)
-export const deriveUserIsRoomAdmin = (url: string, h: string) =>
- derived([pubkey, deriveRoomAdmins(url, h)], ([$pubkey, $admins]) => $admins.includes($pubkey!))
-
-export const deriveUserIsSpaceAdmin = (url: string) => {
- const store = writable(false)
-
- manageRelay(url, {method: ManagementMethod.SupportedMethods, params: []}).then(res =>
- store.set(Boolean(res.result?.length)),
- )
-
- return store
-}
-
// Other utils
export const encodeRelay = (url: string) =>
diff --git a/src/lib/components/ImageIcon.svelte b/src/lib/components/ImageIcon.svelte
index 4574d8bb..c0ab10b6 100644
--- a/src/lib/components/ImageIcon.svelte
+++ b/src/lib/components/ImageIcon.svelte
@@ -4,13 +4,14 @@
type Props = {
src: string
alt: string
+ size?: number
}
- const {src, alt}: Props = $props()
+ const {src, alt, size = 5}: Props = $props()
{#if src.includes("image/svg") || src.endsWith(".svg")}
-
+
{:else}
-
![]()
+
![]()
{/if}
diff --git a/src/routes/spaces/[relay]/[h]/+page.svelte b/src/routes/spaces/[relay]/[h]/+page.svelte
index 0cbd7d62..c55d2fb9 100644
--- a/src/routes/spaces/[relay]/[h]/+page.svelte
+++ b/src/routes/spaces/[relay]/[h]/+page.svelte
@@ -16,11 +16,10 @@
} from "@welshman/util"
import {pubkey, publishThunk, waitForThunkError, joinRoom, leaveRoom} from "@welshman/app"
import {slide, fade, fly} from "@lib/transition"
- import Pen from "@assets/icons/pen.svg?dataurl"
+ import InfoCircle from "@assets/icons/info-circle.svg?dataurl"
import ClockCircle from "@assets/icons/clock-circle.svg?dataurl"
import Login2 from "@assets/icons/login-3.svg?dataurl"
import AltArrowDown from "@assets/icons/alt-arrow-down.svg?dataurl"
- import Logout2 from "@assets/icons/logout-3.svg?dataurl"
import Bookmark from "@assets/icons/bookmark.svg?dataurl"
import Icon from "@lib/components/Icon.svelte"
import Button from "@lib/components/Button.svelte"
@@ -30,10 +29,9 @@
import Divider from "@lib/components/Divider.svelte"
import ThunkToast from "@app/components/ThunkToast.svelte"
import MenuSpaceButton from "@app/components/MenuSpaceButton.svelte"
- import RoomEdit from "@app/components/RoomEdit.svelte"
import RoomName from "@app/components/RoomName.svelte"
- import RoomAccess from "@app/components/RoomAccess.svelte"
import RoomImage from "@app/components/RoomImage.svelte"
+ import RoomDetail from "@app/components/RoomDetail.svelte"
import RoomItem from "@app/components/RoomItem.svelte"
import RoomItemAddMember from "@src/app/components/RoomItemAddMember.svelte"
import RoomItemRemoveMember from "@src/app/components/RoomItemRemoveMember.svelte"
@@ -49,7 +47,6 @@
MembershipStatus,
PROTECTED,
MESSAGE_KINDS,
- deriveUserIsRoomAdmin,
} from "@app/core/state"
import {setChecked, checked} from "@app/util/notifications"
import {
@@ -71,10 +68,11 @@
const room = deriveRoom(url, h)
const shouldProtect = canEnforceNip70(url)
const userRooms = deriveUserRooms(url)
- const userIsAdmin = deriveUserIsRoomAdmin(url, h)
const isFavorite = $derived($userRooms.includes(h))
const membershipStatus = deriveUserRoomMembershipStatus(url, h)
+ const showRoomDetail = () => pushModal(RoomDetail, {url, h})
+
const addFavorite = () => addRoomMembership(url, h)
const removeFavorite = () => removeRoomMembership(url, h)
@@ -304,8 +302,6 @@
}
}
- const startEdit = () => pushModal(RoomEdit, {url, h})
-
onMount(() => {
const observer = new ResizeObserver(() => {
if (dynamicPadding && chatCompose) {
@@ -342,47 +338,18 @@
{/snippet}
{#snippet action()}
-
- {#if $userIsAdmin}
-
- {:else if $membershipStatus === MembershipStatus.Initial}
-
- {:else if $membershipStatus === MembershipStatus.Pending}
-
- {:else}
-
- {/if}
+
{/snippet}