Files
nextplacement/apps/admin/app/(main)/jobs/[jobId]/StatusSelect.tsx
2025-09-02 17:38:19 +05:30

66 lines
1.6 KiB
TypeScript

'use client';
import { useEffect, useState, useTransition } from 'react';
import {
Select,
SelectTrigger,
SelectContent,
SelectItem,
SelectValue,
} from '@workspace/ui/components/select';
const STATUS_OPTIONS = [
'in review',
'Online Assessment',
'Interview round',
'offer given',
'accepted',
'rejected',
];
interface StatusSelectProps {
applicationId: number;
initialStatus: string;
studentId: number;
}
export default function StatusSelect({
applicationId,
initialStatus,
studentId,
}: StatusSelectProps) {
const [status, setStatus] = useState(initialStatus);
const [isPending, startTransition] = useTransition();
// Sync local state when parent updates the initialStatus (e.g., after bulk update)
useEffect(() => {
setStatus(initialStatus);
}, [initialStatus]);
const handleChange = (value: string) => {
setStatus(value); // Optimistic update
startTransition(async () => {
await fetch(`/api/applications/${applicationId}/status`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ status: value, studentId }),
});
});
};
return (
<Select value={status} onValueChange={handleChange} disabled={isPending}>
<SelectTrigger className="min-w-[160px]">
<SelectValue placeholder="Select status" />
</SelectTrigger>
<SelectContent>
{STATUS_OPTIONS.map((option) => (
<SelectItem key={option} value={option}>
{option}
</SelectItem>
))}
</SelectContent>
</Select>
);
}