Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 26 additions & 2 deletions fe_repo/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {ChatBox, Content, Header} from './pages'
import {ReactNode, useState} from "react";
import {analyze, sendMessage} from "./functions/api.ts";
import {analyze, sendMessage, suggest} from "./functions/api.ts";

export type Message = {
text: string | ReactNode,
Expand Down Expand Up @@ -77,11 +77,35 @@ function App() {
setMessages((messages) => [...messages]);
}

const onSuggest = async () => {
const sendingMessage: Message = {
text: 'Waiting for interview question suggestions...',
isUser: false
};
// show loading message
setMessages((messages) => [...messages, {
text: 'Suggest interview questions',
isUser: true
}, sendingMessage]);
// show loading message
const response = await suggest();
if (null === response) {
sendingMessage.text = "Something went wrong, please try again later."
} else {
sendingMessage.text = (
<>
<div className="font-bold">Suggested questions:<br/>{response.response}</div>
</>
);
}
setMessages((messages) => [...messages]);
}

return (
<div className="flex flex-col h-screen bg-gray-100 p-5">
<Header/>
<Content messages={messages}></Content>
<ChatBox onSendMessage={onSendMessage} onAnalyze={onAnalyze}></ChatBox>
<ChatBox onSendMessage={onSendMessage} onAnalyze={onAnalyze} onSuggest={onSuggest}></ChatBox>
</div>
)
}
Expand Down
7 changes: 6 additions & 1 deletion fe_repo/src/functions/api.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {expect, test} from 'vitest';
import {analyze, login, sendMessage, uploadFile} from "./api.ts";
import {analyze, login, sendMessage, suggest, uploadFile} from "./api.ts";

test('sendMessage', () => {
expect(sendMessage("I'm adam")).toBeDefined();
Expand All @@ -24,3 +24,8 @@ test('login', () => {
// make sure message is always returned
expect(login('')).toBeDefined();
})

test('suggest', () => {
// make sure message is always returned
expect(async () => (await suggest())).toBeDefined();
})
16 changes: 16 additions & 0 deletions fe_repo/src/functions/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,22 @@ export type LoginResponse = {
user_id: string
}

export async function suggest(): Promise<QuestionResponse | null> {
try {
return axios.post<QuestionResponse>(uri + '/suggest/interiew_question',
{user_id: getUserId()},
{headers: {'Content-Type': 'multipart/form-data'}})
.then(response => response.data)
.catch(error => {
console.error('Error fetching response', error);
return null;
});
} catch (error) {
console.error('Error fetching the backend response', error);
return null;
}
}

export async function sendMessage(message: string): Promise<QuestionResponse> {
console.log("Sending message: " + message);
try {
Expand Down
13 changes: 10 additions & 3 deletions fe_repo/src/pages/ChatBox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ import xss from "xss";
interface IChatBoxProps {
onSendMessage: (message: string) => void;
onAnalyze: (jd: string) => void;
onSuggest: () => void;
}

export const ChatBox = ({onSendMessage, onAnalyze}: IChatBoxProps) => {
export const ChatBox = ({onSendMessage, onAnalyze, onSuggest}: IChatBoxProps) => {

const [message, setMessage] = useState("");
const [showPrompt, setShowPrompt] = useState(false);
Expand Down Expand Up @@ -87,11 +88,17 @@ export const ChatBox = ({onSendMessage, onAnalyze}: IChatBoxProps) => {
/>
</div>
<button
className="cursor-pointer px-4 py-2 rounded-full bg-blue-500 text-white text-sm flex items-center gap-1 hover:bg-blue-600 transition"
onClick={() => setShowPrompt(true)}
className="cursor-pointer px-4 py-2 rounded-full bg-blue-500 text-white text-sm flex items-center gap-1 hover:bg-blue-600 transition"
onClick={() => setShowPrompt(true)}
>
<span className="text-base">📄</span> Analyze my resume
</button>
<button
className="cursor-pointer px-4 py-2 rounded-full bg-blue-500 text-white text-sm flex items-center gap-1 hover:bg-blue-600 transition"
onClick={() => onSuggest()}
>
<span className="text-base">🛈</span> Interview question suggestion
</button>
{/*🛈 /!* Example icon - you can use actual icons here *!/*/}
{/*💼 /!* Example icon for interview *!/*/}
</div>
Expand Down
Loading