refac: call overlay styling

This commit is contained in:
Timothy J. Baek 2024-08-23 16:42:36 +02:00
parent 4519ddd0e9
commit 48503573c1
5 changed files with 336 additions and 319 deletions

View File

@ -1634,6 +1634,25 @@
<audio id="audioElement" src="" style="display: none;" /> <audio id="audioElement" src="" style="display: none;" />
<ChatControls
models={selectedModelIds.reduce((a, e, i, arr) => {
const model = $models.find((m) => m.id === e);
if (model) {
return [...a, model];
}
return a;
}, [])}
bind:show={showControls}
bind:chatFiles
bind:params
bind:files
{submitPrompt}
{stopResponse}
modelId={selectedModelIds?.at(0) ?? null}
chatId={$chatId}
{eventTarget}
/>
<EventConfirmDialog <EventConfirmDialog
bind:show={showEventConfirmation} bind:show={showEventConfirmation}
title={eventConfirmationTitle} title={eventConfirmationTitle}
@ -1653,17 +1672,6 @@
}} }}
/> />
{#if $showCallOverlay}
<CallOverlay
{submitPrompt}
{stopResponse}
bind:files
modelId={selectedModelIds?.at(0) ?? null}
chatId={$chatId}
{eventTarget}
/>
{/if}
{#if !chatIdProp || (loaded && chatIdProp)} {#if !chatIdProp || (loaded && chatIdProp)}
<div <div
class="h-screen max-h-[100dvh] {$showSidebar class="h-screen max-h-[100dvh] {$showSidebar
@ -1774,21 +1782,11 @@
{messages} {messages}
{submitPrompt} {submitPrompt}
{stopResponse} {stopResponse}
on:call={() => {
showControls = true;
}}
/> />
</div> </div>
</div> </div>
<ChatControls
models={selectedModelIds.reduce((a, e, i, arr) => {
const model = $models.find((m) => m.id === e);
if (model) {
return [...a, model];
}
return a;
}, [])}
bind:show={showControls}
bind:chatFiles
bind:params
/>
</div> </div>
{/if} {/if}

View File

@ -3,6 +3,8 @@
import Modal from '../common/Modal.svelte'; import Modal from '../common/Modal.svelte';
import Controls from './Controls/Controls.svelte'; import Controls from './Controls/Controls.svelte';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { mobile, showCallOverlay } from '$lib/stores';
import CallOverlay from './MessageInput/CallOverlay.svelte';
export let show = false; export let show = false;
@ -12,6 +14,12 @@
export let chatFiles = []; export let chatFiles = [];
export let params = {}; export let params = {};
export let eventTarget: EventTarget;
export let submitPrompt: Function;
export let stopResponse: Function;
export let files;
export let modelId;
let largeScreen = false; let largeScreen = false;
onMount(() => { onMount(() => {
// listen to resize 1024px // listen to resize 1024px
@ -42,6 +50,16 @@
<div <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" 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 <Controls
on:close={() => { on:close={() => {
show = false; show = false;
@ -50,10 +68,19 @@
bind:chatFiles bind:chatFiles
bind:params bind:params
/> />
{/if}
</div> </div>
</div> </div>
</div> </div>
{/if} {/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} {:else}
<Modal bind:show> <Modal bind:show>
<div class=" px-6 py-4 h-full"> <div class=" px-6 py-4 h-full">

View File

@ -1,4 +1,4 @@
<script> <script lang="ts">
import { createEventDispatcher, getContext } from 'svelte'; import { createEventDispatcher, getContext } from 'svelte';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
const i18n = getContext('i18n'); const i18n = getContext('i18n');
@ -10,9 +10,7 @@
import Collapsible from '$lib/components/common/Collapsible.svelte'; import Collapsible from '$lib/components/common/Collapsible.svelte';
import { user } from '$lib/stores'; import { user } from '$lib/stores';
export let models = []; export let models = [];
export let chatFiles = []; export let chatFiles = [];
export let params = {}; export let params = {};
</script> </script>

View File

@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
import { onMount, tick, getContext } from 'svelte'; import { onMount, tick, getContext, createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
import { import {
type Model, type Model,
@ -762,10 +763,14 @@
} }
// check if user has access to getUserMedia // check if user has access to getUserMedia
try { try {
await navigator.mediaDevices.getUserMedia({ audio: true }); let stream = await navigator.mediaDevices.getUserMedia({ audio: true });
// If the user grants the permission, proceed to show the call overlay // If the user grants the permission, proceed to show the call overlay
stream.getTracks().forEach((track) => track.stop());
stream = null;
showCallOverlay.set(true); showCallOverlay.set(true);
dispatch('call');
} catch (err) { } catch (err) {
// If the user denies the permission or an error occurs, show an error message // If the user denies the permission or an error occurs, show an error message
toast.error($i18n.t('Permission denied when accessing media devices')); toast.error($i18n.t('Permission denied when accessing media devices'));

View File

@ -19,12 +19,9 @@
const i18n = getContext('i18n'); const i18n = getContext('i18n');
export let eventTarget: EventTarget; export let eventTarget: EventTarget;
export let submitPrompt: Function; export let submitPrompt: Function;
export let stopResponse: Function; export let stopResponse: Function;
export let files; export let files;
export let chatId; export let chatId;
export let modelId; export let modelId;
@ -631,11 +628,7 @@
</script> </script>
{#if $showCallOverlay} {#if $showCallOverlay}
<div class=" absolute w-full h-screen max-h-[100dvh] flex z-[999] overflow-hidden"> <div class="max-w-lg w-full h-full max-h-[100dvh] flex flex-col justify-between p-3 md:p-6">
<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"
>
<div class="max-w-lg w-full h-screen max-h-[100dvh] flex flex-col justify-between p-3 md:p-6">
{#if camera} {#if camera}
<button <button
type="button" type="button"
@ -798,9 +791,7 @@
{/if} {/if}
</button> </button>
{:else} {:else}
<div <div class="relative flex video-container w-full max-h-full pt-2 pb-4 md:py-6 px-2 h-full">
class="relative flex video-container w-full max-h-full pt-2 pb-4 md:py-6 px-2 h-full"
>
<video <video
id="camera-feed" id="camera-feed"
autoplay autoplay
@ -938,6 +929,4 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div>
{/if} {/if}