ソースを参照

fix: 生成形象未带提示文本

王晓东 1 ヶ月 前
コミット
000dde28af
37 ファイル変更447 行追加232 行削除
  1. 7 7
      README.md
  2. 11 3
      src/components/AgentPage/components/AgentSwap/index.tsx
  3. 7 3
      src/components/KnowledgeIcon/index.tsx
  4. 51 3
      src/components/chat-message/MessageRobot.tsx
  5. 4 3
      src/components/chat-message/index.tsx
  6. 1 1
      src/components/icon/IconCopy/index.tsx
  7. 7 0
      src/components/icon/IconDislike/index.tsx
  8. 7 0
      src/components/icon/IconDislikeBlue/index.tsx
  9. 7 0
      src/components/icon/IconLike/index.tsx
  10. 7 0
      src/components/icon/IconLikeBlue/index.tsx
  11. 4 3
      src/components/popup/popup/index.tsx
  12. 0 0
      src/images/svgs/IconCopy.svg
  13. 3 0
      src/images/svgs/IconDislike.svg
  14. 3 0
      src/images/svgs/IconDislikeBlue.svg
  15. 3 0
      src/images/svgs/IconLike.svg
  16. 3 0
      src/images/svgs/IconLikeBlue.svg
  17. 8 3
      src/pages/agent-avatars/index.tsx
  18. 10 9
      src/pages/agent-gen/components/step/StepConfirm.tsx
  19. 3 1
      src/pages/agent-gen/components/step/StepPick.tsx
  20. 21 14
      src/pages/agent-gen/components/step/StepStart.tsx
  21. 7 1
      src/pages/agent-gen/components/step/index.module.less
  22. 2 2
      src/pages/agent/components/AgentSetting/components/AgentCard/index.tsx
  23. 13 0
      src/pages/chat/index.module.less
  24. 88 72
      src/pages/chat/index.tsx
  25. 99 0
      src/pages/knowledge-item/components/ShareToEntPopup/index.tsx
  26. 12 38
      src/pages/knowledge-item/index.tsx
  27. 4 4
      src/pages/knowledge/components/view-style/ViewStyleChat.tsx
  28. 4 0
      src/pages/knowledge/components/view-style/ViewStyleList.tsx
  29. 3 1
      src/pages/knowledge/components/view-style/ViewStyleListEnt.tsx
  30. 11 6
      src/pages/login/index.tsx
  31. 3 23
      src/pages/voice/components/MyVoiceList/components/popup-recorder/index.module.less
  32. 3 16
      src/pages/voice/components/MyVoiceList/components/popup-recorder/index.tsx
  33. 9 8
      src/service/bot.ts
  34. 1 1
      src/service/knowledge.ts
  35. 8 4
      src/store/textChat.ts
  36. 1 1
      src/store/voiceStore.ts
  37. 12 5
      src/utils/avatar.ts

+ 7 - 7
README.md

