// 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 Box from '@mui/material/Box' // Third-party Imports import { useForm, Controller } from 'react-hook-form' // Component Imports import CustomTextField from '@core/components/mui/TextField' // Types import { CampaignRule, RuleType, RewardType, CampaignRuleRequest } from '@/types/services/campaign' import { useCampaignRulesMutation } from '@/services/mutations/campaign' type Props = { open: boolean handleClose: () => void campaignId: string // Required campaign ID data?: CampaignRule | null // Data for edit mode } type FormValidateType = { rule_type: RuleType condition_value: string reward_type: RewardType reward_value: number reward_subtype: string reward_ref_id: string } // Initial form data const initialData: FormValidateType = { rule_type: 'SPEND', condition_value: '', reward_type: 'POINTS', reward_value: 0, reward_subtype: '', reward_ref_id: '' } const AddEditCampaignRuleDrawer = (props: Props) => { // Props const { open, handleClose, campaignId, data } = props // States const [isSubmitting, setIsSubmitting] = useState(false) const { createCampaignRule, updateCampaignRule } = useCampaignRulesMutation() // Determine if this is edit mode const isEditMode = Boolean(data?.id) // Hooks const { control, reset: resetForm, handleSubmit, watch, formState: { errors } } = useForm({ defaultValues: initialData }) const watchedRewardType = watch('reward_type') // Effect to populate form when editing useEffect(() => { if (isEditMode && data) { const formData: FormValidateType = { rule_type: data.rule_type, condition_value: data.condition_value || '', reward_type: data.reward_type, reward_value: data.reward_value || 0, reward_subtype: data.reward_subtype || '', reward_ref_id: data.reward_ref_id || '' } resetForm(formData) } else { // Reset to initial data for add mode resetForm(initialData) } }, [data, isEditMode, resetForm]) const handleFormSubmit = async (formData: FormValidateType) => { try { setIsSubmitting(true) // Create CampaignRuleRequest object const ruleRequest: CampaignRuleRequest = { campaign_id: campaignId, rule_type: formData.rule_type, condition_value: formData.condition_value.trim() || undefined, reward_type: formData.reward_type, reward_value: formData.reward_value > 0 ? formData.reward_value : undefined, reward_subtype: formData.reward_subtype.trim() || undefined, reward_ref_id: formData.reward_ref_id.trim() || undefined } if (isEditMode && data?.id) { // Update existing campaign rule updateCampaignRule.mutate( { id: data.id, payload: ruleRequest }, { onSuccess: () => { handleReset() handleClose() }, onError: error => { console.error('Error updating campaign rule:', error) } } ) } else { // Create new campaign rule createCampaignRule.mutate(ruleRequest, { onSuccess: () => { handleReset() handleClose() }, onError: error => { console.error('Error creating campaign rule:', error) } }) } } catch (error) { console.error('Error submitting campaign rule:', error) } finally { setIsSubmitting(false) } } const handleReset = () => { handleClose() resetForm(initialData) } // Helper function to get rule type options const getRuleTypeOptions = () => [ { value: 'TIER', label: 'Tier Based', icon: 'tabler-medal' }, { value: 'SPEND', label: 'Spending Amount', icon: 'tabler-wallet' }, { value: 'PRODUCT', label: 'Product Based', icon: 'tabler-package' }, { value: 'CATEGORY', label: 'Category Based', icon: 'tabler-category' }, { value: 'DAY', label: 'Day Based', icon: 'tabler-calendar' }, { value: 'LOCATION', label: 'Location Based', icon: 'tabler-map-pin' } ] // Helper function to get reward type options const getRewardTypeOptions = () => [ { value: 'POINTS', label: 'Points', icon: 'tabler-coins' }, { value: 'TOKENS', label: 'Tokens', icon: 'tabler-ticket' }, { value: 'REWARD', label: 'Reward Item', icon: 'tabler-gift' } ] // Helper function to get condition placeholder based on rule type const getConditionPlaceholder = (ruleType: RuleType) => { switch (ruleType) { case 'TIER': return 'e.g., GOLD, SILVER, BRONZE' case 'SPEND': return 'e.g., 100000 (minimum spend amount)' case 'PRODUCT': return 'e.g., product_id_123' case 'CATEGORY': return 'e.g., electronics, fashion' case 'DAY': return 'e.g., monday, weekend' case 'LOCATION': return 'e.g., jakarta, bandung' default: return 'Enter condition value' } } // Helper function to get reward subtype options based on reward type const getRewardSubtypeOptions = (rewardType: RewardType) => { switch (rewardType) { case 'POINTS': return ['bonus', 'cashback', 'referral'] case 'TOKENS': return ['game', 'lottery', 'voucher'] case 'REWARD': return ['product', 'discount', 'currency', 'experience'] default: return [] } } return ( {/* Sticky Header */}
{isEditMode ? 'Edit Campaign Rule' : 'Add New Campaign Rule'}
{/* Scrollable Content */}
{/* Rule Type */}
Rule Type * ( {getRuleTypeOptions().map(option => (
{option.label}
))}
)} />
{/* Condition Value */}
Condition Value ( )} />
{/* Reward Type */}
Reward Type * ( {getRewardTypeOptions().map(option => (
{option.label}
))}
)} />
{/* Reward Value */}
Reward Value ( field.onChange(Number(e.target.value))} /> )} />
{/* Reward Subtype */}
Reward Subtype ( None {getRewardSubtypeOptions(watchedRewardType).map(subtype => ( {subtype.charAt(0).toUpperCase() + subtype.slice(1)} ))} )} />
{/* Reward Reference ID */}
Reward Reference ID ( )} />
{/* Sticky Footer */}
) } export default AddEditCampaignRuleDrawer