diff --git a/src/app/components/ChannelNameWithImage.svelte b/src/app/components/ChannelNameWithImage.svelte new file mode 100644 index 0000000..d06b8e7 --- /dev/null +++ b/src/app/components/ChannelNameWithImage.svelte @@ -0,0 +1,32 @@ + + +{#if $channel?.picture} + {@const src = $channel.picture} + {#if src.match("\.(png|svg)$") || src.match("image/(png|svg)")} + + {:else} + Room icon + {/if} +{:else if $channel?.closed || $channel?.private} + +{:else} + +{/if} +
+ +
diff --git a/src/app/components/MenuSpaceRoomItem.svelte b/src/app/components/MenuSpaceRoomItem.svelte index 9117790..3e215f5 100644 --- a/src/app/components/MenuSpaceRoomItem.svelte +++ b/src/app/components/MenuSpaceRoomItem.svelte @@ -1,11 +1,7 @@ - {#if $channel?.picture} - {@const src = $channel.picture} - {#if src.match("\.(png|svg)$") || src.match("image/(png|svg)")} - - {:else} - Room icon - {/if} - {:else if $channel?.closed || $channel?.private} - - {:else} - - {/if} -
- -
+
diff --git a/src/app/components/RoomCreate.svelte b/src/app/components/RoomCreate.svelte index b98de40..2a2e7d8 100644 --- a/src/app/components/RoomCreate.svelte +++ b/src/app/components/RoomCreate.svelte @@ -1,181 +1,47 @@ -
- - {#snippet title()} -
Create a Room
- {/snippet} - {#snippet info()} -
- On {displayRelayUrl(url)} -
- {/snippet} -
- {#if hasNip29($relay)} - - {#snippet label()} -

Room Name

+ + {#snippet header()} + + {#snippet title()} +
Create a Room
{/snippet} - {#snippet input()} - - {/snippet} -
-
-

Room Icon

-
- {#if imagePreview} -
- Selected: - Room icon preview -
- {:else if selectedIcon} -
- Selected: - -
- {:else} - No icon selected - {/if} -
- - - Select - - + {#snippet info()} +
+ On {displayRelayUrl(url)}
-
-
- {:else} -

- - This relay does not support creating rooms. -

- {/if} - - - - - + {/snippet} + + {/snippet} + {#snippet footer({loading})} + + + + + {/snippet} + diff --git a/src/app/components/RoomEdit.svelte b/src/app/components/RoomEdit.svelte new file mode 100644 index 0000000..d3ceb0e --- /dev/null +++ b/src/app/components/RoomEdit.svelte @@ -0,0 +1,83 @@ + + + + {#snippet header()} + + {#snippet title()} +
Edit a Room
+ {/snippet} + {#snippet info()} +
+ On {displayRelayUrl(url)} +
+ {/snippet} +
+ {/snippet} + {#snippet footer({loading})} + + +
+ + +
+
+ {/snippet} +
diff --git a/src/app/components/RoomForm.svelte b/src/app/components/RoomForm.svelte new file mode 100644 index 0000000..2a4c542 --- /dev/null +++ b/src/app/components/RoomForm.svelte @@ -0,0 +1,193 @@ + + +
+ {@render header()} + + {#snippet label()} +

Icon

+ {/snippet} + {#snippet input()} +
+
+ {#if imagePreview} +
+ Selected: + Room icon preview +
+ {:else if selectedIcon} +
+ Selected: + +
+ {:else} + No icon selected + {/if} +
+ + + Select + + +
+
+
+ {/snippet} +
+ + {#snippet label()} +

Name

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ + {#snippet label()} +

Description

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ + {#snippet label()} +

Access Control

+ {/snippet} + {#snippet input()} +
+ + + Closed + + + + Private + + + + Hidden + +
+ {/snippet} + {#snippet info()} +

Only members can send messages to closed groups and read messages from private groups.

+ {/snippet} +
+ {@render footer({loading})} +
diff --git a/src/app/core/sync.ts b/src/app/core/sync.ts index 4cb08a2..3555e9c 100644 --- a/src/app/core/sync.ts +++ b/src/app/core/sync.ts @@ -264,7 +264,7 @@ const syncSpace = (url: string) => { signal: controller.signal, filters: [ {kinds: [RELAY_MEMBERS]}, - {kinds: [ROOM_META]}, + {kinds: [ROOM_META, ROOM_DELETE]}, {kinds: [RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER]}, ...MESSAGE_KINDS.map(kind => ({kinds: [kind]})), makeCommentFilter(CONTENT_KINDS), @@ -337,7 +337,6 @@ const syncRoomChat = (url: string, room: string) => { filters: [ {kinds: [ROOM_ADMINS, ROOM_MEMBERS], "#d": [room]}, {kinds: [ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER], "#h": [room]}, - {kinds: [ROOM_DELETE], "#h": [room]}, {kinds: [MESSAGE], "#h": [room]}, ], }) diff --git a/src/app/util/storage.ts b/src/app/util/storage.ts index 75dafda..4fa48bd 100644 --- a/src/app/util/storage.ts +++ b/src/app/util/storage.ts @@ -26,6 +26,7 @@ import { ROOM_CREATE_PERMISSION, ROOM_MEMBERS, ROOM_META, + ROOM_DELETE, ROOM_REMOVE_MEMBER, ROOMS, THREAD, @@ -75,6 +76,7 @@ const syncEvents = async () => { const spaceKinds = [RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER, RELAY_MEMBERS, RELAY_JOIN, RELAY_LEAVE] const roomKinds = [ ROOM_META, + ROOM_DELETE, ROOM_MEMBERS, ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER, diff --git a/src/lib/components/FieldInline.svelte b/src/lib/components/FieldInline.svelte index 9e48d7f..3e20cd9 100644 --- a/src/lib/components/FieldInline.svelte +++ b/src/lib/components/FieldInline.svelte @@ -16,7 +16,7 @@
{@render props.input?.()}
-

+

{#if props.info} {@render props.info?.()} {/if} diff --git a/src/routes/spaces/[relay]/[room]/+page.svelte b/src/routes/spaces/[relay]/[room]/+page.svelte index 8eb3495..a94bf0e 100644 --- a/src/routes/spaces/[relay]/[room]/+page.svelte +++ b/src/routes/spaces/[relay]/[room]/+page.svelte @@ -3,7 +3,6 @@ import {readable} from "svelte/store" import {onMount, onDestroy} from "svelte" import {page} from "$app/stores" - import {goto} from "$app/navigation" import type {Readable} from "svelte/store" import type {MakeNonOptional} from "@welshman/lib" import {now, formatTimestampAsDate, ago, MINUTE} from "@welshman/lib" @@ -15,20 +14,12 @@ ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER, } from "@welshman/util" - import { - pubkey, - publishThunk, - waitForThunkError, - deleteRoom, - joinRoom, - leaveRoom, - repository, - } from "@welshman/app" + import {pubkey, publishThunk, waitForThunkError, joinRoom, leaveRoom} from "@welshman/app" import {slide, fade, fly} from "@lib/transition" import Hashtag from "@assets/icons/hashtag.svg?dataurl" + import Pen from "@assets/icons/pen.svg?dataurl" import ClockCircle from "@assets/icons/clock-circle.svg?dataurl" import Login2 from "@assets/icons/login-3.svg?dataurl" - import TrashBin2 from "@assets/icons/trash-bin-2.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" @@ -38,9 +29,9 @@ import PageBar from "@lib/components/PageBar.svelte" import PageContent from "@lib/components/PageContent.svelte" import Divider from "@lib/components/Divider.svelte" - import Confirm from "@lib/components/Confirm.svelte" import ThunkToast from "@app/components/ThunkToast.svelte" import MenuSpaceButton from "@app/components/MenuSpaceButton.svelte" + import RoomEdit from "@app/components/RoomEdit.svelte" import ChannelName from "@app/components/ChannelName.svelte" import ChannelItem from "@app/components/ChannelItem.svelte" import ChannelItemAddMember from "@src/app/components/ChannelItemAddMember.svelte" @@ -71,7 +62,6 @@ import {popKey} from "@lib/implicit" import {pushToast} from "@app/util/toast" import {pushModal} from "@app/util/modal" - import {makeSpacePath} from "@app/util/routes" const {room, relay} = $page.params as MakeNonOptional const mounted = now() @@ -92,7 +82,7 @@ joining = true try { - const message = await waitForThunkError(joinRoom(url, makeRoomMeta({id: room}))) + const message = await waitForThunkError(joinRoom(url, makeRoomMeta({h: room}))) if (message && !message.startsWith("duplicate:")) { return pushToast({theme: "error", message}) @@ -108,7 +98,7 @@ const leave = async () => { leaving = true try { - const message = await waitForThunkError(leaveRoom(url, makeRoomMeta({id: room}))) + const message = await waitForThunkError(leaveRoom(url, makeRoomMeta({h: room}))) if (message && !message.startsWith("duplicate:")) { pushToast({theme: "error", message}) @@ -307,23 +297,7 @@ } } - const startDelete = () => - pushModal(Confirm, { - title: "Are you sure you want to delete this room?", - message: - "This room will no longer be accessible to space members, and all messages posted to it will be deleted.", - confirm: async () => { - const thunk = deleteRoom(url, makeRoomMeta({id: room})) - const message = await waitForThunkError(thunk) - - if (message) { - repository.removeEvent(thunk.event.id) - pushToast({theme: "error", message}) - } else { - goto(makeSpacePath(url)) - } - }, - }) + const startEdit = () => pushModal(RoomEdit, {url, room}) onMount(() => { const observer = new ResizeObserver(() => { @@ -368,9 +342,9 @@ {#if $userIsAdmin || true} {:else if $membershipStatus === MembershipStatus.Initial}