|
|
<script lang="ts"> |
|
|
import { slide } from 'svelte/transition'; |
|
|
import Modal from '../common/Modal.svelte'; |
|
|
import Controls from './Controls/Controls.svelte'; |
|
|
import { onMount } from 'svelte'; |
|
|
import { mobile, showCallOverlay } from '$lib/stores'; |
|
|
import CallOverlay from './MessageInput/CallOverlay.svelte'; |
|
|
|
|
|
export let show = false; |
|
|
|
|
|
export let models = []; |
|
|
|
|
|
export let chatId = null; |
|
|
export let chatFiles = []; |
|
|
export let params = {}; |
|
|
|
|
|
export let eventTarget: EventTarget; |
|
|
export let submitPrompt: Function; |
|
|
export let stopResponse: Function; |
|
|
export let files; |
|
|
export let modelId; |
|
|
|
|
|
let largeScreen = false; |
|
|
onMount(() => { |
|
|
|
|
|
const mediaQuery = window.matchMedia('(min-width: 1024px)'); |
|
|
|
|
|
const handleMediaQuery = (e) => { |
|
|
if (e.matches) { |
|
|
largeScreen = true; |
|
|
} else { |
|
|
largeScreen = false; |
|
|
} |
|
|
}; |
|
|
|
|
|
mediaQuery.addEventListener('change', handleMediaQuery); |
|
|
|
|
|
handleMediaQuery(mediaQuery); |
|
|
|
|
|
return () => { |
|
|
mediaQuery.removeEventListener('change', handleMediaQuery); |
|
|
}; |
|
|
}); |
|
|
</script> |
|
|
|
|
|
{#if largeScreen} |
|
|
{#if show} |
|
|
<div class=" absolute bottom-0 right-0 z-20 h-full pointer-events-none"> |
|
|
<div class="pr-4 pt-14 pb-8 w-[24rem] h-full" in:slide={{ duration: 200, axis: 'x' }}> |
|
|
<div |
|
|
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" |
|
|
> |
|
|
{#if $showCallOverlay} |
|
|
<CallOverlay |
|
|
bind:files |
|
|
{submitPrompt} |
|
|
{stopResponse} |
|
|
{modelId} |
|
|
{chatId} |
|
|
{eventTarget} |
|
|
/> |
|
|
{:else} |
|
|
<Controls |
|
|
on:close={() => { |
|
|
show = false; |
|
|
}} |
|
|
{models} |
|
|
bind:chatFiles |
|
|
bind:params |
|
|
/> |
|
|
{/if} |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
{/if} |
|
|
{:else if $showCallOverlay} |
|
|
<div class=" absolute w-full h-screen max-h-[100dvh] flex z-[999] overflow-hidden"> |
|
|
<div |
|
|
class="absolute w-full h-screen max-h-[100dvh] bg-white text-gray-700 dark:bg-black dark:text-gray-300 flex justify-center" |
|
|
> |
|
|
<CallOverlay bind:files {submitPrompt} {stopResponse} {modelId} {chatId} {eventTarget} /> |
|
|
</div> |
|
|
</div> |
|
|
{:else} |
|
|
<Modal bind:show> |
|
|
<div class=" px-6 py-4 h-full"> |
|
|
<Controls |
|
|
on:close={() => { |
|
|
show = false; |
|
|
}} |
|
|
{models} |
|
|
bind:chatFiles |
|
|
bind:params |
|
|
/> |
|
|
</div> |
|
|
</Modal> |
|
|
{/if} |
|
|
|