import { apiConfig } from '@/config/api.config'; import { Alert, useDataGrid } from '@/components'; import { useCallApi } from '@/hooks'; import { getAuth } from '@/auth'; import React, { useCallback, useEffect, useRef, useState } from 'react'; import { toast } from 'sonner'; import { Dialog, DialogBody, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { NumericFormat } from 'react-number-format'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { useManageRewardContext } from '../hooks/useManageRewardContext'; import { doSaveLogActivity } from '@/actions/GlobalActions'; import { RefreshCw } from 'lucide-react'; const API_URL = apiConfig.service_master_data; const EditDialog = () => { const parentRef = useRef(null); const { showEditDialog, handleEditDialog, selectedReward } = useManageRewardContext(); const { reload } = useDataGrid(); const { PutData, GetData } = useCallApi(); const parsedUser = getAuth()?.user; const [isLoading, setIsLoading] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [alert, setAlert] = useState({ show: false, message: '' }); const initialState = { name: '', type: '', amount: 0, status: '', updated_by: '', updated_at: '' }; const [formField, setFormField] = useState(initialState); const updated_time = new Date(); const formattedTime = updated_time.toISOString().slice(0, 19).replace('T', ' '); const resetForm = () => { setFormField(initialState); setAlert({ show: false, message: '' }); }; const RewardType = { 'Daily Check in': 'D', Referal: 'R', 'Level Pro': 'P', 'Level Prioritas': 'L' } as const; type RewardTypeValue = (typeof RewardType)[keyof typeof RewardType]; const doUpdateReward = useCallback( async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); try { const response = await PutData(`${API_URL}/reward/update/${selectedReward}`, formField); if (response?.status) { resetForm(); handleEditDialog(false, null); toast.success('Success Update Reward'); reload(); const editActivity = { module: 'Manage Reward', description: `Edit Reward => ${formField.name}`, action: 'U' }; doSaveLogActivity(editActivity); } else { toast.error('Error Update Reward'); setAlert({ show: true, message: response?.message }); } } catch (error) { toast.error('Something went wrong, please try again.'); } finally { setIsSubmitting(false); } }, [selectedReward, formField] ); const doFetchData = useCallback(async (id: string) => { setIsLoading(true); const minDelay = new Promise((resolve) => setTimeout(resolve, 300)); const fetchData = GetData(`${API_URL}/reward/getdata/${id}`, { id }); const [response] = await Promise.all([fetchData, minDelay]); // console.log('API Response:', response); if (response?.status) { setFormField((prev) => ({ ...prev, name: response.data.name, type: response.data.type, amount: response.data.amount, status: response.data.status })); } setIsLoading(false); }, []); // const handleUpdate = (e: React.FormEvent) => { // e.preventDefault(); // if ( // formField.name === '' || // formField.type === '' || // formField.amount === 0 || // formField.status === '' // ) { // setAlert({ show: true, message: 'Please fill in all required fields.' }); // return; // } // doUpdateReward(e); // // console.log(formField); // setAlert({ show: false, message: '' }); // }; useEffect(() => { if (selectedReward) { doFetchData(selectedReward); } }, [selectedReward]); useEffect(() => { if (showEditDialog && selectedReward) { setFormField((prev) => ({ ...prev, updated_by: parsedUser.username, updated_at: formattedTime })); } }, [showEditDialog, selectedReward]); useEffect(() => { if (showEditDialog === false) { resetForm(); } }, [showEditDialog]); return ( handleEditDialog(open, null)}> Reward - Update
{alert.show && {alert.message}} {isLoading ? (

Loading Reward Details...

) : (
setFormField((prev) => ({ ...prev, name: e.target.value }))} />
{ setFormField((prev) => ({ ...prev, amount: values.floatValue || 0 })); }} placeholder="Enter Amount" />
)}
); }; export default EditDialog;