소스 검색

Merge branch 'im-dev' into single-im-chat

wkw 3 주 전
부모
커밋
ea55015e4f

+ 8 - 8
.env

@@ -5,17 +5,17 @@ VITE_DEV_PATH='https://wallet.angeltokens.io'
 VITE_PRO_PATH='https://wallet.angeltokens.io'
 
 
-# VITE_IM_PATH_FIlE ='https://nim.angeltokens.io/api/v1/file/'
-# VITE_PRO_IM_WSS ='wss://nim.angeltokens.io/api/v1/socket.io'
-# VITE_PRO_IM_PATH='https://nim.angeltokens.io' 
+VITE_IM_PATH_FIlE ='https://nim.angeltokens.io/api/v1/file/'
+VITE_PRO_IM_WSS ='wss://nim.angeltokens.io/api/v1/socket.io'
+VITE_PRO_IM_PATH='https://nim.angeltokens.io' 
 
-# VITE_DEV_IM_PATH='https://nim.angeltokens.io'
+VITE_DEV_IM_PATH='https://nim.angeltokens.io'
 
-VITE_IM_PATH_FIlE ='https://nimtest.angeltokens.io/api/v1/file/'
-VITE_PRO_IM_WSS ='wss://nimtest.angeltokens.io/api/v1/socket.io'
-VITE_PRO_IM_PATH='https://nimtest.angeltokens.io' 
+# VITE_IM_PATH_FIlE ='https://nimtest.angeltokens.io/api/v1/file/'
+# VITE_PRO_IM_WSS ='wss://nimtest.angeltokens.io/api/v1/socket.io'
+# VITE_PRO_IM_PATH='https://nimtest.angeltokens.io' 
 
-VITE_DEV_IM_PATH='https://nimtest.angeltokens.io'
+# VITE_DEV_IM_PATH='https://nimtest.angeltokens.io'
 
 # VITE_PRO_IM_WSS ='ws://192.168.0.20:8888/api/v1/socket.io'
 # VITE_IM_PATH_FIlE ='http://192.168.0.20:8888/api/v1/file/'

BIN
src/assets/img/default.png


+ 12 - 8
src/common/login.js

@@ -21,15 +21,20 @@ export async function sysLogin(address) {
     login({ wallet_address: address }),
     imLogin({ uuid: address }),
   ]);
-  const loginResult = results[0].value;
-  const imLoginResult = results[1].value;
 
-  systemStore.token = loginResult.data.access_token;
-  systemStore.USERID = loginResult.data.user_id;
+  const loginResult = results[0].status === "fulfilled" ? results[0].value : null;
+  const imLoginResult = results[1].status === "fulfilled" ? results[1].value : null;
+
+  if (loginResult) {
+    systemStore.token = loginResult.data.access_token;
+    systemStore.USERID = loginResult.data.user_id;
+  }
+
+  walletStore.avatar = imLoginResult?.data?.avatar
+    ? imgHost + imLoginResult.data.avatar
+    : "../assets/img/default.png";
+  walletStore.username = imLoginResult?.data?.nickname || "游客";
 
-  walletStore.avatar = imgHost + imLoginResult.data.avatar;
-  walletStore.username = imLoginResult.data.nickname;
- 
   // 节点分红---获取用户是否为管理员以及是否加入了白名单
   const res = await userInfo({ address });
   if (res.ret) {
@@ -41,7 +46,6 @@ export async function sysLogin(address) {
     };
 
     systemStore.Administrator = data;
- 
   }
 }
 

+ 5 - 5
src/main.js

@@ -22,11 +22,11 @@ import { SafeArea } from "capacitor-plugin-safe-area";
 
 import VConsole from "vconsole";
 
