scrollable message list with sticky conversation header

master
Avraham Sakal 4 weeks ago
parent 6668361f05
commit cac6bf142c

@ -2,11 +2,13 @@ import "@mantine/core/styles.css";
import { navigate } from "vike/client/router"; import { navigate } from "vike/client/router";
import { import {
AppShell, AppShell,
Box,
Burger, Burger,
Group, Group,
Image, Image,
MantineProvider, MantineProvider,
NavLink, NavLink,
ScrollArea,
Title, Title,
} from "@mantine/core"; } from "@mantine/core";
import { import {
@ -137,7 +139,19 @@ export default function LayoutDefault({
<NavLink href="/" label="Welcome" active={urlPathname === "/"} /> <NavLink href="/" label="Welcome" active={urlPathname === "/"} />
<NavLinkChat key="chat-new" /> <NavLinkChat key="chat-new" />
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main> {children} </AppShell.Main> <AppShell.Main
styles={{
main: {
height: "100vh",
overflow: "hidden",
},
}}
>
<Box h="100%" w="100%">
{" "}
{children}{" "}
</Box>
</AppShell.Main>
</AppShell> </AppShell>
</MantineProvider> </MantineProvider>
</TRPCProvider> </TRPCProvider>

@ -496,8 +496,8 @@ export default function ChatPage() {
} }
return ( return (
<Box> <Box h="100%" w="100%" style={{ display: "flex", flexDirection: "column" }}>
<Group justify="flex-start" gap={"sm"}> <Group justify="flex-start" gap={"sm"} w="100%">
<TextInput <TextInput
inputSize="50" inputSize="50"
description={`Conversation #${conversationId}`} description={`Conversation #${conversationId}`}
@ -532,7 +532,15 @@ export default function ChatPage() {
<StatusMessage sendMessageStatus={sendMessageStatus} /> <StatusMessage sendMessageStatus={sendMessageStatus} />
)} )}
</Group> </Group>
<Tabs defaultValue="message"> <Tabs
defaultValue="message"
style={{
display: "flex",
flexDirection: "column",
flex: 1,
overflow: "hidden",
}}
>
<Tabs.List> <Tabs.List>
<Tabs.Tab value="message">Message</Tabs.Tab> <Tabs.Tab value="message">Message</Tabs.Tab>
<Tabs.Tab value="system-prompt">System Prompt</Tabs.Tab> <Tabs.Tab value="system-prompt">System Prompt</Tabs.Tab>
@ -540,35 +548,39 @@ export default function ChatPage() {
<Tabs.Tab value="facts">Facts</Tabs.Tab> <Tabs.Tab value="facts">Facts</Tabs.Tab>
<Tabs.Tab value="fact-triggers">Fact Triggers</Tabs.Tab> <Tabs.Tab value="fact-triggers">Fact Triggers</Tabs.Tab>
</Tabs.List> </Tabs.List>
<Tabs.Panel value="message"> <Tabs.Panel value="message" style={{ flex: 1, overflow: "hidden" }}>
<Messages /> <Stack gap="md" justify="space-between" h="100%">
<Textarea <ScrollArea scrollbars="y" style={{ flex: 1 }}>
resize="vertical" <Messages />
placeholder="Type your message here..." </ScrollArea>
value={message} <Textarea
disabled={loading} resize="vertical"
onChange={(e) => setMessage(e.target.value)} placeholder="Type your message here..."
onKeyDown={async (e) => { value={message}
if (e.key === "Enter") { disabled={loading}
e.preventDefault(); onChange={(e) => setMessage(e.target.value)}
setLoading(true); onKeyDown={async (e) => {
await sendSubscriptionMessage({ if (e.key === "Enter") {
conversationId, e.preventDefault();
messages: [ setLoading(true);
...(messages || []), await sendSubscriptionMessage({
{ conversationId,
role: "user" as const, messages: [
parts: [{ type: "text", text: message }], ...(messages || []),
} as DraftMessage, {
], role: "user" as const,
systemPrompt, parts: [{ type: "text", text: message }],
parameters, } as DraftMessage,
}); ],
setMessage(""); systemPrompt,
setLoading(false); parameters,
} });
}} setMessage("");
/> setLoading(false);
}
}}
/>
</Stack>
</Tabs.Panel> </Tabs.Panel>
<Tabs.Panel value="system-prompt"> <Tabs.Panel value="system-prompt">
<Textarea <Textarea

Loading…
Cancel
Save