mirror of
https://github.com/open-webui/open-webui
synced 2025-02-22 13:18:25 +00:00
refac: chat controls resize behaviour
This commit is contained in:
parent
11d7aec61d
commit
5837dcbfd4
@ -78,6 +78,7 @@
|
|||||||
let loaded = false;
|
let loaded = false;
|
||||||
const eventTarget = new EventTarget();
|
const eventTarget = new EventTarget();
|
||||||
let controlPane;
|
let controlPane;
|
||||||
|
let controlPaneComponent;
|
||||||
|
|
||||||
let stopResponseFlag = false;
|
let stopResponseFlag = false;
|
||||||
let autoScroll = true;
|
let autoScroll = true;
|
||||||
@ -290,14 +291,9 @@
|
|||||||
if (controlPane && !$mobile) {
|
if (controlPane && !$mobile) {
|
||||||
try {
|
try {
|
||||||
if (value) {
|
if (value) {
|
||||||
const currentSize = controlPane.getSize();
|
controlPaneComponent.openPane();
|
||||||
|
|
||||||
if (currentSize === 0) {
|
|
||||||
const size = parseInt(localStorage?.chatControlsSize ?? '30');
|
|
||||||
controlPane.resize(size ? size : 30);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
controlPane.resize(0);
|
controlPane.collapse();
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// ignore
|
// ignore
|
||||||
@ -307,6 +303,7 @@
|
|||||||
if (!value) {
|
if (!value) {
|
||||||
showCallOverlay.set(false);
|
showCallOverlay.set(false);
|
||||||
showOverview.set(false);
|
showOverview.set(false);
|
||||||
|
showArtifacts.set(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -2222,6 +2219,7 @@
|
|||||||
</Pane>
|
</Pane>
|
||||||
|
|
||||||
<ChatControls
|
<ChatControls
|
||||||
|
bind:this={controlPaneComponent}
|
||||||
bind:history
|
bind:history
|
||||||
bind:chatFiles
|
bind:chatFiles
|
||||||
bind:params
|
bind:params
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { SvelteFlowProvider } from '@xyflow/svelte';
|
import { SvelteFlowProvider } from '@xyflow/svelte';
|
||||||
import { slide } from 'svelte/transition';
|
import { slide } from 'svelte/transition';
|
||||||
|
import { Pane, PaneResizer } from 'paneforge';
|
||||||
|
|
||||||
import { onDestroy, onMount, tick } from 'svelte';
|
import { onDestroy, onMount, tick } from 'svelte';
|
||||||
import { mobile, showControls, showCallOverlay, showOverview, showArtifacts } from '$lib/stores';
|
import { mobile, showControls, showCallOverlay, showOverview, showArtifacts } from '$lib/stores';
|
||||||
@ -10,9 +11,9 @@
|
|||||||
import CallOverlay from './MessageInput/CallOverlay.svelte';
|
import CallOverlay from './MessageInput/CallOverlay.svelte';
|
||||||
import Drawer from '../common/Drawer.svelte';
|
import Drawer from '../common/Drawer.svelte';
|
||||||
import Overview from './Overview.svelte';
|
import Overview from './Overview.svelte';
|
||||||
import { Pane, PaneResizer } from 'paneforge';
|
|
||||||
import EllipsisVertical from '../icons/EllipsisVertical.svelte';
|
import EllipsisVertical from '../icons/EllipsisVertical.svelte';
|
||||||
import Artifacts from './Artifacts.svelte';
|
import Artifacts from './Artifacts.svelte';
|
||||||
|
import { min } from '@floating-ui/utils';
|
||||||
|
|
||||||
export let history;
|
export let history;
|
||||||
export let models = [];
|
export let models = [];
|
||||||
@ -35,6 +36,16 @@
|
|||||||
let largeScreen = false;
|
let largeScreen = false;
|
||||||
let dragged = false;
|
let dragged = false;
|
||||||
|
|
||||||
|
let minSize = 0;
|
||||||
|
|
||||||
|
export const openPane = () => {
|
||||||
|
if (parseInt(localStorage?.chatControlsSize)) {
|
||||||
|
pane.resize(parseInt(localStorage?.chatControlsSize));
|
||||||
|
} else {
|
||||||
|
pane.resize(minSize);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleMediaQuery = async (e) => {
|
const handleMediaQuery = async (e) => {
|
||||||
if (e.matches) {
|
if (e.matches) {
|
||||||
largeScreen = true;
|
largeScreen = true;
|
||||||
@ -71,6 +82,32 @@
|
|||||||
mediaQuery.addEventListener('change', handleMediaQuery);
|
mediaQuery.addEventListener('change', handleMediaQuery);
|
||||||
handleMediaQuery(mediaQuery);
|
handleMediaQuery(mediaQuery);
|
||||||
|
|
||||||
|
// Select the container element you want to observe
|
||||||
|
const container = document.getElementById('chat-container');
|
||||||
|
|
||||||
|
// initialize the minSize based on the container width
|
||||||
|
minSize = Math.floor((350 / container.clientWidth) * 100);
|
||||||
|
|
||||||
|
// Create a new ResizeObserver instance
|
||||||
|
const resizeObserver = new ResizeObserver((entries) => {
|
||||||
|
for (let entry of entries) {
|
||||||
|
const width = entry.contentRect.width;
|
||||||
|
// calculate the percentage of 200px
|
||||||
|
const percentage = (350 / width) * 100;
|
||||||
|
// set the minSize to the percentage, must be an integer
|
||||||
|
minSize = Math.floor(percentage);
|
||||||
|
|
||||||
|
if ($showControls) {
|
||||||
|
if (pane && pane.isExpanded() && pane.getSize() < minSize) {
|
||||||
|
pane.resize(minSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Start observing the container's size changes
|
||||||
|
resizeObserver.observe(container);
|
||||||
|
|
||||||
document.addEventListener('mousedown', onMouseDown);
|
document.addEventListener('mousedown', onMouseDown);
|
||||||
document.addEventListener('mouseup', onMouseUp);
|
document.addEventListener('mouseup', onMouseUp);
|
||||||
});
|
});
|
||||||
@ -163,23 +200,29 @@
|
|||||||
</div>
|
</div>
|
||||||
</PaneResizer>
|
</PaneResizer>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<Pane
|
<Pane
|
||||||
bind:pane
|
bind:pane
|
||||||
defaultSize={$showControls
|
defaultSize={0}
|
||||||
? parseInt(localStorage?.chatControlsSize ?? '30')
|
|
||||||
? parseInt(localStorage?.chatControlsSize ?? '30')
|
|
||||||
: 30
|
|
||||||
: 0}
|
|
||||||
onResize={(size) => {
|
onResize={(size) => {
|
||||||
if (size === 0) {
|
console.log('size', size, minSize);
|
||||||
showControls.set(false);
|
|
||||||
} else {
|
if ($showControls && pane.isExpanded()) {
|
||||||
if (!$showControls) {
|
if (size < minSize) {
|
||||||
showControls.set(true);
|
pane.resize(minSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (size < minSize) {
|
||||||
|
localStorage.chatControlsSize = 0;
|
||||||
|
} else {
|
||||||
localStorage.chatControlsSize = size;
|
localStorage.chatControlsSize = size;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
|
onCollapse={() => {
|
||||||
|
showControls.set(false);
|
||||||
|
}}
|
||||||
|
collapsible={true}
|
||||||
class="pt-8"
|
class="pt-8"
|
||||||
>
|
>
|
||||||
{#if $showControls}
|
{#if $showControls}
|
||||||
|
Loading…
Reference in New Issue
Block a user