Purge room work

For issue #118. Now with better status and error. Also, make sure to set global flag "no warning for unknown devices" while we are redacting events.
This commit is contained in:
N-Pex 2021-05-27 13:38:57 +02:00
parent e9a1633083
commit 86f03c0fc2
4 changed files with 44 additions and 10 deletions

View file

@ -48,11 +48,19 @@
"user_is_typing": "{user} is typing", "user_is_typing": "{user} is typing",
"users_are_typing": "{count} members are typing", "users_are_typing": "{count} members are typing",
"room_powerlevel_change": "{user} changed powerlevel of {changes}", "room_powerlevel_change": "{user} changed powerlevel of {changes}",
"user_powerlevel_change_from_to": "{user} from {powerOld} to {powerNew}" "user_powerlevel_change_from_to": "{user} from {powerOld} to {powerNew}",
"user_changed_guest_access_closed": "{user} disallowed guests to join the room",
"user_changed_guest_access_open": "{user} allowed guests to join the room"
}, },
"room": { "room": {
"members": "no members | 1 member | {count} members", "members": "no members | 1 member | {count} members",
"leave": "Leave" "leave": "Leave",
"purge_set_room_state": "Setting room state",
"purge_redacting_events": "Redacting events",
"purge_removing_members": "Removing members",
"purge_failed": "Failed to purge room!",
"room_list_invites": "Invites",
"room_list_rooms": "Rooms"
}, },
"room_welcome": { "room_welcome": {
"welcome": "Welcome!", "welcome": "Welcome!",

View file

@ -3,9 +3,12 @@
<div class="dialog-content text-center"> <div class="dialog-content text-center">
<template> <template>
<v-icon color="black" size="30">lock</v-icon> <v-icon color="black" size="30">lock</v-icon>
<h2 class="dialog-title">{{$t('purge_room.title')}}</h2> <h2 class="dialog-title">{{ $t("purge_room.title") }}</h2>
<div class="dialog-text"> <div class="dialog-text">
{{$t('purge_room.info')}} {{ $t("purge_room.info") }}
</div>
<div class="dialog-text">
{{ status }}
</div> </div>
</template> </template>
<v-container fluid> <v-container fluid>
@ -16,8 +19,9 @@
text text
block block
class="text-button" class="text-button"
:disabled="isPurging"
@click="showDialog = false" @click="showDialog = false"
>{{$t('menu.cancel')}}</v-btn >{{ $t("menu.cancel") }}</v-btn
> >
</v-col> </v-col>
<v-col cols="6" align="center"> <v-col cols="6" align="center">
@ -26,8 +30,9 @@
depressed depressed
block block
class="filled-button" class="filled-button"
:disabled="isPurging"
@click.stop="onPurgeRoom()" @click.stop="onPurgeRoom()"
>{{$t('purge_room.button')}}</v-btn >{{ $t("purge_room.button") }}</v-btn
> >
</v-col> </v-col>
</v-row> </v-row>
@ -52,6 +57,8 @@ export default {
data() { data() {
return { return {
showDialog: false, showDialog: false,
isPurging: false,
status: null,
}; };
}, },
watch: { watch: {
@ -69,8 +76,9 @@ export default {
methods: { methods: {
onPurgeRoom() { onPurgeRoom() {
this.isPurging = true;
this.$matrix this.$matrix
.purgeRoom(this.room.roomId) .purgeRoom(this.room.roomId, this.onPurgeStatus)
.then(() => { .then(() => {
this.showDialog = false; this.showDialog = false;
console.log("Purged room"); console.log("Purged room");
@ -78,8 +86,16 @@ export default {
}) })
.catch((err) => { .catch((err) => {
console.error("Error purging", err); console.error("Error purging", err);
this.status = this.$t("room.purge_failed");
})
.finally(() => {
this.isPurging = false;
}); });
}, },
onPurgeStatus(message) {
this.status = message;
},
}, },
}; };
</script> </script>

View file

@ -24,7 +24,7 @@ Vue.config.productionTip = false
Vue.use(VueResize); Vue.use(VueResize);
Vue.use(VEmojiPicker); Vue.use(VEmojiPicker);
Vue.use(matrix, { store: store }); Vue.use(matrix, { store: store, i18n: i18n });
Vue.use(cleaninsights); Vue.use(cleaninsights);
Vue.use(VueClipboard); Vue.use(VueClipboard);

View file

@ -15,10 +15,11 @@ export default {
} }
const store = options.store; const store = options.store;
const i18n = options.i18n;
const matrixService = new Vue({ const matrixService = new Vue({
store, store,
i18n,
data() { data() {
return { return {
matrixClient: null, matrixClient: null,
@ -471,7 +472,8 @@ export default {
* - Kick all members * - Kick all members
* @param roomId * @param roomId
*/ */
purgeRoom(roomId) { purgeRoom(roomId, statusCallback) {
const oldGlobalErrorSetting = this.matrixClient.getGlobalErrorOnUnknownDevices();
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const room = this.getRoom(roomId); const room = this.getRoom(roomId);
if (!room) { if (!room) {
@ -487,6 +489,7 @@ export default {
const self = this; const self = this;
console.log("Purge: set invite only"); console.log("Purge: set invite only");
statusCallback(this.$t('room.purge_set_room_state'));
this.matrixClient.sendStateEvent( this.matrixClient.sendStateEvent(
roomId, roomId,
"m.room.join_rules", "m.room.join_rules",
@ -530,6 +533,9 @@ export default {
}) })
.then(() => { .then(() => {
console.log("Purge: redact events"); console.log("Purge: redact events");
statusCallback(this.$t('room.purge_redacting_events'));
// First ignore unknown device errors
this.matrixClient.setGlobalErrorOnUnknownDevices(false);
var redactionPromises = []; var redactionPromises = [];
timelineWindow.getEvents().forEach(event => { timelineWindow.getEvents().forEach(event => {
if (!event.isRedacted() && !event.isRedaction() && !event.isState()) { if (!event.isRedacted() && !event.isRedaction() && !event.isState()) {
@ -541,6 +547,7 @@ export default {
}) })
.then(() => { .then(() => {
console.log("Purge: kick members"); console.log("Purge: kick members");
statusCallback(this.$t('room.purge_removing_members'));
var joined = room.getMembersWithMembership("join"); var joined = room.getMembersWithMembership("join");
var invited = room.getMembersWithMembership("invite"); var invited = room.getMembersWithMembership("invite");
var members = joined.concat(invited); var members = joined.concat(invited);
@ -554,10 +561,13 @@ export default {
return Promise.all(kickPromises); return Promise.all(kickPromises);
}) })
.then(() => { .then(() => {
statusCallback(null);
this.matrixClient.setGlobalErrorOnUnknownDevices(oldGlobalErrorSetting);
resolve(true); // Done! resolve(true); // Done!
}) })
.catch((err) => { .catch((err) => {
console.error("Error purging room", err); console.error("Error purging room", err);
this.matrixClient.setGlobalErrorOnUnknownDevices(oldGlobalErrorSetting);
reject(err); reject(err);
}); });
}) })