ChatControls.svelte 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <script lang="ts">
  2. import { slide } from 'svelte/transition';
  3. import Modal from '../common/Modal.svelte';
  4. import Controls from './Controls/Controls.svelte';
  5. import { onMount } from 'svelte';
  6. import { mobile, showCallOverlay } from '$lib/stores';
  7. import CallOverlay from './MessageInput/CallOverlay.svelte';
  8. import Drawer from '../common/Drawer.svelte';
  9. export let show = false;
  10. export let models = [];
  11. export let chatId = null;
  12. export let chatFiles = [];
  13. export let params = {};
  14. export let eventTarget: EventTarget;
  15. export let submitPrompt: Function;
  16. export let stopResponse: Function;
  17. export let files;
  18. export let modelId;
  19. let largeScreen = false;
  20. onMount(() => {
  21. // listen to resize 1024px
  22. const mediaQuery = window.matchMedia('(min-width: 1024px)');
  23. const handleMediaQuery = (e) => {
  24. if (e.matches) {
  25. largeScreen = true;
  26. } else {
  27. largeScreen = false;
  28. }
  29. };
  30. mediaQuery.addEventListener('change', handleMediaQuery);
  31. handleMediaQuery(mediaQuery);
  32. return () => {
  33. mediaQuery.removeEventListener('change', handleMediaQuery);
  34. };
  35. });
  36. </script>
  37. {#if !largeScreen}
  38. {#if $showCallOverlay}
  39. <div class=" absolute w-full h-screen max-h-[100dvh] flex z-[999] overflow-hidden">
  40. <div
  41. class="absolute w-full h-screen max-h-[100dvh] bg-white text-gray-700 dark:bg-black dark:text-gray-300 flex justify-center"
  42. >
  43. <CallOverlay
  44. bind:files
  45. {submitPrompt}
  46. {stopResponse}
  47. {modelId}
  48. {chatId}
  49. {eventTarget}
  50. on:close={() => {
  51. show = false;
  52. }}
  53. />
  54. </div>
  55. </div>
  56. {:else if show}
  57. <Drawer bind:show>
  58. <div class=" px-6 py-4 h-full">
  59. <Controls
  60. on:close={() => {
  61. show = false;
  62. }}
  63. {models}
  64. bind:chatFiles
  65. bind:params
  66. />
  67. </div>
  68. </Drawer>
  69. {/if}
  70. {:else if show}
  71. <div class=" absolute bottom-0 right-0 z-20 h-full pointer-events-none">
  72. <div class="pr-4 pt-14 pb-8 w-[24rem] h-full" in:slide={{ duration: 200, axis: 'x' }}>
  73. <div
  74. class="w-full h-full px-5 py-4 bg-white dark:shadow-lg dark:bg-gray-850 border border-gray-50 dark:border-gray-800 rounded-xl z-50 pointer-events-auto overflow-y-auto scrollbar-hidden"
  75. >
  76. {#if $showCallOverlay}
  77. <CallOverlay
  78. bind:files
  79. {submitPrompt}
  80. {stopResponse}
  81. {modelId}
  82. {chatId}
  83. {eventTarget}
  84. on:close={() => {
  85. show = false;
  86. }}
  87. />
  88. {:else}
  89. <Controls
  90. on:close={() => {
  91. show = false;
  92. }}
  93. {models}
  94. bind:chatFiles
  95. bind:params
  96. />
  97. {/if}
  98. </div>
  99. </div>
  100. </div>
  101. {/if}