forked from danny-avila/LibreChat
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
📋 fix: Ensure Textarea Resizes in Clipboard Edge Case (danny-avila#2268)
* chore: ts-ignore fake conversation data used for testing * chore(useTextarea): import helper functions to declutter hook * fix(Textarea): reset textarea value explicitly by resetting `textAreaRef.current.value`
- Loading branch information
1 parent
d07396d
commit aff219c
Showing
6 changed files
with
63 additions
and
55 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/** | ||
* Insert text at the cursor position in a textarea. | ||
*/ | ||
export function insertTextAtCursor(element: HTMLTextAreaElement, textToInsert: string) { | ||
element.focus(); | ||
|
||
// Use the browser's built-in undoable actions if possible | ||
if (window.getSelection() && document.queryCommandSupported('insertText')) { | ||
document.execCommand('insertText', false, textToInsert); | ||
} else { | ||
console.warn('insertTextAtCursor: document.execCommand is not supported'); | ||
const startPos = element.selectionStart; | ||
const endPos = element.selectionEnd; | ||
const beforeText = element.value.substring(0, startPos); | ||
const afterText = element.value.substring(endPos); | ||
element.value = beforeText + textToInsert + afterText; | ||
element.selectionStart = element.selectionEnd = startPos + textToInsert.length; | ||
const event = new Event('input', { bubbles: true }); | ||
element.dispatchEvent(event); | ||
} | ||
} | ||
|
||
/** | ||
* Necessary resize helper for edge cases where paste doesn't update the container height. | ||
* | ||
1) Resetting the height to 'auto' forces the component to recalculate height based on its current content | ||
2) Forcing a reflow. Accessing offsetHeight will cause a reflow of the page, | ||
ensuring that the reset height takes effect before resetting back to the scrollHeight. | ||
This step is necessary because changes to the DOM do not instantly cause reflows. | ||
3) Reseting back to scrollHeight reads and applies the ideal height for the current content dynamically | ||
*/ | ||
export const forceResize = (textAreaRef: React.RefObject<HTMLTextAreaElement>) => { | ||
if (textAreaRef.current) { | ||
textAreaRef.current.style.height = 'auto'; | ||
textAreaRef.current.offsetHeight; | ||
textAreaRef.current.style.height = `${textAreaRef.current.scrollHeight}px`; | ||
} | ||
}; |