Skip to content

Commit bcdd45f

Browse files
authored
Merge pull request #4 from balureddy003/codex/add-chat-functionality-and-ui-component
feat: add chat endpoint and UI component
2 parents ec4ece3 + 3a9b734 commit bcdd45f

File tree

2 files changed

+114
-1
lines changed

2 files changed

+114
-1
lines changed

src/frontend/src/api/apiService.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ const API_ENDPOINTS = {
2222
HUMAN_CLARIFICATION: '/human_clarification_on_plan',
2323
AGENT_MESSAGES: '/agent_messages',
2424
MESSAGES: '/messages',
25-
USER_BROWSER_LANGUAGE: '/user_browser_language'
25+
USER_BROWSER_LANGUAGE: '/user_browser_language',
26+
CHAT: '/chat'
2627
};
2728

2829
// Simple cache implementation
@@ -432,6 +433,23 @@ export class APIService {
432433
return fetcher();
433434
}
434435

436+
/**
437+
* Send a chat message and receive a response from the backend
438+
* @param sessionId Session ID for the conversation
439+
* @param message User input message
440+
* @returns Promise with backend response
441+
*/
442+
async sendChatMessage(
443+
sessionId: string,
444+
message: string
445+
): Promise<{ session_id: string; reply: string }> {
446+
const payload = {
447+
session_id: sessionId,
448+
message
449+
};
450+
return apiClient.post(API_ENDPOINTS.CHAT, payload);
451+
}
452+
435453
// Utility methods
436454

437455
/**
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import React, { useState } from "react";
2+
import { Button, Input, makeStyles } from "@fluentui/react-components";
3+
import { apiService } from "@/api/apiService";
4+
import { TaskService } from "@/services/TaskService";
5+
6+
interface Message {
7+
role: "user" | "assistant";
8+
content: string;
9+
}
10+
11+
const useStyles = makeStyles({
12+
container: {
13+
display: "flex",
14+
flexDirection: "column",
15+
gap: "8px",
16+
height: "100%",
17+
},
18+
messages: {
19+
flex: 1,
20+
overflowY: "auto",
21+
display: "flex",
22+
flexDirection: "column",
23+
gap: "4px",
24+
},
25+
messageUser: {
26+
alignSelf: "flex-end",
27+
},
28+
messageAssistant: {
29+
alignSelf: "flex-start",
30+
},
31+
inputRow: {
32+
display: "flex",
33+
gap: "4px",
34+
},
35+
});
36+
37+
const Chat: React.FC = () => {
38+
const styles = useStyles();
39+
const [sessionId, setSessionId] = useState<string>(
40+
TaskService.generateSessionId()
41+
);
42+
const [messages, setMessages] = useState<Message[]>([]);
43+
const [input, setInput] = useState("");
44+
45+
const handleSend = async () => {
46+
const text = input.trim();
47+
if (!text) return;
48+
49+
const userMessage: Message = { role: "user", content: text };
50+
setMessages((prev) => [...prev, userMessage]);
51+
setInput("");
52+
53+
try {
54+
const response = await apiService.sendChatMessage(sessionId, text);
55+
if (response.session_id && response.session_id !== sessionId) {
56+
setSessionId(response.session_id);
57+
}
58+
const reply = (response as any).reply || (response as any).message || "";
59+
const assistantMessage: Message = { role: "assistant", content: reply };
60+
setMessages((prev) => [...prev, assistantMessage]);
61+
} catch (err) {
62+
console.error("Failed to send chat message", err);
63+
}
64+
};
65+
66+
return (
67+
<div className={styles.container}>
68+
<div className={styles.messages}>
69+
{messages.map((m, i) => (
70+
<div
71+
key={i}
72+
className={m.role === "user" ? styles.messageUser : styles.messageAssistant}
73+
>
74+
{m.content}
75+
</div>
76+
))}
77+
</div>
78+
<div className={styles.inputRow}>
79+
<Input
80+
value={input}
81+
onChange={(_, data) => setInput(data.value)}
82+
onKeyDown={(e) => {
83+
if (e.key === "Enter") {
84+
handleSend();
85+
}
86+
}}
87+
/>
88+
<Button onClick={handleSend}>Send</Button>
89+
</div>
90+
</div>
91+
);
92+
};
93+
94+
export default Chat;
95+

0 commit comments

Comments
 (0)