refactor/split to roomListElement/userListElement
parent
5f536adc8f
commit
63d3f6fb47
@ -0,0 +1,92 @@
|
|||||||
|
<template>
|
||||||
|
<div class="roomListElement" :title="room.name">
|
||||||
|
<div class="imageContainer">
|
||||||
|
<avatar
|
||||||
|
class="roomImage"
|
||||||
|
:mxcURL="getMxcFromRoom(room)"
|
||||||
|
:fallback="room.roomId"
|
||||||
|
:size="3"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="roomListName">{{room.name}}</div>
|
||||||
|
<div class="status">{{getPreviewString(room)}}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import avatar from "@/components/avatar";
|
||||||
|
import {getMxcFromRoom} from "@/lib/getMxc";
|
||||||
|
import {getTime} from "@/lib/getTimeStrings";
|
||||||
|
import {matrix} from "@/main";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "userListElement",
|
||||||
|
components:{
|
||||||
|
avatar
|
||||||
|
},
|
||||||
|
props:{
|
||||||
|
room: Object
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
getPreviewString(room){
|
||||||
|
let event = this.getLatestEvent(room);
|
||||||
|
if (!event) return '';
|
||||||
|
return `${this.calcUserName(event.sender)}: ${event.content.body||'unknown event'} ${getTime(event.origin_server_ts)}`;
|
||||||
|
},
|
||||||
|
getLatestEvent(room){
|
||||||
|
if (!room.timeline[room.timeline.length-1]) return undefined;
|
||||||
|
return room.timeline[room.timeline.length-1].event;
|
||||||
|
},
|
||||||
|
calcUserName(userId) {
|
||||||
|
if (matrix.user === userId) return 'you';
|
||||||
|
return matrix.client.getUser(userId).displayName || userId;
|
||||||
|
},
|
||||||
|
getMxcFromRoom
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.roomListElement{
|
||||||
|
position: relative;
|
||||||
|
height: 3rem;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
.imageContainer{
|
||||||
|
position: absolute;
|
||||||
|
height: 3rem;
|
||||||
|
width: 3rem;
|
||||||
|
left: 0.5rem;
|
||||||
|
.roomImage {
|
||||||
|
height: inherit;
|
||||||
|
width: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.roomListName{
|
||||||
|
position: absolute;
|
||||||
|
left: 4rem;
|
||||||
|
top: 0.25rem;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: calc(100% - 5rem);
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.status{
|
||||||
|
position: absolute;
|
||||||
|
top: 1.5rem;
|
||||||
|
left: 4rem;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
text-align: left;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
width: calc(100% - 4.5rem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.roomListElement:hover{
|
||||||
|
background-color: #4444;
|
||||||
|
}
|
||||||
|
</style>
|
@ -0,0 +1,84 @@
|
|||||||
|
<template>
|
||||||
|
<div class="userListElement" :title="user.userId">
|
||||||
|
<div class="imageContainer">
|
||||||
|
<avatar
|
||||||
|
class="userImage"
|
||||||
|
:mxcURL="user.avatarUrl"
|
||||||
|
:fallback="user.userId"
|
||||||
|
:size="3"
|
||||||
|
/>
|
||||||
|
<div v-if="user.currentlyActive" class="online"></div>
|
||||||
|
</div>
|
||||||
|
<div class="userListName">{{user.displayName || user.userId}}</div>
|
||||||
|
<div class="status">{{user.presence}}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import avatar from "@/components/avatar";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "userListElement",
|
||||||
|
components:{
|
||||||
|
avatar
|
||||||
|
},
|
||||||
|
props:{
|
||||||
|
user: Object
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.userListElement{
|
||||||
|
position: relative;
|
||||||
|
height: 3rem;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
.imageContainer{
|
||||||
|
position: absolute;
|
||||||
|
height: 3rem;
|
||||||
|
width: 3rem;
|
||||||
|
left: 0.5rem;
|
||||||
|
.userImage {
|
||||||
|
height: inherit;
|
||||||
|
width: inherit;
|
||||||
|
}
|
||||||
|
.online {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 0.6rem;
|
||||||
|
width: 0.6rem;
|
||||||
|
background-color: #42b983;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 0.2rem solid #222;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.userListName{
|
||||||
|
position: absolute;
|
||||||
|
left: 4rem;
|
||||||
|
top: 0.25rem;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: calc(100% - 5rem);
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.status{
|
||||||
|
position: absolute;
|
||||||
|
top: 1.5rem;
|
||||||
|
left: 4rem;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
text-align: left;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
width: calc(100% - 4.5rem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.userListElement:hover{
|
||||||
|
background-color: #4444;
|
||||||
|
}
|
||||||
|
</style>
|
@ -0,0 +1,19 @@
|
|||||||
|
import sdk from 'matrix-js-sdk'
|
||||||
|
import {matrix} from "@/main";
|
||||||
|
|
||||||
|
export function getMxcFromUser(user){
|
||||||
|
return user.avatarUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getMxcFromUserId(userId){
|
||||||
|
return matrix.client.getUser(userId).avatarUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getMxcFromRoom(room){
|
||||||
|
let avatarState = room.getLiveTimeline().getState(sdk.EventTimeline.FORWARDS).getStateEvents("m.room.avatar");
|
||||||
|
return avatarState.length>0?avatarState[avatarState.length-1].getContent().url:undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getMxcFromRoomId(roomId){
|
||||||
|
return getMxcFromRoom(matrix.client.getRoom(roomId));
|
||||||
|
}
|
Loading…
Reference in New Issue