feat: disable user messaging and retain公益 service guidance
CI/CD Pipeline / Test Shell Guard (Phase 23 Gate) (push) Canceled after 0s
CI/CD Pipeline / Backend Build & Test (push) Canceled after 0s
CI/CD Pipeline / Admin Web Build (push) Canceled after 0s
CI/CD Pipeline / Mini Program Compile Check (push) Canceled after 0s
CI/CD Pipeline / Migration Validation (push) Canceled after 0s
CI/CD Pipeline / UI Contracts (source-structure gates) (push) Canceled after 0s
CI/CD Pipeline / E2E (live stack) (push) Canceled after 0s
CI/CD Pipeline / Test Shell Guard (Phase 23 Gate) (push) Canceled after 0s
CI/CD Pipeline / Backend Build & Test (push) Canceled after 0s
CI/CD Pipeline / Admin Web Build (push) Canceled after 0s
CI/CD Pipeline / Mini Program Compile Check (push) Canceled after 0s
CI/CD Pipeline / Migration Validation (push) Canceled after 0s
CI/CD Pipeline / UI Contracts (source-structure gates) (push) Canceled after 0s
CI/CD Pipeline / E2E (live stack) (push) Canceled after 0s
This commit is contained in:
@@ -5,7 +5,6 @@
|
||||
"pages": [
|
||||
"pages/index/index",
|
||||
"pages/discover/discover",
|
||||
"pages/messages/messages",
|
||||
"pages/activity/activity",
|
||||
"pages/mine/mine",
|
||||
"pages/login/login",
|
||||
@@ -23,7 +22,6 @@
|
||||
"pages/review-rejected/review-rejected",
|
||||
"pages/profile-detail/profile-detail",
|
||||
"pages/fate-center/fate-center",
|
||||
"pages/chat/chat",
|
||||
"pages/activity-detail/activity-detail",
|
||||
"pages/activity-register/activity-register",
|
||||
"pages/my-activities/my-activities",
|
||||
@@ -97,12 +95,6 @@
|
||||
"iconPath": "assets/tabbar/discover.png",
|
||||
"selectedIconPath": "assets/tabbar/discover-active.png"
|
||||
},
|
||||
{
|
||||
"pagePath": "pages/messages/messages",
|
||||
"text": "消息",
|
||||
"iconPath": "assets/tabbar/message.png",
|
||||
"selectedIconPath": "assets/tabbar/message-active.png"
|
||||
},
|
||||
{
|
||||
"pagePath": "pages/activity/activity",
|
||||
"text": "活动",
|
||||
|
||||
@@ -173,7 +173,7 @@ exports.ERROR_USER_MESSAGE = {
|
||||
[exports.BUSINESS_ERROR_CODE.PROFILE_NOT_APPROVED]: '当前资料尚未通过审核',
|
||||
[exports.BUSINESS_ERROR_CODE.ACCOUNT_LIMITED]: '账号已被限制,详情请查看账号状态',
|
||||
[exports.BUSINESS_ERROR_CODE.TARGET_UNAVAILABLE]: '该用户当前不可查看或联系',
|
||||
[exports.BUSINESS_ERROR_CODE.MATCH_REQUIRED]: '双方互相喜欢后才能开始聊天',
|
||||
[exports.BUSINESS_ERROR_CODE.MATCH_REQUIRED]: '当前平台未提供用户间即时聊天功能',
|
||||
[exports.BUSINESS_ERROR_CODE.ACTIVITY_FULL]: '本次活动报名人数已满',
|
||||
[exports.BUSINESS_ERROR_CODE.ACTIVITY_CLOSED]: '本次活动报名已结束',
|
||||
[exports.BUSINESS_ERROR_CODE.ALREADY_APPLIED]: '你已经提交过申请',
|
||||
|
||||
+1
-9
@@ -2,7 +2,6 @@
|
||||
"pages": [
|
||||
"pages/index/index",
|
||||
"pages/discover/discover",
|
||||
"pages/messages/messages",
|
||||
"pages/activity/activity",
|
||||
"pages/mine/mine",
|
||||
"pages/login/login",
|
||||
@@ -20,7 +19,6 @@
|
||||
"pages/review-rejected/review-rejected",
|
||||
"pages/profile-detail/profile-detail",
|
||||
"pages/fate-center/fate-center",
|
||||
"pages/chat/chat",
|
||||
"pages/activity-detail/activity-detail",
|
||||
"pages/activity-register/activity-register",
|
||||
"pages/my-activities/my-activities",
|
||||
@@ -68,12 +66,6 @@
|
||||
"iconPath": "assets/tabbar/discover.png",
|
||||
"selectedIconPath": "assets/tabbar/discover-active.png"
|
||||
},
|
||||
{
|
||||
"pagePath": "pages/messages/messages",
|
||||
"text": "消息",
|
||||
"iconPath": "assets/tabbar/message.png",
|
||||
"selectedIconPath": "assets/tabbar/message-active.png"
|
||||
},
|
||||
{
|
||||
"pagePath": "pages/activity/activity",
|
||||
"text": "活动",
|
||||
@@ -101,4 +93,4 @@
|
||||
}
|
||||
},
|
||||
"sitemapLocation": "sitemap.json"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,9 +50,4 @@ Page({
|
||||
});
|
||||
},
|
||||
|
||||
startChat(userId) {
|
||||
wx.navigateTo({
|
||||
url: `/pages/chat/chat?userId=${userId}&activityId=${this.data.activityId}`
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<text class="match-meta">{{item.age}}岁 · {{item.locationName || ''}}</text>
|
||||
</view>
|
||||
<view class="match-actions" catchtap>
|
||||
<button class="btn-chat" bindtap="startChat" data-user-id="{{item.targetUserId}}">聊天</button>
|
||||
<text class="match-service-hint">可查看公益服务</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@@ -18,8 +18,4 @@ Page({
|
||||
} catch (e) { console.error(e); this.setData({ loading: false }); }
|
||||
},
|
||||
|
||||
openChat(e: any) {
|
||||
const partnerId = e.currentTarget.dataset.partnerid;
|
||||
wx.navigateTo({ url: `/pages/chat/chat?partnerId=${partnerId}` });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<button class="btn-waiting" disabled>等待对方确认</button>
|
||||
</view>
|
||||
<view class="card-actions" wx:if="{{item.bothConfirmed}}">
|
||||
<button class="btn-chat" bindtap="openChat" data-partnerid="{{item.partnerId}}">开启聊天</button>
|
||||
<text class="service-hint">双方已确认,可查看公益活动和服务站</text>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
|
||||
@@ -55,10 +55,7 @@ Page({
|
||||
});
|
||||
if (res.statusCode === 200 && res.data.success) {
|
||||
this.setData({ myConfirmed: true, bothConfirmed: res.data.data.bothConfirmed });
|
||||
if (res.data.data.bothConfirmed) {
|
||||
wx.showToast({ title: '双方已确认!', icon: 'success' });
|
||||
setTimeout(() => this.openChat(), 1500);
|
||||
}
|
||||
if (res.data.data.bothConfirmed) wx.showToast({ title: '双方已确认,可查看公益服务', icon: 'success' });
|
||||
}
|
||||
} catch (e) { wx.showToast({ title: '操作失败', icon: 'none' }); }
|
||||
},
|
||||
@@ -76,7 +73,4 @@ Page({
|
||||
} catch (e) { wx.showToast({ title: '操作失败', icon: 'none' }); }
|
||||
},
|
||||
|
||||
openChat() {
|
||||
wx.navigateTo({ url: `/pages/chat/chat?partnerId=${this.data.partnerId}` });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -7,21 +7,20 @@
|
||||
<view class="status-section" wx:if="{{bothConfirmed}}">
|
||||
<view class="success-icon">✅</view>
|
||||
<text class="success-title">双方已确认!</text>
|
||||
<text class="success-hint">你们可以开始聊天了</text>
|
||||
<button class="chat-btn" bindtap="openChat">开启聊天</button>
|
||||
<text class="success-hint">双方意向已确认,可查看公益活动和服务站</text>
|
||||
</view>
|
||||
|
||||
<view class="status-section" wx:elif="{{myConfirmed}}">
|
||||
<view class="waiting-icon">⏳</view>
|
||||
<text class="waiting-title">已发送邀请</text>
|
||||
<text class="waiting-hint">对方确认后你们可以开始聊天</text>
|
||||
<text class="waiting-hint">对方确认后将收到平台通知</text>
|
||||
<button class="decline-btn" bindtap="onDecline">暂不联系</button>
|
||||
</view>
|
||||
|
||||
<view class="status-section" wx:else>
|
||||
<view class="pending-icon">💬</view>
|
||||
<text class="pending-title">向对方表达兴趣</text>
|
||||
<text class="pending-hint">双方确认后才能开启线上沟通</text>
|
||||
<text class="pending-hint">双方确认后将收到平台通知,并可查看公益服务</text>
|
||||
<button class="confirm-btn" bindtap="onConfirm">确认开启沟通</button>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@@ -305,10 +305,7 @@ Page({
|
||||
const result = await matchStore.like(userId);
|
||||
this.setData({ users: this.data.users.filter((u) => u.userId !== userId) });
|
||||
if (result?.mutualMatch) {
|
||||
appStore.toastSuccess('双向喜欢!可以开始聊天了');
|
||||
if (result.matchedConversationId) {
|
||||
wx.navigateTo({ url: to.chat(result.matchedConversationId) });
|
||||
}
|
||||
appStore.toastSuccess('双向意向匹配成功,可查看公益服务');
|
||||
} else {
|
||||
appStore.toastSuccess('已表达喜欢');
|
||||
}
|
||||
|
||||
@@ -141,12 +141,7 @@ Page({
|
||||
wx.navigateTo({ url: to.detail(userId) });
|
||||
},
|
||||
|
||||
/** 互相喜欢 → 开始聊天(已 Mutual,符合第 3 条) */
|
||||
onStartChat(e) {
|
||||
const conversationId = e.currentTarget.dataset.conversationId;
|
||||
if (!conversationId) return;
|
||||
wx.navigateTo({ url: to.chat(conversationId) });
|
||||
},
|
||||
/** 互相喜欢 → 查看资料和公益服务 */
|
||||
|
||||
/**
|
||||
* 喜欢我的人 → 喜欢 TA(like-back)
|
||||
@@ -163,12 +158,9 @@ Page({
|
||||
likersList: matchStore.state.likersList.filter((u) => u.userId !== userId),
|
||||
});
|
||||
if (result && result.mutualMatch) {
|
||||
appStore.toastSuccess('双向喜欢!可以开始聊天了');
|
||||
appStore.toastSuccess('双向意向匹配成功,可查看公益服务');
|
||||
// 刷新互相喜欢列表
|
||||
try { await matchStore.fetchMutualList({ pageSize: PAGE_SIZE }); } catch (e2) { /* ignore */ }
|
||||
if (result.matchedConversationId) {
|
||||
wx.navigateTo({ url: to.chat(result.matchedConversationId) });
|
||||
}
|
||||
} else {
|
||||
appStore.toastSuccess('已表达喜欢');
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<view class="item" wx:for="{{mutualList}}" wx:key="conversationId">
|
||||
<ui-user-card user="{{item}}" bind:tap="onViewDetail">
|
||||
<view slot="actions">
|
||||
<button class="btn-primary" catchtap="onStartChat" data-conversation-id="{{item.conversationId}}">开始聊天</button>
|
||||
<button class="btn-primary" catchtap="onViewDetail" data-user-id="{{item.userId}}">查看资料</button>
|
||||
</view>
|
||||
</ui-user-card>
|
||||
</view>
|
||||
@@ -45,7 +45,7 @@
|
||||
wx:else
|
||||
illustration="heart"
|
||||
title="还没有互相喜欢的人"
|
||||
description="去「找对象」遇见合适的人,互相喜欢就能聊天啦"
|
||||
description="去「找对象」遇见合适的人,双方匹配后可查看公益服务"
|
||||
actions="{{[{text:'去「找对象', event:'discover', variant:'primary'}]}}"
|
||||
bind:action="onEmptyAction"
|
||||
/>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
const { authStore, appStore, matchStore } = require('../../stores')
|
||||
const api = require('../../utils/api')
|
||||
// 顶部安全区:实测右上角胶囊按钮矩形,避免品牌栏「消息」入口被胶囊压住(见 utils/nav-metrics.js)
|
||||
// 顶部安全区:实测右上角胶囊按钮矩形,避免品牌栏入口被胶囊压住(见 utils/nav-metrics.js)
|
||||
const { navSafeData } = require('../../utils/nav-metrics')
|
||||
|
||||
// 4×2 宫格的视觉映射(tone → index.wxss 的 .tone-* 渐变砖;subtitle → 主标题下的说明行)。
|
||||
@@ -244,10 +244,7 @@ Page({
|
||||
const result = await matchStore.like(userId)
|
||||
this.setData({ recommendations: this.data.recommendations.filter((item) => item.userId !== userId) })
|
||||
if (result?.mutualMatch) {
|
||||
appStore.toastSuccess('双向喜欢!可以开始聊天了')
|
||||
if (result.matchedConversationId) {
|
||||
wx.navigateTo({ url: `/pages/chat/chat?id=${result.matchedConversationId}` })
|
||||
}
|
||||
appStore.toastSuccess('双向意向匹配成功,可查看公益服务')
|
||||
} else {
|
||||
appStore.toastSuccess('已表达喜欢')
|
||||
}
|
||||
@@ -327,7 +324,7 @@ Page({
|
||||
wx.navigateTo({ url: '/pages/anti-fraud/anti-fraud' })
|
||||
},
|
||||
onArticleTap(e) { wx.navigateTo({ url: `/pages/content-detail/content-detail?id=${e.currentTarget.dataset.id}` }) },
|
||||
onMessages() { wx.switchTab({ url: '/pages/messages/messages' }) },
|
||||
onMessages() { wx.navigateTo({ url: '/pages/notifications/notifications' }) },
|
||||
|
||||
formatDate(timestamp) {
|
||||
if (!timestamp) return ''
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
</view>
|
||||
</view>
|
||||
<view class="brand-actions" bindtap="onMessages">
|
||||
<text class="message-label">消息</text>
|
||||
<text class="message-label">通知</text>
|
||||
<text wx:if="{{unreadCount}}" class="badge">{{unreadCount}}</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@@ -47,8 +47,8 @@ Page({
|
||||
try {
|
||||
const result = action === 'like' ? await matchStore.like(userId) : await matchStore.pass(userId);
|
||||
this.setData({ recommendations: this.data.recommendations.filter((item) => item.userId !== userId) });
|
||||
if (action === 'like' && result && result.mutualMatch && result.matchedConversationId) {
|
||||
wx.navigateTo({ url: to.chat(result.matchedConversationId) });
|
||||
if (action === 'like' && result && result.mutualMatch) {
|
||||
appStore.toastSuccess('双向意向匹配成功,可查看公益服务');
|
||||
} else {
|
||||
appStore.toastSuccess(action === 'like' ? '已表达喜欢' : '已暂不考虑');
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@ Page({
|
||||
|
||||
// ============ 匹配 ============
|
||||
|
||||
onGoMessages() { wx.switchTab({ url: ROUTE.TAB.MESSAGES }); },
|
||||
onGoMessages() { wx.navigateTo({ url: ROUTE.SETTINGS.NOTIFICATIONS }); },
|
||||
onGoLikers() { wx.navigateTo({ url: ROUTE.DETAIL.LIKERS }); },
|
||||
|
||||
// ============ 账户与安全 ============
|
||||
|
||||
@@ -163,10 +163,7 @@ Page({
|
||||
relationStatus: RELATION_STATUS.MUTUAL_MATCH,
|
||||
actionLoading: false,
|
||||
});
|
||||
appStore.toastSuccess('双向喜欢!可以开始聊天了');
|
||||
if (result.matchedConversationId) {
|
||||
wx.navigateTo({ url: to.chat(result.matchedConversationId) });
|
||||
}
|
||||
appStore.toastSuccess('双向意向匹配成功,可查看公益服务');
|
||||
} else {
|
||||
this.setData({
|
||||
isLiked: true,
|
||||
@@ -185,19 +182,6 @@ Page({
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 开始聊天(仅 Mutual 后可见,AGENTS 第 3 条)
|
||||
*/
|
||||
onGoChat() {
|
||||
const { userId, canChat, profile } = this.data;
|
||||
if (!canChat) {
|
||||
appStore.toast('双方互相喜欢后才能开始聊天');
|
||||
return;
|
||||
}
|
||||
// matchedConversationId 优先来自最近 like 结果;无则用 userId 占位由 chat 页拉取
|
||||
const conversationId = (profile && profile.matchedConversationId) || userId;
|
||||
wx.navigateTo({ url: to.chat(conversationId) });
|
||||
},
|
||||
|
||||
/**
|
||||
* 举报:跳转 report 页,不在本页处理(AGENTS 第 7 条:举报内容不在此暴露)
|
||||
|
||||
@@ -113,14 +113,6 @@
|
||||
bind:tap="onReport"
|
||||
disabled="{{actionLoading}}"
|
||||
>举报</ui-button>
|
||||
<ui-button
|
||||
wx:if="{{canChat}}"
|
||||
variant="secondary"
|
||||
size="md"
|
||||
custom-class="profile-actions__btn"
|
||||
bind:tap="onGoChat"
|
||||
disabled="{{actionLoading}}"
|
||||
>开始聊天</ui-button>
|
||||
<ui-button
|
||||
wx:if="{{!isLiked}}"
|
||||
variant="primary"
|
||||
|
||||
@@ -14,6 +14,7 @@ const profileService = require('./profileService');
|
||||
const verificationService = require('./verificationService');
|
||||
const recommendationService = require('./recommendationService');
|
||||
const matchService = require('./matchService');
|
||||
// 兼容未注册的历史聊天页面源码;用户端不再暴露该服务。
|
||||
const messageService = require('./messageService');
|
||||
const activityService = require('./activityService');
|
||||
const matchmakerService = require('./matchmakerService');
|
||||
|
||||
@@ -20,8 +20,7 @@ const api = require('../utils/api');
|
||||
* 表达喜欢
|
||||
* POST /likes { targetUserId }
|
||||
*
|
||||
* 响应对齐 types.LikeResult:{ relationStatus, mutualMatch, matchedConversationId }。
|
||||
* mutualMatch=true 且 matchedConversationId 非空时,调用方可直接跳转聊天页。
|
||||
* 响应对齐 types.LikeResult:{ relationStatus, mutualMatch }。
|
||||
* @param {string} userId
|
||||
* @returns {Promise<import('../types').LikeResult>}
|
||||
*/
|
||||
|
||||
+5
-19
@@ -15,6 +15,7 @@
|
||||
const authStore = require('./authStore');
|
||||
const userStore = require('./userStore');
|
||||
const matchStore = require('./matchStore');
|
||||
// 兼容未注册的历史聊天页面源码;页面与服务端入口均已下线,不在启动流程中初始化。
|
||||
const messageStore = require('./messageStore');
|
||||
const activityStore = require('./activityStore');
|
||||
const matchmakerStore = require('./matchmakerStore');
|
||||
@@ -128,53 +129,40 @@ function isProfileApproved() {
|
||||
// ============ 跨 Store 编排 ============
|
||||
|
||||
/**
|
||||
* 拉黑用户:触发 MatchStore 与 MessageStore 同步副作用
|
||||
* - MatchStore:从推荐/Mutual 列表移除该用户
|
||||
* - MessageStore:标记对应会话不可发消息(AGENTS 第 4 条)
|
||||
* 拉黑用户:从推荐/Mutual 列表移除该用户。
|
||||
* @param {string} userId
|
||||
* @param {string} [reason]
|
||||
*/
|
||||
async function blockUser(userId, reason) {
|
||||
await matchStore.block(userId, reason);
|
||||
// 查找对应会话并标记停用
|
||||
const conv = messageStore.state.conversations.find(
|
||||
(c) => c.targetUserId === userId || c.conversationId === userId,
|
||||
);
|
||||
if (conv) messageStore.markConversationBlocked(conv.conversationId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Like 用户:若返回 mutualMatch=true,自动刷新会话列表
|
||||
* Like 用户:若返回 mutualMatch=true,仅保留匹配结果和公益服务引导。
|
||||
* @param {string} userId
|
||||
* @returns {Promise<import('../types').LikeResult>}
|
||||
*/
|
||||
async function likeUser(userId) {
|
||||
const result = await matchStore.like(userId);
|
||||
if (result && result.mutualMatch) {
|
||||
// Mutual Match 达成,刷新会话列表,让用户能立即开始聊天
|
||||
await messageStore.fetchConversations();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解除匹配:触发 MatchStore 与 MessageStore 同步副作用
|
||||
* 解除匹配。
|
||||
* @param {string} matchId
|
||||
*/
|
||||
async function unmatchConversation(matchId) {
|
||||
await matchStore.unmatch(matchId);
|
||||
messageStore.markConversationBlocked(matchId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 成功牵手:双确认第二步(仅被请求方调用),成功后刷新 userStore 与会话列表
|
||||
* 成功牵手:双确认第二步(仅被请求方调用),成功后刷新 userStore。
|
||||
* @param {string} matchId
|
||||
*/
|
||||
async function confirmSuccess(matchId) {
|
||||
const result = await matchStore.confirmSuccess(matchId);
|
||||
// 成功牵手后关系状态变化,需刷新 userState
|
||||
try { await userStore.fetchStatus(); } catch (e) { /* 不阻塞主流程 */ }
|
||||
try { await messageStore.fetchConversations(); } catch (e) { /* 同上 */ }
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -185,14 +173,12 @@ async function confirmSuccess(matchId) {
|
||||
* 1. appStore.init() — 拉取服务端配置(不阻塞核心)
|
||||
* 2. authStore.hydrate() — 从本地恢复登录态
|
||||
* 3. userStore.hydrate() — 从本地恢复用户状态快照
|
||||
* 4. messageStore.hydrate() — 从本地恢复未读数(兜底)
|
||||
* 5. 若已登录,异步刷新 userStore.fetchStatus()(不阻塞启动)
|
||||
*/
|
||||
async function bootstrap() {
|
||||
// 同步阶段:本地状态恢复(避免白屏)
|
||||
authStore.hydrate();
|
||||
userStore.hydrate();
|
||||
messageStore.hydrate();
|
||||
|
||||
// 异步阶段:服务端配置 + 用户状态刷新
|
||||
// 配置失败不阻塞启动;状态失败由路由守卫处理(跳登录页)
|
||||
|
||||
@@ -163,7 +163,7 @@ class MatchStore extends BaseStore {
|
||||
/**
|
||||
* 拉黑用户(Block 优先级最高,AGENTS 第 4 条)
|
||||
* 拉黑后:本地从推荐/Mutual 列表移除;调用方应跳离当前用户详情页。
|
||||
* 跨 Store 副作用由 stores/index.js 编排:通知 messageStore 标记会话不可发消息。
|
||||
* 匹配结果由 stores/index.js 编排,不创建用户间聊天会话。
|
||||
*/
|
||||
async block(userId, reason) {
|
||||
if (this._actionLocks.has(`block:${userId}`)) return;
|
||||
|
||||
Vendored
-1
@@ -109,7 +109,6 @@ export interface Recommendation extends User {
|
||||
export interface LikeResult {
|
||||
relationStatus: RelationStatus;
|
||||
mutualMatch: boolean;
|
||||
matchedConversationId?: string;
|
||||
}
|
||||
|
||||
// ============ Conversation / Message(规范 §35-38, §61-63) ============
|
||||
|
||||
@@ -239,7 +239,6 @@ export interface LikeResult {
|
||||
mutual: boolean
|
||||
mutualMatch?: boolean
|
||||
matchCreated?: boolean
|
||||
matchedConversationId?: string
|
||||
}
|
||||
|
||||
// ===== 通知 =====
|
||||
|
||||
Reference in New Issue
Block a user