Skip to content

Commit e1c5b7a

Browse files
committed
Changes to add Fluent AI components and use them to construct chat view
1 parent e8ed7d9 commit e1c5b7a

39 files changed

+5990
-171
lines changed

.vscode/settings.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"typescript.tsdk": "src/frontend/node_modules/typescript/lib",
3+
"typescript.enablePromptUseWorkspaceTsdk": true,
4+
"editor.formatOnSave": true,
5+
"editor.codeActionsOnSave": {
6+
"source.fixAll.eslint": "explicit"
7+
},
8+
"[typescript]": {
9+
"editor.defaultFormatter": "esbenp.prettier-vscode"
10+
},
11+
"[typescriptreact]": {
12+
"editor.defaultFormatter": "esbenp.prettier-vscode"
13+
}
14+
}

src/frontend/package.json

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,46 @@
55
"main": "index.js",
66
"scripts": {
77
"dev": "vite",
8-
"build": "vite build",
9-
"preview": "vite preview"
8+
"build": "tsc && vite build",
9+
"preview": "vite preview",
10+
"typecheck": "tsc --noEmit"
1011
},
1112
"keywords": [],
1213
"author": "",
1314
"license": "ISC",
1415
"packageManager": "[email protected]",
1516
"dependencies": {
17+
"@fluentui-copilot/react-copilot": "0.23.3",
18+
"@fluentui-copilot/react-copilot-chat": "0.9.6",
19+
"@fluentui-copilot/react-feedback-buttons": "0.9.6",
20+
"@fluentui-copilot/react-provider": "0.9.4",
21+
"@fluentui-copilot/react-reference": "0.13.10",
22+
"@fluentui-copilot/react-sensitivity-label": "0.5.8",
23+
"@fluentui/react-components": "9.60.0",
24+
"@fluentui/react-icons": "2.0.279",
25+
"@fluentui/react-theme": "9.1.24",
1626
"@vitejs/plugin-react": "4.4.1",
27+
"copy-to-clipboard": "^3.3.3",
1728
"react": "19.1.0",
1829
"react-dom": "19.1.0",
1930
"react-markdown": "10.1.0",
31+
"react-syntax-highlighter": "^15.5.0",
32+
"rehype-katex": "^7.0.0",
33+
"rehype-raw": "^7.0.0",
34+
"rehype-sanitize": "^6.0.0",
35+
"rehype-stringify": "^10.0.0",
36+
"remark-breaks": "^4.0.0",
37+
"remark-gfm": "^4.0.0",
38+
"remark-math": "^6.0.0",
39+
"remark-parse": "^11.0.0",
40+
"remark-supersub": "^1.0.0",
2041
"vite": "6.3.3"
42+
},
43+
"devDependencies": {
44+
"@types/node": "22.14.1",
45+
"@types/react": "18.3.20",
46+
"@types/react-dom": "18.3.5",
47+
"@types/react-syntax-highlighter": "15.5.13",
48+
"typescript": "5.8.3"
2149
}
2250
}

src/frontend/pnpm-lock.yaml

Lines changed: 3950 additions & 123 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/frontend/src/components/App.jsx

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/frontend/src/components/App.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import React from "react";
2+
import { AgentPreview } from "./agents/AgentPreview";
3+
4+
const App: React.FC = () => {
5+
// Sample agent details - in a real application, this would come from an API
6+
const mockAgentDetails = {
7+
id: "sample-agent-1",
8+
name: "Sample AI Agent",
9+
description: "A helpful AI assistant",
10+
logo: "Avatar_Default.svg",
11+
};
12+
13+
return (
14+
<div className="app-container">
15+
<AgentPreview
16+
resourceId="sample-resource-id"
17+
agentDetails={mockAgentDetails}
18+
/>
19+
</div>
20+
);
21+
};
22+
23+
export default App;

src/frontend/src/components/ChatContainer.jsx renamed to src/frontend/src/components/ChatContainer.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1-
import React, { useState, useEffect } from 'react';
1+
import React, { useState } from 'react';
22
import MessageList from './MessageList';
33
import ChatForm from './ChatForm';
44

