import React, { useEffect, useState } from 'react'; import { Textarea } from 'components/ui/textarea'; import { Checkbox } from 'components/ui/checkbox'; import useCommonDispatch from 'hooks/useCommonDispatch'; import { saveGeneralSettings, updateGeneralSettings } from '../../../store/app/appActions'; import { useAppContext } from '../../../context/app'; import AppButton from "components/ui/app-button"; import { Select, SelectTrigger, SelectValue, SelectContent, SelectGroup, SelectLabel, SelectItem } from 'components/ui/select'; import {CheckCircleIcon, ChevronRightIcon, XCircleIcon} from "@heroicons/react/24/solid"; import Accordion from "components/accordion"; import {Label} from "components/ui/label"; import { Button } from 'components/ui/button'; import { useToast } from "components/ui/use-toast" import { Loader } from 'lucide-react'; import { optimizerData } from '../../../store/app/appSelector'; import { useSelector } from 'react-redux'; interface GeneralSettingsProps { onClose: (open: boolean) => void; } interface QueueOption { value: string; label: string; } const JOB_OPTIONS: QueueOption[] = [ { value: '1', label: '1 Job' }, { value: '2', label: '2 Jobs' }, { value: '3', label: '3 Jobs' }, ]; const TIME_INTERVAL_OPTIONS: QueueOption[] = [ { value: '60', label: '1 Minute' }, { value: '300', label: '5 Minutes' }, { value: '600', label: '10 Minutes' }, { value: '1800', label: '30 Minutes' }, { value: '3600', label: '1 Hour' }, ]; const GeneralSettings: React.FC = ({ onClose }) => { const { dispatch } = useCommonDispatch(); const { options, uucssGlobal } = useAppContext(); const [settingsData, setSettingsData] = useState((uucssGlobal as Required).active_modules.general.options); const [jobCount, setJobCount] = useState(() => { const savedJobs = settingsData.uucss_jobs_per_queue?.toString() || '1'; return JOB_OPTIONS.find(opt => opt.value === savedJobs)?.value || JOB_OPTIONS[0].value; }); const [timeInterval, setTimeInterval] = useState(() => { const savedInterval = settingsData.uucss_queue_interval?.toString() || '600'; return TIME_INTERVAL_OPTIONS.find(opt => opt.value === savedInterval)?.value || TIME_INTERVAL_OPTIONS[2].value; }); const { toast } = useToast(); const [loading, setLoading] = useState(false); const { generalSettings } = useSelector(optimizerData); useEffect(() => { if (generalSettings) { const generalOptions = generalSettings; const hasChanges = (Object.keys(generalOptions) as Array) .some(key => generalOptions[key] !== settingsData[key]); if (hasChanges) { setSettingsData(generalOptions); } } }, [uucssGlobal, generalSettings]); useEffect(() => { if (settingsData) { setJobCount(settingsData.uucss_jobs_per_queue?.toString() || '1'); setTimeInterval(settingsData.uucss_queue_interval?.toString() || '600'); } }, [settingsData]); const handleCheckboxChange = (key: keyof GeneralSettings) => { setSettingsData(prev => ({ ...prev, [key]: !prev[key] })); }; const handleSaveSettings = async () => { setLoading(true); try { const updatedSettings = { ...settingsData, uucss_jobs_per_queue: parseInt(jobCount), uucss_queue_interval: parseInt(timeInterval) }; // dispatch(updateGeneralSettings(updatedSettings)); // console.log(generalSettings); const response = await dispatch(saveGeneralSettings(options, updatedSettings)); if (response.success) { dispatch(updateGeneralSettings(updatedSettings)); toast({ description: (
Settings saved successfully
), }); } else { toast({ description: (
{response.error || "Failed to save settings. Please try again."}
), }); } } catch (error) { toast({ description: (
{typeof error === 'string' ? error : "Error on Saving general settings"}
), }); } finally { setLoading(false); } }; const renderCheckbox = (label: string, description: string, key: keyof GeneralSettings) => { const isChecked = typeof settingsData[key] === 'boolean' ? settingsData[key] : false; return (
handleCheckboxChange(key)} />
{label}

{description}

); }; const renderTextarea = (label: string, description: string, key: keyof GeneralSettings) => { const value = typeof settingsData[key] === 'string' ? settingsData[key] : ''; return (
{label}
{description}