diff --git a/web/chat/chat-thread-ancestors.css b/web/chat/chat-thread-ancestors.css new file mode 100644 --- /dev/null +++ b/web/chat/chat-thread-ancestors.css @@ -0,0 +1,47 @@ +div.ancestorThreadsContainer { + font-size: var(--xs-font-12); + display: flex; + align-items: center; + column-gap: 5px; +} + +div.ancestorName { + display: flex; + align-items: center; + padding: 2px 6px; + border-radius: 2px; + box-sizing: border-box; + height: 22px; +} + +button.seeFullStructure { + background-color: transparent; + border: none; + cursor: pointer; +} + +div.ancestorKeyserver { + display: flex; + align-items: center; +} + +div.ancestorKeyserverName { + border-radius: 0px 2px 2px 0px; +} + +div.ancestorKeyserverOperator { + display: flex; + column-gap: 5px; + padding: 0px 5px; + align-items: center; + border: 1px solid var(--thread-ancestor-keyserver-border); + border-radius: 2px 0px 0px 2px; + height: 22px; + box-sizing: border-box; +} + +button.seeFullAncestor { + font-size: var(--xs-font-12); + font-weight: var(--semi-bold); + cursor: pointer; +} diff --git a/web/chat/chat-thread-ancestors.react.js b/web/chat/chat-thread-ancestors.react.js new file mode 100644 --- /dev/null +++ b/web/chat/chat-thread-ancestors.react.js @@ -0,0 +1,110 @@ +// @flow +import classNames from 'classnames'; +import * as React from 'react'; + +import { useAncestorThreads } from 'lib/shared/ancestor-threads'; +import { memberHasAdminPowers, colorIsDark } from 'lib/shared/thread-utils'; +import type { ThreadInfo, RelativeMemberInfo } from 'lib/types/thread-types'; + +import { useSelector } from '../redux/redux-utils'; +import SWMansionIcon from '../SWMansionIcon.react'; +import css from './chat-thread-ancestors.css'; + +type ThreadAncestorsProps = { + +threadInfo: ThreadInfo, +}; +function ThreadAncestors(props: ThreadAncestorsProps): React.Node { + const { threadInfo } = props; + const threadColor = threadInfo.color; + const darkColor = colorIsDark(threadColor); + const threadBackgroundColorStyle = React.useMemo( + () => ({ + backgroundColor: `#${threadInfo.color}`, + color: darkColor + ? 'var(--thread-ancestor-color-light)' + : 'var(--thread-ancestor-color-dark)', + }), + [darkColor, threadInfo.color], + ); + const threadColorStyle = React.useMemo( + () => ({ color: `#${threadInfo.color}` }), + [threadInfo.color], + ); + + const ancestorThreads = useAncestorThreads(threadInfo); + + const userInfos = useSelector(state => state.userStore.userInfos); + const community = ancestorThreads[0] ?? threadInfo; + const keyserverOperatorUsername: ?string = React.useMemo(() => { + for (const member: RelativeMemberInfo of community.members) { + if (memberHasAdminPowers(member)) { + return userInfos[member.id].username; + } + } + }, [community, userInfos]); + + const keyserverInfo = React.useMemo( + () => ( +