fix(avatar): refresh BOXIM takeover status

This commit is contained in:
stefanfeng
2026-08-19 18:03:59 +08:00
parent 25fb8fbee5
commit 08590bf9ea
@@ -101,7 +101,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, onMounted, reactive, ref } from 'vue' import { computed, onBeforeUnmount, onMounted, reactive, ref } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { import {
getAvatarPermissionSettings, getAvatarPermissionSettings,
@@ -177,6 +177,7 @@ const errorMessage = ref('')
const toastMessage = ref('') const toastMessage = ref('')
const takeoverStatus = ref<TakeoverStatus | null>(null) const takeoverStatus = ref<TakeoverStatus | null>(null)
let toastTimer: number | undefined let toastTimer: number | undefined
let takeoverStatusTimer: number | undefined
const takeoverDescription = computed(() => { const takeoverDescription = computed(() => {
if (!permissionState.takeover) return '收到私聊消息 3 秒后回复,主人发言时暂停' if (!permissionState.takeover) return '收到私聊消息 3 秒后回复,主人发言时暂停'
@@ -203,9 +204,28 @@ const showToast = (message: string) => {
const togglePermission = (permission: AvatarPermission) => { const togglePermission = (permission: AvatarPermission) => {
permissionState[permission] = !permissionState[permission] permissionState[permission] = !permissionState[permission]
if (permission === 'takeover') {
takeoverStatus.value = null
if (!permissionState.takeover && takeoverStatusTimer) {
window.clearTimeout(takeoverStatusTimer)
takeoverStatusTimer = undefined
}
}
errorMessage.value = '' errorMessage.value = ''
} }
const scheduleTakeoverStatusRefresh = () => {
if (takeoverStatusTimer) window.clearTimeout(takeoverStatusTimer)
if (!permissionState.takeover || !activeAvatarId.value) {
takeoverStatusTimer = undefined
return
}
takeoverStatusTimer = window.setTimeout(async () => {
await loadTakeoverStatus()
scheduleTakeoverStatusRefresh()
}, 3000)
}
const loadSettings = async () => { const loadSettings = async () => {
if (!activeAvatarId.value) { if (!activeAvatarId.value) {
loading.value = false loading.value = false
@@ -217,6 +237,7 @@ const loadSettings = async () => {
const settings = await getAvatarPermissionSettings(activeAvatarId.value) const settings = await getAvatarPermissionSettings(activeAvatarId.value)
setPermissions(settings.permissions || []) setPermissions(settings.permissions || [])
await loadTakeoverStatus() await loadTakeoverStatus()
scheduleTakeoverStatusRefresh()
} catch (error: any) { } catch (error: any) {
errorMessage.value = readableError(error, '授权设置加载失败,请稍后重试') errorMessage.value = readableError(error, '授权设置加载失败,请稍后重试')
} finally { } finally {
@@ -241,7 +262,7 @@ const saveSettings = async () => {
const settings = await updateAvatarPermissionSettings(activeAvatarId.value, selectedPermissions()) const settings = await updateAvatarPermissionSettings(activeAvatarId.value, selectedPermissions())
setPermissions(settings.permissions || []) setPermissions(settings.permissions || [])
await loadTakeoverStatus() await loadTakeoverStatus()
if (permissionState.takeover) window.setTimeout(loadTakeoverStatus, 1400) scheduleTakeoverStatusRefresh()
showToast('授权设置已保存') showToast('授权设置已保存')
} catch (error: any) { } catch (error: any) {
errorMessage.value = readableError(error, '授权设置保存失败,请重试') errorMessage.value = readableError(error, '授权设置保存失败,请重试')
@@ -258,6 +279,11 @@ onMounted(async () => {
activeAvatarId.value = pickAvatarId(avatarStore.currentAvatarId, avatarStore.avatars) || '' activeAvatarId.value = pickAvatarId(avatarStore.currentAvatarId, avatarStore.avatars) || ''
await loadSettings() await loadSettings()
}) })
onBeforeUnmount(() => {
if (toastTimer) window.clearTimeout(toastTimer)
if (takeoverStatusTimer) window.clearTimeout(takeoverStatusTimer)
})
</script> </script>
<style scoped> <style scoped>