File size: 4,310 Bytes
e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | import { getAllInterviewReports, generateInterviewReport, getInterviewReportById, generateResumePdf, evaluateAnswerAPI } from "../services/interview.api"
import { useContext, useEffect } from "react"
import { InterviewContext } from "../interview.context"
import { useParams } from "react-router"
export const useInterview = () => {
const context = useContext(InterviewContext)
const { interviewId } = useParams()
if (!context) {
throw new Error("useInterview must be used within an InterviewProvider")
}
const { loading, setLoading, report, setReport, reports, setReports } = context
const evaluateAnswer = async ({ question, answer }) => {
try {
const response = await evaluateAnswerAPI({ question, answer })
return response.evaluation
} catch (error) {
console.error("Error evaluating answer:", error)
return null
}
}
const generateReport = async ({ jobDescription, selfDescription, resumeFile }) => {
setLoading(true)
let response = null
try {
response = await generateInterviewReport({ jobDescription, selfDescription, resumeFile })
if (response && response.interviewReport) {
setReport(response.interviewReport)
}
} catch (error) {
console.error("Error generating report:", error)
setLoading(false)
return { error: error.response?.data?.error || error.response?.data?.message || error.message }
} finally {
setLoading(false)
}
return response && response.interviewReport ? response.interviewReport : null
}
const getReportById = async (interviewId) => {
setLoading(true)
let response = null
try {
response = await getInterviewReportById(interviewId)
if (response && response.interviewReport) {
setReport(response.interviewReport)
}
} catch (error) {
console.error("Error fetching report by ID:", error)
} finally {
setLoading(false)
}
return response && response.interviewReport ? response.interviewReport : null
}
const getReports = async () => {
setLoading(true)
let response = null
try {
response = await getAllInterviewReports()
if (response && response.interviewReports) {
setReports(response.interviewReports)
}
} catch (error) {
console.error("Error fetching reports:", error)
} finally {
setLoading(false)
}
return response && response.interviewReports ? response.interviewReports : []
}
const getResumePdf = async (interviewReportId, candidateAnswers = []) => {
setLoading(true)
let response = null
try {
response = await generateResumePdf({ interviewReportId, candidateAnswers })
const url = window.URL.createObjectURL(new Blob([ response ], { type: "application/pdf" }))
const link = document.createElement("a")
link.href = url
link.setAttribute("download", `resume_${interviewReportId}.pdf`)
document.body.appendChild(link)
link.click()
link.remove()
window.URL.revokeObjectURL(url)
}
catch (error) {
console.error("PDF Download Error:", error)
let errorMessage = "Failed to download resume.\nError message: " + error.message;
if (error.response && error.response.data instanceof Blob) {
try {
const text = await error.response.data.text();
const json = JSON.parse(text);
errorMessage += "\n\nServer Reason: " + (json.error || json.message);
} catch(e){}
}
alert(errorMessage)
} finally {
setLoading(false)
}
}
useEffect(() => {
if (interviewId) {
getReportById(interviewId)
} else {
getReports()
}
}, [ interviewId ])
return { loading, report, reports, generateReport, getReportById, getReports, getResumePdf, evaluateAnswer }
} |