* fix(app): make markdown links tappable on iOS A markdown link's label renders as nested React elements (link > textgroup > text -> MarkdownInheritedText spans). The link's onPress was placed on the wrapping UITextView span, but react-native-uitextview only attaches onPress to the *string* children it converts into tappable RNUITextViewChild nodes - element children pass through untouched, so the handler never reached a node the native tap recognizer could fire. Link text stayed visible and selectable but dead to taps; web links never opened. Thread the link's press handler down to the leaf text spans via a new AssistantLinkPressProvider so it lands on the real tappable string nodes. MarkdownInheritedText consumes the context and forwards onPress to its MarkdownTextSpan; null outside a link, so ordinary text is unaffected. Gated to iOS - Android forwards onPress through nested <Text> already, and web uses the <a> path. * refactor(app): export useAssistantLinkPress from module index Import it through the assistant-file-links public surface instead of reaching into the internal link-press-context file, matching the rest of message.tsx. Addresses Greptile review feedback on #1334. --------- Co-authored-by: Kevin Aspesi <kevinaspesi@Kevins-Mac-mini.local>
25 lines
1.2 KiB
TypeScript
25 lines
1.2 KiB
TypeScript
import { createContext, useContext } from "react";
|
|
import type { TextProps } from "react-native";
|
|
|
|
// Carries a link's press handler down to the leaf text spans that render its
|
|
// label. On iOS an assistant link is a nested UITextView span, and
|
|
// react-native-uitextview only attaches onPress to the *string* children it
|
|
// converts into RNUITextViewChild nodes (src/Text.tsx) — element children (the
|
|
// MarkdownInheritedText spans markdown produces for link text) pass through
|
|
// untouched, so an onPress placed on the wrapping span never reaches a tappable
|
|
// native node. Threading the handler through context lets each leaf span hand
|
|
// onPress to its own string children, where the native tap recognizer can find
|
|
// it. Provided only on iOS (Android/web links tap fine via their own paths).
|
|
export interface AssistantLinkPress {
|
|
onPress: () => void;
|
|
accessibilityRole?: TextProps["accessibilityRole"];
|
|
}
|
|
|
|
const AssistantLinkPressContext = createContext<AssistantLinkPress | null>(null);
|
|
|
|
export const AssistantLinkPressProvider = AssistantLinkPressContext.Provider;
|
|
|
|
export function useAssistantLinkPress(): AssistantLinkPress | null {
|
|
return useContext(AssistantLinkPressContext);
|
|
}
|