MultiResponseMessages.svelte 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <script lang="ts">
  2. import { onMount, tick } from 'svelte';
  3. import { createEventDispatcher } from 'svelte';
  4. import { updateChatById } from '$lib/apis/chats';
  5. import ResponseMessage from './ResponseMessage.svelte';
  6. export let chatId;
  7. export let history;
  8. export let messages = [];
  9. export let messageIdx;
  10. export let parentMessage;
  11. export let readOnly = false;
  12. export let updateChatMessages: Function;
  13. export let confirmEditResponseMessage: Function;
  14. export let rateMessage: Function;
  15. export let copyToClipboard: Function;
  16. export let continueGeneration: Function;
  17. export let regenerateResponse: Function;
  18. const dispatch = createEventDispatcher();
  19. let currentMessageId;
  20. let groupedMessages = {};
  21. let groupedMessagesIdx = {};
  22. $: if (parentMessage) {
  23. initHandler();
  24. }
  25. const showPreviousMessage = (modelIdx) => {
  26. groupedMessagesIdx[modelIdx] = Math.max(0, groupedMessagesIdx[modelIdx] - 1);
  27. let messageId = groupedMessages[modelIdx].messages[groupedMessagesIdx[modelIdx]].id;
  28. console.log(messageId);
  29. let messageChildrenIds = history.messages[messageId].childrenIds;
  30. while (messageChildrenIds.length !== 0) {
  31. messageId = messageChildrenIds.at(-1);
  32. messageChildrenIds = history.messages[messageId].childrenIds;
  33. }
  34. history.currentId = messageId;
  35. dispatch('change');
  36. };
  37. const showNextMessage = (modelIdx) => {
  38. groupedMessagesIdx[modelIdx] = Math.min(
  39. groupedMessages[modelIdx].messages.length - 1,
  40. groupedMessagesIdx[modelIdx] + 1
  41. );
  42. let messageId = groupedMessages[modelIdx].messages[groupedMessagesIdx[modelIdx]].id;
  43. console.log(messageId);
  44. let messageChildrenIds = history.messages[messageId].childrenIds;
  45. while (messageChildrenIds.length !== 0) {
  46. messageId = messageChildrenIds.at(-1);
  47. messageChildrenIds = history.messages[messageId].childrenIds;
  48. }
  49. history.currentId = messageId;
  50. dispatch('change');
  51. };
  52. const initHandler = async () => {
  53. await tick();
  54. currentMessageId = messages[messageIdx].id;
  55. groupedMessages = parentMessage?.models.reduce((a, model, modelIdx) => {
  56. // Find all messages that are children of the parent message and have the same model
  57. const modelMessages = parentMessage?.childrenIds
  58. .map((id) => history.messages[id])
  59. .filter((m) => m.modelIdx === modelIdx);
  60. return {
  61. ...a,
  62. [modelIdx]: { messages: modelMessages }
  63. };
  64. }, {});
  65. groupedMessagesIdx = parentMessage?.models.reduce((a, model, modelIdx) => {
  66. const idx = groupedMessages[modelIdx].messages.findIndex((m) => m.id === currentMessageId);
  67. if (idx !== -1) {
  68. return {
  69. ...a,
  70. [modelIdx]: idx
  71. };
  72. } else {
  73. return {
  74. ...a,
  75. [modelIdx]: 0
  76. };
  77. }
  78. }, {});
  79. };
  80. onMount(async () => {
  81. initHandler();
  82. });
  83. </script>
  84. <div>
  85. <div
  86. class="flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden"
  87. id="responses-container-{chatId}-{parentMessage.id}"
  88. >
  89. {#key currentMessageId}
  90. {#each Object.keys(groupedMessages) as modelIdx}
  91. {#if groupedMessagesIdx[modelIdx] !== undefined && groupedMessages[modelIdx].messages.length > 0}
  92. <!-- svelte-ignore a11y-no-static-element-interactions -->
  93. <!-- svelte-ignore a11y-click-events-have-key-events -->
  94. {@const message = groupedMessages[modelIdx].messages[groupedMessagesIdx[modelIdx]]}
  95. <div
  96. class=" snap-center min-w-80 w-full max-w-full m-1 border {history.messages[
  97. currentMessageId
  98. ]?.modelIdx == modelIdx
  99. ? 'border-gray-100 dark:border-gray-800 border-[1.5px]'
  100. : 'border-gray-50 dark:border-gray-850 '} transition p-5 rounded-3xl"
  101. on:click={() => {
  102. if (currentMessageId != message.id) {
  103. currentMessageId = message.id;
  104. let messageId = message.id;
  105. console.log(messageId);
  106. //
  107. let messageChildrenIds = history.messages[messageId].childrenIds;
  108. while (messageChildrenIds.length !== 0) {
  109. messageId = messageChildrenIds.at(-1);
  110. messageChildrenIds = history.messages[messageId].childrenIds;
  111. }
  112. history.currentId = messageId;
  113. dispatch('change');
  114. }
  115. }}
  116. >
  117. {#key history.currentId}
  118. {#if message}
  119. <ResponseMessage
  120. {message}
  121. siblings={groupedMessages[modelIdx].messages.map((m) => m.id)}
  122. isLastMessage={true}
  123. {updateChatMessages}
  124. {confirmEditResponseMessage}
  125. showPreviousMessage={() => showPreviousMessage(modelIdx)}
  126. showNextMessage={() => showNextMessage(modelIdx)}
  127. {readOnly}
  128. {rateMessage}
  129. {copyToClipboard}
  130. {continueGeneration}
  131. regenerateResponse={async (message) => {
  132. regenerateResponse(message);
  133. await tick();
  134. groupedMessagesIdx[modelIdx] = groupedMessages[modelIdx].messages.length - 1;
  135. }}
  136. on:save={async (e) => {
  137. console.log('save', e);
  138. const message = e.detail;
  139. history.messages[message.id] = message;
  140. await updateChatById(localStorage.token, chatId, {
  141. messages: messages,
  142. history: history
  143. });
  144. }}
  145. />
  146. {/if}
  147. {/key}
  148. </div>
  149. {/if}
  150. {/each}
  151. {/key}
  152. </div>
  153. </div>