-// if (process.env.NODE_ENV === "development") {
-//   // 引入 vconsole
-//   new VConsole();
-// }
-new VConsole();
+if (process.env.NODE_ENV === "development") {
+  // 引入 vconsole
+  new VConsole();
+}
+// new VConsole();
 
 async function appInit() {
   const app = createApp(App);

+ 4 - 4
src/stores/modules/webSocketStore.js

@@ -160,7 +160,7 @@ export const useWebSocketStore = defineStore("webSocketStore", {
           }
 
           console.log("WebSocket 连接成功");
-          showNotify({ type: 'success', message: '服务器连接成功' });
+          // showNotify({ type: 'success', message: '服务器连接成功' });
           this.flushMessageQueue(); // 连接成功后立即发送队列中的消息
         };
 
@@ -171,7 +171,7 @@ export const useWebSocketStore = defineStore("webSocketStore", {
 
         this.socket.onclose = () => {
           this.connectionState = "disconnected";
-          showNotify({ type: 'warning', message: '服务器连接断开' });
+          // showNotify({ type: 'warning', message: '服务器连接断开' });
           this.cleanupTimers();
 
           if (
@@ -185,7 +185,7 @@ export const useWebSocketStore = defineStore("webSocketStore", {
         this.socket.onerror = (error) => {
           this.connectionState = "error";
           console.error("WebSocket 错误并 重新连接:", error);
-          showNotify({ type: 'warning', message: '服务器连接断开' });
+          // showNotify({ type: 'warning', message: '服务器连接断开' });
           this.cleanupTimers();
           this.scheduleReconnect();
         };
@@ -827,7 +827,7 @@ export const useWebSocketStore = defineStore("webSocketStore", {
         ...this.toUserInfo,
         // 群公告
         notice: msg && msg.notice?msg.notice: this.toUserInfo.notice,
-        nickname: msg && msg.name?msg.name:this.toUserInfo.nickname,
+        // nickname: msg && msg.name?msg.name:this.toUserInfo.nickname,
         // 群名称
         sessionName: msg && msg.name?msg.name:this.toUserInfo.sessionName,
       }

+ 3 - 3
src/updater/update.json

@@ -1,7 +1,7 @@
 {
-  "version": "2.0.49",
-  "releaseDate": "2025-09-09 03:04:51",
-  "checksum": "8dbe940247cb4878fb365bbf64ae1c15990f95e4a85043002a30d47351c6b68a",
+  "version": "2.0.6",
+  "releaseDate": "2025-09-22 10:28:58",
+  "checksum": "fa702c100937809e537f48e9ffdff79913de3c12eee8605c82d02df1b26357dd",
   "minBinaryVersion": "2.0.0",
   "mandatory": false,
   "upDataDescription": "✨修正一些錯誤。。。。!!!"

+ 8 - 1
src/views/dapp/index.vue

@@ -256,7 +256,14 @@ const handleSearch = () => {
   if (urlPattern.test(val)) {
     // 自动补 https
     const finalUrl = /^https?:\/\//i.test(val) ? val : `https://${val}`;
-    openDapp(finalUrl)
+    const dapp = cryptoEncode(
+      JSON.stringify({
+        address: walletStore.account,
+        privateKey: walletStore.privateKey,
+        oaid:systemStore.DeviceId
+      })
+    );
+    openDapp(finalUrl,{ dapp, d:walletStore.account })
   }
 };
 

+ 16 - 7
src/views/im/chat/index.vue

@@ -207,6 +207,11 @@
             </div>
           </template>
         </div>
+        <svg-icon
+          class="page-icon mr12 emoji-toggle"
+          name="emoji"
+          @click="toggleAppBox(1)"
+        />
         <van-button class="sendText"
           v-if="text.trim()"
           type="primary"
@@ -217,11 +222,6 @@
           发送
         </van-button>
         <template v-else>
-          <svg-icon
-            class="page-icon mr12 emoji-toggle"
-            name="emoji"
-            @click="toggleAppBox(1)"
-          />
           <svg-icon v-if="showBurn" @click="closeMessaageBurning"
             class="page-icon-qx"
             name="qx"
@@ -660,7 +660,7 @@ let mediaRecorder = null;
 let audioChunks = [];
 
 // 切换文字/语音输入模式
-const toggleVoiceMode = () => {
+const toggleVoiceMode = async () => {
   if(!wsStore.verifyChatAuth(wsStore.toUserInfo.uuid)){
     showToast(`${wsStore.toUserInfo.type == 'user' ? '对方已删除' : '您已不在群聊里面'}`);
     return;
@@ -672,6 +672,15 @@ const toggleVoiceMode = () => {
   if (isMobile) Keyboard.hide();
   keyboardHeight.value = 0;
   scrollToBottom();
+  if(voiceMode.value){
+    try {
+      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
+      stream.getTracks().forEach(t => t.stop()); // 只申请权限,不录音
+      console.log("麦克风权限已授权");
+    } catch (err) {
+      console.error("麦克风权限拒绝", err);
+    }
+  }
 };
 
 // 录音事件
@@ -1480,7 +1489,7 @@ const goDetail = () =>{
   line-height: 25px !important;
   border-radius: 4px;
   background-color: #4765dd;
-  padding: 0 16px;
+  padding: 0 10px;
   box-sizing: border-box;
 }
 :deep(.van-button:before){

+ 13 - 7
src/views/im/components/Discover/Discover.vue

@@ -86,7 +86,7 @@
                 </div>
 
                 <!-- 评论静态数据 -->
-                <Remark v-if="item.commnet_array.length > 0"
+                <Remark
                   ref="remarkRefs"
                   :comments="item.commnet_array"
                   :dynamic-id="item.dynamic_id"
@@ -105,7 +105,7 @@
 <script>
 import { dynamicList, dynamicLike,dynamicDetail } from "@/api/path/im.api";
 import { showToast, showImagePreview } from 'vant';
-import Remark from '../../components/remarkList/index.vue';
+import Remark from '../remarkList/index.vue';
 
 export default {
   components: { Remark },
@@ -194,12 +194,18 @@ export default {
       }
     },
     // 评论
-    handleComment(i,item) {
+    handleComment(i, item) {
       this.showActionsMap[i] = false;
-      const comp = this.$refs.remarkRefs[i];
-      if (comp && comp.openComment) {
-        comp.openComment({ user_id: item.user_id, dynamic_id: item.dynamic_id });
-      }
+      this.$nextTick(() => {
+        const refs = this.$refs.remarkRefs;
+        const comp = Array.isArray(refs) ? refs[i] : refs;
+
+        if (comp && comp.openComment) {
+          comp.openComment({ user_id: item.user_id, dynamic_id: item.dynamic_id });
+        } else {
+          console.warn("Remark 组件未挂载或 openComment 方法不存在", i, refs);
+        }
+      });
     },
     // 更新指定动态的点赞列表
     async setLike(index,dynamic_id){

+ 0 - 1
src/views/im/components/remarkList/index.vue

@@ -89,7 +89,6 @@ export default {
     },
     // 点击评论或回复
     onCommentClick(item) {
-      console.log(item)
       const userWalletId = this.systemStore.USERID;
       if (item.send_user_id === userWalletId) return; // 可实现删除
       this.par.dynamic_id = this.dynamicId;

+ 6 - 0
src/views/im/contactList/groupList/index.vue

@@ -116,6 +116,8 @@ onMounted(() => {
 <style lang="less" scoped>
 .container {
     height: 100%;
+    display: flex;
+    flex-direction: column;
     :deep(.van-search) {
         padding: 4px 16px !important;
     }
@@ -183,6 +185,7 @@ onMounted(() => {
     }
     .content {
         margin: 16px;
+        overflow: auto;
         .list-ul {
             background: #fff;
             border-radius: 12px;
@@ -219,5 +222,8 @@ onMounted(() => {
             }
         }
     }
+    .content::-webkit-scrollbar{
+        width: 0;
+    }
 }
 </style>

+ 7 - 0
src/views/im/detail/checkMember/index.vue

@@ -93,6 +93,8 @@ onMounted(() => {
 <style lang="less" scoped>
 .container{
     height: 100%;
+    display: flex;
+    flex-direction: column;
     :deep(.van-search){
         padding: 4px 16px !important;
     }
@@ -154,6 +156,8 @@ onMounted(() => {
     }
     .content{
         margin: 8px 16px;
+        flex: 1;
+        overflow: auto;
         .list-ul{
             background: #fff;
             border-radius: 12px;
@@ -201,5 +205,8 @@ onMounted(() => {
             }
         }
     }
+    .content::-webkit-scrollbar{
+        width: 0;
+    }
 }
 </style>

+ 5 - 5
src/views/im/index.vue

@@ -32,7 +32,7 @@
         <svg-icon class="search-icon" name="search" />
         <span>请输入关键词</span>
       </div> -->
-      <van-pull-refresh v-model="loading" @refresh="onRefresh" style="height:100%">
+      <van-pull-refresh v-model="loading" @refresh="onRefresh" style="height:100%;overflow:auto;background: #F7F8FA;border-radius: 30px 30px 0 0;">
       <div class="message-list">
         <template v-if="list.length > 0">
           <div class="list-item" :class="(item.uuid === wsStore.toUserInfo?.uuid ? wsStore.toUserInfo?.stick : item.stick) ? 'bgstick-color' : ''"  v-for="(item,i) in list" :key="i" @click="goToChat(item,i)">
@@ -306,10 +306,10 @@ onMounted(()=>{
     }
   }
   .message-list{
-    background: #F7F8FA;
-    border-radius: 30px 30px 0 0;
+    // background: #F7F8FA;
+    // border-radius: 30px 30px 0 0;
     flex: 1;
-    overflow: auto;
+    //overflow: auto;
     // margin-top: 16px;
     // padding: 26px 16px 0;
     height: 100%;
@@ -387,7 +387,7 @@ onMounted(()=>{
     top: -5px;
     left: -15px;
   }
-  .message-list::-webkit-scrollbar{
+  .van-pull-refresh::-webkit-scrollbar{
     width: 0;
   }
   .discover-list {