@@ -28,11 +28,6 @@ pnpm devbuild:weapp
 pnpm build:weapp 
 ```
 
-
-### API 文档
-Link:  https://n25yh4s6dw.apidog.io
-Access password: 3zs5Gwlu
-
 ### Taro 
 https://taro-docs.jd.com/docs/h5
 
@@ -74,7 +69,7 @@ https://developers.weixin.qq.com/miniprogram/dev/component/store-product.html
 
 * 个人主页
 
-  /pages/profile/index?profileId=xxxx
+  /pages/profile/index?agentId=xxxx&shareKey=xxx
 
 
 
@@ -83,4 +78,9 @@ https://developers.weixin.qq.com/miniprogram/dev/component/store-product.html
 
 后台接口文档 https://bluebook.feishu.cn/docx/Ckh0dLOBzo0rjyxrUkrc0ffdn2c
 
-开发进度在线文档 https://www.kdocs.cn/l/cgHRgaGkRuJu
+开发进度在线文档 https://www.kdocs.cn/l/cgHRgaGkRuJu
+
+
+# bug 文档
+
+https://bluebook.feishu.cn/sheets/BW1dsW5NLhQKj7t3fnjc0xvsnpd

+ 11 - 3
src/components/AgentPage/components/AgentSwap/index.tsx

@@ -9,6 +9,7 @@ import { useAgentStore } from "@/store/agentStore";
 import { TAgent } from "@/types/agent";
 import Taro from "@tarojs/taro";
 import ContactIcon from "@/components/ContactIcon";
+import { useEffect } from "react";
 interface IProps {
   show: boolean;
   setShow: (show: boolean) => void;
@@ -62,12 +63,15 @@ export default ({ show, setShow }: IProps) => {
     }
   }
 
+  useEffect(()=> {
+    fetchAgents()
+  }, [show])
+
   const renderCard = (item: TAgent, isEnt: boolean) => {
     return (
-      <View className={item.isDefault ? style.cardActive : style.card}>
+      <View className={item.isDefault ? style.cardActive : style.card} onClick={() => handleClick(item)}>
         <View
           className="flex items-start mb-24"
-          onClick={() => handleClick(item)}
         >
           <View className="flex flex-col flex-1">
             <View className="flex items-end gap-8 text-gray-65">
@@ -117,7 +121,11 @@ export default ({ show, setShow }: IProps) => {
           <View className="text-12 text-gray-45 leading-20 mb-24">
             企业小蓝本由公司创建并授权,可引用企业知识内容
           </View>
-          <View className="text-primary font-medium leading-22">联系我们</View>
+          <View className="text-primary font-medium leading-22" onClick={() => {
+            Taro.navigateTo({
+              url: "/pages/contact-us/index",
+            });
+          }}>联系我们</View>
         </View>
       </View>
     );

+ 7 - 3
src/components/KnowledgeIcon/index.tsx

@@ -5,9 +5,13 @@ import IconFilePDF from "@/components/icon/IconFilePDF";
 import IconFileXLSX from "@/components/icon/IconFileXLSX";
 import { TKnowledgeItem } from "@/types/knowledge";
 export interface Iprops {
-  data: TKnowledgeItem
+  data?: TKnowledgeItem | null
 }
 const KnowledgeIcon = ({data}:Iprops) => {
+  if(!data){
+    return <></>
+  }
+
   // todo: 更多类型
   const renderIcon = ()=> {
     const type = data.type
@@ -24,8 +28,8 @@ const KnowledgeIcon = ({data}:Iprops) => {
       return <IconFileLink/>
     }
 
-    // 默认使用 icon 字段
-    return <Image src={data.icon} mode="widthFix" style={{width: '36px', height: '36px'}}></Image>    
+    // 默认使用 doc 
+    return <IconFileTxt />
 
   }
 

+ 51 - 3
src/components/chat-message/MessageRobot.tsx

@@ -1,16 +1,27 @@
 import { View, Image, Text } from "@tarojs/components";
 import style from './index.module.less'
-import IconCopy from "@/components/icon/icon-copy";
+import IconCopy from "@/components/icon/IconCopy";
+import IconDislike from "@/components/icon/IconDislike";
+import IconDislikeBlue from "@/components/icon/IconDislikeBlue";
+import IconLike from "@/components/icon/IconLike";
+import IconLikeBlue from "@/components/icon/IconLikeBlue";
 import IconSpeaker from "@/components/icon/icon-speaker";
 import { TAgentDetail } from "@/types/agent";
 import Taro from "@tarojs/taro";
 import ThinkAnimation from '../think-animation/index'
+import { dislikeMessage, likeMessage } from "@/service/bot";
+import { TMessage } from "@/types/bot";
+import { getLoginId, isSuccess } from "@/utils";
+import { useState } from "react";
 interface Props {
   agent?: TAgentDetail,
   text: string,
   textReasoning: string,
+  message: TMessage
 }
-export default ({agent, text, textReasoning=''}:Props) => {
+export default ({agent, text, message, textReasoning=''}:Props) => {
+  const [isDislike, setIsDislike] = useState(message.isDislike)
+  const [isLike, setIsLike] = useState(message.isLike)
   const handleCopy = (e: any)=> {
     e.stopPropagation();
     // 手动复制并 toast 提示
@@ -32,6 +43,37 @@ export default ({agent, text, textReasoning=''}:Props) => {
       })
     }
   }
+  const loginId = getLoginId();
+  const handleDislike = async (disLike: boolean) => {
+    if(!agent?.agentId){
+      return;  
+    }
+    const response = await dislikeMessage({
+      agentId: agent?.agentId,
+      dislikeReason: '',
+      isDislike: !disLike,
+      loginId,
+      msgUk: message.msgUk
+    })
+    if(isSuccess(response.status)){
+      setIsDislike(!disLike)
+    }
+  }
+  const handleLike = async (like: boolean) => {
+    if(!agent?.agentId){
+      return;  
+    }
+    const response = await likeMessage({
+      agentId: agent?.agentId,
+      isLike: !like,
+      loginId,
+      msgUk: message.msgUk
+    })
+    if(isSuccess(response.status)){
+      setIsLike(!like)
+    }
+  }
+
   return <View>
       {agent && <View className="flex gap-8 mb-10">
         <View className={style.avatarContainer}>
@@ -59,8 +101,14 @@ export default ({agent, text, textReasoning=''}:Props) => {
           <Text>{text}</Text>
         </View>
         <View className="flex gap-8">
-          <View onClick={handleCopy}><IconCopy></IconCopy></View>
+          <View onClick={handleCopy}><IconCopy /></View>
           {/* <IconSpeaker></IconSpeaker> */}
+          <View onClick={()=> handleDislike(message.isDislike)}>
+            {isDislike ? <IconDislikeBlue/> : <IconDislike/>}
+          </View>
+          <View onClick={()=> handleLike(message.isLike)}>
+            {isLike ? <IconLikeBlue/> : <IconLike/>}
+          </View>
         </View>
     </View>
   </View>

+ 4 - 3
src/components/chat-message/index.tsx

@@ -1,5 +1,5 @@
 
-import { EChatRole, TChatRole } from "@/types/bot";
+import { EChatRole, TChatRole, TMessage } from "@/types/bot";
 import Message from "./Message";
 import MessageRobot from "./MessageRobot";
 import { TAgentDetail } from "@/types/agent";
@@ -8,12 +8,13 @@ interface Props {
   role: TChatRole,
   text: string
   textReasoning?: string
+  message: TMessage
 }
-export default ({agent, text, role, textReasoning=''}:Props) => {
+export default ({agent, text, role, message, textReasoning=''}:Props) => {
   if(role === EChatRole.User ){
     return <Message text={text}/>
   }
-  return <MessageRobot textReasoning={textReasoning} text={text} agent={agent}/>
+  return <MessageRobot message={message} textReasoning={textReasoning} text={text} agent={agent}/>
 }
 
 

+ 1 - 1
src/components/icon/icon-copy/index.tsx → src/components/icon/IconCopy/index.tsx

@@ -1,5 +1,5 @@
 import { Image } from '@tarojs/components'
-import Icon from '@/images/svgs/icon-copy.svg'
+import Icon from '@/images/svgs/IconCopy.svg'
 export default () => {
   return (
     <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>

+ 7 - 0
src/components/icon/IconDislike/index.tsx

@@ -0,0 +1,7 @@
+import { Image } from '@tarojs/components'
+import Icon from '@/images/svgs/IconDislike.svg'
+export default () => {
+  return (
+    <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>
+  )
+}

+ 7 - 0
src/components/icon/IconDislikeBlue/index.tsx

@@ -0,0 +1,7 @@
+import { Image } from '@tarojs/components'
+import Icon from '@/images/svgs/IconDislikeBlue.svg'
+export default () => {
+  return (
+    <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>
+  )
+}

+ 7 - 0
src/components/icon/IconLike/index.tsx

@@ -0,0 +1,7 @@
+import { Image } from '@tarojs/components'
+import Icon from '@/images/svgs/IconLike.svg'
+export default () => {
+  return (
+    <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>
+  )
+}

+ 7 - 0
src/components/icon/IconLikeBlue/index.tsx

@@ -0,0 +1,7 @@
+import { Image } from '@tarojs/components'
+import Icon from '@/images/svgs/IconLikeBlue.svg'
+export default () => {
+  return (
+    <Image src={Icon} mode="widthFix" style={{width: '20px', height: '20px'}}></Image>
+  )
+}

+ 4 - 3
src/components/popup/popup/index.tsx

@@ -6,9 +6,10 @@ interface Props {
   title?: string
   setShow: (show: boolean)=>void
   show: boolean,
+  showCloseButton?: boolean
   children?: JSX.Element|JSX.Element[]
 }
-export default ({title = '', show, setShow, children}:Props)=> {
+export default ({title = '', showCloseButton = true, show, setShow, children}:Props)=> {
   const [slideUp, setSlideUp] = useState(false)
   const handleClose = (b: boolean) => {
     setSlideUp(false)
@@ -33,9 +34,9 @@ export default ({title = '', show, setShow, children}:Props)=> {
       <View className={`${style.container} ${slideUp ? style.show : ''}`}>
         <View className={style.titleBar}>
           <View className={style.title}>{title}</View>
-          <View className={style.closeButton} onClick={()=>handleClose(false)}>
+          {showCloseButton && <View className={style.closeButton} onClick={()=>handleClose(false)}>
             <Image src={closeIcon} mode="widthFix" className={style.closeIcon} />
-          </View>
+          </View>}
         </View>
         <View className={style.content}>
           {children}

+ 0 - 0
src/images/svgs/icon-copy.svg → src/images/svgs/IconCopy.svg


+ 3 - 0
src/images/svgs/IconDislike.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.5 3.7C5.12518 3.7 3.2 5.62518 3.2 8C3.2 10.3748 5.12518 12.3 7.5 12.3H7.6656C8.58217 12.3 9.27938 13.123 9.1287 14.0271L8.79916 16.0044C8.75466 16.2713 9.05856 16.4561 9.27507 16.2937L13.48 13.14C13.6814 12.9889 13.8 12.7518 13.8 12.5V4.66667C13.8 4.13279 13.3672 3.7 12.8333 3.7H7.5ZM2 8C2 4.96243 4.46243 2.5 7.5 2.5H12.8333C14.03 2.5 15 3.47005 15 4.66667V12.5C15 13.1295 14.7036 13.7223 14.2 14.1L9.99508 17.2537C8.91248 18.0656 7.39301 17.1419 7.61548 15.8071L7.94502 13.8299C7.9738 13.6572 7.84065 13.5 7.6656 13.5H7.5C4.46243 13.5 2 11.0376 2 8ZM17.6 3.25C17.6 2.91863 17.3314 2.65 17 2.65C16.6686 2.65 16.4 2.91863 16.4 3.25V12.25C16.4 12.5814 16.6686 12.85 17 12.85C17.3314 12.85 17.6 12.5814 17.6 12.25V3.25Z" fill="black"/>
+</svg>

+ 3 - 0
src/images/svgs/IconDislikeBlue.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.5 3.7C5.12518 3.7 3.2 5.62518 3.2 8C3.2 10.3748 5.12518 12.3 7.5 12.3H7.6656C8.58217 12.3 9.27938 13.123 9.1287 14.0271L8.79916 16.0044C8.75466 16.2713 9.05856 16.4561 9.27507 16.2937L13.48 13.14C13.6814 12.9889 13.8 12.7518 13.8 12.5V4.66667C13.8 4.13279 13.3672 3.7 12.8333 3.7H7.5ZM2 8C2 4.96243 4.46243 2.5 7.5 2.5H12.8333C14.03 2.5 15 3.47005 15 4.66667V12.5C15 13.1295 14.7036 13.7223 14.2 14.1L9.99508 17.2537C8.91248 18.0656 7.39301 17.1419 7.61548 15.8071L7.94502 13.8299C7.9738 13.6572 7.84065 13.5 7.6656 13.5H7.5C4.46243 13.5 2 11.0376 2 8ZM17.6 3.25C17.6 2.91863 17.3314 2.65 17 2.65C16.6686 2.65 16.4 2.91863 16.4 3.25V12.25C16.4 12.5814 16.6686 12.85 17 12.85C17.3314 12.85 17.6 12.5814 17.6 12.25V3.25Z" fill="rgba(49, 124, 250, 1)"/>
+</svg>

+ 3 - 0
src/images/svgs/IconLike.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.5 16.3C14.8748 16.3 16.8 14.3748 16.8 12C16.8 9.62518 14.8748 7.7 12.5 7.7H12.3344C11.4178 7.7 10.7206 6.87698 10.8713 5.97287L11.2008 3.99563C11.2453 3.72866 10.9414 3.54392 10.7249 3.70631L6.52 6.86C6.31855 7.01108 6.2 7.24819 6.2 7.5V15.3333C6.2 15.8672 6.63279 16.3 7.16667 16.3H12.5ZM18 12C18 15.0376 15.5376 17.5 12.5 17.5H7.16667C5.97005 17.5 5 16.53 5 15.3333V7.5C5 6.87049 5.29639 6.27771 5.8 5.9L10.0049 2.74631C11.0875 1.93436 12.607 2.85808 12.3845 4.1929L12.055 6.17015C12.0262 6.34282 12.1594 6.5 12.3344 6.5H12.5C15.5376 6.5 18 8.96243 18 12ZM2.4 16.75C2.4 17.0814 2.66863 17.35 3 17.35C3.33137 17.35 3.6 17.0814 3.6 16.75V7.75C3.6 7.41863 3.33137 7.15 3 7.15C2.66863 7.15 2.4 7.41863 2.4 7.75V16.75Z" fill="black"/>
+</svg>

+ 3 - 0
src/images/svgs/IconLikeBlue.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.5 16.3C14.8748 16.3 16.8 14.3748 16.8 12C16.8 9.62518 14.8748 7.7 12.5 7.7H12.3344C11.4178 7.7 10.7206 6.87698 10.8713 5.97287L11.2008 3.99563C11.2453 3.72866 10.9414 3.54392 10.7249 3.70631L6.52 6.86C6.31855 7.01108 6.2 7.24819 6.2 7.5V15.3333C6.2 15.8672 6.63279 16.3 7.16667 16.3H12.5ZM18 12C18 15.0376 15.5376 17.5 12.5 17.5H7.16667C5.97005 17.5 5 16.53 5 15.3333V7.5C5 6.87049 5.29639 6.27771 5.8 5.9L10.0049 2.74631C11.0875 1.93436 12.607 2.85808 12.3845 4.1929L12.055 6.17015C12.0262 6.34282 12.1594 6.5 12.3344 6.5H12.5C15.5376 6.5 18 8.96243 18 12ZM2.4 16.75C2.4 17.0814 2.66863 17.35 3 17.35C3.33137 17.35 3.6 17.0814 3.6 16.75V7.75C3.6 7.41863 3.33137 7.15 3 7.15C2.66863 7.15 2.4 7.41863 2.4 7.75V16.75Z" fill="rgba(49, 124, 250, 1)"/>
+</svg>

+ 8 - 3
src/pages/agent-avatars/index.tsx

@@ -4,17 +4,19 @@ import { Image, View, ScrollView } from "@tarojs/components";
 import PageCustom from "@/components/page-custom/index";
 import NavBarNormal from "@/components/nav-bar-normal/index";
 
-import { uploadAndGenNewAvatar } from "@/utils/avatar";
+import { uploadAndNavToGenNewAvatar } from "@/utils/avatar";
 import { useAvatars } from "./useAvatars";
 import IconPlusBig from "@/components/icon/icon-plus-big";
 
 import { editAgentAvatar } from "@/service/agent";
+import { deleteAvatar } from "@/service/storage";
 
 import style from "./index.module.less";
 import { TAvatarItem } from "@/service/storage";
 import { useAgentStore } from "@/store/agentStore";
 import useSWRMutation from "swr/mutation";
 import Taro from "@tarojs/taro";
+import { isSuccess } from "@/utils";
 
 export default function Index() {
   const { agent, fetchAgent } = useAgentStore();
@@ -55,7 +57,7 @@ export default function Index() {
     // }
 
     Taro.showLoading();
-    await editAvatar({
+    const result = await editAvatar({
       agentId: agent.agentId,
       avatarId: item.avatarId,
       enabledChatBg: false,
@@ -63,12 +65,15 @@ export default function Index() {
     await fetchAgent(agent.agentId)
     Taro.hideLoading();
     setCurrent(item);
+    if(isSuccess(result.status)){
+      Taro.navigateBack();
+    }
   };
   const onScrollToLower = () => {
     loadAvatars();
   };
   const handleCreate = () => {
-    uploadAndGenNewAvatar();
+    uploadAndNavToGenNewAvatar();
   };
 
   useEffect(() => {

+ 10 - 9
src/pages/agent-gen/components/step/StepConfirm.tsx

@@ -12,21 +12,20 @@ interface IProps {
 }
 export default React.memo(function Index({prev, pickedAvatar}:IProps) {
   const {agent, fetchAgent} = useAgentStore()
-  const [enabledChatBg, setEnabledChatBg] = useState(false)
+  const [enabledChatBg, setEnabledChatBg] = useState(true)
 
   const handleConfirm = async () => {
     if(!agent?.agentId){
       return
     }
-    Taro.showLoading();
     await editAgentAvatar(
       agent.agentId,
       pickedAvatar.avatarId,
       enabledChatBg,
     );
     await fetchAgent(agent.agentId)
-    Taro.hideLoading();
-    Taro.navigateTo({url: '/pages/agent/index'})
+    
+    Taro.redirectTo({url: '/pages/agent/index'})
   }
   return (
     <View>
@@ -39,11 +38,13 @@ export default React.memo(function Index({prev, pickedAvatar}:IProps) {
           ></Image>
         </View>
         <View className={style.confirmChatAvatarBg}>
-          <Image
-            mode="widthFix"
-            className="w-full"
-            src={pickedAvatar.avatarUrl}
-          ></Image>
+          <View className={style.confirmChatAvatarImage}>
+            <Image
+              mode="widthFix"
+              className="w-full"
+              src={pickedAvatar.avatarUrl}
+            ></Image>
+          </View>
           <View className={style.confirmChatAvatarBgCover}>
               <View className={style.block1}></View>
               <View className={style.block2}></View>

+ 3 - 1
src/pages/agent-gen/components/step/StepPick.tsx

@@ -4,6 +4,7 @@ import style from "./index.module.less";
 import IconStarColor from "@/components/icon/icon-star-color";
 import { getUploadedAvatarStatus, TAvatarItem } from '@/service/storage'
 import useSWR from 'swr';
+import Taro from "@tarojs/taro";
 interface IProps {
   prev: () => void;
   next: () => void;
@@ -23,9 +24,10 @@ export default React.memo(function Index({ prev, next, taskId, setPickedAvatar }
     next()
   }
   
+  Taro.hideLoading()
 
   const { data } = useSWR(
-    shouldPoll ? 'getUploadedAvatarStatus' : null,
+    shouldPoll ? `getUploadedAvatarStatus${taskId}` : null,
     ()=> getUploadedAvatarStatus(taskId),
     {
       revalidateOnFocus: false,

+ 21 - 14
src/pages/agent-gen/components/step/StepStart.tsx

@@ -7,6 +7,7 @@ import WemetaTextarea from "@/components/wemeta-textarea/index";
 import Taro, { useRouter } from "@tarojs/taro";
 import { uploadAvatar } from '@/service/storage'
 import { isSuccess } from "@/utils";
+import { getNewAvatarPic } from "@/utils/avatar";
 interface IProps {
   next: () =>void
   setTaskId: (value:any)=> void 
@@ -17,27 +18,33 @@ export default React.memo(function StepStart({ next, setTaskId }: IProps) {
   const router = useRouter();
   const { avatarUrl } = router.params
   const uploadedAvatarUrl = decodeURIComponent(avatarUrl ?? '')
-  const [value, setValue] = useState("职场精英,频频点头微笑,且桀骜不驯");
-  
-  console.log('StepStart render', { value });
+  const [currentAvatarUrl, setCurrentAvatarUrl] = useState(uploadedAvatarUrl)
+  const [value, setValue] = useState('');
 
-  useEffect(() => {
-    console.log('StepStart mounted/updated');
-  });
+  const handleChange = () => {
+    getNewAvatarPic((picUrl)=> {
+      setCurrentAvatarUrl(picUrl)
+    })
+  }
 
-  const handleInput = useCallback((value: string) => {
+  const handleInput = (value: string) => {
     setValue(value);
-  }, []);
+  }
 
-  const handleClick = useCallback(async () => {
-    if(!uploadedAvatarUrl){
+  const handleClick = async () => {
+    if(!currentAvatarUrl){
       return
     }
     
     Taro.showLoading();
+    console.log({
+      aiGenerated: true,
+      avatarUrl: currentAvatarUrl,
+      description: value,
+    })
     const response = await uploadAvatar({
       aiGenerated: true,
-      avatarUrl: uploadedAvatarUrl,
+      avatarUrl: currentAvatarUrl,
       description: value,
     })
     Taro.hideLoading();
@@ -45,16 +52,16 @@ export default React.memo(function StepStart({ next, setTaskId }: IProps) {
       setTaskId(response.data.taskId)
       next();
     }
-  }, [next]);
+  };
 
   return (
     <View>
       <View className={style.startContainer}>
         <View className={style.startCard}>
-          <View className={style.startIconChange}>
+          <View className={style.startIconChange} onClick={handleChange}>
             <IconChange />
           </View>
-          <Image className={style.startCard} src={uploadedAvatarUrl} mode="widthFix"></Image>
+          <Image className={style.startCard} src={currentAvatarUrl} mode="widthFix"></Image>
         </View>
       </View>
       <View className="mb-24">

+ 7 - 1
src/pages/agent-gen/components/step/index.module.less

@@ -145,6 +145,12 @@
   min-height: 373px;
   margin-bottom: 16px;
   border-radius: 24px;
+  overflow: hidden;
+}
+.confirmChatAvatarImage{
+  width: 240px;
+  min-height: 373px;
+  overflow: hidden;
 }
 .confirmChatAvatarBgCover{
   position: absolute;
@@ -153,7 +159,7 @@
   justify-content: flex-end;
   position: absolute;
   left: 0;
-  top: 0;
+  bottom: 0;
   right: 0;
   z-index: 1;
   width: 240px;

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

@@ -2,7 +2,7 @@ import { Image, View } from "@tarojs/components";
 import style from "./index.module.less";
 import IconPlusBig from "@/components/icon/icon-plus-big";
 import Taro from "@tarojs/taro";
-import { uploadAndGenNewAvatar } from "@/utils/avatar";
+import { uploadAndNavToGenNewAvatar } from "@/utils/avatar";
 import { useAgentStore } from "@/store/agentStore";
 
 export default () => {
@@ -12,7 +12,7 @@ export default () => {
     if (agent?.avatarUrl) {
       return;
     }
-    uploadAndGenNewAvatar()
+    uploadAndNavToGenNewAvatar()
     
   };
 

+ 13 - 0
src/pages/chat/index.module.less

@@ -16,4 +16,17 @@
   .deepMindMark();
   background: rgba(#CBF706, .2);
   color: #547500;
+}
+
+.topBg{
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  z-index: 1;
+  height: 652px;
+  width: 100%;
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-size: 100%;
 }

+ 88 - 72
src/pages/chat/index.tsx

@@ -17,9 +17,8 @@ import PersonalCard from "./components/personal-card";
 import { useAgentStore } from "@/store/agentStore";
 
 import { useLoadMore } from "@/utils/loadMore";
-import {
-  getMessageHistories,
-} from "@/service/bot";
+import { getMessageHistories } from "@/service/bot";
+import { useAppStore } from "@/store/appStore";
 
 // 类型谓词函数
 function isRobotMessage(
@@ -29,103 +28,99 @@ function isRobotMessage(
 }
 
 export default function Index() {
-  const router = useRouter()
-  const {agentId} = router.params
-  
-  if(!agentId){
-    return <View>没有相应的智能体</View>
-  }
-  const {fetchAgent} = useAgentStore()
-  const agent = useAgentStore((state) =>  state.agent)
+  const router = useRouter();
+  const { agentId } = router.params;
 
+  if (!agentId) {
+    return <View>没有相应的智能体</View>;
+  }
+  const headerHeight = useAppStore((state) => state.headerHeight);
+  const { fetchAgent } = useAgentStore();
+  const agent = useAgentStore((state) => state.agent);
 
   const [deepThink, setDeepThink] = useState(EAI_MODEL.DeepseekChat);
 
-  const [histories, setHistories] = useState<(TMessage|TRobotMessage)[]>([]);
-  
+  const [histories, setHistories] = useState<(TMessage | TRobotMessage)[]>([]);
+
   const [keyboardHeight, setKeyboardHeight] = useState(0);
   const [contentHeight, setContentHeight] = useState(0);
   const [scrollViewHeight, setScrollViewHeight] = useState(0);
 
   const scrollViewRef = useRef<any>(null);
-  // const headerHeight = useAppStore((state) => state.headerHeight);
-  
+
   const messageList = useTextChat((state) => state.list);
-  const { destroy, setScrollTop  } = useTextChat();
+  const { destroy, setScrollTop, genSessionId } = useTextChat();
   const scrollTop = useTextChat((state) => state.scrollTop);
 
   const fetcher = async ([_url, nextId, page, pageSize]) => {
-    if(!agent){
-      return null
+    if (!agent) {
+      return null;
     }
-    const _nextId = nextId ? decodeURIComponent(nextId) : nextId
+    const _nextId = nextId ? decodeURIComponent(nextId) : nextId;
     const res = await getMessageHistories({
       agentId,
-      startId:  _nextId,
+      startId: _nextId,
       pageSize,
     });
     return res.data;
   };
   const { data, loadMore, page } = useLoadMore<{
-    data?: (TMessage|TRobotMessage)[]
-    nextId?: string,
-    totalCount?: number
+    data?: (TMessage | TRobotMessage)[];
+    nextId?: string;
+    totalCount?: number;
   }>({
-    url: '/blue-aiagent/api/v1/my/messeagehistories',
+    url: "/blue-aiagent/api/v1/my/messeagehistories",
     fetcher,
   });
-  
+
   const [showWelcome, setShowWelcome] = useState(!histories.length);
-  
-  
+
   //  加载更多
   const onScrollToUpper = () => {
-    console.log('onscroll')
-    loadMore()
+    console.log("onscroll");
+    loadMore();
   };
 
-  
-  useEffect(()=> {
-    agentId && fetchAgent(agentId)
-  }, [agentId])
+  useEffect(() => {
+    agentId && fetchAgent(agentId);
+  }, [agentId]);
 
-  useEffect(()=> {
-    setShowWelcome(!histories.length)
-  }, [histories])
+  useEffect(() => {
+    setShowWelcome(!histories.length);
+  }, [histories]);
 
   useEffect(() => {
     if (data?.data) {
       setHistories([...data.data.reverse(), ...histories]);
-      if(page === 1){
-        setTimeout(()=> {
-          setScrollTop()
-        }, 300)
+      if (page === 1) {
+        setTimeout(() => {
+          setScrollTop();
+        }, 300);
       }
     }
   }, [data, page]);
-  
-  
+
   // 计算 marginTopOffset 偏移的距离
   const marginTopOffset = (() => {
     if (keyboardHeight <= 0) return 0;
     // 如果内容超过滚动容器,取键盘弹起高度
-    if(contentHeight > scrollViewHeight){
-      return  -(keyboardHeight)
+    if (contentHeight > scrollViewHeight) {
+      return -keyboardHeight;
     }
     // 如果内容+键盘弹起高度超过滚动容器, 则取其差值
-    if( contentHeight + keyboardHeight > scrollViewHeight){ 
+    if (contentHeight + keyboardHeight > scrollViewHeight) {
       // 内容+键盘弹起高度 - 滚动容器高度
-      return -(contentHeight + keyboardHeight - scrollViewHeight)  
+      return -(contentHeight + keyboardHeight - scrollViewHeight);
     }
   })();
-  
+
   useEffect(() => {
     // 监听键盘高度变化
     Taro.onKeyboardHeightChange((res) => {
-      if(res.height <= 0){
+      if (res.height <= 0) {
         return setKeyboardHeight(0);
       }
-      
+
       setKeyboardHeight(res.height - 24);
     });
 
@@ -140,22 +135,29 @@ export default function Index() {
     if (scrollViewRef.current) {
       const query = Taro.createSelectorQuery();
       // 获取聊天内容高度
-      query.select('#message-list').boundingClientRect((rect: any) => {
-        if (rect) {
-          setContentHeight(rect.height);
-        }
-      }).exec();
+      query
+        .select("#message-list")
+        .boundingClientRect((rect: any) => {
+          if (rect) {
+            setContentHeight(rect.height);
+          }
+        })
+        .exec();
       // 获取滚动容器高度
-      query.select('#scroll-view').boundingClientRect((rect: any) => {
-        if (rect) {
-          setScrollViewHeight(rect.height);
-        }
-      }).exec();
+      query
+        .select("#scroll-view")
+        .boundingClientRect((rect: any) => {
+          if (rect) {
+            setScrollViewHeight(rect.height);
+          }
+        })
+        .exec();
     }
   }, [messageList]);
 
-  
-  
+  useEffect(() => {
+    genSessionId();
+  }, []);
 
   useUnload(() => {
     destroy();
@@ -171,7 +173,10 @@ export default function Index() {
 
   const renderNavLeft = () => {
     return (
-      <View className="flex items-center gap-8" onClick={()=>Taro.navigateBack()}>
+      <View
+        className="flex items-center gap-8"
+        onClick={() => Taro.navigateBack()}
+      >
         <IconArrowLeft />
         <View className={showWelcome ? "hidden" : "block"}>
           <PersonalCard size="mini" />
@@ -180,10 +185,19 @@ export default function Index() {
     );
   };
 
+  // 自定义背景样式
+  const bgImageStyle = {
+    backgroundImage: `url(${agent?.avatarUrl})`,
+  };
+
   return (
-    <PageCustom>
-      <NavBarNormal scrollFadeIn leftColumn={renderNavLeft}></NavBarNormal>
-      <View className="flex flex-col w-full h-screen" style={{marginTop: `${marginTopOffset}px`}}>
+    <PageCustom fullPage style={{ overflow: "hidden" }}>
+      <NavBarNormal leftColumn={renderNavLeft}></NavBarNormal>
+      {(!!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` }}
+      >
         <ScrollView
           ref={scrollViewRef}
           scrollY
