浏览代码

fix: 差评列表刷新

sheldon 3 周之前
父节点
当前提交
4818eb9934
共有 28 个文件被更改,包括 126 次插入66 次删除
  1. 3 3
      src/app.config.ts
  2. 4 4
      src/app.less
  3. 2 2
      src/components/ChatRecordItem/index.tsx
  4. 1 1
      src/components/empty-data/index.tsx
  5. 1 1
      src/pages/agent-avatars/index.tsx
  6. 17 5
      src/pages/agent/components/AgentSetting/components/AgentCard/index.tsx
  7. 1 2
      src/pages/chat/index.tsx
  8. 1 1
      src/pages/contact/index.tsx
  9. 1 1
      src/pages/dashboard/components/VisitorCard/index.tsx
  10. 7 3
      src/pages/dashboard/index.tsx
  11. 0 0
      src/pages/dislike-message-editor/index.config.ts
  12. 2 2
      src/pages/dislike-message-editor/index.tsx
  13. 0 0
      src/pages/dislike-messages/components/ShareToEntPopup/index.tsx
  14. 0 0
      src/pages/dislike-messages/index.config.ts
  15. 0 0
      src/pages/dislike-messages/index.module.less
  16. 30 4
      src/pages/dislike-messages/index.tsx
  17. 1 1
      src/pages/knowledge/components/CompanyList/index.tsx
  18. 1 1
      src/pages/knowledge/components/CompanyTab/components/ScrollListChat.tsx
  19. 1 1
      src/pages/knowledge/components/CorrectionList/index.tsx
  20. 2 2
      src/pages/knowledge/components/PersonalTab/components/ScrollList.tsx
  21. 4 5
      src/pages/knowledge/components/PersonalTab/components/ScrollListChat.tsx
  22. 0 0
      src/pages/visiteor-detail/components/VisitorSummary/index.tsx
  23. 0 0
      src/pages/visiteor-detail/index.config.ts
  24. 0 0
      src/pages/visiteor-detail/index.module.less
  25. 3 1
      src/pages/visiteor-detail/index.tsx
  26. 1 1
      src/pages/voice/components/MyVoiceList/index.tsx
  27. 7 0
      src/service/agent.ts
  28. 36 25
      src/utils/loadMoreInfinite.ts

+ 3 - 3
src/app.config.ts

