From 4f46a2a45ea545ba0473352172063bf61ce363a1 Mon Sep 17 00:00:00 2001 From: HaochenCode Date: Thu, 21 Nov 2024 15:54:45 -0500 Subject: [PATCH 1/3] feat: implement job suggestion --- be_repo/app.py | 16 ++++++++++++++++ fe_repo/src/App.tsx | 28 ++++++++++++++++++++++++++-- fe_repo/src/functions/api.test.ts | 5 +++++ fe_repo/src/functions/api.ts | 16 ++++++++++++++++ fe_repo/src/pages/ChatBox.tsx | 15 ++++++++++++++- 5 files changed, 77 insertions(+), 3 deletions(-) diff --git a/be_repo/app.py b/be_repo/app.py index 2e581391c..9d12398e1 100644 --- a/be_repo/app.py +++ b/be_repo/app.py @@ -202,5 +202,21 @@ def interview_question_suggestion(): return jsonify({"response": response}), 200 +@app.route('/suggest/jobs', methods=['POST', 'OPTIONS']) +def interview_question_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) diff --git a/fe_repo/src/App.tsx b/fe_repo/src/App.tsx index d8b49caa2..bccec274f 100644 --- a/fe_repo/src/App.tsx +++ b/fe_repo/src/App.tsx @@ -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, @@ -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 = ( + <> +
Suggested questions:
{response.response}
+ + ); + } + setMessages((messages) => [...messages]); + } + return (
- +
) } diff --git a/fe_repo/src/functions/api.test.ts b/fe_repo/src/functions/api.test.ts index 9f6d3cabe..ac8aec433 100644 --- a/fe_repo/src/functions/api.test.ts +++ b/fe_repo/src/functions/api.test.ts @@ -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(); diff --git a/fe_repo/src/functions/api.ts b/fe_repo/src/functions/api.ts index 74994c278..bc47d7b25 100644 --- a/fe_repo/src/functions/api.ts +++ b/fe_repo/src/functions/api.ts @@ -40,6 +40,22 @@ export async function suggest(): Promise { } } +export async function suggestJob(): Promise { + try { + return axios.post(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 { console.log("Sending message: " + message); try { diff --git a/fe_repo/src/pages/ChatBox.tsx b/fe_repo/src/pages/ChatBox.tsx index 6def13ecf..1010dce3a 100644 --- a/fe_repo/src/pages/ChatBox.tsx +++ b/fe_repo/src/pages/ChatBox.tsx @@ -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); @@ -123,6 +124,18 @@ export const ChatBox = ({onSendMessage, onAnalyze, onSuggest}: IChatBoxProps) => > 🛈 Interview question suggestion + {/*🛈 /!* Example icon - you can use actual icons here *!/*/} {/*💼 /!* Example icon for interview *!/*/} From d4bd8d22a8faaeabfb22e62bd845664977a66cd4 Mon Sep 17 00:00:00 2001 From: HaochenCode Date: Thu, 21 Nov 2024 15:58:35 -0500 Subject: [PATCH 2/3] feat: implement job suggestion --- fe_repo/src/functions/api.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fe_repo/src/functions/api.test.ts b/fe_repo/src/functions/api.test.ts index ac8aec433..bd0f8ec06 100644 --- a/fe_repo/src/functions/api.test.ts +++ b/fe_repo/src/functions/api.test.ts @@ -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(); From 0ac79962e226b5ffd6ffd8eb97dff845d0ffa483 Mon Sep 17 00:00:00 2001 From: Linchen Xu <592789211@qq.com> Date: Thu, 21 Nov 2024 16:17:03 -0500 Subject: [PATCH 3/3] fix: change method name --- be_repo/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/be_repo/app.py b/be_repo/app.py index 9d12398e1..32c904b29 100644 --- a/be_repo/app.py +++ b/be_repo/app.py @@ -203,7 +203,7 @@ def interview_question_suggestion(): @app.route('/suggest/jobs', methods=['POST', 'OPTIONS']) -def interview_question_suggestion(): +def job_suggestion(): if request.method == 'OPTIONS': return jsonify({'status': 'OK'}), 200