174 lines
5.3 KiB
JavaScript
174 lines
5.3 KiB
JavaScript
'use strict';
|
|
|
|
const { TemplateView, AvatarView, text } = require('hydrogen-view-sdk');
|
|
const AvatarViewModel = require('../viewmodels/AvatarViewModel');
|
|
|
|
const safeSearchBlockedRoomTitle = 'Blocked by safe search';
|
|
const safeSearchBlockedRoomDescription =
|
|
'This room was blocked because safe search is turned on and may contain explicit content. Turn off safe search to view this room.';
|
|
|
|
const blockedBySafeSearchAvatarViewModel = new AvatarViewModel({
|
|
avatarTitle: 'x',
|
|
avatarLetterString: 'x',
|
|
entityId: 'x',
|
|
});
|
|
|
|
class RoomCardView extends TemplateView {
|
|
render(t, vm) {
|
|
const avatarViewModel = new AvatarViewModel({
|
|
homeserverUrlToPullMediaFrom: vm.homeserverUrlToPullMediaFrom,
|
|
avatarUrl: vm.mxcAvatarUrl,
|
|
avatarTitle: vm.name || vm.canonicalAlias || vm.roomId,
|
|
avatarLetterString:
|
|
vm.name ||
|
|
// Skip to the first letter after the `#` sigil from the alias
|
|
vm.canonicalAlias?.[1] ||
|
|
// Skip to the first letter after the `!` sigil from the room ID
|
|
vm.roomId?.[1],
|
|
entityId: vm.roomId,
|
|
});
|
|
|
|
// Pluralize based on number of members in the room
|
|
let memberDisplay = `${vm.numJoinedMembers} member`;
|
|
if (vm.numJoinedMembers > 1) {
|
|
memberDisplay = `${vm.numJoinedMembers} members`;
|
|
}
|
|
|
|
const aliasOrRoomId = vm.canonicalAlias || vm.roomId;
|
|
const displayName = vm.name || aliasOrRoomId;
|
|
|
|
return t.li(
|
|
{
|
|
className: {
|
|
RoomCardView: true,
|
|
blockedBySafeSearch: (vm) => vm.blockedBySafeSearch,
|
|
},
|
|
'data-room-id': vm.roomId,
|
|
'data-testid': 'room-card',
|
|
},
|
|
[
|
|
t.a(
|
|
{
|
|
className: 'RoomCardView_header',
|
|
href: (vm) => {
|
|
if (vm.blockedBySafeSearch) {
|
|
// Omit the href so the link is not clickable when it's blocked by
|
|
// safe search
|
|
return false;
|
|
}
|
|
|
|
return vm.roomUrl;
|
|
},
|
|
// Since this is the same button as the "View" link, just tab to
|
|
// that instead
|
|
tabindex: -1,
|
|
},
|
|
[
|
|
t.mapView(
|
|
(vm) => vm.blockedBySafeSearch,
|
|
(blockedBySafeSearch) => {
|
|
if (blockedBySafeSearch) {
|
|
return new AvatarView(blockedBySafeSearchAvatarViewModel, 24);
|
|
}
|
|
return new AvatarView(avatarViewModel, 24);
|
|
}
|
|
),
|
|
t.if(
|
|
(vm) => vm.name,
|
|
(t /*, vm*/) =>
|
|
t.h4(
|
|
{
|
|
className: 'RoomCardView_headerTitle',
|
|
// We add a title so a tooltip shows the full name on hover
|
|
title: (vm) => {
|
|
if (vm.blockedBySafeSearch) {
|
|
return safeSearchBlockedRoomTitle;
|
|
}
|
|
|
|
return displayName;
|
|
},
|
|
},
|
|
[
|
|
(vm) => {
|
|
if (vm.blockedBySafeSearch) {
|
|
return safeSearchBlockedRoomTitle;
|
|
}
|
|
|
|
return displayName;
|
|
},
|
|
]
|
|
)
|
|
),
|
|
]
|
|
),
|
|
t.if(
|
|
(vm) => !vm.blockedBySafeSearch,
|
|
(t /*, vm*/) =>
|
|
t.a(
|
|
{
|
|
className: 'RoomCardView_alias',
|
|
href: vm.roomUrl,
|
|
// Since this is the same button as the "View" link, just tab to
|
|
// that instead
|
|
tabindex: -1,
|
|
},
|
|
[aliasOrRoomId]
|
|
)
|
|
),
|
|
t.if(
|
|
(vm) => vm.blockedBySafeSearch,
|
|
(t /*, vm*/) =>
|
|
t.p({ className: 'RoomCardView_blockedBySafeSearchTopic' }, [
|
|
safeSearchBlockedRoomDescription,
|
|
])
|
|
),
|
|
t.if(
|
|
(vm) => !vm.blockedBySafeSearch,
|
|
(t /*, vm*/) =>
|
|
t.p({ className: 'RoomCardView_topic', title: vm.topic || null }, [vm.topic || ''])
|
|
),
|
|
t.div({ className: 'RoomCardView_footer' }, [
|
|
t.div({ className: 'RoomCardView_footerInner' }, [
|
|
t.div({}, [
|
|
t.if(
|
|
(vm) => !vm.blockedBySafeSearch,
|
|
(/*t , vm*/) => text(memberDisplay)
|
|
),
|
|
]),
|
|
t.a(
|
|
{
|
|
className: 'RoomCardView_viewButtonWrapperLink',
|
|
href: (vm) => {
|
|
if (vm.blockedBySafeSearch) {
|
|
// Omit the href so the link is not clickable when it's blocked by
|
|
// safe search
|
|
return false;
|
|
}
|
|
|
|
return vm.roomUrl;
|
|
},
|
|
title: (vm) => {
|
|
if (vm.blockedBySafeSearch) {
|
|
return `Turn off safe search to view this room`;
|
|
}
|
|
|
|
return `View the ${displayName} room`;
|
|
},
|
|
},
|
|
t.span(
|
|
{
|
|
className: 'RoomCardView_viewButton',
|
|
disabled: (vm) => vm.blockedBySafeSearch,
|
|
},
|
|
['View']
|
|
)
|
|
),
|
|
]),
|
|
]),
|
|
]
|
|
);
|
|
}
|
|
}
|
|
|
|
module.exports = RoomCardView;
|