通过向UpdateDataInfoParams添加conRemark并重构相关组件,增强好友信息更新功能。删除未使用的本地数据库更新逻辑并简化DetailValue组件中的数据处理。
This commit is contained in:
@@ -2,6 +2,7 @@ import request from "@/api/request";
|
||||
// 更新好友信息
|
||||
export interface UpdateFriendInfoParams {
|
||||
id: number;
|
||||
conRemark: string;
|
||||
phone: string;
|
||||
company: string;
|
||||
name: string;
|
||||
@@ -15,18 +16,6 @@ export function updateFriendInfo(params: UpdateFriendInfoParams): Promise<any> {
|
||||
return request("/v1/kefu/wechatFriend/updateInfo", params, "POST");
|
||||
}
|
||||
|
||||
// 更新本地数据库中的好友信息
|
||||
export interface UpdateLocalDBParams {
|
||||
wechatFriendId: number;
|
||||
extendFields: string;
|
||||
updateConversation?: boolean; // 是否同时更新会话列表
|
||||
}
|
||||
|
||||
export function updateLocalDBFriendInfo(
|
||||
params: UpdateLocalDBParams,
|
||||
): Promise<any> {
|
||||
return request("/v1/kefu/wechatFriend/updateLocalDB", params, "POST");
|
||||
}
|
||||
// 获取好友信息
|
||||
export interface GetFriendInfoParams {
|
||||
id: number;
|
||||
|
||||
@@ -2,7 +2,6 @@ import React, { useCallback, useState, useEffect, useRef } from "react";
|
||||
import { Input, message } from "antd";
|
||||
import { Button } from "antd-mobile";
|
||||
import { EditOutlined } from "@ant-design/icons";
|
||||
import { updateFriendInfo, UpdateFriendInfoParams } from "../api";
|
||||
|
||||
import styles from "../Person.module.scss";
|
||||
|
||||
@@ -31,7 +30,6 @@ export interface DetailValueProps {
|
||||
values: Record<string, string>,
|
||||
changedKeys: string[],
|
||||
) => void;
|
||||
isGroup?: boolean;
|
||||
}
|
||||
|
||||
const DetailValue: React.FC<DetailValueProps> = ({
|
||||
@@ -44,7 +42,6 @@ const DetailValue: React.FC<DetailValueProps> = ({
|
||||
renderFooter,
|
||||
saveHandler,
|
||||
onSaveSuccess,
|
||||
isGroup = false,
|
||||
}) => {
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [editingFields, setEditingFields] = useState<Record<string, boolean>>(
|
||||
@@ -158,37 +155,12 @@ const DetailValue: React.FC<DetailValueProps> = ({
|
||||
}
|
||||
|
||||
try {
|
||||
if (isGroup) {
|
||||
// 群组信息使用传入的saveHandler
|
||||
if (saveHandler) {
|
||||
await saveHandler(fieldValues, changedKeys);
|
||||
} else {
|
||||
onSubmit?.(fieldValues, changedKeys);
|
||||
}
|
||||
// 统一由外部传入的 saveHandler 或 onSubmit 处理保存逻辑,
|
||||
// DetailValue 只负责收集数据和触发保存,避免与业务层重复。
|
||||
if (saveHandler) {
|
||||
await saveHandler(fieldValues, changedKeys);
|
||||
} else {
|
||||
// 个人资料信息处理
|
||||
if (changedKeys.includes("conRemark")) {
|
||||
// 微信备注是特例,使用WebSocket更新
|
||||
if (saveHandler) {
|
||||
await saveHandler(fieldValues, changedKeys);
|
||||
} else {
|
||||
onSubmit?.(fieldValues, changedKeys);
|
||||
}
|
||||
} else {
|
||||
// 其他个人资料信息使用updateFriendInfo API
|
||||
const params: UpdateFriendInfoParams = {
|
||||
id: Number(value.id) || 0,
|
||||
phone: fieldValues.phone || "",
|
||||
company: fieldValues.company || "",
|
||||
name: fieldValues.name || "",
|
||||
position: fieldValues.position || "",
|
||||
email: fieldValues.email || "",
|
||||
address: fieldValues.address || "",
|
||||
qq: fieldValues.qq || "",
|
||||
remark: fieldValues.remark || "",
|
||||
};
|
||||
await updateFriendInfo(params);
|
||||
}
|
||||
onSubmit?.(fieldValues, changedKeys);
|
||||
}
|
||||
|
||||
// 更新原始值
|
||||
@@ -216,8 +188,6 @@ const DetailValue: React.FC<DetailValueProps> = ({
|
||||
changedKeys,
|
||||
fields,
|
||||
messageApi,
|
||||
isGroup,
|
||||
value.id,
|
||||
]);
|
||||
|
||||
const isEditing = Object.values(editingFields).some(Boolean);
|
||||
|
||||
@@ -21,19 +21,18 @@ import {
|
||||
} from "@ant-design/icons";
|
||||
import { ContractData, weChatGroup } from "@/pages/pc/ckbox/data";
|
||||
import { useCustomerStore } from "@/store/module/weChat/customer";
|
||||
import { useMessageStore } from "@weChatStore/message";
|
||||
import { useUserStore } from "@storeModule/user";
|
||||
import { useWebSocketStore } from "@/store/module/websocket/websocket";
|
||||
import { useWeChatStore } from "@/store/module/weChat/weChat";
|
||||
import { contactUnifiedService } from "@/utils/db";
|
||||
import { MessageManager } from "@/utils/dbAction/message";
|
||||
import { generateAiText } from "@/api/ai";
|
||||
import TwoColumnSelection from "@/components/TwoColumnSelection/TwoColumnSelection";
|
||||
import TwoColumnMemberSelection from "@/components/MemberSelection/TwoColumnMemberSelection";
|
||||
import { FriendSelectionItem } from "@/components/FriendSelection/data";
|
||||
import DetailValue from "./components/detailValue";
|
||||
import {
|
||||
getFriendInfo,
|
||||
FriendDetailResponse,
|
||||
updateLocalDBFriendInfo,
|
||||
} from "./api";
|
||||
import { getFriendInfo, FriendDetailResponse, updateFriendInfo } from "./api";
|
||||
import styles from "./Person.module.scss";
|
||||
interface PersonProps {
|
||||
contract: ContractData | weChatGroup;
|
||||
@@ -52,6 +51,11 @@ const Person: React.FC<PersonProps> = ({ contract }) => {
|
||||
null,
|
||||
);
|
||||
|
||||
// 会话列表 & 当前用户,用于在备注更新后同步会话列表显示
|
||||
const setSessions = useMessageStore(state => state.setSessions);
|
||||
const { user } = useUserStore();
|
||||
const currentUserId = user?.id || 0;
|
||||
|
||||
// 判断是否为群聊
|
||||
const isGroup = "chatroomId" in contract;
|
||||
|
||||
@@ -212,32 +216,14 @@ const Person: React.FC<PersonProps> = ({ contract }) => {
|
||||
|
||||
// 优化:使用选择器函数直接订阅匹配的客服对象,避免订阅整个 customerList
|
||||
// 添加相等性比较,只有当匹配的客服对象或其 labels 真正变化时才触发重新渲染
|
||||
const kfSelectedUser = useCustomerStore(
|
||||
state => {
|
||||
if (!contract.wechatAccountId) return null;
|
||||
return (
|
||||
state.customerList.find(
|
||||
customer => customer.id === contract.wechatAccountId,
|
||||
) || null
|
||||
);
|
||||
},
|
||||
(prev, next) => {
|
||||
// 如果都是 null,认为相等
|
||||
if (!prev && !next) return true;
|
||||
// 如果一个是 null 另一个不是,认为不相等
|
||||
if (!prev || !next) return false;
|
||||
// 比较关键字段:id 和 labels(因为 useEffect 中使用了 labels)
|
||||
if (prev.id !== next.id) return false;
|
||||
// 比较 labels 数组是否真的变化了
|
||||
const prevLabels = prev.labels || [];
|
||||
const nextLabels = next.labels || [];
|
||||
if (prevLabels.length !== nextLabels.length) return false;
|
||||
// 深度比较 labels 数组内容(先复制再排序,避免修改原数组)
|
||||
const prevLabelsStr = JSON.stringify([...prevLabels].sort());
|
||||
const nextLabelsStr = JSON.stringify([...nextLabels].sort());
|
||||
return prevLabelsStr === nextLabelsStr;
|
||||
},
|
||||
);
|
||||
const kfSelectedUser = useCustomerStore(state => {
|
||||
if (!contract.wechatAccountId) return null;
|
||||
return (
|
||||
state.customerList.find(
|
||||
(customer: any) => customer.id === contract.wechatAccountId,
|
||||
) || null
|
||||
);
|
||||
});
|
||||
|
||||
// 不再需要从useContactStore获取getContactsByCustomer
|
||||
|
||||
@@ -253,7 +239,7 @@ const Person: React.FC<PersonProps> = ({ contract }) => {
|
||||
useEffect(() => {
|
||||
const fetchAvailableTags = async () => {
|
||||
try {
|
||||
const kfTags = kfSelectedUser?.labels || [];
|
||||
const kfTags = (kfSelectedUser as any)?.labels || [];
|
||||
const contractTags = contract.labels || [];
|
||||
const allTags = [...new Set([...kfTags, ...contractTags])];
|
||||
setAllAvailableTags(allTags);
|
||||
@@ -403,14 +389,47 @@ const Person: React.FC<PersonProps> = ({ contract }) => {
|
||||
extendFields: extendFieldsStr,
|
||||
});
|
||||
|
||||
// 同时更新会话列表和好友本地数据库中的extendFields字段
|
||||
updateLocalDBFriendInfo({
|
||||
wechatFriendId: contract.id,
|
||||
extendFields: extendFieldsStr,
|
||||
updateConversation: true, // 同时更新会话列表
|
||||
// 同步好友信息到后端
|
||||
updateFriendInfo({
|
||||
id: Number(contract.id) || 0,
|
||||
conRemark: values.conRemark || "",
|
||||
phone: values.phone || "",
|
||||
company: values.company || "",
|
||||
name: values.name || "",
|
||||
position: values.position || "",
|
||||
email: values.email || "",
|
||||
address: values.address || "",
|
||||
qq: values.qq || "",
|
||||
remark: values.remark || "",
|
||||
}).catch(err => {
|
||||
console.error("更新本地数据库失败:", err);
|
||||
console.error("更新好友信息失败:", err);
|
||||
});
|
||||
|
||||
// 备注变更时,同步更新会话列表 UI 和本地会话数据库
|
||||
if (changedKeys.includes("conRemark")) {
|
||||
const newRemark = values.conRemark || "";
|
||||
|
||||
// 1. 立即更新会话列表 UI(乐观更新)
|
||||
setSessions(prev =>
|
||||
prev.map(session =>
|
||||
session.type === "friend" && session.id === contract.id
|
||||
? { ...session, conRemark: newRemark }
|
||||
: session,
|
||||
),
|
||||
);
|
||||
|
||||
// 2. 同步到会话本地数据库
|
||||
if (currentUserId) {
|
||||
MessageManager.updateRemark(
|
||||
currentUserId,
|
||||
Number(contract.id) || 0,
|
||||
"friend",
|
||||
newRemark,
|
||||
).catch(err => {
|
||||
console.error("更新会话备注失败:", err);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -740,7 +759,7 @@ const Person: React.FC<PersonProps> = ({ contract }) => {
|
||||
}
|
||||
|
||||
// 获取当前用户ID
|
||||
const userId = kfSelectedUser?.userId || 0;
|
||||
const userId = (kfSelectedUser as any)?.userId || 0;
|
||||
const storeUserId = databaseManager.getCurrentUserId();
|
||||
const effectiveUserId = storeUserId || userId;
|
||||
|
||||
@@ -924,7 +943,6 @@ const Person: React.FC<PersonProps> = ({ contract }) => {
|
||||
setSelfDisplayNameValue(values.selfDisplayName);
|
||||
}
|
||||
}}
|
||||
isGroup={true}
|
||||
/>
|
||||
) : (
|
||||
// 好友信息
|
||||
@@ -1010,7 +1028,6 @@ const Person: React.FC<PersonProps> = ({ contract }) => {
|
||||
setRemarkValue(values.conRemark);
|
||||
}
|
||||
}}
|
||||
isGroup={false}
|
||||
/>
|
||||
)}
|
||||
</Card>
|
||||
|
||||
Reference in New Issue
Block a user