// React Imports import { useState, useEffect } from 'react' // MUI Imports import Button from '@mui/material/Button' import Drawer from '@mui/material/Drawer' import IconButton from '@mui/material/IconButton' import MenuItem from '@mui/material/MenuItem' import Typography from '@mui/material/Typography' import Divider from '@mui/material/Divider' import Grid from '@mui/material/Grid2' import Box from '@mui/material/Box' import Switch from '@mui/material/Switch' import FormControlLabel from '@mui/material/FormControlLabel' import Chip from '@mui/material/Chip' import InputAdornment from '@mui/material/InputAdornment' // Third-party Imports import { useForm, Controller, useFieldArray } from 'react-hook-form' // Component Imports import CustomTextField from '@core/components/mui/TextField' // Types export type TierType = { id: string // uuid name: string min_points: number benefits: Record created_at: string // ISO datetime updated_at: string // ISO datetime } export interface TierRequest { name: string min_points: number benefits: Record } type Props = { open: boolean handleClose: () => void data?: TierType // Data tier untuk edit (jika ada) } type FormValidateType = { name: string min_points: number benefits: string[] // Array of benefit names for easier form handling newBenefit: string // Temporary field for adding new benefits } // Initial form data const initialData: FormValidateType = { name: '', min_points: 0, benefits: [], newBenefit: '' } // Mock mutation hooks (replace with actual hooks) const useTierMutation = () => { const createTier = { mutate: (data: TierRequest, options?: { onSuccess?: () => void }) => { console.log('Creating tier:', data) setTimeout(() => options?.onSuccess?.(), 1000) } } const updateTier = { mutate: (data: { id: string; payload: TierRequest }, options?: { onSuccess?: () => void }) => { console.log('Updating tier:', data) setTimeout(() => options?.onSuccess?.(), 1000) } } return { createTier, updateTier } } const AddEditTierDrawer = (props: Props) => { // Props const { open, handleClose, data } = props // States const [showMore, setShowMore] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) const { createTier, updateTier } = useTierMutation() // Determine if this is edit mode const isEditMode = Boolean(data?.id) // Hooks const { control, reset: resetForm, handleSubmit, watch, setValue, formState: { errors } } = useForm({ defaultValues: initialData }) const watchedBenefits = watch('benefits') const watchedNewBenefit = watch('newBenefit') // Helper function to convert benefits object to string array const convertBenefitsToArray = (benefits: Record): string[] => { if (!benefits) return [] return Object.keys(benefits).filter(key => benefits[key] === true || benefits[key] === 'true') } // Helper function to convert benefits array to object const convertBenefitsToObject = (benefits: string[]): Record => { const benefitsObj: Record = {} benefits.forEach(benefit => { benefitsObj[benefit] = true }) return benefitsObj } // Effect to populate form when editing useEffect(() => { if (isEditMode && data) { // Convert benefits object to array for form handling const benefitsArray = convertBenefitsToArray(data.benefits) // Populate form with existing data const formData: FormValidateType = { name: data.name || '', min_points: data.min_points || 0, benefits: benefitsArray, newBenefit: '' } resetForm(formData) setShowMore(true) // Always show more for edit mode } else { // Reset to initial data for add mode resetForm(initialData) setShowMore(false) } }, [data, isEditMode, resetForm]) const handleAddBenefit = () => { if (watchedNewBenefit.trim()) { const currentBenefits = watchedBenefits || [] setValue('benefits', [...currentBenefits, watchedNewBenefit.trim()]) setValue('newBenefit', '') } } const handleRemoveBenefit = (index: number) => { const currentBenefits = watchedBenefits || [] const newBenefits = currentBenefits.filter((_, i) => i !== index) setValue('benefits', newBenefits) } const handleKeyPress = (event: React.KeyboardEvent) => { if (event.key === 'Enter') { event.preventDefault() handleAddBenefit() } } const handleFormSubmit = async (formData: FormValidateType) => { try { setIsSubmitting(true) // Convert benefits array back to object format const benefitsObj = convertBenefitsToObject(formData.benefits) // Create TierRequest object const tierRequest: TierRequest = { name: formData.name, min_points: formData.min_points, benefits: benefitsObj } if (isEditMode && data?.id) { // Update existing tier updateTier.mutate( { id: data.id, payload: tierRequest }, { onSuccess: () => { handleReset() handleClose() } } ) } else { // Create new tier createTier.mutate(tierRequest, { onSuccess: () => { handleReset() handleClose() } }) } } catch (error) { console.error('Error submitting tier:', error) // Handle error (show toast, etc.) } finally { setIsSubmitting(false) } } const handleReset = () => { handleClose() resetForm(initialData) setShowMore(false) } const formatNumber = (value: number) => { return new Intl.NumberFormat('id-ID').format(value) } return ( {/* Sticky Header */}
{isEditMode ? 'Edit Tier' : 'Tambah Tier Baru'}
{/* Scrollable Content */}
{/* Nama Tier */}
Nama Tier * ( )} />
{/* Minimum Points */}
Minimum Poin * ( 0 ? `${formatNumber(field.value)} poin` : '') } InputProps={{ endAdornment: poin }} onChange={e => field.onChange(Number(e.target.value))} /> )} />
{/* Benefits */}
Manfaat Tier * {/* Display current benefits */} {watchedBenefits && watchedBenefits.length > 0 && (
{watchedBenefits.map((benefit, index) => ( handleRemoveBenefit(index)} color='primary' variant='outlined' size='small' /> ))}
)} {/* Add new benefit */} ( ) }} /> )} /> {(!watchedBenefits || watchedBenefits.length === 0) && ( Minimal satu manfaat harus ditambahkan )}
{/* Tampilkan selengkapnya */} {!showMore && ( )} {/* Konten tambahan */} {showMore && ( <> {/* Sembunyikan */} )}
{/* Sticky Footer */}
) } export default AddEditTierDrawer