MessageUser.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { locationContext } from "@/contexts/locationContext";
  2. import { ChatMessageType } from "@/types/chat";
  3. import { MagnifyingGlassIcon, Pencil2Icon, ReloadIcon } from "@radix-ui/react-icons";
  4. import { useContext } from "react";
  5. import { useMessageStore } from "./messageStore";
  6. export default function MessageUser({ useName, data }: { data: ChatMessageType }) {
  7. const msg = data.message[data.chatKey]
  8. const { appConfig } = useContext(locationContext)
  9. const running = useMessageStore(state => state.running)
  10. const handleSearch = () => {
  11. window.open(appConfig.dialogQuickSearch + encodeURIComponent(msg))
  12. }
  13. const handleResend = (send) => {
  14. const myEvent = new CustomEvent('userResendMsgEvent', {
  15. detail: {
  16. send,
  17. message: msg
  18. }
  19. });
  20. document.dispatchEvent(myEvent);
  21. }
  22. return <div className="flex justify-end w-full py-1">
  23. <div className="w-fit min-h-8 max-w-[90%]">
  24. {useName && <p className="text-gray-600 text-xs mb-2 text-right">{useName}</p>}
  25. <div className="mr-[14px] rounded-2xl px-6 py-4 bg-[#EEF2FF] dark:bg-[#333A48]">
  26. <div className="flex gap-2 ">
  27. <div className="text-[#0D1638] dark:text-[#CFD5E8] text-sm break-all whitespace-break-spaces">{msg}</div>
  28. <div className="w-6 h-6 min-w-6"><img src="/user.png" alt="" /></div>
  29. </div>
  30. </div>
  31. {/* 附加信息 */}
  32. {
  33. // 数组类型的 data通常是文件上传消息,不展示附加按钮
  34. !Array.isArray(data.message.data) && <div className="flex justify-between mt-2 mr-[14px]">
  35. <span></span>
  36. <div className="flex gap-2 text-gray-400 cursor-pointer self-end">
  37. {!running && <Pencil2Icon className="hover:text-gray-500" onClick={() => handleResend(false)} />}
  38. {!running && <ReloadIcon className="hover:text-gray-500" onClick={() => handleResend(true)} />}
  39. {appConfig.dialogQuickSearch && <MagnifyingGlassIcon className="hover:text-gray-500" onClick={handleSearch} />}
  40. </div>
  41. </div>
  42. }
  43. </div>
  44. </div>
  45. };