import * as Yup from 'yup'; import { useSnackbar } from 'notistack'; import { useNavigate } from 'react-router-dom'; import { yupResolver } from '@hookform/resolvers/yup'; import { Controller, useForm } from 'react-hook-form'; import React, { useRef, useEffect, useMemo, useState } from 'react'; import axios from '../../utils/axios'; import { FormProvider, RHFTextField } from '../../components/hook-form'; import { makeFormData } from '@/utils/jsonToFormData'; import { Autocomplete, Button, Grid, Stack, Table, TableBody, TableCell, TableRow, TextField, Typography, useTheme, List, ListItem, IconButton, ListItemAvatar, Avatar, ListItemText, Card, InputAdornment, Divider, ButtonBase, Box, } from '@mui/material'; import Iconify from '../../components/Iconify'; import CalendarTodayIcon from '@mui/icons-material/CalendarToday'; import { LoadingButton } from '@mui/lab'; import { fCurrency } from '../../utils/formatNumber'; import MemberSelectDialog from '../../components/dialogs/MemberSelectDialog'; import { Add, DeleteOutline } from '@mui/icons-material'; import { ClaimRequest, Files } from '@/@types/claims'; import { fDateTimesecond } from '@/utils/formatTime'; interface FormValuesProps extends Partial { taxes: boolean; inStock: boolean; } type Props = { isEdit: boolean; currentClaim?: ClaimRequest; }; export default function ClaimForm({ isEdit, currentClaim }: Props) { const navigate = useNavigate(); const { enqueueSnackbar } = useSnackbar(); const EditClaimSchema = Yup.object().shape({ organization_id: Yup.string().required('Code Provider is required'), }); const defaultValues = useMemo( () => ({ id: currentClaim?.id || '-', code: currentClaim?.code || '-', member_name: currentClaim?.member?.name || '-', date: currentClaim?.submission_date ? fDateTimesecond(currentClaim?.submission_date) : '-', claim_method: currentClaim?.payment_type || '-', service_type: currentClaim?.service_code || '-', organization_id: currentClaim?.organization?.code || '-', }), [currentClaim] ); useEffect(() => { if (isEdit && currentClaim) { reset(defaultValues); } if (!isEdit) { reset(defaultValues); } // setFileKondisis(currentClaim?.files_by_type?.claim_diagnosis); // setFileDiagnosas(currentClaim?.files_by_type?.claim_diagnosis); setFileHasilPenunjangCurrent(currentClaim?.files_by_type?.claim_result); }, [isEdit, currentClaim]); const methods = useForm({ resolver: yupResolver(EditClaimSchema), defaultValues, }); const { reset, watch, control, setValue, getValues, setError, handleSubmit, formState: { isSubmitting }, } = methods; const values = watch(); const [isCheckingLimit, setIsCheckingLimit] = useState(false); const [isEligible, setIsEligible] = useState(false); const [memberBenefits, setMemberBenefits] = useState([]); const [diagnosisOption, setDiagnosisOption] = useState([]); const [isMemberDialogOpen, setIsMemberDialogOpen] = useState(false); const [member, setMember] = useState({}) // ---------------------------------------------------------------------- // Files Result Kondisi const fileKondisiInput = useRef(null); const [fileKondisis, setFileKondisis] = useState([]); const handleKondisiInputChange = (event) => { if (event.target.files[0]) { setFileKondisis([...fileKondisis, ...event.target.files]); } else { console.log('NO FILE'); } }; const removeKondisiFiles = (filesState, index) => { setFileKondisis( filesState.filter((file, fileIndex) => { return fileIndex != index; }) ); }; // Files Result Diagnosa const fileDiagnosaInput = useRef(null); const [fileDiagnosas, setFileDiagnosas] = useState([]); const handleDiagnosaInputChange = (event) => { if (event.target.files[0]) { setFileDiagnosas([...fileDiagnosas, ...event.target.files]); } else { console.log('NO FILE'); } }; const removeDiagnosaFiles = (filesState, index) => { setFileDiagnosas( filesState.filter((file, fileIndex) => { return fileIndex != index; }) ); }; // Files Result Hasil Penunjang const fileHasilPenunjangInput = useRef(null); const [fileHasilPenunjangs, setFileHasilPenunjangs] = useState([]); const [fileHasilPenunjangsCurrent, setFileHasilPenunjangCurrent] = useState([]); const handleResultInputChange = (event) => { if (event.target.files[0]) { setFileHasilPenunjangs([...fileHasilPenunjangs, ...event.target.files]); } else { console.log('NO FILE'); } }; const removeFiles = (filesState, index) => { setFileHasilPenunjangs( filesState.filter((file, fileIndex) => { return fileIndex != index; }) ); }; const onSubmit = async (data: FormValuesProps) => { try { // const formData = new FormData(); // formData.append('result_files', fileHasilPenunjangs); // formData.append('diagnosa_files', fileDiagnosaInput); // formData.append('kondisi_files', fileKondisiInput); // formData.append('provider_code', data.organization_id); // formData.append('_method', 'PUT'); const formData = makeFormData({ result_files: fileHasilPenunjangs, diagnosa_files: fileDiagnosas, kondisi_files: fileKondisis, provider_code: data.organization_id, _method: 'PUT' }); const response = await axios.post(`/claim-requests/${data.id}`, formData); reset(); enqueueSnackbar('Claim Request Updated Successfully!', { variant: 'success' }); navigate('/claim-requests'); } catch (error: any) { if (error && error.response.status === 422) { for (const [key, value] of Object.entries(error.response.data.errors)) { // setError(key, { message: value[0] }); enqueueSnackbar('Failed Processing Request', { variant: 'error' }); } } else { enqueueSnackbar(error.message ?? 'Failed Processing Request', { variant: 'error' }); } } }; return ( Code* Name* {/* */} Date of Submission* Claim Method* Service Type* Code Provider* ), }} name="date" label="Date of Submission" disabled/> {/* -------------------------------Upload Dokumen Kondisi------------------------------- */} Condition Document {fileKondisis && fileKondisis.map((file, index) => ( {file.name} { removeKondisiFiles(fileKondisis, index); }} > ))} fileKondisiInput.current?.click()}> Add File {/* -------------------------------Upload Dokumen Diagnosa------------------------------- */} Diagnosis Document {fileDiagnosas && fileDiagnosas.map((file, index) => ( {file.name} { removeDiagnosaFiles(fileDiagnosas, index); }} > ))} fileDiagnosaInput.current?.click()}> Add Result {/* -------------------------------Upload Result Hasil Penunjang------------------------------- */} Supporting Result Document {fileHasilPenunjangs && fileHasilPenunjangs.map((file, index) => ( {file.name} { removeFiles(fileHasilPenunjangs, index); }} > ))} fileHasilPenunjangInput.current?.click()}> Add Result Update ); }