+
-
@@ -103,6 +113,8 @@ const receiveLoading = ref(false);
const myId = ref("");
const targetId = ref("");
const isConnected = ref(false);
+const isDesktopActive = ref(false);
+const isCallActive = ref(false);
// 文件系统相关
const selectedLocalFiles = ref
([]);
const selectedRemoteFiles = ref([]);
@@ -112,9 +124,19 @@ onMounted(() => {
});
const requestDesktop = () => {
+ if (!isConnected.value) return;
+ if (isDesktopActive.value) {
+ peer.endMedia(sign2peerid(targetId.value), "desktop");
+ return;
+ }
peer.requestDesktop(targetId.value);
};
const requestCall = () => {
+ if (!isConnected.value) return;
+ if (isCallActive.value) {
+ peer.endMedia(sign2peerid(targetId.value), "call");
+ return;
+ }
peer.requestCall(targetId.value);
};
const shareUrl = async () => {
@@ -233,6 +255,8 @@ onMounted(() => {
peer.on("peer-disconnected", ((event: CustomEvent) => {
isConnected.value = peer.remoteConnection?.open;
+ isDesktopActive.value = false;
+ isCallActive.value = false;
notification.error({
message: event.detail.peer + "连接已断开",
});
@@ -244,6 +268,36 @@ onMounted(() => {
});
console.error("连接错误:", event.detail);
}) as EventListener);
+
+ peer.on("stream", ((event: CustomEvent) => {
+ if (event.detail.peerId !== sign2peerid(targetId.value)) return;
+ if (event.detail.type === "desktop") {
+ isDesktopActive.value = true;
+ } else if (event.detail.type === "call") {
+ isCallActive.value = true;
+ }
+ }) as EventListener);
+
+ peer.on("desktop-started", ((event: CustomEvent) => {
+ if (event.detail.peerId === sign2peerid(targetId.value)) {
+ isDesktopActive.value = true;
+ }
+ }) as EventListener);
+
+ peer.on("call-started", ((event: CustomEvent) => {
+ if (event.detail.peerId === sign2peerid(targetId.value)) {
+ isCallActive.value = true;
+ }
+ }) as EventListener);
+
+ peer.on("media-ended", ((event: CustomEvent) => {
+ if (event.detail.peerId !== sign2peerid(targetId.value)) return;
+ if (event.detail.type === "desktop") {
+ isDesktopActive.value = false;
+ } else if (event.detail.type === "call") {
+ isCallActive.value = false;
+ }
+ }) as EventListener);
});
@@ -284,11 +338,31 @@ onMounted(() => {
.connect-item:hover {
background: #cae5f9;
}
+.connect-item.active {
+ background: #b7eb8f;
+ border-color: #52c41a;
+}
+.connect-item.active:hover {
+ background: #95de64;
+}
+.connect-item.disabled {
+ background: #f0f0f0;
+ border-color: #d9d9d9;
+ cursor: not-allowed;
+ opacity: 0.55;
+}
+.connect-item.disabled:hover {
+ background: #f0f0f0;
+}
+.connect-item.disabled img {
+ filter: grayscale(1);
+}
.connect-item img {
width: 100%;
height: 100%;
}
+.connect-actions,
.connect-section {
display: flex;
gap: 10px;
diff --git a/src/pages/file/item/desptopView.vue b/src/pages/file/item/desptopView.vue
index a271288..c402737 100644
--- a/src/pages/file/item/desptopView.vue
+++ b/src/pages/file/item/desptopView.vue
@@ -1,10 +1,14 @@
-