diff --git a/src/app/components/EventMenu.svelte b/src/app/components/EventMenu.svelte index 174a28b5..95b84902 100644 --- a/src/app/components/EventMenu.svelte +++ b/src/app/components/EventMenu.svelte @@ -3,7 +3,7 @@ import type {Snippet} from "svelte" import {goto} from "$app/navigation" import type {TrustedEvent} from "@welshman/util" - import {COMMENT, ManagementMethod} from "@welshman/util" + import {COMMENT, ManagementMethod, getTagValue} from "@welshman/util" import {pubkey, repository, relaysByUrl, manageRelay} from "@welshman/app" import ShareCircle from "@assets/icons/share-circle.svg?dataurl" import Code2 from "@assets/icons/code-2.svg?dataurl" @@ -17,7 +17,8 @@ import Report from "@app/components/Report.svelte" import EventShare from "@app/components/EventShare.svelte" import EventDeleteConfirm from "@app/components/EventDeleteConfirm.svelte" - import {hasNip29, deriveUserIsSpaceAdmin} from "@app/core/state" + import {deriveHasPermission, ROOM_PERMISSION_DELETE_EVENT} from "@app/core/roles" + import {hasNip29} from "@app/core/state" import {pushModal} from "@app/util/modal" import {pushToast} from "@app/util/toast" import {makeSpaceChatPath} from "@app/util/routes" @@ -33,7 +34,8 @@ const {url, noun, event, onClick, customActions}: Props = $props() const isRoot = event.kind !== COMMENT - const userIsAdmin = deriveUserIsSpaceAdmin(url) + const h = getTagValue("h", event.tags) + const canDelete = deriveHasPermission(url, h, ROOM_PERMISSION_DELETE_EVENT) const report = () => pushModal(Report, {url, event}) @@ -107,7 +109,7 @@ Report Content - {#if $userIsAdmin} + {#if $canDelete}
  • - {:else if $members === undefined} -
    - Member list not available from this relay + {/if} + {#if $userIsAdmin && $roleDefinitions.length > 0} +
    + Role Definitions +
    + {#each $roleDefinitions as role (role.name)} +
    +
    + + {#if role.order !== undefined} + Order {role.order} + {/if} +
    + {#if role.permissions.length > 0} +

    Permissions: {getRolePermissionsLabel(role)}

    + {/if} + {#if role.access.size > 0} +

    Access: {getRoleAccessLabel(role)}

    + {/if} +
    + {/each} +
    {/if}
    diff --git a/src/app/components/RoomItemMenu.svelte b/src/app/components/RoomItemMenu.svelte index e03e47c8..0d4f18eb 100644 --- a/src/app/components/RoomItemMenu.svelte +++ b/src/app/components/RoomItemMenu.svelte @@ -13,7 +13,7 @@ import EventDeleteConfirm from "@app/components/EventDeleteConfirm.svelte" import {pushModal} from "@app/util/modal" import {pushToast} from "@app/util/toast" - import {deriveUserIsSpaceAdmin} from "@app/core/state" + import {deriveUserIsSpaceAdmin} from "@app/core/roles" type Props = { url: string diff --git a/src/app/components/RoomMembers.svelte b/src/app/components/RoomMembers.svelte index 8ff478b9..5ddbbdb2 100644 --- a/src/app/components/RoomMembers.svelte +++ b/src/app/components/RoomMembers.svelte @@ -16,9 +16,17 @@ import ModalTitle from "@lib/components/ModalTitle.svelte" import ModalSubtitle from "@lib/components/ModalSubtitle.svelte" import Profile from "@app/components/Profile.svelte" + import RoleBadge from "@app/components/RoleBadge.svelte" import RoomName from "@app/components/RoomName.svelte" import RoomMembersAdd from "@app/components/RoomMembersAdd.svelte" - import {deriveRoom, deriveRoomMembers, deriveUserIsRoomAdmin} from "@app/core/state" + import { + deriveRoomMembers, + deriveGroupedRoomMembers, + deriveHasPermission, + ROOM_PERMISSION_ADD_MEMBER, + ROOM_PERMISSION_REMOVE_MEMBER, + } from "@app/core/roles" + import {deriveRoom} from "@app/core/state" import {pushModal} from "@app/util/modal" import {pushToast} from "@app/util/toast" @@ -31,7 +39,9 @@ const room = deriveRoom(url, h) const members = deriveRoomMembers(url, h) - const userIsAdmin = deriveUserIsRoomAdmin(url, h) + const memberGroups = deriveGroupedRoomMembers(url, h) + const canAddMembers = deriveHasPermission(url, h, ROOM_PERMISSION_ADD_MEMBER) + const canRemoveMembers = deriveHasPermission(url, h, ROOM_PERMISSION_REMOVE_MEMBER) const back = () => history.back() @@ -73,42 +83,58 @@
    - {#if $members === undefined} -
    - Member list not available from this relay -
    - {:else if $members.length === 0} + {#if $members.length === 0}
    No members yet
    {:else} - {#each $members as pubkey (pubkey)} -
    -
    -
    - -
    -
    - - {#if menuPubkey === pubkey} - - - + {#each $memberGroups as group (group.key)} +
    + {#if group.role} + + {:else} + Members + {/if} +
    + {#each group.members as member (member.pubkey)} +
    +
    +
    + + {#if member.roles.length > 0} +
    + {#each member.roles as role (role.name)} + + {/each} +
    + {/if} +
    + {#if $canRemoveMembers} +
    + + {#if menuPubkey === member.pubkey} + + + + {/if} +
    {/if}
    -
    + {/each} {/each} {/if}
    @@ -118,7 +144,7 @@ Go back - {#if $userIsAdmin} + {#if $canAddMembers}
    - {#if $userIsAdmin} + {#if $canEdit} - {#if menuPubkey === pubkey} - - - + {#each $memberGroups as group (group.key)} +
    + {#if group.role} + + {:else} + Members + {/if} +
    + {#each group.members as member (member.pubkey)} +
    +
    +
    + + {#if member.roles.length > 0} +
    + {#each member.roles as role (role.name)} + + {/each} +
    {/if}
    - {/if} + {#if canBan || canUnallow} +
    + + {#if menuPubkey === member.pubkey} + + + + {/if} +
    + {/if} +
    -
    + {/each} {/each} {/if}
    @@ -171,7 +194,7 @@ Go back - {#if $userIsAdmin} + {#if $canAddMember}