'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { useQuery, useMutation } from '@tanstack/react-query'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { circulationService } from '@/lib/services/circulation.service'; import { userService } from '@/lib/services/user.service'; import { correspondenceService } from '@/lib/services/correspondence.service'; import { CreateCirculationDto } from '@/types/circulation'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Badge } from '@/components/ui/badge'; import { ArrowLeft, Check, ChevronsUpDown, X } from 'lucide-react'; import Link from 'next/link'; import { toast } from 'sonner'; import { cn } from '@/lib/utils'; // Force dynamic rendering to prevent build-time prerendering issues export const dynamic = 'force-dynamic'; // Ensure this page is never statically generated export const fetchCache = 'force-no-store'; // Form validation schema const formSchema = z.object({ correspondenceId: z.string().min(1, 'Please select a document'), subject: z.string().min(1, 'Subject is required'), assigneeIds: z.array(z.string()).min(1, 'At least one assignee is required'), remarks: z.string().optional(), }); type FormData = z.infer; export default function CreateCirculationPage() { const router = useRouter(); const [assigneeOpen, setAssigneeOpen] = useState(false); const [docOpen, setDocOpen] = useState(false); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { subject: '', assigneeIds: [], remarks: '', }, }); // Fetch users for assignee selection const { data: users = [] } = useQuery({ queryKey: ['users'], queryFn: () => userService.getAll(), }); // Fetch correspondences for document selection const { data: correspondences } = useQuery({ queryKey: ['correspondences-dropdown'], queryFn: () => correspondenceService.getAll({ limit: 100 }), }); const createMutation = useMutation({ mutationFn: (data: CreateCirculationDto) => circulationService.create(data), onSuccess: (result) => { toast.success('Circulation created successfully'); router.push(`/circulation/${result.publicId}`); }, onError: () => { toast.error('Failed to create circulation'); }, }); const onSubmit = (data: FormData) => { createMutation.mutate(data); }; const selectedAssignees = form.watch('assigneeIds'); const selectedDocId = form.watch('correspondenceId'); const selectedDoc = correspondences?.data?.find((c: { publicId: string }) => c.publicId === selectedDocId); const toggleAssignee = (userUuid: string) => { const current = form.getValues('assigneeIds'); if (current.includes(userUuid)) { form.setValue( 'assigneeIds', current.filter((id) => id !== userUuid) ); } else { form.setValue('assigneeIds', [...current, userUuid]); } }; return (
{/* Header */}

Create Circulation

Create a new internal document circulation

Circulation Details
{/* Document Selection */} ( Document No document found. {correspondences?.data?.map((doc: { publicId: string; correspondenceNumber: string }) => ( { form.setValue('correspondenceId', doc.publicId); setDocOpen(false); }} > {doc.correspondenceNumber} ))} )} /> {/* Subject */} ( Subject )} /> {/* Assignees Multi-select */} ( Assignees No user found. {users.map((user) => ( toggleAssignee(user.publicId)} > {user.firstName && user.lastName ? `${user.firstName} ${user.lastName}` : user.username} ))} )} /> {/* Remarks */} ( Remarks (Optional)