@@ -198,7 +212,6 @@ export default function Index() {
         >
           {showWelcome && <ChatWelcome />}
           <View id="messageList" className="flex flex-col gap-8 px-18 pb-140">
-            
             {[...histories, ...messageList].map((message) => {
               const robotMessage = isRobotMessage(message) ? message : null;
               return (
@@ -208,6 +221,7 @@ export default function Index() {
                   agent={agent}
                   role={message.role}
                   text={message.content}
+                  message={message}
                 ></ChatMessage>
               );
             })}
@@ -230,12 +244,14 @@ export default function Index() {
           >
             深度思考(R1)
           </View>
-          {agent && <InputBar
-            aiModel={deepThink}
-            agent={agent}
-            histories={histories}
-            setShowWelcome={setShowWelcome}
-          ></InputBar>}
+          {agent && (
+            <InputBar
+              aiModel={deepThink}
+              agent={agent}
+              histories={histories}
+              setShowWelcome={setShowWelcome}
+            ></InputBar>
+          )}
         </View>
       </View>
     </PageCustom>

+ 99 - 0
src/pages/knowledge-item/components/ShareToEntPopup/index.tsx

@@ -0,0 +1,99 @@
+/**
+ * 知识库
+ */
+
+import { Text, View, Image, ScrollView } from "@tarojs/components";
+
+
+import WemetaSwitch from "@/components/wemeta-switch";
+
+import Popup from "@/components/popup/popup";
+import { useEffect, useState } from "react";
+import Taro, { useRouter, useDidShow } from "@tarojs/taro";
+import {
+  shareToEnt,
+} from "@/service/knowledge";
+import { useUserStore } from "@/store/userStore";
+import { TEntItem } from "@/types/user";
+import { isSuccess } from "@/utils";
+
+
+interface IProps {
+  knowledgeId: string|number
+  showPopup: boolean
+  setShowPopup: (show: boolean)=> void,
+}
+
+export default function Index({knowledgeId, showPopup, setShowPopup }:IProps) {
+
+  const {entList, fetchMyEntList} = useUserStore()
+  const [shareEntList, setShareEntList] = useState(entList ?? []);
+  
+  
+  const handleSwitchChange = async (ent: TEntItem, checked: boolean)=> {
+    if(!knowledgeId){
+      return false;
+    }
+    const response = await shareToEnt({
+      knowledgeIds: [knowledgeId],
+      toEntId: ent.entId,
+    })
+    if(isSuccess(response.status)){
+      Taro.showToast({title: checked ? '分享成功' : '取消分享成功'})
+      setShareEntList((prev) => {
+        if(checked){
+          return [...prev, ent]
+        }
+        return  prev.filter( item => item.entId !== ent.entId)
+      })
+    }
+  }
+
+  useDidShow(() => {
+    fetchMyEntList()
+  });
+
+  const renderContent = ()=> {
+    if(!entList.length){
+      return <View className="rounded-8 bg-gray-3 py-20 text-center">
+        <View className="leading-24 text-gray-45 font-medium text-14 mb-4">
+          暂未加入任何企业
+        </View>
+        
+        <View
+          className="text-primary"
+          onClick={() => {
+            Taro.navigateTo({
+              url: "/pages/contact-us/index",
+            });
+          }}
+        >
+          联系我们
+        </View>
+      </View>
+    }
+
+    return <View className="flex flex-col gap-12 pb-24" style={{maxHeight: '60vh', overflow: 'auto'}}>
+      {entList.map(ent=> {
+        return <View className="flex items-center rounded-8 bg-gray-3 px-16 py-24">
+            <View className="flex-1 text-black font-medium text-14 leading-22">{ent.entName}</View>
+            <WemetaSwitch
+              checked={!!shareEntList.find((item)=> item.entId === ent.entId)}
+              onChange={(checked) => handleSwitchChange(ent, checked)}
+            ></WemetaSwitch>
+        </View>
+      })}
+    </View>
+
+  }
+  
+
+  return (
+    <Popup setShow={setShowPopup} show={showPopup} title="共享至">
+      <View className="text-gray-45 leading-20 mb-16 text-12">开启后,该组织下的所有成员都可引用,可随时取消共享。</View>
+      
+      {renderContent()}
+      
+    </Popup>
+  );
+}

+ 12 - 38
src/pages/knowledge-item/index.tsx

@@ -2,7 +2,7 @@
  * 知识库
  */
 
-import { Text, View, Image, ScrollView } from "@tarojs/components";
+import { Text, View, Image } from "@tarojs/components";
 
 import PageCustom from "@/components/page-custom/index";
 import NavBarNormal from "@/components/nav-bar-normal/index";
@@ -12,6 +12,8 @@ import IconEye from "@/components/icon/IconEye";
 import IconA from "@/components/icon/IconA";
 import IconQ from "@/components/icon/IconQ";
 import WemetaSwitch from "@/components/wemeta-switch";
+import KnowledgeIcon from "@/components/KnowledgeIcon";
+import ShareToEntPopup from "./components/ShareToEntPopup";
 import { useEffect, useState } from "react";
 import CardEditable from "@/components/card/card-editable/index";
 import Taro, { useRouter, useDidShow } from "@tarojs/taro";
@@ -21,7 +23,6 @@ import {
   deleteKnowledgeQa,
   updateExactAnswer,
   deleteKnowledge,
-  shareToEnt,
 } from "@/service/knowledge";
 import { TKnowledgeDetail,TQAListItem } from "@/types/knowledge";
 import { isSuccess } from "@/utils";
@@ -36,7 +37,7 @@ export default function Index() {
 
   const isEnt = (entId !== undefined)
   const { showModal } = useModalStore();
-
+  const [showPopup, setShowPopup] = useState(false);
   
 
   const handleEdit = (qaId: number | string) => {
@@ -44,16 +45,11 @@ export default function Index() {
       url: `/pages/knowledge-item-editor/index?knowledgeId=${knowledgeId}&qaId=${qaId}&knowledgeTitle=${detail?.title}`,
     });
   };
-
-  const shareKnowledgeToEnt = async (entId: string|number) => {
-    await shareToEnt({
-      knowledgeIds: [knowledgeId],
-      toEntId: entId,
-    })
-  }
+  
   const handleShare = async () => {
-    
+    setShowPopup(true)
   };
+  
   // 删除问答项
   const handleDeleteItem = async (qaId: number | string) => {
     if (!detail) {
@@ -109,8 +105,6 @@ export default function Index() {
     });
   };
 
-
-
   useDidShow(() => {
     knowledgeId && getDetail(parseInt(knowledgeId));
   });
@@ -135,17 +129,7 @@ export default function Index() {
           <View className="mb-16">
             <FigureListItem
               figure={() => {
-                return (
-                  <>
-                    {detail?.icon && (
-                      <Image
-                        src={detail?.icon}
-                        mode="widthFix"
-                        style={{ width: "36px", height: "36px" }}
-                      ></Image>
-                    )}
-                  </>
-                );
+                return <KnowledgeIcon data={detail}/>
               }}
               rightRenderer={() => (
                 !isEnt ? <View>
@@ -243,20 +227,6 @@ export default function Index() {
               );
             })}
           </View>
-          {/* <View className="flex flex-col gap-16 px-16">
-            <CardEditable buttons={[<View>删除</View>, <View onClick={handleEdit}>编辑</View>]}>
-              <View className="flex items-start mb-8 gap-8">
-                <View className="flex-center h-28"><IconQ/></View>
-                <View className="flex-1 font-medium text-14 leading-28">你们医院可以做哪些近视手术?</View>
-              </View>
-
-              <View className="flex items-start gap-8">
-                <View className="flex-center  h-28"><IconA/></View>
-                <View className="flex-1 text-12 leading-20 text-gray-45">我们医院目前开展的近视手术包括:全飞秒SMILE、半飞秒LASIK、ICL人工晶体植入术等。医生会根据您的角膜厚度、度数、眼部条件推荐最适合您的手术方式。</View>
-              </View>
-
-            </CardEditable>
-          </View> */}
         </View>
         {!isEnt && <BottomBar>
           <View
@@ -269,6 +239,10 @@ export default function Index() {
             共享到企业知识
           </View>
         </BottomBar>}
+        
+
+        {(knowledgeId!== undefined) && <ShareToEntPopup knowledgeId={knowledgeId} setShowPopup={setShowPopup} showPopup={showPopup}/>}
+        
       </View>
     </PageCustom>
   );

+ 4 - 4
src/pages/knowledge/components/view-style/ViewStyleChat.tsx

@@ -37,9 +37,9 @@ const ViewStyleChat = () => {
     })
   }
 
-  useEffect(() => {
-    loadMore()
-  }, []);
+  useDidShow(()=> {
+    loadMore(true)
+  })
 
   return (
     <ScrollView
@@ -72,7 +72,7 @@ const ViewStyleChat = () => {
                   name: whoami?.nickName ?? ''
                 }}>
                   <View className="flex items-center gap-12">
-                    <View className="w-36 h-36 overflow-hidden"><Image src={item.icon} mode="widthFix" style={{width: '36px', height: '36px'}}></Image></View>
+                    <View className="w-36 h-36 overflow-hidden"><KnowledgeIcon data={item} /></View>
                     <View className="flex flex-col flex-1 gap-2">
                       <View className="text-14 leading-22">{item.title}</View>
                       <View className="text-12 leading-20 text-gray-45">

+ 4 - 0
src/pages/knowledge/components/view-style/ViewStyleList.tsx

@@ -26,6 +26,10 @@ const Index = ({types}: IProps) => {
     loadMoreList()
   }
 
+  useDidShow(()=> {
+    loadMoreList(true)
+  })
+
   useEffect(()=> {
     if(types){
       setListTypes(types)

+ 3 - 1
src/pages/knowledge/components/view-style/ViewStyleListEnt.tsx

@@ -21,7 +21,9 @@ const Index = ({entId}:Iprops) => {
     console.log('toUpper')
     loadMoreList()
   }
-
+  useDidShow(()=> {
+    loadMoreList(true)
+  })
   useEffect(()=> {
     initLoadList()
   }, [])

+ 11 - 6
src/pages/login/index.tsx

@@ -3,7 +3,7 @@ import { View,Text, Image, Checkbox, Button } from "@tarojs/components";
 import PageCustom from "@/components/page-custom/index";
 import LogoImage from '@/images/logo.png'
 import { useLogin } from '@/xiaolanbenlib/hooks/data/useAuth'
-
+import WemetaRadio from "@/components/wemeta-radio";
 
 import { useState } from "react";
 
@@ -24,6 +24,11 @@ export default function Index() {
 
 
   const [showPopup, setShowPopup] = useState(true);
+  const [checked, setChecked] = useState(false);
+
+  const handleChecked = () => {
+    setChecked(prev => !prev)
+  }
 
   const renderLogo = ()=> {
     return <View><Image className="w-68 h-24" src={LogoImage}></Image></View>
@@ -35,11 +40,11 @@ export default function Index() {
       <NavBarNormal leftColumn={renderLogo}></NavBarNormal>
       
         
-        <Popup setShow={setShowPopup} show={showPopup}>
+        <Popup setShow={setShowPopup} show={showPopup} showCloseButton={false}>
           <View className="text-24 font-medium leading-32 text-black mb-16">欢迎来到小蓝本</View>
           <View className="text-gray-45 text-14 leading-22 mb-70">登录后享受更好的服务体验</View>
-          {/* <View className="button-rounded-big mb-16">微信登录</View> */}
           <Button
+            disabled={!checked}
             className="button-rounded-big mb-16"
             style={{backgroundColor: '#317CFA', fontSize: '14px'}}
             type='primary'
@@ -52,9 +57,9 @@ export default function Index() {
           >
             手机号快捷登录
           </Button>
-          <View className="text-12 mb-86 text-center">
-            <Checkbox className="custom-checkbox" value='选中' checked color="#317CFA">选中</Checkbox>
-            同意<Text className="primary-color">《用户隐私条款》</Text><Text className="primary-color">《用户服务须知》</Text>
+          <View className="flex items-center justify-center text-12 mb-86 text-center">
+            <View className="flex-center text-gray-45 gap-8" onClick={handleChecked}><WemetaRadio checkbox checked={checked}></WemetaRadio>同意</View>
+            <Text className="primary-color">《用户隐私条款》</Text><Text className="primary-color">《用户服务须知》</Text>
           </View>
         </Popup>
     </PageCustom>

+ 3 - 23
src/pages/voice/components/MyVoiceList/components/popup-recorder/index.module.less

@@ -63,29 +63,9 @@
 }
 .actionButtonActived{
   .actionButton();
-  background: var(--color-primary);
+  background: url(https://cdn.wehome.cn/cmn/gif/115/META-H8UKYHWU-E9EPKMQUBSVOJ4T4NHO63-Y5XUW92M-CI.gif) center center no-repeat;
+  background-size: 124px 27px;
+  background-color: #000;
   box-shadow: none;
 }
 
-.speechButton{
-  display: flex;
-  position: absolute;
-  left: 0;
-  top: 0;
-  right: 0;
-  width: 100%;
-  height: 100%;
-  justify-content: center;
-  align-items: center;
-  background-color: var(--color-bg-primary);
-  border-radius: 50px;
-  overflow: hidden;
-}
-.speechButtonActive{
-  .speechButton();
-  background-color: #000;
-}
-.speech{
-  width: 124px;
-  height: 27px;
-}

+ 3 - 16
src/pages/voice/components/MyVoiceList/components/popup-recorder/index.tsx

@@ -179,20 +179,7 @@ export default ({
     setRecording(false);
   };
 
-  // todo: 只能改样式,不能改 dom 否则某些手机 onTouchEnd 可能不触发
-  const renderButton = (recording: boolean) => {
-    if (recording) {
-      return (
-        <View className={popupStyle.speechButtonActive} onTouchEnd={onTouchEnd}>
-          <Image
-            src="https://cdn.wehome.cn/cmn/gif/115/META-H8UKYHWU-E9EPKMQUBSVOJ4T4NHO63-Y5XUW92M-CI.gif"
-            className={popupStyle.speech}
-          ></Image>
-        </View>
-      );
-    }
-    return <View>按住录制</View>;
-  };
+  
   useEffect(() => {
     if (!show) {
       return recorderManager.stop();
@@ -220,12 +207,12 @@ export default ({
             松手发送,上移取消
           </View>
           <View
-            className={popupStyle.actionButton}
+            className={recording ? popupStyle.actionButtonActived : popupStyle.actionButton}
             onLongPress={onLongPress}
             onTouchEnd={onTouchEnd}
             onTouchMove={onTouchMove}
           >
-            {renderButton(recording)}
+            <View className={`${recording ? 'hidden':''}`}>按住录制</View>
           </View>
         </View>
       </View>

+ 9 - 8
src/service/bot.ts

@@ -32,10 +32,11 @@ export const appendMessages = (data: TAppendMessages) => {
 
 // 消息差评或取消差评
 type TDislikeMessage = {
-  "agentId": string,
-  "dislikeReason": string,
-  "isDislike": boolean,
-  "msgUk": string
+  agentId: string,
+  dislikeReason: string,
+  isDislike: boolean,
+  msgUk: string
+  loginId: string
 }
 export const dislikeMessage = (data: TDislikeMessage) => {
   return request.put(`${bluebookAiAgent}api/v1/chat/messages/dislike`, data)
@@ -43,10 +44,10 @@ export const dislikeMessage = (data: TDislikeMessage) => {
 
 // 消息点赞或取消点赞
 type TLikeMessage = {
-  "agentId": string,
-  "dislikeReason": string,
-  "isDislike": boolean,
-  "msgUk": string
+  agentId: string,
+  isLike: boolean,
+  msgUk: string
+  loginId: string
 }
 export const likeMessage = (data: TLikeMessage) => {
   return request.put(`${bluebookAiAgent}api/v1/chat/messages/like`, data)

+ 1 - 1
src/service/knowledge.ts

@@ -63,7 +63,7 @@ export const getKnowledgeList = ({startId, pageSize = 1, types = []}: {
 // 共享我的知识库至企业
 export const shareToEnt = (data: 
   {
-    "knowledgeIds": number|string[],
+    "knowledgeIds": (number|string)[],
     "toEntId": string|number
   }
 ) => {

+ 8 - 4
src/store/textChat.ts

@@ -41,6 +41,7 @@ export interface TextChat {
   list: (TMessage | TRobotMessage)[];
   sessionId: string|null
   // 显示聊天历史
+  genSessionId: () => void // 进入聊天界面后,本次的 sessionId
   setScrollTop: () => void
   // 将机器人气泡框推入聊天框
   pushRobotMessage: (message: TRobotMessageWithOptionalId) => string;
@@ -68,6 +69,12 @@ export const useTextChat = create<TextChat>((set, get) => ({
   scrollTop: 9999,
   list: [],
   sessionId: null,
+  genSessionId: ()=> {
+    const sessionId = generateUUID();
+    set({
+      sessionId
+    })
+  },
   destroy: () => {
     set({
       list: [],
@@ -103,12 +110,9 @@ export const useTextChat = create<TextChat>((set, get) => ({
   },
   pushMessage: (content: string) => {
     const msgUk = generateUk();
-    const sessionId = generateUUID();
     const newMessage:TMessage ={ msgUk, content: content, role: EChatRole.User, saveStatus: 0 }
-    
     set((state) => {
       return {
-        sessionId,
         list: [...state.list,  newMessage],
         scrollTop: state.scrollTop + 1,
       };
@@ -121,7 +125,7 @@ export const useTextChat = create<TextChat>((set, get) => ({
       });
     }, 100)
     
-    return {msgUk, sessionId}
+    return {msgUk, sessionId: get().sessionId}
   },
   updateMessage: (content, msgUk) => {
     set((state) => {

+ 1 - 1
src/store/voiceStore.ts

@@ -70,7 +70,7 @@ export const useVoiceStore = create<StorageStoreState>((set, get) => ({
     // 更新状态
     set({
       voices: response.data.data,
-      myVoices: response.data.data.filter(item => !item.isSystem),
+      myVoices: response.data.data.filter(item => !item.isSystem).reverse(),
       pagination: {
         ...requestParams,
         totalCount: response.data.totalCount,

+ 12 - 5
src/utils/avatar.ts

@@ -4,8 +4,8 @@ import { EUploadFileScene } from "@/consts/enum";
 
 
 const MAX_IMAGE_SIZE = 10;
-// 上传新形象,成功后跳转至 ai 生成页
-export const uploadAndGenNewAvatar = () => {
+
+export const getNewAvatarPic = (cb: (result: string)=> void)=> {
   Taro.chooseMedia({
     count: 1,
     mediaType: ["image"],
@@ -30,12 +30,19 @@ export const uploadAndGenNewAvatar = () => {
           const response = await uploadImage(path, EUploadFileScene.AVATAR);
           Taro.hideLoading();
           if (response?.publicUrl) {
-            Taro.navigateTo({
-              url: `/pages/agent-gen/index?avatarUrl=${response?.publicUrl}`,
-            });
+            cb(response?.publicUrl)
           }
         },
       });
     },
   });
+}
+
+// 上传新形象,成功后跳转至 ai 生成页
+export const uploadAndNavToGenNewAvatar = () => {
+  getNewAvatarPic((picUrl)=> {
+    Taro.navigateTo({
+      url: `/pages/agent-gen/index?avatarUrl=${picUrl}`,
+    });
+  })
 };