import { memo, useEffect, useMemo, useRef, useState } from "react" import { Checkbox, ColorPicker, Input, InputNumber, Select, Collapse } 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" import { useFileUploadContext } from "../contexts/fileUploadContext.js" import { AudioOutlined, FileImageOutlined, FileTextOutlined, VideoCameraOutlined } from "@ant-design/icons" import { useWidgetContext } from "./context/widgetContext.js" /** * * @param {boolean} isOpen * @param {string} widgetType * @param {object} attrs - widget attributes */ const CanvasToolBar = memo(({ isOpen, widgetType, }) => { // const { activeWidgetAttrs } = useActiveWidget() const {activeWidget} = useWidgetContext() // console.log("active widget context: ", activeWidgetAttrs) const [toolbarOpen, setToolbarOpen] = useState(isOpen) const [toolbarAttrs, setToolbarAttrs] = useState({}) const focusedInputRef = useRef() const [cursorPos, setCursorPos] = useState(0) // store cursor position for focused input so during remount if the cursor position goes to end we can use this const [activeInputKey, setActiveInputKey] = useState(null) const {uploadedAssets} = useFileUploadContext() useEffect(() => { const stateUpdatedCallback = () => { setToolbarAttrs(activeWidget.getToolbarAttrs()) } if (activeWidget){ activeWidget.stateChangeSubscriberCallback(stateUpdatedCallback) // console.log("sytate update: ", activeWidget.getToolbarAttrs()) setToolbarAttrs(activeWidget.getToolbarAttrs()) } }, [activeWidget, focusedInputRef, cursorPos]) // , activeWidget?.state useEffect(() => { setToolbarOpen(isOpen) }, [isOpen]) useEffect(() => { if (focusedInputRef.current?.input && activeInputKey) { // this fixes the cursor going to the end issue during remount focusedInputRef.current.setSelectionRange(cursorPos, cursorPos) } }, [toolbarAttrs, focusedInputRef, cursorPos]) // useEffect(() => { // setToolbarAttrs(activeWidget.getToolbarAttrs()) // }, []) const uploadItems = useMemo(() => { const returnComponentBasedOnFileType = (file) => { if (file.fileType === "image"){ return (
{file.name}
) }else if (file.fileType === "video"){ return (
{file.name}
) }else if (file.fileType === "audio"){ return (
{file.name}
) }else{ return (
{file.name}
) } } const uploadList = uploadedAssets.map((file, idx) => ({ value: file.name, label: returnComponentBasedOnFileType(file), fileType: file.fileType, type: file.type, // previewUrl: file.previewUrl, })) return uploadList }, [uploadedAssets]) const handleInputFocus = (key, event) => { const {value, target} = event setActiveInputKey(key) setCursorPos(target.selectionStart) focusedInputRef.current = event.target } const handleInputBlur = () => { setActiveInputKey(null); focusedInputRef.current = null; } const handleChange = (value, callback) => { if (callback) { callback(value) } if (focusedInputRef.current?.input) { setCursorPos(focusedInputRef.current.input.selectionStart) }else{ setCursorPos(0) } } function getUploadFileFromName(name){ return uploadedAssets.find(val => val.name === name) } const renderUploadDropDown = (val, filter) => { let uploadOptions = [...uploadItems] if (filter){ uploadOptions = uploadOptions.filter((value, idx) => filter.includes(value.type)) } return (
handleChange({ ...val.value, layout: value }, val.onChange)} />
Direction handleChange({ ...val.value, align: value }, val.onChange)} />
*/}
Gap handleInputFocus(val.label, e)} onBlur={handleInputBlur} ref={activeInputKey === val.label ? focusedInputRef : null} onChange={(value) => { handleChange({ ...val.value, gap: value }, val.onChange) }} />
{/*
Grids
Rows { let newGrid = { rows: value, cols: val.value?.grid.cols } handleChange({ ...val.value, grid: newGrid }, val.onChange) }} />
Columns { let newGrid = { rows: val.value?.grid.cols, cols: value } handleChange({ ...val.value, grid: newGrid }, val.onChange) }} />
*/}
) } const renderCustomTool = (val) => { return ( // NOTE: custom components must accept value and onChange handleChange(value, val.onChange)}> ) } const renderTool = (keyName, val) => { return ( <> {val.tool === Tools.INPUT && ( handleInputFocus(val.label, event)} onBlur={handleInputBlur} ref={activeInputKey === val.label ? focusedInputRef : null} value={val.value} onChange={(e) => handleChange(e.target.value, val.onChange)} /> )} {val.tool === Tools.NUMBER_INPUT && ( handleInputFocus(val.label, event)} onBlur={handleInputBlur} ref={activeInputKey === val.label ? focusedInputRef : null} onChange={(value) => handleChange(value, val.onChange)} /> )} {val.tool === Tools.COLOR_PICKER && ( handleChange(value.toHexString(), val.onChange)} /> )} {val.tool === Tools.SELECT_DROPDOWN && (