@@ -4,9 +4,9 @@ export default defineAppConfig({
     'pages/personal/index',
     'pages/profile/index',
     'pages/dashboard/index',
-    'pages/dashboard-visited-detail/index',
-    'pages/dashboard-dislike-messages/index',
-    'pages/dashboard-visitor-message-editor/index',
+    'pages/visiteor-detail/index',
+    'pages/dislike-messages/index',
+    'pages/dislike-message-editor/index',
     'pages/chat-messages/index',
     'pages/chat-session-messages/index',
     'pages/contact/index',

+ 4 - 4
src/app.less

@@ -288,11 +288,11 @@ page {
   background-repeat: no-repeat;
 }
 // 放大镜
-.data-empty2{
+.data-empty-search{
   background-image: url(https://cdn.wehome.cn/cmn/png/137/META-H8UKWHWU-HGXWYHZT5H6E78JCO9YE2-EZTHCUCM-YC.png);
 }
 // 空白写字板
-.data-empty3{
+.data-empty-whiteboard{
   background-image: url(https://cdn.wehome.cn/cmn/png/87/META-H8UKWHWU-HGXWYHZT5H6E78JCO9YE2-QYTHCUCM-XC.png);
 }
 // 三角牌感叹号
@@ -300,7 +300,7 @@ page {
   background-image: url(https://cdn.wehome.cn/cmn/png/63/META-H8UKWHWU-8HXWA0PE7HXUV4QMQUBV2-NYTHCUCM-SC.png);
 }
 // 两个对话框
-.data-empty5{
+.data-empty-chat{
   background-image: url(https://cdn.wehome.cn/cmn/png/30/META-H8UKWHWU-8HXWA0PE7HXUV4QMQUBV2-RYTHCUCM-TC.png);
 }
 // 破碎文件夹
@@ -308,7 +308,7 @@ page {
   background-image: url(https://cdn.wehome.cn/cmn/png/82/META-H8UKWHWU-8HXWA0PE7HXUV4QMQUBV2-Z5UHCUCM-UC.png);
 }
 // 空白文件盒
-.data-empty7{
+.data-empty-box{
   background-image: url(https://cdn.wehome.cn/cmn/png/69/META-H8UKWHWU-HGXWYHZT5H6E78JCO9YE2-36UHCUCM-ZC.png);
 }
 

+ 2 - 2
src/components/ChatRecordItem/index.tsx

@@ -50,9 +50,9 @@ export default ({ visitorId, sessionId, showMoreButton = false }:IProps) => {
           <View className="text-14 text-title mb-8">{question?.content}</View>
           {!!answer?.content?.length && <View className="p-16 text-title rounded-8 relative" style={{backgroundColor: '#F4F9FF'}}>
               <View>{answer?.content}</View>
-              <View className={style.editButton}>
+              {/* <View className={style.editButton}>
                 <Image src={IconEditButtonBlue} className="w-14 h-14" />
-              </View>
+              </View> */}
             </View>}
         </View>
         {showMoreButton && <View

+ 1 - 1
src/components/empty-data/index.tsx

@@ -1,6 +1,6 @@
 import { View } from "@tarojs/components";
 interface IProps {
-  type: number,
+  type: 'search'|'chat' | 'box' | 'whiteboard' | (string & {}),
   text?: string,
   children?: JSX.Element|JSX.Element[]
 }

+ 1 - 1
src/pages/agent-avatars/index.tsx

@@ -103,7 +103,7 @@ export default function Index() {
   const renderList = ()=> {
     if(!list.length){
       return <>
-        <EmptyData type={2}></EmptyData>
+        <EmptyData type={'search'}></EmptyData>
       </>
     }
     

+ 17 - 5
src/pages/agent/components/AgentSetting/components/AgentCard/index.tsx

@@ -5,12 +5,24 @@ import Taro from "@tarojs/taro";
 import { uploadAndNavToGenNewAvatar } from "@/utils/avatar";
 import WemetaRadio from '@/components/WemetaRadio'
 import { useAgentStore } from "@/store/agentStore";
+import { editAgentChatBg } from "@/service/agent";
+import { isSuccess } from "@/utils";
 
 export default () => {
-  const {agent} = useAgentStore()
-
-  const handleChange = (checked: boolean)=> {
+  const {agent, fetchAgent} = useAgentStore()
 
+  const handleChange = async (isChecked: boolean)=> {
+    if(!agent?.agentId){
+      return
+    }
+    const response = await editAgentChatBg(agent.agentId, isChecked)
+    if(isSuccess(response.status)) {
+      Taro.showToast({
+        title: isChecked ? '启用成功' : '取消启用',
+        icon: 'success',
+      });
+      fetchAgent(agent.agentId); // 刷新智能体信息  
+    }
   }
   const handleClick = () => {
     if (agent?.avatarUrl) {
@@ -50,9 +62,9 @@ export default () => {
       <View className={style.card} onClick={handleClick}>
         {renderContent()}
       </View>
-      <View className="w-full flex-center pt-24 gap-6" onClick={()=> handleChange(!!agent?.enabledChatBg)}>
+      <View className="w-full flex-center pt-24 gap-6" onClick={()=> handleChange(!!!agent?.enabledChatBg)}>
         {/* ={agent?.enabledChatBg} */}
-        <WemetaRadio checkbox checked></WemetaRadio>
+        <WemetaRadio checkbox checked={agent?.enabledChatBg}></WemetaRadio>
         <View className="font-medium text-14 text-black">启用聊天背景</View>
       </View>
     </View>

+ 1 - 2
src/pages/chat/index.tsx

@@ -199,8 +199,7 @@ export default function Index() {
   return (
     <PageCustom fullPage style={{ overflow: "hidden" }}>
       <NavBarNormal leftColumn={renderNavLeft}></NavBarNormal>
-      {/* {(!!agent?.enabledChatBg) ? <View className={style.topBg} style={bgImageStyle}></View> : <></>} */}
-      {<View className={style.topBg} style={bgImageStyle}></View>}
+      {(!!agent?.enabledChatBg) ? <View className={style.topBg} style={bgImageStyle}></View> : <></>}
       <View
         className="flex flex-col w-full h-screen relative z-10"
         style={{ marginTop: `${marginTopOffset}px` }}

+ 1 - 1
src/pages/contact/index.tsx

@@ -104,7 +104,7 @@ export default function Index() {
         </slide-delete>
       ));
     }
-    return <EmptyData type={2} />;
+    return <EmptyData type={'search'} />;
   };
 
   return (

+ 1 - 1
src/pages/dashboard/components/VisitorCard/index.tsx

@@ -16,7 +16,7 @@ export interface IndexProps {
 const Index = ({ data }: IndexProps) => {
   const handleClick = ()=> {
     Taro.navigateTo({
-      url: `/pages/dashboard-visited-detail/index?visitorId=${data.visitorId}`
+      url: `/pages/visiteor-detail/index?visitorId=${data.visitorId}`
     })
   }
   return (

+ 7 - 3
src/pages/dashboard/index.tsx

@@ -58,6 +58,7 @@ export default () => {
 
   const options = ['全部智能体', ...agents.map(_agent => _agent.name)]
 
+  const unprocessedDislikeCnt = summary?.unprocessedDislikeCnt ?? 0
 
   return (
     <PageCustom>
@@ -80,14 +81,17 @@ export default () => {
           <DataCard text="今日对话人数" unitText="人" value={summary?.todayUv ?? 0} />
           <DataCard text="累计访问次数" unitText="次" value={summary?.sumPv ?? 0} />
           <DataCard text="累计对话人数" unitText="人" value={summary?.sumPv ?? 0} />
-          <DataCard text="好评" unitText="条" value={summary?.unreadLikeCnt ?? 0} arrow />
+          <DataCard text="好评" unitText="条" value={summary?.unreadLikeCnt ?? 0} />
           <DataCard onClick={()=> {
+            if(unprocessedDislikeCnt <= 0) {
+              return;
+            }
             const query = currentAgent?.agentId ? `agentId=${currentAgent.agentId}` : ''
             Taro.navigateTo({
-              url: `/pages/dashboard-dislike-messages/index?${query}`
+              url: `/pages/dislike-messages/index?${query}`
             })
             
-          }} text="待处理差评" unitText="条" value={summary?.unprocessedDislikeCnt ?? 0} arrow />
+          }} text="待处理差评" unitText="条" value={unprocessedDislikeCnt} arrow />
         </View>
 
         <VisitorList agentId={currentAgent?.agentId}></VisitorList>

+ 0 - 0
src/pages/dashboard-visitor-message-editor/index.config.ts → src/pages/dislike-message-editor/index.config.ts


+ 2 - 2
src/pages/dashboard-visitor-message-editor/index.tsx → src/pages/dislike-message-editor/index.tsx

@@ -104,7 +104,7 @@ export default function Index() {
       return
     }
     const dataToSubmit = {
-      questions : [visitorQ?.content],
+      questions : visitorQ?.content ? [visitorQ?.content] : [],
       visitorId: visitorId,
       answer: formData.correctionAnswer,
       content: formData.content,
@@ -176,7 +176,7 @@ export default function Index() {
 
   return (
     <PageCustom>
-      <NavBarNormal scrollFadeIn backText={'差评记录'}></NavBarNormal>
+      <NavBarNormal scrollFadeIn backText={'待处理差评'}></NavBarNormal>
       <View className="w-full pb-120">
         <View className="p-16">
           <View className="text-gray-45 text-14 text-center py-8">修改后的问答将存入知识库,持续训练提升您的智能体</View>

+ 0 - 0
src/pages/dashboard-dislike-messages/components/ShareToEntPopup/index.tsx → src/pages/dislike-messages/components/ShareToEntPopup/index.tsx


+ 0 - 0
src/pages/dashboard-dislike-messages/index.config.ts → src/pages/dislike-messages/index.config.ts


+ 0 - 0
src/pages/dashboard-dislike-messages/index.module.less → src/pages/dislike-messages/index.module.less


+ 30 - 4
src/pages/dashboard-dislike-messages/index.tsx → src/pages/dislike-messages/index.tsx

@@ -35,19 +35,22 @@ export default function Index() {
     });
     return res.data;
   };
-  const { list, loadMore } = useLoadMoreInfinite<TVisitorChat>(
+  const { list, loadMore, setSize, pages, pageIndex, mutate } = useLoadMoreInfinite<TVisitorChat[]>(
     createKey(`getVisitorDislikeMessages${agentId}`),
     fetcher
   );
 
+  const dislikeList = list.filter((_item) => _item.role === 'assistant');
+
   const handleEdit = (item: TVisitorChat) => {
     Taro.navigateTo({
-      url: `/pages/dashboard-visitor-message-editor/index?msgId=${item.msgId}&visitorId=${item.visitorId}&agentId=${item.agentId}`,
+      url: `/pages/dislike-message-editor/index?msgId=${item.msgId}&visitorId=${item.visitorId}&agentId=${item.agentId}`,
     });
   };
 
   // 删除问答项
   const handleDeleteItem = async (item: TVisitorChat) => {
+    
     showModal({
       content: "确定删除该问答项吗?",
       onConfirm: async () => {
@@ -57,7 +60,26 @@ export default function Index() {
         });
         if (isSuccess(status)) {
           Taro.showToast({ title: "删除成功", icon: "success" });
-          // todo
+          // if (newPages[newPages.length - 1]?.length === 0) {
+          //   setSize(size - 1)
+          // }
+          // 1. 乐观更新:立即移除数据
+          mutate((currentPages) => {
+            if(currentPages === undefined) return currentPages;
+            // 创建全新的 pages 数组(深拷贝)
+            const newPages = currentPages.map((page, index) => {
+              // 如果不是目标页,直接返回原引用(避免不必要的重渲染)
+              if (index !== pageIndex - 1) return page;
+              
+              // 创建目标页的新副本
+              return {
+                ...page, // 复制其他属性
+                data: page.data.filter(_item => _item.msgId !== item.msgId)
+              };
+            });
+            
+            return newPages;
+          }, false) // 不重新验证
         }
       },
     });
@@ -72,6 +94,10 @@ export default function Index() {
     loadMore();
   };
 
+  useDidShow(() => {
+    mutate()
+  });
+
   const createCardOptions = (item: TVisitorChat) => {
     return [
       <View onClick={() => handleDeleteItem(item)}>删除</View>,
@@ -99,7 +125,7 @@ export default function Index() {
           }}
         >
           <View className="pb-80">
-            {list.map((item) => {
+            {dislikeList.map((item) => {
               return (
                 <View className="flex flex-col gap-16 px-16 mb-16">
                   <CardEditable buttons={createCardOptions(item)}>

+ 1 - 1
src/pages/knowledge/components/CompanyList/index.tsx

@@ -62,7 +62,7 @@ const Index = ({currentEnt, setCurrentEnt, extraEnt = []}: IProps) => {
   if (!allEnt.length) {
     return (
       <View className="flex-center pt-40">
-        <EmptyData type={7}>
+        <EmptyData type={'box'}>
           <View className="text-center text-14 leading-28 text-gray-45 mb-44 w-172">
             <View className="text-center text-16 leading-24 font-medium text-black">
               绑定企业,知识自动到位

+ 1 - 1
src/pages/knowledge/components/CompanyTab/components/ScrollListChat.tsx

@@ -32,7 +32,7 @@ const ViewStyleChatEnt = ({ entId }: Iprops) => {
     const res = await getEntKnowledgeStream({ startId: nextId, pageSize, entId });
     return res.data;
   };
-  const { list, loadMore, pageIndex } = useLoadMoreInfinite<TKnowledgeStreamResponseData>(
+  const { list, loadMore, pageIndex } = useLoadMoreInfinite<TKnowledgeStreamResponseData[]>(
     createKey(`getEntKnowledgeStream ${entId}`, 10, [entId]),
     fetcher);
 

+ 1 - 1
src/pages/knowledge/components/CorrectionList/index.tsx

@@ -60,7 +60,7 @@ const Index = () => {
     if (list && !list.length) {
       return (
         <View className="flex-center pt-40">
-          <EmptyData type={3}>
+          <EmptyData type={'whiteboard'}>
             <View className="text-center text-14 leading-28 text-gray-45 mb-44 w-[296px]">
               <View className="text-center text-16 leading-24 font-medium text-black">
                 还没有纠正过的内容

+ 2 - 2
src/pages/knowledge/components/PersonalTab/components/ScrollList.tsx

@@ -33,7 +33,7 @@ const Index = ({types}: IProps) => {
     const res = await getKnowledgeList({ startId: nextId, pageSize, types });
     return res.data;
   };
-  const { list, loadMore } = useLoadMoreInfinite<TKnowledgeItem>( createKey('getKnowledgeList', 2, [types]), fetcher,);
+  const { list, loadMore } = useLoadMoreInfinite<TKnowledgeItem[]>( createKey('getKnowledgeList', 2, [types]), fetcher,);
 
   const onScrollToUpper = async () => {
     console.log('toUpper')
@@ -77,7 +77,7 @@ const Index = ({types}: IProps) => {
         height: "100%", // 高度自适应
       }}
     >
-      {list.length<=0 ? <EmptyData type={2}/> : <></>}
+      {list.length<=0 ? <EmptyData type={'search'}/> : <></>}
       <FigureList>
       {list.map(item => {
         return <FigureListItem

+ 4 - 5
src/pages/knowledge/components/PersonalTab/components/ScrollListChat.tsx

@@ -35,7 +35,7 @@ const ViewStyleChat = () => {
   };
 
   
-  const { list, loadMore, pageIndex } = useLoadMoreInfinite<TKnowledgeStreamResponseData>(
+  const { list, loadMore, pageIndex } = useLoadMoreInfinite<TKnowledgeStreamResponseData[]>(
     createKey('getMyKnowledgeStream', 10),
     fetcher,
   );
@@ -62,7 +62,7 @@ const ViewStyleChat = () => {
   }
 
   useEffect(()=> {
-    if(pageIndex === 0){
+    if(pageIndex === 1){
       setTimeout(()=> {
         setScrollTop( prev => prev + 1); // 重置滚动位置
       }, 300)
@@ -70,6 +70,7 @@ const ViewStyleChat = () => {
     }
   }, [pageIndex])
 
+  console.log(reversedList, 'reversedList');
   
 
   return (
@@ -84,9 +85,7 @@ const ViewStyleChat = () => {
     >
       <View className="flex flex-col gap-20 pb-80">
         {/* 欢迎语 */}
-        <MessageRobotRich data={DEFAULT_AGENT}>
-          <WelcomeCard />
-        </MessageRobotRich>
+        {(reversedList.length <= 0) && <MessageRobotRich data={DEFAULT_AGENT}><WelcomeCard /></MessageRobotRich>}
 
         {/* 添加小蓝本助手成功 */}
         {/* <MessageRobotRich data={avatarData}>

+ 0 - 0
src/pages/dashboard-visited-detail/components/VisitorSummary/index.tsx → src/pages/visiteor-detail/components/VisitorSummary/index.tsx


+ 0 - 0
src/pages/dashboard-visited-detail/index.config.ts → src/pages/visiteor-detail/index.config.ts


+ 0 - 0
src/pages/dashboard-visited-detail/index.module.less → src/pages/visiteor-detail/index.module.less


+ 3 - 1
src/pages/dashboard-visited-detail/index.tsx → src/pages/visiteor-detail/index.tsx

@@ -15,6 +15,7 @@ import { getVisitorSessions } from "@/service/visitor";
 
 import style from "./index.module.less";
 import { useLoadMoreInfinite, createKey } from "@/utils/loadMoreInfinite";
+import EmptyData from "@/components/empty-data";
 
 export default () => {
   const router = useRouter();
@@ -63,7 +64,7 @@ export default () => {
 
 
 
-  const { list, pageIndex, loadMore } = useLoadMoreInfinite<TSessionItem>(
+  const { list, pageIndex, loadMore } = useLoadMoreInfinite<TSessionItem[]>(
     createKey(`api/v1/my/visitor/sessions${visitorId}`, 5),
     fetcher);
 
@@ -94,6 +95,7 @@ export default () => {
         >
           <View>
             <View className="flex flex-col gap-16 px-16 w-full">
+              {list.length <= 0 && <View className="pt-100"><EmptyData type={'chat'} /></View>}
               {list.map((item) => {
                 return (
                   <View className="w-full">

+ 1 - 1
src/pages/voice/components/MyVoiceList/index.tsx

@@ -228,7 +228,7 @@ export default ({ onPlay, agent }: Props) => {
     //
     const voices = cloning ? [cloning, ...myVoices] : myVoices;
     if (!voices.length) {
-      return <EmptyData type={2}></EmptyData>;
+      return <EmptyData type={'search'}></EmptyData>;
     }
     return (
       <View className="px-16 flex flex-col w-full">

+ 7 - 0
src/service/agent.ts

@@ -30,6 +30,13 @@ export const editAgentAvatar = (agentId: string, avatarId: string|number, enable
   })
 }
 
+// 编辑智能体--是否启用背景聊天效果
+export const editAgentChatBg = (agentId: string, enabledChatBg: boolean) => {
+  return request.put(`${bluebookAiAgent}api/v1/my/agent/${agentId}/avatar/chatBg`, {
+    enabledChatBg,
+  })
+}
+
 // 设置当前我的默认智能体
 export const setDefaultAgent = (agentId: string) => {
   return request.put(`${bluebookAiAgent}api/v1/my/agent/${agentId}/default`)

+ 36 - 25
src/utils/loadMoreInfinite.ts

@@ -1,46 +1,56 @@
 import useSWRInfinite from "swr/infinite";
 
 export type TResponseData<D> = {
-  data:D
+  data: D
   nextId?: string
-  totalCount?: null|number
+  totalCount?: null | number
   pageIndex?: number
   pageSize?: number
 }
 
-export const createKey = (query: string, pageSize:number = 10, extra: Record<string,any> = [])=> {
-    return (pageIndex:number, previousPageData) => {
-      if (pageIndex === 0)
-        return [
-          query,
-          { nextId: undefined, pageSize},
-          extra,
-        ];
-      if (previousPageData && previousPageData.nextId) {
-        return [
-          query,
-          { pageSize, nextId: previousPageData.nextId },
-          extra,
-        ];
-      }
-      return null;
-    };
-  }
+export const createKey = (query: string, pageSize: number = 10, extra: Record<string, any> = []) => {
+  return (pageIndex: number, previousPageData) => {
+    if (pageIndex === 0)
+      return [
+        query,
+        { nextId: undefined, pageSize },
+        extra,
+      ];
+    if (previousPageData && previousPageData.nextId) {
+      return [
+        query,
+        { pageSize, nextId: previousPageData.nextId },
+        extra,
+      ];
+    }
+    return null;
+  };
+}
 export const useLoadMoreInfinite = <T>(getKey, fetcher, params = {}) => {
-  const { data, setSize, size } = useSWRInfinite<TResponseData<T>>(getKey, fetcher, {
+  const { data, setSize, size, mutate } = useSWRInfinite<{
+    data: T
+    nextId?: string
+    totalCount?: null | number
+    pageIndex?: number
+    pageSize?: number
+  }>(getKey, fetcher, {
     ...params,
     revalidateIfStale: false,
+    revalidateFirstPage: false,
     onErrorRetry(err, key, config, revalidate, revalidateOpts) {
-      if(err.status === 404) return 
-      if(err.status === 401) return
-      if(revalidateOpts.retryCount >=3 )return
+      if (err.status === 404) return
+      if (err.status === 401) return
+      if (revalidateOpts.retryCount >= 3) return
     },
   });
 
-  const list = data?.flatMap((page) => page?.data || []) || [];
+  // 扁平化后的数据列表
+  const list = (data?.flatMap((page) => page?.data || []) || []) as T;
+  // 原分页数据二维数组
   const pages = data
   const pageIndex = size
 
+
   const loadMore = () => {
     setSize((size) => size + 1);
   }
@@ -48,6 +58,7 @@ export const useLoadMoreInfinite = <T>(getKey, fetcher, params = {}) => {
     list,
     pageIndex,
     pages,
+    mutate,
     setSize,
     loadMore
   }