File size: 2,007 Bytes
93dd66e
 
3ba9c0c
c69ef3e
052672d
 
c69ef3e
052672d
3ba9c0c
 
93dd66e
 
a8e1cb0
93dd66e
 
 
a8e1cb0
3ba9c0c
 
 
93dd66e
 
 
 
 
 
 
 
 
3ba9c0c
93dd66e
3ba9c0c
93dd66e
a8e1cb0
93dd66e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ba9c0c
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
64
65
66
67
68
69
70
71
72
73
74
75
76
import * as React from 'react';
import { type UseChatHelpers } from 'ai/react';

import { Button } from '@/components/ui/Button';
import { PromptForm } from '@/components/chat/PromptForm';
import { ButtonScrollToBottom } from '@/components/chat/ButtonScrollToBottom';
import { IconRefresh, IconShare, IconStop } from '@/components/ui/Icons';
import { MessageWithSelectedDataset } from '../../lib/types';

export interface ChatPanelProps
	extends Pick<
		UseChatHelpers,
		'append' | 'isLoading' | 'reload' | 'stop' | 'input' | 'setInput'
	> {
	id?: string;
	title?: string;
	messages: MessageWithSelectedDataset[];
}

export function ChatPanel({
	id,
	title,
	isLoading,
	stop,
	append,
	reload,
	input,
	setInput,
	messages,
}: ChatPanelProps) {
	const [shareDialogOpen, setShareDialogOpen] = React.useState(false);

	return (
		<div className="fixed inset-x-0 bottom-0 w-full animate-in duration-300 ease-in-out peer-[[data-state=open]]:group-[]:lg:pl-[250px] peer-[[data-state=open]]:group-[]:xl:pl-[300px]">
			<ButtonScrollToBottom />
			<div className="mx-auto sm:max-w-3xl sm:px-4">
				<div className="flex items-center justify-center h-12">
					{isLoading ? (
						<Button
							variant="outline"
							onClick={() => stop()}
							className="bg-background"
						>
							<IconStop className="mr-2" />
							Stop generating
						</Button>
					) : (
						messages?.length >= 2 && (
							<div className="flex space-x-2">
								<Button variant="outline" onClick={() => reload()}>
									<IconRefresh className="mr-2" />
									Regenerate response
								</Button>
							</div>
						)
					)}
				</div>
				<div className="px-4 py-2 space-y-4 border-t shadow-lg bg-background sm:rounded-t-xl sm:border md:py-4">
					<PromptForm
						onSubmit={async value => {
							await append({
								id,
								content: value,
								role: 'user',
							});
						}}
						input={input}
						setInput={setInput}
						isLoading={isLoading}
					/>
				</div>
			</div>
		</div>
	);
}