Spaces:
Running
Running
File size: 1,796 Bytes
bb42e25 6e3dd98 e8700b8 bb42e25 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <script lang="ts">
import { MessageCirclePlus } from '@lucide/svelte';
import { useNodes, useSvelteFlow, type Node } from '@xyflow/svelte';
import * as ContextMenu from '$lib/components/ui/context-menu/index.js';
import { MAX_DEFAULT_MODELS } from '$lib';
import type { ChatModel } from '$lib/helpers/types';
import { modelsState } from '$lib/state/models.svelte';
let triggerRef: HTMLDivElement | null = null;
const { update: updateNodes } = useNodes();
export function openAt(e: MouseEvent) {
const syntheticEvent = new MouseEvent('contextmenu', {
clientX: e.clientX,
clientY: e.clientY,
bubbles: true
});
(syntheticEvent as MouseEvent & { __contextMenuSynthetic?: true }).__contextMenuSynthetic =
true;
triggerRef?.dispatchEvent(syntheticEvent);
}
function handleNewChat() {
const newNodeId = `user-${crypto.randomUUID()}`;
const newNode: Node = {
id: newNodeId,
type: 'user',
position: {
x: 0,
y: 0
},
data: {
role: 'user',
isParentNode: true,
selectedModels: modelsState.models.slice(0, MAX_DEFAULT_MODELS).map((m) => m.id) as string[]
}
};
updateNodes((currentNodes) => {
const firstNode = currentNodes.find((node) => node.data.isFirstNode);
const updatedNodes = currentNodes.map((node) => {
if (node.id === firstNode?.id) {
return { ...node, data: { ...node.data, showWelcome: false } };
}
return node;
});
return [...updatedNodes, newNode];
});
}
</script>
<ContextMenu.Root>
<ContextMenu.Trigger bind:ref={triggerRef}>
<div class="absolute inset-0" aria-hidden="true"></div>
</ContextMenu.Trigger>
<ContextMenu.Content>
<ContextMenu.Item onclick={handleNewChat}>
<MessageCirclePlus />
New chat
</ContextMenu.Item>
</ContextMenu.Content>
</ContextMenu.Root>
|