keanu-weblite/src/components/DeviceList.vue

111 lines
2.8 KiB
Vue
Raw Normal View History

2021-02-01 15:51:14 +01:00
<template>
<v-list density="compact" @click.stop="nullEvent" color="primary">
2021-02-01 15:51:14 +01:00
<v-list-item
v-for="device in devices"
:key="device.deviceId"
:value="device.deviceId"
>
2025-05-08 13:10:06 +02:00
<template v-slot:default>
2021-02-01 15:51:14 +01:00
<v-list-item-title>{{ displayName(device) }}</v-list-item-title>
<v-list-item-subtitle>{{
verificationStatus(device)
}}</v-list-item-subtitle>
2025-05-08 13:10:06 +02:00
</template>
<template v-slot:append="{ isActive }">
2025-05-08 11:52:39 +02:00
<v-list-item-action v-if="isActive">
2021-02-01 15:51:14 +01:00
<v-btn icon>
<v-icon
:color="
2025-05-12 18:21:48 +02:00
device.isBlocked
2021-02-01 15:51:14 +01:00
? 'red'
2025-05-12 18:21:48 +02:00
: device.isVerified
2021-02-01 15:51:14 +01:00
? 'green'
2025-05-08 11:52:39 +02:00
: 'grey-lighten-1'
2021-02-01 15:51:14 +01:00
"
>verified_user</v-icon
>
</v-btn>
</v-list-item-action>
</template>
</v-list-item>
</v-list>
</template>
<script>
2025-05-12 18:21:48 +02:00
import { DeviceVerification } from 'matrix-js-sdk';
2021-02-01 15:51:14 +01:00
export default {
name: "DeviceList",
props: {
member: {
type: Object,
default: function () {
return {};
},
},
},
data() {
return {
devices: [],
};
},
watch: {
member: {
immediate: true,
handler(member, ignoredOldVal) {
this.updateDevices();
if (member) {
2025-05-12 18:21:48 +02:00
this.$matrix.matrixClient.downloadKeysForUsers([member.userId]).then(() => {
2021-02-01 15:51:14 +01:00
this.updateDevices();
});
}
},
},
},
methods: {
updateDevices() {
if (!this.member) {
this.devices = [];
return;
}
2025-05-12 18:21:48 +02:00
this.$matrix.matrixClient.getCrypto().getUserDeviceInfo(
[this.member.userId], true
).then(deviceMap => {
if (deviceMap && deviceMap.get(this.member.userId)) {
const userDevices = deviceMap.get(this.member.userId);
const devices = [...userDevices.keys()].map(k => {
return userDevices.get(k);
}).map(d => ({
deviceId: d.deviceId,
displayName: d.displayName,
isBlocked: d.verified == DeviceVerification.Blocked,
isVerified: d.verified == DeviceVerification.Verified
}));
this.devices = devices;
}
})
2021-02-01 15:51:14 +01:00
},
displayName(device) {
var name = device.deviceId;
2025-05-12 18:21:48 +02:00
if (device.displayName) {
name += " - " + device.displayName;
2021-02-01 15:51:14 +01:00
}
return name;
},
verificationStatus(device) {
2025-05-12 18:21:48 +02:00
if (device.isBlocked) {
return this.$t('device_list.blocked');
2025-05-12 18:21:48 +02:00
} else if (device.isVerified) {
return this.$t('device_list.verified');
2021-02-01 15:51:14 +01:00
} else {
return this.$t('device_list.not_verified');
2021-02-01 15:51:14 +01:00
}
},
nullEvent() {},
},
};
</script>