"use client";
import React from "react";
import { cn } from "@/lib/utils";
import { Input } from "@/components/ui/input";
import { Textarea } from "@/components/ui/textarea";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { Switch } from "@/components/ui/switch";
import { Slider } from "@/components/ui/slider";
import { Checkbox } from "@/components/ui/checkbox";
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
import { Label } from "@/components/ui/label";
import { FieldConfig } from "@/types/admin-panel";
interface FieldRendererProps {
field: FieldConfig;
value?: any;
error?: string;
disabled?: boolean;
onChange: (value: any) => void;
onBlur?: () => void;
className?: string;
form_field?: any;
}
export function FieldRenderer({
field,
value,
error,
disabled = false,
onChange,
onBlur,
className,
form_field
}: FieldRendererProps) {
const isDisabled = disabled || field.disabled;
const isReadOnly = field.readOnly;
// Use custom render function if provided
if (field.render) {
return (
{field.render(field, value, onChange)}
);
}
const renderField = () => {
switch (field.type) {
case "input":
case "email":
case "url":
case "tel":
return (
);
case "password":
return (
);
case "number":
return (
);
case "textarea":
return (
);
case "select":
return (
);
case "switch":
return (
{
form_field.onChange(c)
onChange(c);
}}
disabled={isDisabled}
className={cn(
error && "border-destructive",
className
)}
/>
);
case "checkbox":
return (
{
form_field.onChange(c)
onChange(c);
}}
disabled={isDisabled}
className={cn(
error && "border-destructive",
className
)}
/>
);
case "radio":
return (
{
const option = field.options?.find(opt => opt.value?.toString() === newValue);
onChange(option ? option.value : newValue);
}}
disabled={isDisabled}
className={className}
>
{field.options?.map((option) => (
{option.description && (
{option.description}
)}
))}
);
case "slider":
case "range":
const sliderValue = Array.isArray(value) ? value : [value || field.min || 0];
return (
onChange(newValue[0])}
min={field.min || 0}
max={field.max || 100}
step={field.step || 1}
disabled={isDisabled}
className={cn(
error && "accent-destructive",
className
)}
/>
{field.min || 0}
{sliderValue[0]}
{field.max || 100}
);
case "date":
case "time":
case "datetime-local":
return (
);
case "color":
return (
);
case "file":
return (
);
default:
return (
);
}
};
return (
{renderField()}
{error && (
{error}
)}
);
}