fix: btg link highlight text
This commit is contained in:
@@ -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}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user