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
16 changes: 16 additions & 0 deletions be_repo/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,5 +202,21 @@ def interview_question_suggestion():
return jsonify({"response": response}), 200


@app.route('/suggest/jobs', methods=['POST', 'OPTIONS'])
def job_suggestion():
if request.method == 'OPTIONS':
return jsonify({'status': 'OK'}), 200

user_id = request.form.get('user_id')

if not user_id:
return jsonify({"error": "No user ID provided."}), 400

# Get answer using LangGraph
response = 'Example response'

return jsonify({"response": response}), 200


if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True, port=5000)
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, suggest} from "./functions/api.ts";
import {analyze, sendMessage, suggest, suggestJob} from "./functions/api.ts";

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

const onSuggestJob = async () => {
const sendingMessage: Message = {
text: 'Waiting for job suggestions...',
isUser: false
};
// show loading message
setMessages((messages) => [...messages, {
text: 'Suggest jobs',
isUser: true
}, sendingMessage]);
// show loading message
const response = await suggestJob();
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} onSuggest={onSuggest}></ChatBox>
<ChatBox onSendMessage={onSendMessage} onAnalyze={onAnalyze} onSuggest={onSuggest} onSuggestJob={onSuggestJob}></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, getHasResume, getUserId, login, sendMessage, suggest, uploadFile} from "./api.ts";
import {analyze, getHasResume, getUserId, login, sendMessage, suggest, uploadFile, suggestJob} from "./api.ts";

test('sendMessage', () => {
expect(sendMessage("I'm adam")).toBeDefined();
Expand Down Expand Up @@ -30,6 +30,11 @@ test('suggest', () => {
expect(async () => (await suggest())).toBeDefined();
})

test('suggestJob', () => {
// make sure message is always returned
expect(async () => (await suggestJob())).toBeDefined();
})

test('getUserId', () => {
// make sure message is always returned
expect(getUserId()).toBeDefined();
Expand Down
16 changes: 16 additions & 0 deletions fe_repo/src/functions/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,22 @@ export async function suggest(): Promise<QuestionResponse | null> {
}
}

export async function suggestJob(): Promise<QuestionResponse | null> {
try {
return axios.post<QuestionResponse>(uri + '/suggest/jobs',
{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
15 changes: 14 additions & 1 deletion fe_repo/src/pages/ChatBox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ interface IChatBoxProps {
onSendMessage: (message: string) => void;
onAnalyze: (jd: string) => void;
onSuggest: () => void;
onSuggestJob: () => void;
}

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

const [message, setMessage] = useState("");
const [showPrompt, setShowPrompt] = useState(false);
Expand Down Expand Up @@ -123,6 +124,18 @@ export const ChatBox = ({onSendMessage, onAnalyze, onSuggest}: IChatBoxProps) =>
>
<span className="text-base">🛈</span> Interview question suggestion
</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={() => {
if (!hasResume) {
alert("Please upload your resume.");
return;
}
onSuggestJob();
}}
>
<span className="text-base">💼</span> Job suggestion
</button>
{/*🛈 /!* Example icon - you can use actual icons here *!/*/}
{/*💼 /!* Example icon for interview *!/*/}
</div>
Expand Down
Loading