5-
const ChatContainer = () => {
6-
const [messages, setMessages] = useState([]);
7-
const [isGenerating, setIsGenerating] = useState(false);
5+
interface Message {
6+
content: string;
7+
role: 'user' | 'assistant';
8+
}
89

9-
const addMessage = (content, role) => {
10+
const ChatContainer: React.FC = () => {
11+
const [messages, setMessages] = useState<Message[]>([]);
12+
const [isGenerating, setIsGenerating] = useState<boolean>(false);
13+
14+
const addMessage = (content: string, role: 'user' | 'assistant'): void => {
1015
setMessages(prev => [...prev, { content, role }]);
1116
};
1217

13-
const handleSubmit = async (userMessage) => {
18+
const handleSubmit = async (userMessage: string): Promise<void> => {
1419
if (!userMessage.trim()) return;
1520

1621
// Add user message to the chat

src/frontend/src/components/ChatForm.jsx renamed to src/frontend/src/components/ChatForm.tsx

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
1-
import React, { useState } from 'react';
1+
import React, { useState, FormEvent, ChangeEvent } from 'react';
22

3-
const ChatForm = ({ onSubmit, isGenerating }) => {
4-
const [message, setMessage] = useState('');
3+
interface ChatFormProps {
4+
onSubmit: (message: string) => void;
5+
isGenerating: boolean;
6+
}
57

6-
const handleSubmit = (e) => {
8+
const ChatForm: React.FC<ChatFormProps> = ({ onSubmit, isGenerating }) => {
9+
const [message, setMessage] = useState<string>('');
10+
11+
const handleSubmit = (e: FormEvent<HTMLFormElement>): void => {
712
e.preventDefault();
813
if (message.trim() && !isGenerating) {
914
onSubmit(message);
1015
setMessage('');
1116
}
1217
};
1318

14-
const clearChat = () => {
19+
const clearChat = (): void => {
1520
// We'll implement this to match the existing functionality
1621
window.location.reload();
1722
};
@@ -23,29 +28,26 @@ const ChatForm = ({ onSubmit, isGenerating }) => {
2328
<button
2429
type="button"
2530
className="btn btn-outline-dark"
26-
onClick={clearChat}
27-
aria-label="Start a new chat">
28-
<i className="bi bi-arrow-repeat" aria-hidden="true"></i>
31+
onClick={clearChat}>
32+
<i className="bi bi-arrow-repeat"></i>
2933
</button>
30-
<i className="bi bi-body-text input-group-text dark-border" aria-hidden="true"></i>
34+
<i className="bi bi-body-text input-group-text dark-border"></i>
3135
<input
3236
id="message"
3337
name="message"
3438
className="form-control form-control-sm dark-border"
3539
type="text"
36-
placeholder="Your Message"
37-
aria-label="Ask ChatGPT"
40+
placeholder="Your Message"
3841
value={message}
39-
onChange={(e) => setMessage(e.target.value)}
42+
onChange={(e: ChangeEvent<HTMLInputElement>) => setMessage(e.target.value)}
4043
disabled={isGenerating}
4144
/>
4245
<button
4346
type="submit"
4447
className="btn btn-outline-dark"
45-
style={{ borderLeftWidth: 0 }}
46-
aria-label="Submit"
48+
style={{ borderLeftWidth: 0 }}
4749
disabled={isGenerating}>
48-
Send <i className="bi bi-send-fill" aria-hidden="true"></i>
50+
Send <i className="bi bi-send-fill"></i>
4951
</button>
5052
</div>
5153
</form>

src/frontend/src/components/Message.jsx renamed to src/frontend/src/components/Message.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import React from 'react';
22
import ReactMarkdown from 'react-markdown';
33

4-
const Message = ({ content, role }) => {
4+
interface MessageProps {
5+
content: string;
6+
role: 'user' | 'assistant';
7+
}
8+
9+
const Message: React.FC<MessageProps> = ({ content, role }) => {
510
const isUser = role === 'user';
611

712
return (

src/frontend/src/components/MessageList.jsx renamed to src/frontend/src/components/MessageList.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
import React, { useEffect, useRef } from 'react';
22
import Message from './Message';
33

4-
const MessageList = ({ messages }) => {
5-
const messagesEndRef = useRef(null);
4+
interface Message {
5+
content: string;
6+
role: 'user' | 'assistant';
7+
}
8+
9+
interface MessageListProps {
10+
messages: Message[];
11+
}
12+
13+
const MessageList: React.FC<MessageListProps> = ({ messages }) => {
14+
const messagesEndRef = useRef<HTMLDivElement>(null);
615

716
// Auto-scroll to the bottom when new messages arrive
817
useEffect(() => {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
.iconContainer {
2+
display: flex;
3+
align-items: center;
4+
justify-content: center;
5+
}
6+
7+
.icon {
8+
width: 32px;
9+
height: 32px;
10+
border-radius: 50%;
11+
object-fit: cover;
12+
}

0 commit comments

Comments
 (0)