From 2dc22c19b0c0967eab23d1f535d0d2a2de587655 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 19 Apr 2026 07:28:44 +0000 Subject: [PATCH] Rename native borderRadius prop to avoid UIView collision RN/Expo already owns a borderRadius property on UIView (as a style prop), so declaring `private var borderRadius` on ExpoView was rejected by Swift ("cannot override with a stored property"). Rename the bridge prop and Swift property to `previewCornerRadius`; the public Trigger/ImageContextMenu API keeps `borderRadius` and Root translates it at the bridge layer. Also tighten `var start` to `let` in the SVG parser. https://claude.ai/code/session_015REmux3R9uuEMMJUHxTyQT --- .../ios/ExpoBlueskyContextMenuModule.swift | 5 +++-- .../ios/ExpoBlueskyContextMenuView.swift | 21 ++++++++++--------- .../ios/SVGPathParser.swift | 2 +- .../expo-bluesky-context-menu/src/Root.tsx | 2 +- .../expo-bluesky-context-menu/src/types.ts | 3 ++- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/modules/expo-bluesky-context-menu/ios/ExpoBlueskyContextMenuModule.swift b/modules/expo-bluesky-context-menu/ios/ExpoBlueskyContextMenuModule.swift index c203996983..655880b0b0 100644 --- a/modules/expo-bluesky-context-menu/ios/ExpoBlueskyContextMenuModule.swift +++ b/modules/expo-bluesky-context-menu/ios/ExpoBlueskyContextMenuModule.swift @@ -15,8 +15,9 @@ public class ExpoBlueskyContextMenuModule: Module { view.setMenuItems(value) } - Prop("borderRadius") { (view: ExpoBlueskyContextMenuView, value: Double) in - view.setBorderRadius(value) + Prop("previewCornerRadius") { + (view: ExpoBlueskyContextMenuView, value: Double) in + view.setPreviewCornerRadius(value) } } } diff --git a/modules/expo-bluesky-context-menu/ios/ExpoBlueskyContextMenuView.swift b/modules/expo-bluesky-context-menu/ios/ExpoBlueskyContextMenuView.swift index 09e11b4769..10efb34bdf 100644 --- a/modules/expo-bluesky-context-menu/ios/ExpoBlueskyContextMenuView.swift +++ b/modules/expo-bluesky-context-menu/ios/ExpoBlueskyContextMenuView.swift @@ -2,21 +2,20 @@ import ExpoModulesCore import UIKit /// Native view that hosts the children and attaches a -/// `UIContextMenuInteraction`. Two JS-shipped props drive behaviour: -/// - `preview`: discriminated union describing what to show during peek +/// `UIContextMenuInteraction`. JS-shipped props drive behaviour: +/// - `preview`: discriminated union describing what to show during peek /// - `menuItems`: array of menu item specs (see `MenuBuilder`) -/// - `borderRadius`: used for the targeted preview's visible path so the lift -/// animation matches the thumbnail's clipping +/// - `previewCornerRadius`: used for the targeted preview's visible path so the +/// lift animation matches the thumbnail's clipping. (Named distinctly from +/// the RN-owned `borderRadius` style prop on UIView.) class ExpoBlueskyContextMenuView: ExpoView, UIContextMenuInteractionDelegate { private var preview: [String: Any]? private var menuItems: [[String: Any]] = [] - private var borderRadius: CGFloat = 0 + private var previewCornerRadius: CGFloat = 0 private let onItemPress = EventDispatcher() private let onPreviewPress = EventDispatcher() - private var pendingCommitId: String? - required init(appContext: AppContext? = nil) { super.init(appContext: appContext) let interaction = UIContextMenuInteraction(delegate: self) @@ -25,7 +24,9 @@ class ExpoBlueskyContextMenuView: ExpoView, UIContextMenuInteractionDelegate { func setPreview(_ value: [String: Any]?) { self.preview = value } func setMenuItems(_ value: [[String: Any]]) { self.menuItems = value } - func setBorderRadius(_ value: Double) { self.borderRadius = CGFloat(value) } + func setPreviewCornerRadius(_ value: Double) { + self.previewCornerRadius = CGFloat(value) + } // MARK: - UIContextMenuInteractionDelegate @@ -83,10 +84,10 @@ class ExpoBlueskyContextMenuView: ExpoView, UIContextMenuInteractionDelegate { private func makeTargetedPreview() -> UITargetedPreview { let parameters = UIPreviewParameters() parameters.backgroundColor = .clear - if borderRadius > 0 { + if previewCornerRadius > 0 { parameters.visiblePath = UIBezierPath( roundedRect: self.bounds, - cornerRadius: borderRadius + cornerRadius: previewCornerRadius ) } return UITargetedPreview(view: self, parameters: parameters) diff --git a/modules/expo-bluesky-context-menu/ios/SVGPathParser.swift b/modules/expo-bluesky-context-menu/ios/SVGPathParser.swift index 83a2ec7698..d8a346621d 100644 --- a/modules/expo-bluesky-context-menu/ios/SVGPathParser.swift +++ b/modules/expo-bluesky-context-menu/ios/SVGPathParser.swift @@ -169,7 +169,7 @@ private struct Tokenizer { mutating func readNumber() -> CGFloat { skipSeparators() - var start = index + let start = index var sawDot = false var sawE = false while index < chars.count { diff --git a/modules/expo-bluesky-context-menu/src/Root.tsx b/modules/expo-bluesky-context-menu/src/Root.tsx index df4635089e..32d7cbb03a 100644 --- a/modules/expo-bluesky-context-menu/src/Root.tsx +++ b/modules/expo-bluesky-context-menu/src/Root.tsx @@ -61,7 +61,7 @@ export function Root({children, style}: RootProps) { diff --git a/modules/expo-bluesky-context-menu/src/types.ts b/modules/expo-bluesky-context-menu/src/types.ts index 188c142429..2f2abe761a 100644 --- a/modules/expo-bluesky-context-menu/src/types.ts +++ b/modules/expo-bluesky-context-menu/src/types.ts @@ -48,7 +48,8 @@ export type MenuItemIconSource = IconWithSvgMeta export type NativeViewProps = { preview?: PreviewContent menuItems: MenuItemSpec[] - borderRadius: number + /** Named distinctly from `borderRadius`, which RN owns as a style prop. */ + previewCornerRadius: number onItemPress: (e: {nativeEvent: {id: string}}) => void onPreviewPress: (e: {nativeEvent: {}}) => void style?: StyleProp