forked from Arnab-Afk/nextplacement
Compare commits
4 Commits
dependabot
...
fix/job-ap
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3a1deddb8c | ||
|
|
441ae8169b | ||
|
|
3bcb5b851d | ||
| 1648a56680 |
@@ -5,8 +5,8 @@
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "dotenv -e ../../.env -- next dev --turbopack -p 9001",
|
||||
"build": "dotenv -e ../../.env -- next build",
|
||||
"start": "dotenv -e ../../.env -- next start -p 9001",
|
||||
"build": "dotenv -e ../../.env -- next build && cp -r .next/static .next/standalone/apps/admin/.next/static && cp -r public .next/standalone/apps/admin/public",
|
||||
"start": "PORT=9001 dotenv -e ../../.env -- node .next/standalone/apps/admin/server.js",
|
||||
"lint": "next lint",
|
||||
"lint:fix": "next lint --fix",
|
||||
"typecheck": "tsc --noEmit"
|
||||
|
||||
@@ -40,6 +40,9 @@ export default function JobApplicationModal({ job, studentId, resumes, isApplied
|
||||
const [isPending, startTransition] = useTransition();
|
||||
const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null);
|
||||
|
||||
const deadline = new Date(job.applicationDeadline);
|
||||
const isDeadlinePassed = new Date() > deadline;
|
||||
|
||||
const handleApply = async () => {
|
||||
if (!selectedResume) {
|
||||
setMessage({ type: 'error', text: 'Please select a resume' });
|
||||
@@ -63,12 +66,14 @@ export default function JobApplicationModal({ job, studentId, resumes, isApplied
|
||||
setMessage({ type: 'error', text: result.error || 'Failed to submit application' });
|
||||
}
|
||||
} catch (error) {
|
||||
setMessage({ type: 'error', text: 'An error occurred while submitting your application' });
|
||||
setMessage({
|
||||
type: 'error',
|
||||
text: error instanceof Error ? error.message : 'An error occurred while submitting your application'
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const isDeadlinePassed = new Date() > new Date(job.applicationDeadline as any);
|
||||
const cannotApplyReason = isApplied
|
||||
? 'You have already applied to this job'
|
||||
: resumes.length === 0
|
||||
@@ -78,21 +83,33 @@ export default function JobApplicationModal({ job, studentId, resumes, isApplied
|
||||
: null;
|
||||
|
||||
return (
|
||||
<Dialog open={isOpen} onOpenChange={setIsOpen}>
|
||||
<DialogTrigger asChild>
|
||||
<Dialog open={isOpen} onOpenChange={(open) => !isPending && setIsOpen(open)}>
|
||||
{!cannotApplyReason && (
|
||||
<DialogTrigger asChild>
|
||||
<div className="flex flex-col items-start">
|
||||
<Button
|
||||
size="sm"
|
||||
className="bg-blue-600 hover:bg-blue-700"
|
||||
>
|
||||
Apply Now
|
||||
</Button>
|
||||
</div>
|
||||
</DialogTrigger>
|
||||
)}
|
||||
|
||||
{cannotApplyReason && (
|
||||
<div className="flex flex-col items-start">
|
||||
<Button
|
||||
size="sm"
|
||||
className="bg-blue-600 hover:bg-blue-700"
|
||||
disabled={Boolean(cannotApplyReason)}
|
||||
disabled
|
||||
>
|
||||
{isApplied ? 'Applied' : 'Apply Now'}
|
||||
</Button>
|
||||
{cannotApplyReason && (
|
||||
<span className="mt-1 text-xs text-red-600">{cannotApplyReason}</span>
|
||||
)}
|
||||
<span className="mt-1 text-xs text-red-600">{cannotApplyReason}</span>
|
||||
</div>
|
||||
</DialogTrigger>
|
||||
)}
|
||||
|
||||
<DialogContent className="max-w-2xl max-h-[90vh] overflow-y-auto">
|
||||
<DialogHeader>
|
||||
<DialogTitle className="flex items-center gap-2">
|
||||
@@ -127,7 +144,7 @@ export default function JobApplicationModal({ job, studentId, resumes, isApplied
|
||||
</div>
|
||||
<div className="flex items-center gap-1">
|
||||
<Calendar className="w-4 h-4" />
|
||||
<span>Deadline: {job.applicationDeadline.toLocaleDateString()}</span>
|
||||
<span>Deadline: {deadline.toLocaleDateString()}</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-1">
|
||||
<Star className="w-4 h-4" />
|
||||
@@ -162,6 +179,18 @@ export default function JobApplicationModal({ job, studentId, resumes, isApplied
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
|
||||
{selectedResume && (
|
||||
<a
|
||||
href={resumes.find(r => r.id.toString() === selectedResume)?.fileUrl}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-sm text-blue-600 underline mt-2 inline-block"
|
||||
>
|
||||
Preview selected resume
|
||||
</a>
|
||||
)}
|
||||
|
||||
{resumes.length === 0 && (
|
||||
<p className="text-sm text-red-600 mt-1">
|
||||
No resumes found. Please upload a resume first.
|
||||
@@ -171,11 +200,10 @@ export default function JobApplicationModal({ job, studentId, resumes, isApplied
|
||||
|
||||
{/* Message Display */}
|
||||
{message && (
|
||||
<div className={`p-3 rounded-lg ${
|
||||
message.type === 'success'
|
||||
<div className={`p-3 rounded-lg ${message.type === 'success'
|
||||
? 'bg-green-100 text-green-700 border border-green-200'
|
||||
: 'bg-red-100 text-red-700 border border-red-200'
|
||||
}`}>
|
||||
}`}>
|
||||
<div className="flex items-center gap-2">
|
||||
{message.type === 'success' ? (
|
||||
<CheckCircle className="w-4 h-4" />
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "dotenv -e ../../.env -- next dev --turbopack -p 9000",
|
||||
"build": "dotenv -e ../../.env -- next build",
|
||||
"start": "dotenv -e ../../.env -- next start -p 9000",
|
||||
"build": "dotenv -e ../../.env -- next build && cp -r .next/static .next/standalone/apps/student/.next/static && cp -r public .next/standalone/apps/student/public",
|
||||
"start": "PORT=9000 dotenv -e ../../.env -- node .next/standalone/apps/student/server.js",
|
||||
"lint": "next lint",
|
||||
"lint:fix": "next lint --fix",
|
||||
"typecheck": "tsc --noEmit"
|
||||
|
||||
1
nextplacement
Submodule
1
nextplacement
Submodule
Submodule nextplacement added at 1648a56680
@@ -34,6 +34,6 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"nodemailer": "^7.0.7"
|
||||
"nodemailer": "^7.0.6"
|
||||
}
|
||||
}
|
||||
|
||||
10
pnpm-lock.yaml
generated
10
pnpm-lock.yaml
generated
@@ -9,8 +9,8 @@ importers:
|
||||
.:
|
||||
dependencies:
|
||||
nodemailer:
|
||||
specifier: ^7.0.7
|
||||
version: 7.0.7
|
||||
specifier: ^7.0.6
|
||||
version: 7.0.6
|
||||
devDependencies:
|
||||
'@eslint/js':
|
||||
specifier: ^9.32.0
|
||||
@@ -3269,8 +3269,8 @@ packages:
|
||||
resolution: {integrity: sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
|
||||
nodemailer@7.0.7:
|
||||
resolution: {integrity: sha512-jGOaRznodf62TVzdyhKt/f1Q/c3kYynk8629sgJHpRzGZj01ezbgMMWJSAjHADcwTKxco3B68/R+KHJY2T5BaA==}
|
||||
nodemailer@7.0.6:
|
||||
resolution: {integrity: sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
|
||||
npm-run-path@4.0.1:
|
||||
@@ -7271,7 +7271,7 @@ snapshots:
|
||||
|
||||
nodemailer@6.10.1: {}
|
||||
|
||||
nodemailer@7.0.7: {}
|
||||
nodemailer@7.0.6: {}
|
||||
|
||||
npm-run-path@4.0.1:
|
||||
dependencies:
|
||||
|
||||
Reference in New Issue
Block a user