Merge pull request #538 from sumnerevans/render-room-topic

web/roomview: render room topic in header
This commit is contained in:
Tulir Asokan 2024-12-06 18:43:28 +02:00 committed by GitHub
commit 0930e94fb2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 66 additions and 9 deletions

View file

@ -151,4 +151,9 @@ img.avatar {
width: 1rem; width: 1rem;
height: 1rem; height: 1rem;
} }
&.large {
width: 5rem;
height: 5rem;
}
} }

View file

@ -5,7 +5,7 @@ div.room-view {
display: grid; display: grid;
outline: none; outline: none;
grid-template: grid-template:
"header" 3rem "header" 3.5rem
"messageview" 1fr "messageview" 1fr
"autocomplete" 0 "autocomplete" 0
"input" auto "input" auto

View file

@ -6,12 +6,26 @@ div.room-header {
border-bottom: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);
overflow: hidden; overflow: hidden;
> div.room-name { > div.room-name-and-topic {
font-weight: bold;
overflow: hidden;
text-overflow: ellipsis;
text-wrap: nowrap;
flex: 1; flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
> div.room-name, > div.room-topic {
overflow: hidden;
text-overflow: ellipsis;
text-wrap: nowrap;
}
> div.room-name {
font-weight: bold;
}
> div.room-topic {
font-size: 0.85rem;
color: var(--secondary-text-color);
}
} }
> button.back { > button.back {

View file

@ -52,8 +52,13 @@ const RoomViewHeader = ({ room }: RoomViewHeaderProps) => {
onClick={use(LightboxContext)} onClick={use(LightboxContext)}
alt="" alt=""
/> />
<div className="room-name"> <div className="room-name-and-topic">
{roomMeta.name ?? roomMeta.room_id} <div className="room-name">
{roomMeta.name ?? roomMeta.room_id}
</div>
{roomMeta.topic && <div className="room-topic">
{roomMeta.topic}
</div>}
</div> </div>
<div className="right-buttons"> <div className="right-buttons">
<button <button

View file

@ -1,4 +1,20 @@
div.settings-view { div.settings-view {
div.room-details {
display: flex;
gap: .5rem;
img.avatar {
margin-top: 0.5rem;
}
div.room-name {
font-size: 1.2rem;
font-weight: bold;
text-overflow: ellipsis;
text-wrap: nowrap;
}
}
width: min(60rem, 80vw); width: min(60rem, 80vw);
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View file

@ -16,6 +16,7 @@
import { Suspense, lazy, use, useCallback, useRef, useState } from "react" import { Suspense, lazy, use, useCallback, useRef, useState } from "react"
import { ScaleLoader } from "react-spinners" import { ScaleLoader } from "react-spinners"
import Client from "@/api/client.ts" import Client from "@/api/client.ts"
import { getRoomAvatarURL } from "@/api/media.ts"
import { RoomStateStore, usePreferences } from "@/api/statestore" import { RoomStateStore, usePreferences } from "@/api/statestore"
import { import {
Preference, Preference,
@ -25,8 +26,10 @@ import {
preferenceContextToInt, preferenceContextToInt,
preferences, preferences,
} from "@/api/types/preferences" } from "@/api/types/preferences"
import { useEventAsState } from "@/util/eventdispatcher.ts"
import useEvent from "@/util/useEvent.ts" import useEvent from "@/util/useEvent.ts"
import ClientContext from "../ClientContext.ts" import ClientContext from "../ClientContext.ts"
import { LightboxContext } from "../modal/Lightbox.tsx"
import JSONView from "../util/JSONView.tsx" import JSONView from "../util/JSONView.tsx"
import Toggle from "../util/Toggle.tsx" import Toggle from "../util/Toggle.tsx"
import CloseIcon from "@/icons/close.svg?react" import CloseIcon from "@/icons/close.svg?react"
@ -289,6 +292,7 @@ const AppliedSettingsView = ({ room }: SettingsViewProps) => {
} }
const SettingsView = ({ room }: SettingsViewProps) => { const SettingsView = ({ room }: SettingsViewProps) => {
const roomMeta = useEventAsState(room.meta)
const client = use(ClientContext)! const client = use(ClientContext)!
const setPref = useCallback((context: PreferenceContext, key: keyof Preferences, value: PreferenceValueType | undefined) => { const setPref = useCallback((context: PreferenceContext, key: keyof Preferences, value: PreferenceValueType | undefined) => {
if (context === PreferenceContext.Account) { if (context === PreferenceContext.Account) {
@ -330,7 +334,20 @@ const SettingsView = ({ room }: SettingsViewProps) => {
const roomLocal = room.localPreferenceCache const roomLocal = room.localPreferenceCache
return <> return <>
<h2>Settings</h2> <h2>Settings</h2>
<code>{room.roomID}</code> <div className="room-details">
<img
className="avatar large"
loading="lazy"
src={getRoomAvatarURL(roomMeta)}
onClick={use(LightboxContext)}
alt=""
/>
<div>
{roomMeta.name && <div className="room-name">{roomMeta.name}</div>}
<code>{room.roomID}</code>
<div>{roomMeta.topic}</div>
</div>
</div>
<table> <table>
<thead> <thead>
<tr> <tr>