Add room policy indicator
This commit is contained in:
parent
a52c2b4c3c
commit
41d50d8c28
8 changed files with 146 additions and 25 deletions
|
|
@ -43,7 +43,7 @@
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="w-96 rounded-box bg-base-100 p-4 shadow-lg">
|
<div class="w-96 rounded-box bg-base-100 p-4 shadow-2xl">
|
||||||
<label class="input input-bordered flex w-full items-center gap-2">
|
<label class="input input-bordered flex w-full items-center gap-2">
|
||||||
<Icon icon={Magnifier} />
|
<Icon icon={Magnifier} />
|
||||||
<input bind:value={searchTerm} class="grow" type="text" placeholder="Search icons..." />
|
<input bind:value={searchTerm} class="grow" type="text" placeholder="Search icons..." />
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
import RemoteControllerMinimalistic from "@assets/icons/remote-controller-minimalistic.svg?dataurl"
|
import RemoteControllerMinimalistic from "@assets/icons/remote-controller-minimalistic.svg?dataurl"
|
||||||
import UserRounded from "@assets/icons/user-rounded.svg?dataurl"
|
import UserRounded from "@assets/icons/user-rounded.svg?dataurl"
|
||||||
import LinkRound from "@assets/icons/link-round.svg?dataurl"
|
import LinkRound from "@assets/icons/link-round.svg?dataurl"
|
||||||
|
import SquareTopDown from "@assets/icons/square-top-down.svg?dataurl"
|
||||||
import Exit from "@assets/icons/logout-3.svg?dataurl"
|
import Exit from "@assets/icons/logout-3.svg?dataurl"
|
||||||
import Letter from "@assets/icons/letter.svg?dataurl"
|
import Letter from "@assets/icons/letter.svg?dataurl"
|
||||||
import Login from "@assets/icons/login-3.svg?dataurl"
|
import Login from "@assets/icons/login-3.svg?dataurl"
|
||||||
|
|
@ -157,6 +158,7 @@
|
||||||
<Link external href="https://landlubber.coracle.social">
|
<Link external href="https://landlubber.coracle.social">
|
||||||
<Icon icon={Tuning2} />
|
<Icon icon={Tuning2} />
|
||||||
Manage Space
|
Manage Space
|
||||||
|
<Icon icon={SquareTopDown} size={4} class="opacity-50" />
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
{:else if $relay?.pubkey}
|
{:else if $relay?.pubkey}
|
||||||
|
|
@ -184,7 +186,7 @@
|
||||||
</Popover>
|
</Popover>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="flex max-h-[calc(100vh-150px)] min-h-0 flex-col gap-1 overflow-auto">
|
<div class="flex max-h-[calc(100vh-250px)] min-h-0 flex-col gap-1 overflow-auto">
|
||||||
{#if hasNip29($relay)}
|
{#if hasNip29($relay)}
|
||||||
<SecondaryNavItem {replaceState} href={makeSpacePath(url, "recent")}>
|
<SecondaryNavItem {replaceState} href={makeSpacePath(url, "recent")}>
|
||||||
<Icon icon={History} /> Recent Activity
|
<Icon icon={History} /> Recent Activity
|
||||||
|
|
|
||||||
37
src/app/components/RoomAccess.svelte
Normal file
37
src/app/components/RoomAccess.svelte
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import EyeClosed from "@assets/icons/eye-closed.svg?dataurl"
|
||||||
|
import Lock from "@assets/icons/lock.svg?dataurl"
|
||||||
|
import Microphone from "@assets/icons/microphone.svg?dataurl"
|
||||||
|
import Icon from "@lib/components/Icon.svelte"
|
||||||
|
import Button from "@lib/components/Button.svelte"
|
||||||
|
import {deriveRoom} from "@app/core/state"
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
h: any
|
||||||
|
url: any
|
||||||
|
}
|
||||||
|
|
||||||
|
const {url, h}: Props = $props()
|
||||||
|
|
||||||
|
const room = deriveRoom(url, h)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if $room.isHidden}
|
||||||
|
<Button
|
||||||
|
class="btn btn-neutral btn-sm tooltip tooltip-left"
|
||||||
|
data-tip="This room is not visible to non-members.">
|
||||||
|
<Icon size={4} icon={EyeClosed} />
|
||||||
|
</Button>
|
||||||
|
{:else if $room.isPrivate}
|
||||||
|
<Button
|
||||||
|
class="btn btn-neutral btn-sm tooltip tooltip-left"
|
||||||
|
data-tip="Only members can view messages.">
|
||||||
|
<Icon size={4} icon={Lock} />
|
||||||
|
</Button>
|
||||||
|
{:else if $room.isRestricted}
|
||||||
|
<Button
|
||||||
|
class="btn btn-neutral btn-sm tooltip tooltip-left"
|
||||||
|
data-tip="Only members can send messages.">
|
||||||
|
<Icon size={4} icon={Microphone} />
|
||||||
|
</Button>
|
||||||
|
{/if}
|
||||||
21
src/app/components/RoomImage.svelte
Normal file
21
src/app/components/RoomImage.svelte
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import Hashtag from "@assets/icons/hashtag.svg?dataurl"
|
||||||
|
import Icon from "@lib/components/Icon.svelte"
|
||||||
|
import ImageIcon from "@lib/components/ImageIcon.svelte"
|
||||||
|
import {deriveRoom} from "@app/core/state"
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
h: any
|
||||||
|
url: any
|
||||||
|
}
|
||||||
|
|
||||||
|
const {url, h}: Props = $props()
|
||||||
|
|
||||||
|
const room = deriveRoom(url, h)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if $room.picture}
|
||||||
|
<ImageIcon src={$room.picture} alt="Room icon" />
|
||||||
|
{:else}
|
||||||
|
<Icon icon={Hashtag} />
|
||||||
|
{/if}
|
||||||
|
|
@ -4,4 +4,6 @@
|
||||||
const {url, h} = $props()
|
const {url, h} = $props()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{$roomsById.get(makeRoomId(url, h))?.name || h}
|
<span class="ellipsize">
|
||||||
|
{$roomsById.get(makeRoomId(url, h))?.name || h}
|
||||||
|
</span>
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,20 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Hashtag from "@assets/icons/hashtag.svg?dataurl"
|
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
|
||||||
import ImageIcon from "@lib/components/ImageIcon.svelte"
|
|
||||||
import RoomName from "@app/components/RoomName.svelte"
|
import RoomName from "@app/components/RoomName.svelte"
|
||||||
import {deriveRoom} from "@app/core/state"
|
import RoomImage from "@app/components/RoomImage.svelte"
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
url: any
|
|
||||||
h: any
|
h: any
|
||||||
|
url: any
|
||||||
}
|
}
|
||||||
|
|
||||||
const {url, h}: Props = $props()
|
const {url, h}: Props = $props()
|
||||||
|
|
||||||
const room = deriveRoom(url, h)
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if $room.picture}
|
<div class="flex flex-grow items-center justify-between gap-4">
|
||||||
{@const src = $room.picture}
|
<div class="flex items-center gap-3">
|
||||||
<ImageIcon {src} alt="Room icon" />
|
<RoomImage {url} {h} />
|
||||||
{:else}
|
<div class="min-w-0 overflow-hidden text-ellipsis">
|
||||||
<Icon icon={Hashtag} />
|
<RoomName {url} {h} />
|
||||||
{/if}
|
</div>
|
||||||
<div class="min-w-0 overflow-hidden text-ellipsis">
|
</div>
|
||||||
<RoomName {url} {h} />
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
67
src/lib/components/Tooltip.svelte
Normal file
67
src/lib/components/Tooltip.svelte
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
<style>
|
||||||
|
:global(.tippy-box[data-theme~="tooltip"]) {
|
||||||
|
background-color: var(--neutral);
|
||||||
|
color: var(--neutral-content);
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
padding: 0.25rem 0.5rem;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
box-shadow:
|
||||||
|
0 4px 6px -1px rgb(0 0 0 / 0.1),
|
||||||
|
0 2px 4px -2px rgb(0 0 0 / 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(.tippy-box[data-theme~="tooltip"][data-placement^="top"] > .tippy-arrow::before) {
|
||||||
|
border-top-color: var(--neutral);
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(.tippy-box[data-theme~="tooltip"][data-placement^="bottom"] > .tippy-arrow::before) {
|
||||||
|
border-bottom-color: var(--neutral);
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(.tippy-box[data-theme~="tooltip"][data-placement^="left"] > .tippy-arrow::before) {
|
||||||
|
border-left-color: var(--neutral);
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(.tippy-box[data-theme~="tooltip"][data-placement^="right"] > .tippy-arrow::before) {
|
||||||
|
border-right-color: var(--neutral);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import "tippy.js/animations/shift-away.css"
|
||||||
|
|
||||||
|
import tippy from "tippy.js"
|
||||||
|
import {onMount} from "svelte"
|
||||||
|
import {isMobile} from "@lib/html"
|
||||||
|
|
||||||
|
let {
|
||||||
|
content,
|
||||||
|
arrow = true,
|
||||||
|
interactive = false,
|
||||||
|
children = undefined,
|
||||||
|
instance = $bindable(),
|
||||||
|
...restProps
|
||||||
|
} = $props()
|
||||||
|
|
||||||
|
let element: Element
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
instance = tippy(element, {
|
||||||
|
content,
|
||||||
|
arrow,
|
||||||
|
interactive,
|
||||||
|
animation: "shift-away",
|
||||||
|
theme: "tooltip",
|
||||||
|
appendTo: document.querySelector(".tippy-target")!,
|
||||||
|
trigger: isMobile ? "click" : "mouseenter focus",
|
||||||
|
})
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
instance?.destroy()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div bind:this={element} class={restProps.class}>
|
||||||
|
{@render children?.()}
|
||||||
|
</div>
|
||||||
|
|
@ -16,7 +16,6 @@
|
||||||
} from "@welshman/util"
|
} from "@welshman/util"
|
||||||
import {pubkey, publishThunk, waitForThunkError, joinRoom, leaveRoom} from "@welshman/app"
|
import {pubkey, publishThunk, waitForThunkError, joinRoom, leaveRoom} from "@welshman/app"
|
||||||
import {slide, fade, fly} from "@lib/transition"
|
import {slide, fade, fly} from "@lib/transition"
|
||||||
import Hashtag from "@assets/icons/hashtag.svg?dataurl"
|
|
||||||
import Pen from "@assets/icons/pen.svg?dataurl"
|
import Pen from "@assets/icons/pen.svg?dataurl"
|
||||||
import ClockCircle from "@assets/icons/clock-circle.svg?dataurl"
|
import ClockCircle from "@assets/icons/clock-circle.svg?dataurl"
|
||||||
import Login2 from "@assets/icons/login-3.svg?dataurl"
|
import Login2 from "@assets/icons/login-3.svg?dataurl"
|
||||||
|
|
@ -33,6 +32,8 @@
|
||||||
import MenuSpaceButton from "@app/components/MenuSpaceButton.svelte"
|
import MenuSpaceButton from "@app/components/MenuSpaceButton.svelte"
|
||||||
import RoomEdit from "@app/components/RoomEdit.svelte"
|
import RoomEdit from "@app/components/RoomEdit.svelte"
|
||||||
import RoomName from "@app/components/RoomName.svelte"
|
import RoomName from "@app/components/RoomName.svelte"
|
||||||
|
import RoomAccess from "@app/components/RoomAccess.svelte"
|
||||||
|
import RoomImage from "@app/components/RoomImage.svelte"
|
||||||
import RoomItem from "@app/components/RoomItem.svelte"
|
import RoomItem from "@app/components/RoomItem.svelte"
|
||||||
import RoomItemAddMember from "@src/app/components/RoomItemAddMember.svelte"
|
import RoomItemAddMember from "@src/app/components/RoomItemAddMember.svelte"
|
||||||
import RoomItemRemoveMember from "@src/app/components/RoomItemRemoveMember.svelte"
|
import RoomItemRemoveMember from "@src/app/components/RoomItemRemoveMember.svelte"
|
||||||
|
|
@ -334,17 +335,14 @@
|
||||||
|
|
||||||
<PageBar>
|
<PageBar>
|
||||||
{#snippet icon()}
|
{#snippet icon()}
|
||||||
<div class="center">
|
<RoomImage {url} {h} />
|
||||||
<Icon icon={Hashtag} />
|
|
||||||
</div>
|
|
||||||
{/snippet}
|
{/snippet}
|
||||||
{#snippet title()}
|
{#snippet title()}
|
||||||
<strong class="ellipsize">
|
<RoomName {url} {h} />
|
||||||
<RoomName {url} {h} />
|
|
||||||
</strong>
|
|
||||||
{/snippet}
|
{/snippet}
|
||||||
{#snippet action()}
|
{#snippet action()}
|
||||||
<div class="row-2">
|
<div class="row-2">
|
||||||
|
<RoomAccess {url} {h} />
|
||||||
{#if $userIsAdmin}
|
{#if $userIsAdmin}
|
||||||
<Button
|
<Button
|
||||||
class="btn btn-neutral btn-sm tooltip tooltip-left"
|
class="btn btn-neutral btn-sm tooltip tooltip-left"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue