fix: btg link highlight text

This commit is contained in:
gosangam
2026-05-07 14:48:01 +05:30
parent cbd9c55777
commit 6e9fa4ee25
2 changed files with 88 additions and 21 deletions
+40 -7
View File
@@ -32,6 +32,30 @@ export function TextSelectionToolbar() {
// Track whether the user is interacting with our toolbar/popovers
const interactingRef = useRef(false);
// Save/restore selection range for iOS Safari — drawers steal focus from selection
const savedRangeRef = useRef<Range | null>(null);
const saveAndClearSelection = useCallback(() => {
const sel = window.getSelection();
if (sel && sel.rangeCount > 0) {
savedRangeRef.current = sel.getRangeAt(0).cloneRange();
sel.removeAllRanges();
}
interactingRef.current = true;
}, []);
const restoreSelection = useCallback(() => {
interactingRef.current = false;
if (savedRangeRef.current) {
const sel = window.getSelection();
if (sel) {
sel.removeAllRanges();
sel.addRange(savedRangeRef.current);
}
savedRangeRef.current = null;
}
}, []);
const clearSelection = useCallback(() => {
setSelectedText("");
setToolbarPos(null);
@@ -247,7 +271,8 @@ export function TextSelectionToolbar() {
label: "Share",
icon: <Share2 className="size-3.5" />,
onClick: () => {
interactingRef.current = true;
if (isMobile) saveAndClearSelection();
else interactingRef.current = true;
setShowShare(true);
},
},
@@ -271,7 +296,8 @@ export function TextSelectionToolbar() {
label: "More",
icon: <MoreHorizontal className="size-3.5" />,
onClick: () => {
interactingRef.current = true;
if (isMobile) saveAndClearSelection();
else interactingRef.current = true;
setMorePos({
x: toolbarPos.x + 60,
y: toolbarPos.y,
@@ -298,19 +324,24 @@ export function TextSelectionToolbar() {
selectedText={selectedText}
onClose={() => {
setShowMore(false);
interactingRef.current = false;
if (isMobile) restoreSelection();
else interactingRef.current = false;
}}
onBookmark={() => {
setShowMore(false);
interactingRef.current = false;
if (isMobile) restoreSelection();
else interactingRef.current = false;
}}
onSaveToCollection={() => {
setShowMore(false);
if (isMobile) saveAndClearSelection();
else interactingRef.current = true;
setShowCollections(true);
}}
onMention={() => {
setShowMore(false);
interactingRef.current = false;
if (isMobile) restoreSelection();
else interactingRef.current = false;
}}
/>
@@ -318,7 +349,8 @@ export function TextSelectionToolbar() {
open={showShare}
onClose={() => {
setShowShare(false);
interactingRef.current = false;
if (isMobile) restoreSelection();
else interactingRef.current = false;
}}
selectedText={selectedText}
isMobile={isMobile}
@@ -328,7 +360,8 @@ export function TextSelectionToolbar() {
open={showCollections}
onClose={() => {
setShowCollections(false);
interactingRef.current = false;
if (isMobile) restoreSelection();
else interactingRef.current = false;
}}
isMobile={isMobile}
/>