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 }

}