import NotificationBadge from '../../atoms/badge/NotificationBadge';
import { blurOnBubbling } from '../../atoms/button/script';
+function ChannelSelectorWrapper({
+ isSelected, onClick, content, options,
+}) {
+ return (
+ <div className={`channel-selector${isSelected ? ' channel-selector--selected' : ''}`}>
+ <button
+ className="channel-selector__content"
+ type="button"
+ onClick={onClick}
+ onMouseUp={(e) => blurOnBubbling(e, '.channel-selector__wrapper')}
+ >
+ {content}
+ </button>
+ <div className="channel-selector__options">{options}</div>
+ </div>
+ );
+}
+ChannelSelectorWrapper.defaultProps = {
+ options: null,
+};
+ChannelSelectorWrapper.propTypes = {
+ isSelected: PropTypes.bool.isRequired,
+ onClick: PropTypes.func.isRequired,
+ content: PropTypes.node.isRequired,
+ options: PropTypes.node,
+};
+
function ChannelSelector({
- selected, unread, notificationCount, alert,
- iconSrc, imageSrc, roomId, onClick, children,
+ name, roomId, imageSrc, iconSrc,
+ isSelected, isUnread, notificationCount, isAlert,
+ options, onClick,
}) {
return (
- <button
- className={`channel-selector__button-wrapper${selected ? ' channel-selector--selected' : ''}`}
- type="button"
- onClick={onClick}
- onMouseUp={(e) => blurOnBubbling(e, '.channel-selector__button-wrapper')}
- >
- <div className="channel-selector">
- <div className="channel-selector__icon flex--center">
+ <ChannelSelectorWrapper
+ isSelected={isSelected}
+ content={(
+ <>
<Avatar
- text={children.slice(0, 1)}
+ text={name.slice(0, 1)}
bgColor={colorMXID(roomId)}
imageSrc={imageSrc}
iconSrc={iconSrc}
size="extra-small"
/>
- </div>
- <div className="channel-selector__text-container">
- <Text variant="b1">{children}</Text>
- </div>
- <div className="channel-selector__badge-container">
- { unread && (
+ <Text variant="b1">{name}</Text>
+ { isUnread && (
<NotificationBadge
- alert={alert}
+ alert={isAlert}
content={notificationCount !== 0 ? notificationCount : null}
/>
)}
- </div>
- </div>
- </button>
+ </>
+ )}
+ options={options}
+ onClick={onClick}
+ />
);
}
-
ChannelSelector.defaultProps = {
- selected: false,
- unread: false,
- notificationCount: 0,
- alert: false,
- iconSrc: null,
imageSrc: null,
+ iconSrc: null,
+ options: null,
};
-
ChannelSelector.propTypes = {
- selected: PropTypes.bool,
- unread: PropTypes.bool,
- notificationCount: PropTypes.number,
- alert: PropTypes.bool,
- iconSrc: PropTypes.string,
- imageSrc: PropTypes.string,
+ name: PropTypes.string.isRequired,
roomId: PropTypes.string.isRequired,
+ imageSrc: PropTypes.string,
+ iconSrc: PropTypes.string,
+ isSelected: PropTypes.bool.isRequired,
+ isUnread: PropTypes.bool.isRequired,
+ notificationCount: PropTypes.number.isRequired,
+ isAlert: PropTypes.bool.isRequired,
+ options: PropTypes.node,
onClick: PropTypes.func.isRequired,
- children: PropTypes.string.isRequired,
};
export default ChannelSelector;
-.channel-selector__button-wrapper {
- display: block;
- width: calc(100% - var(--sp-extra-tight));
- margin-left: auto;
- padding: var(--sp-extra-tight) var(--sp-extra-tight);
-
+.channel-selector-flex {
+ display: flex;
+ align-items: center;
+}
+.channel-selector-flexItem {
+ flex: 1;
+ min-width: 0;
+ min-height: 0;
+}
+
+.channel-selector {
+ @extend .channel-selector-flex;
+
border: 1px solid transparent;
- border-radius: var(--bo-radius);
+ border-radius: var(--bo-radius);
cursor: pointer;
+
+ &--selected {
+ background-color: var(--bg-surface);
+ border-color: var(--bg-surface-border);
- [dir=rtl] & {
-
- margin: {
- left: 0;
- right: auto;
+ & .channel-selector__options {
+ display: flex;
}
}
@media (hover: hover) {
&:hover {
background-color: var(--bg-surface-hover);
+ & .channel-selector__options {
+ display: flex;
+ }
}
}
&:focus {
&:active {
background-color: var(--bg-surface-active);
}
+ &--selected:hover,
+ &--selected:focus,
+ &--selected:active {
+ background-color: var(--bg-surface);
+ }
}
-.channel-selector {
- display: flex;
- align-items: center;
- &__icon {
- width: 24px;
- height: 24px;
- .avatar__border {
- box-shadow: none;
- }
+.channel-selector__content {
+ @extend .channel-selector-flexItem;
+ @extend .channel-selector-flex;
+ padding: 0 var(--sp-extra-tight);
+ min-height: 40px;
+ cursor: inherit;
+
+ & > .avatar-container .avatar__bordered {
+ box-shadow: none;
}
- &__text-container {
- flex: 1;
- min-width: 0;
+
+ & > .text {
+ @extend .channel-selector-flexItem;
margin: 0 var(--sp-extra-tight);
- & .text {
- color: var(--tc-surface-normal);
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- }
+ color: var(--tc-surface-normal);
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
}
}
+.channel-selector__options {
+ @extend .channel-selector-flex;
+ display: none;
+ margin-right: var(--sp-ultra-tight);
-.channel-selector--selected {
- background-color: var(--bg-surface);
- border-color: var(--bg-surface-border);
+ [dir=rtl] & {
+ margin-right: 0;
+ margin-left: var(--sp-ultra-tight);
+ }
+
+ &:empty {
+ margin: 0 !important;
+ }
+
+ & .ic-btn-surface {
+ padding: 6px;
+ border-radius: calc(var(--bo-radius) / 2);
+ }
}
\ No newline at end of file