import { memo, useEffect, useState } from "react"
import { Checkbox, ColorPicker, Input, InputNumber, Select } from "antd"
import { capitalize } from "../utils/common"
import Tools from "./constants/tools.js"
import { useActiveWidget } from "./activeWidgetContext.js"
import { Layouts } from "./constants/layouts.js"
import { DynamicRadioInputList } from "../components/inputs.js"
// FIXME: Maximum recursion error
/**
*
* @param {boolean} isOpen
* @param {string} widgetType
* @param {object} attrs - widget attributes
*/
const CanvasToolBar = memo(({ isOpen, widgetType, attrs = {} }) => {
// const { activeWidgetAttrs } = useActiveWidget()
// console.log("active widget context: ", activeWidgetAttrs)
const [toolbarOpen, setToolbarOpen] = useState(isOpen)
const [toolbarAttrs, setToolbarAttrs] = useState(attrs)
useEffect(() => {
setToolbarOpen(isOpen)
}, [isOpen])
useEffect(() => {
setToolbarAttrs(attrs)
}, [attrs])
const handleChange = (value, callback) => {
if (callback) {
callback(value)
}
}
const renderLayoutManager = (val) => {
return (
)
}
const renderWidgets = (obj, parentKey = "") => {
return Object.entries(obj).map(([key, val], i) => {
const keyName = parentKey ? `${parentKey}.${key}` : key
// Highlight outer labels in blue for first-level keys
const isFirstLevel = parentKey === ""
const outerLabelClass = isFirstLevel
? "tw-text-base tw-text-blue-700 tw-font-medium"
: "tw-text-base"
// Render tool widgets
if (typeof val === "object" && val.tool) {
return (
{val.label}
{val.tool === Tools.INPUT && (
handleChange(e.target.value, val.onChange)}
/>
)}
{val.tool === Tools.NUMBER_INPUT && (
handleChange(value, val.onChange)}
/>
)}
{val.tool === Tools.COLOR_PICKER && (
handleChange(value.toHexString(), val.onChange)}
/>
)}
{val.tool === Tools.SELECT_DROPDOWN && (
handleChange(value, val.onChange)}
/>
)}
{val.tool === Tools.CHECK_BUTTON && (
handleChange(e.target.checked, val.onChange)}
>{val.label}
)}
{val.tool === Tools.INPUT_RADIO_LIST && (
handleChange({inputs, selectedRadio}, val.onChange)}
/>
)}
{
val.tool === Tools.LAYOUT_MANAGER && (
renderLayoutManager(val)
)
}
);
}
// Handle nested objects and horizontal display for inner elements
if (typeof val === "object") {
const containerClass = val.display === "horizontal"
? "tw-flex tw-flex-row tw-flex-wrap tw-content-start tw-gap-4"
: "tw-flex tw-flex-col tw-gap-2"
return (
{/* Outer label highlighted in blue for first-level */}
{val.label}
{renderWidgets(val, keyName)}
)
}
return null
})
}
return (
{capitalize(`${widgetType || ""}`).replace(/_/g, " ")}
{renderWidgets(toolbarAttrs || {})}
)
})
export default CanvasToolBar