Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

use-cache-chat-log.ts 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import {
  2. IEventList,
  3. INodeEvent,
  4. MessageEventType,
  5. } from '@/hooks/use-send-message';
  6. import { useCallback, useEffect, useMemo, useState } from 'react';
  7. export const ExcludeTypes = [
  8. MessageEventType.Message,
  9. MessageEventType.MessageEnd,
  10. ];
  11. export function useCacheChatLog() {
  12. const [eventList, setEventList] = useState<IEventList>([]);
  13. const [messageIdPool, setMessageIdPool] = useState<
  14. Record<string, IEventList>
  15. >({});
  16. const [currentMessageId, setCurrentMessageId] = useState('');
  17. useEffect(() => {
  18. setMessageIdPool((prev) => ({ ...prev, [currentMessageId]: eventList }));
  19. }, [currentMessageId, eventList]);
  20. const filterEventListByMessageId = useCallback(
  21. (messageId: string) => {
  22. return messageIdPool[messageId]?.filter(
  23. (x) => x.message_id === messageId,
  24. );
  25. },
  26. [messageIdPool],
  27. );
  28. const filterEventListByEventType = useCallback(
  29. (eventType: string) => {
  30. return messageIdPool[currentMessageId]?.filter(
  31. (x) => x.event === eventType,
  32. );
  33. },
  34. [messageIdPool, currentMessageId],
  35. );
  36. const clearEventList = useCallback(() => {
  37. setEventList([]);
  38. }, []);
  39. const addEventList = useCallback(
  40. (events: IEventList, message_id: string) => {
  41. const nextList = [...eventList];
  42. events.forEach((x) => {
  43. if (nextList.every((y) => y !== x)) {
  44. nextList.push(x);
  45. }
  46. });
  47. setEventList(nextList);
  48. setMessageIdPool((prev) => ({ ...prev, [message_id]: nextList }));
  49. },
  50. [eventList],
  51. );
  52. const currentEventListWithoutMessage = useMemo(() => {
  53. const list = messageIdPool[currentMessageId]?.filter(
  54. (x) =>
  55. x.message_id === currentMessageId &&
  56. ExcludeTypes.every((y) => y !== x.event),
  57. );
  58. return list as INodeEvent[];
  59. }, [currentMessageId, messageIdPool]);
  60. const currentEventListWithoutMessageById = useCallback(
  61. (messageId: string) => {
  62. const list = messageIdPool[messageId]?.filter(
  63. (x) =>
  64. x.message_id === messageId &&
  65. ExcludeTypes.every((y) => y !== x.event),
  66. );
  67. return list as INodeEvent[];
  68. },
  69. [messageIdPool],
  70. );
  71. return {
  72. eventList,
  73. currentEventListWithoutMessage,
  74. currentEventListWithoutMessageById,
  75. setEventList,
  76. clearEventList,
  77. addEventList,
  78. filterEventListByEventType,
  79. filterEventListByMessageId,
  80. setCurrentMessageId,
  81. currentMessageId,
  82. };
  83. }