Knock support
Also, fix token refresh functionality
This commit is contained in:
parent
cfabd8be08
commit
e8f04d79c9
11 changed files with 310 additions and 75 deletions
|
|
@ -192,7 +192,7 @@
|
|||
<v-list-item
|
||||
class="member"
|
||||
v-show="showAllMembers || index < SHOW_MEMBER_LIMIT"
|
||||
@click="onListItemClick(member)"
|
||||
@click="onMemberClick(member)"
|
||||
>
|
||||
<div>
|
||||
<div class="user-icon-with-badge">
|
||||
|
|
@ -236,6 +236,81 @@
|
|||
</div>
|
||||
</v-card>
|
||||
|
||||
<!-- KNOCKS, only shown is joinRule is knock -->
|
||||
<v-card class="members ma-3" variant="flat" v-if="iAmAdmin && roomJoinRule == 'knock'">
|
||||
<v-card-title class="h2"
|
||||
>{{ $t("room_info.knocks") }}<v-spacer></v-spacer>
|
||||
<div>{{ knocks.length }}</div></v-card-title
|
||||
>
|
||||
<v-list>
|
||||
<template v-for="(member, index) in knocks" :key="member.userId">
|
||||
<v-list-item
|
||||
class="member"
|
||||
v-show="showAllKnocks || index < SHOW_MEMBER_LIMIT"
|
||||
@click="onKnockClick(member)"
|
||||
>
|
||||
<div>
|
||||
<div class="user-icon-with-badge">
|
||||
<v-avatar class="avatar" size="32" color="grey">
|
||||
<AuthedImage v-if="memberAvatar(member)" :src="memberAvatar(member)" />
|
||||
<span v-else class="text-white headline">{{
|
||||
member.name.substring(0, 1).toUpperCase()
|
||||
}}</span>
|
||||
</v-avatar>
|
||||
<v-avatar circle class="user-badge" size="15" v-if="isAdmin(member) || isModerator(member)">
|
||||
<v-icon style="min-width: 15px;min-height: 15px;">{{ `$vuetify.icons.${isAdmin(member)? 'make_admin' : 'make_moderator'}` }}</v-icon>
|
||||
</v-avatar>
|
||||
</div>
|
||||
<span class="user-name">
|
||||
{{
|
||||
member.userId == $matrix.currentUserId
|
||||
? $t("room_info.user_you", {
|
||||
user: member.user ? member.user.displayName : member.name,
|
||||
})
|
||||
: $t("room_info.user", {
|
||||
user: member.user ? member.user.displayName : member.name,
|
||||
})
|
||||
}}
|
||||
</span>
|
||||
<span v-if="isAdmin(member)" class="user-power">
|
||||
{{ $t("room_info.user_admin") }}
|
||||
</span>
|
||||
<span v-else-if="isModerator(member)" class="user-power">
|
||||
{{ $t("room_info.user_moderator") }}
|
||||
</span>
|
||||
<div class="knock-reason">{{ member.events?.member ? member.events?.member.getContent().reason : "" }}</div>
|
||||
</div>
|
||||
|
||||
<!-- Accept/Deny knock buttons-->
|
||||
<template v-slot:append>
|
||||
<v-list-item-action>
|
||||
<v-tooltip location="top">
|
||||
<template v-slot:activator="{ props }">
|
||||
<v-btn color="transparent" v-bind="props" @click.stop="acceptKnock(member)" icon="thumb_up"></v-btn>
|
||||
</template>
|
||||
<span>{{ $t("room_info.accept_knock") }}</span>
|
||||
</v-tooltip>
|
||||
<v-tooltip location="top">
|
||||
<template v-slot:activator="{ props }">
|
||||
<v-btn color="transparent" v-bind="props" @click.stop="rejectKnock(member)" icon="block"></v-btn>
|
||||
</template>
|
||||
<span>{{ $t("room_info.reject_knock") }}</span>
|
||||
</v-tooltip>
|
||||
</v-list-item-action>
|
||||
</template>
|
||||
|
||||
</v-list-item>
|
||||
<v-divider
|
||||
v-if="(showAllKnocks || index < SHOW_MEMBER_LIMIT) && index < knocks.length - 1"
|
||||
:key="index"
|
||||
></v-divider>
|
||||
</template>
|
||||
</v-list>
|
||||
<div class="show-all p-2" @click="showAllKnocks = !showAllKnocks" v-if="knocks.length > SHOW_MEMBER_LIMIT">
|
||||
{{ showAllKnocks ? $t("room_info.hide_all") : $t("room_info.show_all") }}
|
||||
</div>
|
||||
</v-card>
|
||||
|
||||
<!-- EXPORT CHAT -->
|
||||
<div style="text-align: center">
|
||||
<v-btn
|
||||
|
|
@ -314,8 +389,10 @@ export default {
|
|||
data() {
|
||||
return {
|
||||
members: [],
|
||||
knocks: [],
|
||||
user: null,
|
||||
showAllMembers: false,
|
||||
showAllKnocks: false,
|
||||
showMemberActionConfirmation: false,
|
||||
showLeaveConfirmation: false,
|
||||
showPurgeConfirmation: false,
|
||||
|
|
@ -334,6 +411,11 @@ export default {
|
|||
text: this.$t("room_info.join_invite"),
|
||||
icon: "person_add",
|
||||
},
|
||||
{
|
||||
id: "knock",
|
||||
text: this.$t("room_info.join_knock"),
|
||||
icon: "doorbell",
|
||||
},
|
||||
],
|
||||
SHOW_MEMBER_LIMIT: 5,
|
||||
exporting: false,
|
||||
|
|
@ -430,10 +512,21 @@ export default {
|
|||
const retentionPeriodsFound = this.retentionPeriods.find(rp => rp.value===retention)
|
||||
this.messageRetentionDisplay = retentionPeriodsFound.text
|
||||
},
|
||||
onListItemClick(member) {
|
||||
onMemberClick(member) {
|
||||
this.activeMember = member
|
||||
this.showMemberActionConfirmation = true
|
||||
},
|
||||
onKnockClick(member) {
|
||||
this.activeMember = member
|
||||
this.showMemberActionConfirmation = true
|
||||
},
|
||||
acceptKnock(member) {
|
||||
this.$matrix.answerKnock(member.roomId, member.userId, true, undefined);
|
||||
},
|
||||
rejectKnock(member) {
|
||||
this.$matrix.answerKnock(member.roomId, member.userId, false, undefined);
|
||||
},
|
||||
|
||||
onEvent(event) {
|
||||
if (this.room && this.room.roomId == event.getRoomId()) {
|
||||
// For this room
|
||||
|
|
@ -466,8 +559,30 @@ export default {
|
|||
const bName = b.user ? b.user.displayName : b.name;
|
||||
return aName.localeCompare(bName);
|
||||
});
|
||||
this.knocks = this.room.getMembersWithMembership("knock").sort((a, b) => {
|
||||
// Place ourselves at the top!
|
||||
if (a.userId == myUserId) {
|
||||
return -1;
|
||||
} else if (b.userId == myUserId) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Then sort by power level
|
||||
if (a.powerLevel > b.powerLevel) {
|
||||
return -1;
|
||||
} else if (b.powerLevel > a.powerLevel) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Then by name
|
||||
const aName = a.user ? a.user.displayName : a.name;
|
||||
const bName = b.user ? b.user.displayName : b.name;
|
||||
return aName.localeCompare(bName);
|
||||
});
|
||||
|
||||
} else {
|
||||
this.members = [];
|
||||
this.knocks = [];
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue