import React, { useState, useMemo } from "react"; import { Search, ChevronDown, Loader } from "lucide-react"; import { TemplateSampleSetting } from "@/user-management/services/TemplateConfiguration/types/templateTypes"; import { useTranslation } from "react-i18next"; interface SectionSettings { items: TemplateSampleSetting[]; page: number; hasMore: boolean; loading: boolean; } interface SettingsPanelProps { settings: TemplateSampleSetting[]; onSettingChange: (index: number, field: string, value: string) => void; onLoadMore?: (sectionKey: string, nextPage: number) => void; } interface StyleInputsProps { setting: TemplateSampleSetting; index: number; onChange: (index: number, field: string, value: string) => void; } const StyleInputs: React.FC = ({ setting, index, onChange, }) => { return (

{setting.code.replace("-", " ")}

{Object.entries(setting.value).map(([key, value]) => (
onChange(index, key, e.target.value)} className="w-full px-2 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded focus:outline-none focus:ring-2 focus:ring-purple-500 dark:bg-gray-600 dark:text-gray-200" placeholder={key} />
))}
); }; interface CollapsibleSectionProps { title: string; sectionKey: string; sectionData: SectionSettings; settings: TemplateSampleSetting[]; onSettingChange: (index: number, field: string, value: string) => void; onLoadMore: (sectionKey: string, nextPage: number) => void; } const CollapsibleSection: React.FC = ({ title, sectionKey, sectionData, settings, onSettingChange, onLoadMore, }) => { const [isOpen, setIsOpen] = useState(true); return (
{isOpen && (
{sectionData.items.length === 0 ? (

No settings available

) : ( <> {sectionData.items.map((setting) => { const originalIndex = settings.findIndex( (s) => s.code === setting.code, ); return ( ); })} {sectionData.hasMore && ( )} )}
)}
); }; export const SettingsPanel: React.FC = ({ settings, onSettingChange, onLoadMore = () => {}, }) => { const { t } = useTranslation(); const [searchTerm, setSearchTerm] = useState(""); // Flatten all settings for search const allSettings = useMemo(() => settings, [settings]); // Filter settings based on search term const filteredSettings = useMemo(() => { if (!searchTerm.trim()) return null; return allSettings.filter( (s) => s.code.toLowerCase().includes(searchTerm.toLowerCase()) || Object.values(s.value).some((v) => String(v).toLowerCase().includes(searchTerm.toLowerCase()), ), ); }, [searchTerm, allSettings]); // Group settings by section (for non-search view) const sectionSettings: Record = useMemo(() => { return { subject: { items: allSettings.filter((s) => s.code.includes("subject")), page: 0, hasMore: false, loading: false, }, body: { items: allSettings.filter((s) => s.code.includes("body")), page: 0, hasMore: false, loading: false, }, header: { items: allSettings.filter((s) => s.code.includes("header")), page: 0, hasMore: false, loading: false, }, footer: { items: allSettings.filter((s) => s.code.includes("footer")), page: 0, hasMore: false, loading: false, }, }; }, [allSettings]); return (
{/* Search Input */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-purple-500" />
{/* Filtered Results View */} {filteredSettings !== null ? (

Found {filteredSettings.length} setting {filteredSettings.length !== 1 ? "s" : ""}

{filteredSettings.length === 0 ? (

{t("common.noResults", "No settings found")}

) : (
{filteredSettings.map((setting) => { const originalIndex = allSettings.findIndex( (s) => s.code === setting.code, ); return ( ); })}
)}
) : ( /* Collapsible Sections View */
{Object.entries(sectionSettings).map(([key, section]) => ( ))}
)}
); };