149 lines
6.2 KiB
JavaScript
149 lines
6.2 KiB
JavaScript
import React, { useState, useEffect } from 'react';
|
|
import axios from 'axios';
|
|
|
|
const apiUrl = process.env.REACT_APP_API_URL;
|
|
|
|
function CareerModal({ career, careerDetails, closeModal, addCareerToList }) {
|
|
|
|
const [error, setError] = useState(null);
|
|
|
|
console.log('CareerModal props:', { career, careerDetails});
|
|
|
|
if (!careerDetails?.salaryData) {
|
|
return (
|
|
<div className="fixed inset-0 bg-gray-900 bg-opacity-70 flex justify-center items-center z-50">
|
|
<div className="bg-white rounded-lg shadow-lg p-6">
|
|
<p className="text-lg text-gray-700">Loading career details...</p>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
if (error) return <div>{error}</div>;
|
|
|
|
const calculateStabilityRating = (salaryData) => {
|
|
const medianSalaryObj = salaryData.find(s => s.percentile === 'Median');
|
|
const medianSalary = medianSalaryObj?.regionalSalary || medianSalaryObj?.nationalSalary || 0;
|
|
|
|
if (medianSalary >= 90000) return 5;
|
|
if (medianSalary >= 70000) return 4;
|
|
if (medianSalary >= 50000) return 3;
|
|
if (medianSalary >= 30000) return 2;
|
|
return 1;
|
|
};
|
|
|
|
|
|
return (
|
|
<div className="fixed inset-0 bg-gray-900 bg-opacity-70 flex justify-center items-center overflow-auto z-50">
|
|
<div className="bg-white rounded-lg shadow-lg w-full max-w-5xl p-6 m-4 max-h-[90vh] overflow-y-auto">
|
|
|
|
<div className="flex justify-between items-center mb-4 pb-2 border-b">
|
|
<h2 className="text-2xl font-bold text-blue-600">{careerDetails.title}</h2>
|
|
<div className="flex gap-2">
|
|
<button
|
|
onClick={() => {
|
|
const stabilityRating = calculateStabilityRating(careerDetails.salaryData);
|
|
addCareerToList({
|
|
...careerDetails,
|
|
ratings: {
|
|
stability: stabilityRating
|
|
}
|
|
});
|
|
}}
|
|
className="text-white bg-green-500 hover:bg-green-600 rounded px-3 py-1"
|
|
>
|
|
Add to Comparison
|
|
</button>
|
|
|
|
|
|
<button
|
|
onClick={closeModal}
|
|
className="text-white bg-red-500 hover:bg-red-600 rounded px-3 py-1"
|
|
>
|
|
Close
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Job Description */}
|
|
<div className="mb-4">
|
|
<h3 className="text-lg font-semibold mb-1">Job Description:</h3>
|
|
<p className="text-gray-700">{careerDetails.jobDescription}</p>
|
|
</div>
|
|
|
|
{/* Tasks (full width) */}
|
|
<div className="mb-4 border-t pt-3">
|
|
<h3 className="text-lg font-semibold mb-2">Tasks:</h3>
|
|
<ul className="list-disc pl-5 space-y-1">
|
|
{careerDetails.tasks.map((task, i) => (
|
|
<li key={i}>{task}</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
|
|
{/* Salary and Economic Projections side-by-side */}
|
|
<div className="flex flex-col md:flex-row gap-4 border-t pt-3">
|
|
{/* Salary Data */}
|
|
<div className="md:w-1/2 overflow-x-auto">
|
|
<h3 className="text-lg font-semibold mb-2">Salary Data:</h3>
|
|
<table className="w-full text-left border border-gray-300 rounded">
|
|
<thead className="bg-gray-100">
|
|
<tr>
|
|
<th className="px-3 py-2 border-b">Percentile</th>
|
|
<th className="px-3 py-2 border-b">Regional Salary</th>
|
|
<th className="px-3 py-2 border-b">National Salary</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{careerDetails.salaryData.map((s, i) => (
|
|
<tr key={i}>
|
|
<td className="px-3 py-2 border-b">{s.percentile}</td>
|
|
<td className="px-3 py-2 border-b">${s.regionalSalary.toLocaleString()}</td>
|
|
<td className="px-3 py-2 border-b">${s.nationalSalary.toLocaleString()}</td>
|
|
</tr>
|
|
))}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
{/* Economic Projections */}
|
|
<div className="md:w-1/2 overflow-x-auto">
|
|
<h3 className="text-lg font-semibold mb-2">Economic Projections:</h3>
|
|
<table className="w-full text-left border border-gray-300 rounded">
|
|
<thead className="bg-gray-100">
|
|
<tr>
|
|
<th className="px-3 py-2 border-b">Region</th>
|
|
<th className="px-3 py-2 border-b">Current Jobs</th>
|
|
<th className="px-3 py-2 border-b">Jobs in 10 yrs</th>
|
|
<th className="px-3 py-2 border-b">Growth %</th>
|
|
<th className="px-3 py-2 border-b">Annual Openings</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{careerDetails.economicProjections.state && (
|
|
<tr>
|
|
<td className="px-3 py-2 border-b">{careerDetails.economicProjections.state.area}</td>
|
|
<td className="px-3 py-2 border-b">{careerDetails.economicProjections.state.base.toLocaleString()}</td>
|
|
<td className="px-3 py-2 border-b">{careerDetails.economicProjections.state.projection.toLocaleString()}</td>
|
|
<td className="px-3 py-2 border-b">{careerDetails.economicProjections.state.percentChange}%</td>
|
|
<td className="px-3 py-2 border-b">{careerDetails.economicProjections.state.annualOpenings.toLocaleString()}</td>
|
|
</tr>
|
|
)}
|
|
{careerDetails.economicProjections.national && (
|
|
<tr>
|
|
<td className="px-3 py-2 border-b">National</td>
|
|
<td className="px-3 py-2 border-b">{careerDetails.economicProjections.national.base.toLocaleString()}</td>
|
|
<td className="px-3 py-2 border-b">{careerDetails.economicProjections.national.projection.toLocaleString()}</td>
|
|
<td className="px-3 py-2 border-b">{careerDetails.economicProjections.national.percentChange}%</td>
|
|
<td className="px-3 py-2 border-b">{careerDetails.economicProjections.national.annualOpenings.toLocaleString()}</td>
|
|
</tr>
|
|
)}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default CareerModal; |