ChatControls.svelte 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <script lang="ts">
  2. import { SvelteFlowProvider } from '@xyflow/svelte';
  3. import { slide } from 'svelte/transition';
  4. import { onDestroy, onMount } from 'svelte';
  5. import { mobile, showControls, showCallOverlay, showOverview } from '$lib/stores';
  6. import Modal from '../common/Modal.svelte';
  7. import Controls from './Controls/Controls.svelte';
  8. import CallOverlay from './MessageInput/CallOverlay.svelte';
  9. import Drawer from '../common/Drawer.svelte';
  10. import Overview from './Overview.svelte';
  11. export let history;
  12. export let models = [];
  13. export let chatId = null;
  14. export let chatFiles = [];
  15. export let params = {};
  16. export let eventTarget: EventTarget;
  17. export let submitPrompt: Function;
  18. export let stopResponse: Function;
  19. export let showMessage: Function;
  20. export let files;
  21. export let modelId;
  22. let largeScreen = false;
  23. onMount(() => {
  24. // listen to resize 1024px
  25. const mediaQuery = window.matchMedia('(min-width: 1024px)');
  26. const handleMediaQuery = (e) => {
  27. if (e.matches) {
  28. largeScreen = true;
  29. } else {
  30. largeScreen = false;
  31. }
  32. };
  33. mediaQuery.addEventListener('change', handleMediaQuery);
  34. handleMediaQuery(mediaQuery);
  35. return () => {
  36. mediaQuery.removeEventListener('change', handleMediaQuery);
  37. };
  38. });
  39. onDestroy(() => {
  40. showControls.set(false);
  41. });
  42. $: if (!chatId) {
  43. showOverview.set(false);
  44. }
  45. </script>
  46. <SvelteFlowProvider>
  47. {#if !largeScreen}
  48. {#if $showCallOverlay}
  49. <div class=" absolute w-full h-screen max-h-[100dvh] flex z-[999] overflow-hidden">
  50. <div
  51. class="absolute w-full h-screen max-h-[100dvh] bg-white text-gray-700 dark:bg-black dark:text-gray-300 flex justify-center"
  52. >
  53. <CallOverlay
  54. bind:files
  55. {submitPrompt}
  56. {stopResponse}
  57. {modelId}
  58. {chatId}
  59. {eventTarget}
  60. on:close={() => {
  61. showControls.set(false);
  62. }}
  63. />
  64. </div>
  65. </div>
  66. {:else if $showControls}
  67. <Drawer
  68. show={$showControls}
  69. on:close={() => {
  70. showControls.set(false);
  71. }}
  72. >
  73. <div class=" {$showOverview ? ' h-screen w-screen' : 'px-6 py-4'} h-full">
  74. {#if $showOverview}
  75. <Overview
  76. {history}
  77. on:nodeclick={(e) => {
  78. showMessage(e.detail.node.data.message);
  79. }}
  80. on:close={() => {
  81. showControls.set(false);
  82. }}
  83. />
  84. {:else}
  85. <Controls
  86. on:close={() => {
  87. showControls.set(false);
  88. }}
  89. {models}
  90. bind:chatFiles
  91. bind:params
  92. />
  93. {/if}
  94. </div>
  95. </Drawer>
  96. {/if}
  97. {:else if $showControls}
  98. <div class=" absolute bottom-0 right-0 z-20 h-full pointer-events-none">
  99. <div class="pr-4 pt-14 pb-8 w-[26rem] h-full" in:slide={{ duration: 200, axis: 'x' }}>
  100. <div
  101. class="w-full h-full {$showOverview && !$showCallOverlay
  102. ? ' '
  103. : 'px-5 py-4 bg-white dark:shadow-lg dark:bg-gray-850 border border-gray-50 dark:border-gray-800'} rounded-lg z-50 pointer-events-auto overflow-y-auto scrollbar-hidden"
  104. >
  105. {#if $showCallOverlay}
  106. <CallOverlay
  107. bind:files
  108. {submitPrompt}
  109. {stopResponse}
  110. {modelId}
  111. {chatId}
  112. {eventTarget}
  113. on:close={() => {
  114. showControls.set(false);
  115. }}
  116. />
  117. {:else if $showOverview}
  118. <Overview
  119. {history}
  120. on:nodeclick={(e) => {
  121. showMessage(e.detail.node.data.message);
  122. }}
  123. on:close={() => {
  124. showControls.set(false);
  125. }}
  126. />
  127. {:else}
  128. <Controls
  129. on:close={() => {
  130. showControls.set(false);
  131. }}
  132. {models}
  133. bind:chatFiles
  134. bind:params
  135. />
  136. {/if}
  137. </div>
  138. </div>
  139. </div>
  140. {/if}
  141. </SvelteFlowProvider>