refactor(window): 优化悬浮列表窗口的创建和关闭逻辑
- 简化 close_float_list_window 命令的返回值处理 - 清理 create_float_list_window_impl 中的多余空行 - 修复悬浮列表组件中全员静音状态的变量引用 - 移除样式文件中的多余空行 - 更新教师端会议页面中组件卸载生命周期为 onBeforeUnmount - 在会议结束时确保关闭悬浮列表窗口 - 简化 Vite 配置中 VueDevTools 的配置选项
This commit is contained in:
@ -15,8 +15,7 @@ pub async fn create_float_list_window(app: AppHandle, is_teacher_muted: bool) ->
|
|||||||
/// 关闭悬浮列表窗口
|
/// 关闭悬浮列表窗口
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn close_float_list_window(app: AppHandle) -> Result<String, String> {
|
pub fn close_float_list_window(app: AppHandle) -> Result<String, String> {
|
||||||
close_float_list_window_impl(std::sync::Arc::new(app))
|
close_float_list_window_impl(std::sync::Arc::new(app)).map(|_| "success".to_string())
|
||||||
.map(|_| "success".to_string())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 创建弹出框窗口
|
/// 创建弹出框窗口
|
||||||
|
|||||||
@ -76,7 +76,7 @@ pub async fn create_float_list_window_impl<R: Runtime>(app: Arc<AppHandle<R>>, i
|
|||||||
/// 关闭悬浮列表窗口(内部实现)
|
/// 关闭悬浮列表窗口(内部实现)
|
||||||
pub fn close_float_list_window_impl<R: Runtime>(app: Arc<AppHandle<R>>) -> Result<(), String> {
|
pub fn close_float_list_window_impl<R: Runtime>(app: Arc<AppHandle<R>>) -> Result<(), String> {
|
||||||
use tauri::Manager;
|
use tauri::Manager;
|
||||||
|
|
||||||
// 尝试获取悬浮列表窗口
|
// 尝试获取悬浮列表窗口
|
||||||
if let Some(window) = app.get_webview_window(WindowLabel::FLOAT_LIST.as_ref()) {
|
if let Some(window) = app.get_webview_window(WindowLabel::FLOAT_LIST.as_ref()) {
|
||||||
// 关闭窗口
|
// 关闭窗口
|
||||||
@ -85,7 +85,7 @@ pub fn close_float_list_window_impl<R: Runtime>(app: Arc<AppHandle<R>>) -> Resul
|
|||||||
} else {
|
} else {
|
||||||
log::warn!("悬浮列表窗口不存在,无需关闭");
|
log::warn!("悬浮列表窗口不存在,无需关闭");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<!-- 会议控制按钮 -->
|
<!-- 会议控制按钮 -->
|
||||||
<div class="menu-item" @click="muteAllStudents()">
|
<div class="menu-item" @click="muteAllStudents()">
|
||||||
<div class="icon-wrapper">
|
<div class="icon-wrapper">
|
||||||
<icon-mdi-volume-high v-if="!isMuted" class="menu-icon"></icon-mdi-volume-high>
|
<icon-mdi-volume-high v-if="!isAllMuted" class="menu-icon"></icon-mdi-volume-high>
|
||||||
<icon-mdi-volume-off v-else class="menu-icon muted"></icon-mdi-volume-off>
|
<icon-mdi-volume-off v-else class="menu-icon muted"></icon-mdi-volume-off>
|
||||||
</div>
|
</div>
|
||||||
<span class="menu-text" :class="{ 'text-muted': isAllMuted }">全员静音</span>
|
<span class="menu-text" :class="{ 'text-muted': isAllMuted }">全员静音</span>
|
||||||
|
|||||||
@ -69,8 +69,6 @@ button:disabled {
|
|||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fieldset {
|
fieldset {
|
||||||
padding: 0.35em 0.75em 0.625em;
|
padding: 0.35em 0.75em 0.625em;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -181,7 +181,7 @@
|
|||||||
import IconMdiVolumeHigh from '~icons/mdi/volume-high';
|
import IconMdiVolumeHigh from '~icons/mdi/volume-high';
|
||||||
import IconMdiVolumeOff from '~icons/mdi/volume-off';
|
import IconMdiVolumeOff from '~icons/mdi/volume-off';
|
||||||
import { ElIcon, ElMessageBox, ElMessage as Toast } from 'element-plus';
|
import { ElIcon, ElMessageBox, ElMessage as Toast } from 'element-plus';
|
||||||
import { computed, onMounted, onUnmounted, ref, watchEffect } from 'vue';
|
import { computed, onBeforeUnmount, onMounted, ref, watchEffect } from 'vue';
|
||||||
import { useRoute, useRouter } from 'vue-router';
|
import { useRoute, useRouter } from 'vue-router';
|
||||||
import { useStreamType } from './useStreamType';
|
import { useStreamType } from './useStreamType';
|
||||||
import { usePermissions } from './usePermissions';
|
import { usePermissions } from './usePermissions';
|
||||||
@ -1001,6 +1001,7 @@
|
|||||||
role.value = String(route.query.role) === 'student' ? 'student' : 'teacher';
|
role.value = String(route.query.role) === 'student' ? 'student' : 'teacher';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
await closeFloatListWindow();
|
||||||
// 使用 Hook 加入 WebSocket 房间获取房间数据
|
// 使用 Hook 加入 WebSocket 房间获取房间数据
|
||||||
const roomData = await meetingSocket.joinRoom(socket);
|
const roomData = await meetingSocket.joinRoom(socket);
|
||||||
// 设置房间 ID(用于权限管理中的控制消息发送)
|
// 设置房间 ID(用于权限管理中的控制消息发送)
|
||||||
@ -1041,10 +1042,7 @@
|
|||||||
/**
|
/**
|
||||||
* 组件卸载生命周期钩子
|
* 组件卸载生命周期钩子
|
||||||
*/
|
*/
|
||||||
onUnmounted(async () => {
|
onBeforeUnmount(async () => {
|
||||||
if (isLeaving) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
socket.off('message', onSocketMessage);
|
socket.off('message', onSocketMessage);
|
||||||
// 关闭悬浮窗
|
// 关闭悬浮窗
|
||||||
await closeFloatListWindow();
|
await closeFloatListWindow();
|
||||||
|
|||||||
@ -37,9 +37,7 @@ export default defineConfig(async ({ command }: ConfigEnv): Promise<UserConfig>
|
|||||||
base: './', // 基础路径
|
base: './', // 基础路径
|
||||||
|
|
||||||
plugins: [
|
plugins: [
|
||||||
VueDevTools({
|
VueDevTools({}),
|
||||||
appendTo: 'index.html',
|
|
||||||
}),
|
|
||||||
|
|
||||||
Vue({}),
|
Vue({}),
|
||||||
// 自动导入API
|
// 自动导入API
|
||||||
|
|||||||
Reference in New Issue
Block a user