From b9139469d42e0bed25a99ba61972c04b217a572e Mon Sep 17 00:00:00 2001 From: paul Date: Sat, 22 Mar 2025 21:16:13 +0530 Subject: [PATCH] fix: fixed input cursor problem --- src/canvas/toolbar.js | 53 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/src/canvas/toolbar.js b/src/canvas/toolbar.js index 7f89577..d53f0c9 100644 --- a/src/canvas/toolbar.js +++ b/src/canvas/toolbar.js @@ -1,4 +1,4 @@ -import { memo, useEffect, useMemo, useState } from "react" +import { memo, useEffect, useMemo, useRef, useState } from "react" import { Checkbox, ColorPicker, Input, @@ -29,12 +29,16 @@ const CanvasToolBar = memo(({ isOpen, widgetType, }) => { const {activeWidget} = useWidgetContext() - console.log("active widget: ", activeWidget) - // console.log("active widget context: ", activeWidgetAttrs) const [toolbarOpen, setToolbarOpen] = useState(isOpen) const [toolbarAttrs, setToolbarAttrs] = useState({}) + // TODO: From here + 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(() => { @@ -47,14 +51,25 @@ const CanvasToolBar = memo(({ isOpen, widgetType, }) => { activeWidget.stateChangeSubscriberCallback(stateUpdatedCallback) // console.log("sytate update: ", activeWidget.getToolbarAttrs()) setToolbarAttrs(activeWidget.getToolbarAttrs()) + + } - }, [activeWidget]) // , activeWidget?.state + + }, [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()) @@ -110,11 +125,31 @@ const CanvasToolBar = memo(({ isOpen, widgetType, }) => { }, [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) { + console.log("handling change: ", focusedInputRef.current.input.selectionStart) + setCursorPos(focusedInputRef.current.input.selectionStart); + }else{ + setCursorPos(0) + } } function getUploadFileFromName(name){ @@ -207,6 +242,9 @@ const CanvasToolBar = memo(({ isOpen, widgetType, }) => { min={1} value={val.value?.gap || 10} size="small" + onFocus={(e) => handleInputFocus(val.label, e)} + onBlur={handleInputBlur} + ref={activeInputKey === val.label ? focusedInputRef : null} onChange={(value) => { handleChange({ ...val.value, gap: value }, val.onChange) }} @@ -263,6 +301,10 @@ const CanvasToolBar = memo(({ isOpen, widgetType, }) => { {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)} /> @@ -273,6 +315,9 @@ const CanvasToolBar = memo(({ isOpen, widgetType, }) => { {...val.toolProps} value={val.value || 0} size="small" + onFocus={(event) => handleInputFocus(val.label, event)} + onBlur={handleInputBlur} + ref={activeInputKey === val.label ? focusedInputRef : null} onChange={(value) => handleChange(value, val.onChange)} /> )}