react-native-tvos 0.83.1-0 → 0.83.2-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -28,7 +28,7 @@
28
28
  export default class ReactNativeVersion {
29
29
  static major: number = 0;
30
30
  static minor: number = 83;
31
- static patch: number = 1;
31
+ static patch: number = 2;
32
32
  static prerelease: string | null = '0';
33
33
 
34
34
  static getVersionString(): string {
@@ -23,7 +23,7 @@ NSDictionary* RCTGetReactNativeVersion(void)
23
23
  __rnVersion = @{
24
24
  RCTVersionMajor: @(0),
25
25
  RCTVersionMinor: @(83),
26
- RCTVersionPatch: @(1),
26
+ RCTVersionPatch: @(2),
27
27
  RCTVersionPrerelease: @"0",
28
28
  };
29
29
  });
@@ -1146,13 +1146,11 @@ static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCu
1146
1146
  if (context.nextFocusedView == self) {
1147
1147
  [self becomeFirstResponder];
1148
1148
  [self addSwipeGestureRecognizers];
1149
- [self sendFocusNotification];
1150
1149
  // if we enter the scroll view from different view then block first touch event since it is the event that triggered the focus
1151
1150
  _blockFirstTouch = (unsigned long)context.focusHeading != 0;
1152
1151
  [self addArrowsListeners];
1153
1152
  } else if (context.previouslyFocusedView == self) {
1154
1153
  [self removeArrowsListeners];
1155
- [self sendBlurNotification];
1156
1154
  [self removeSwipeGestureRecognizers];
1157
1155
  [self resignFirstResponder];
1158
1156
  // If scrolling is enabled:
@@ -1261,16 +1259,6 @@ static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCu
1261
1259
  return [super shouldUpdateFocusInContext:context];
1262
1260
  }
1263
1261
 
1264
- - (void)sendFocusNotification
1265
- {
1266
- [[NSNotificationCenter defaultCenter] postNavigationFocusEventWithTag:@(self.tag) target:nil];
1267
- }
1268
-
1269
- - (void)sendBlurNotification
1270
- {
1271
- [[NSNotificationCenter defaultCenter] postNavigationBlurEventWithTag:@(self.tag) target:nil];
1272
- }
1273
-
1274
1262
  - (NSInteger)swipeVerticalInterval
1275
1263
  {
1276
1264
  RCTEnhancedScrollView *scrollView = (RCTEnhancedScrollView *)_scrollView;
@@ -265,16 +265,6 @@ const CGFloat BACKGROUND_COLOR_ZPOSITION = -1024.0f;
265
265
  [self handleFocusGuide];
266
266
  }
267
267
 
268
- - (void)sendFocusNotification:(__unused UIFocusUpdateContext *)context
269
- {
270
- [[NSNotificationCenter defaultCenter] postNavigationFocusEventWithTag:@(self.tag) target:@(self.tag)];
271
- }
272
-
273
- - (void)sendBlurNotification:(__unused UIFocusUpdateContext *)context
274
- {
275
- [[NSNotificationCenter defaultCenter] postNavigationBlurEventWithTag:@(self.tag) target:@(self.tag)];
276
- }
277
-
278
268
  - (void)sendSelectNotification
279
269
  {
280
270
  [[NSNotificationCenter defaultCenter] postNavigationPressEventWithType:RCTTVRemoteEventSelect keyAction:RCTTVRemoteEventKeyActionUp tag:@(self.tag) target:@(self.tag)];
@@ -596,7 +586,6 @@ const CGFloat BACKGROUND_COLOR_ZPOSITION = -1024.0f;
596
586
  [self enableDirectionalFocusGuides];
597
587
  [coordinator addCoordinatedAnimations:^(void){
598
588
  if (self->_eventEmitter) self->_eventEmitter->onFocus();
599
- [self sendFocusNotification:context];
600
589
  [self addParallaxMotionEffects];
601
590
  } completion:^(void){}];
602
591
  // Without this check, onBlur would also trigger when `TVFocusGuideView` transfers focus to its children.
@@ -607,7 +596,6 @@ const CGFloat BACKGROUND_COLOR_ZPOSITION = -1024.0f;
607
596
  [coordinator addCoordinatedAnimations:^(void){
608
597
  [self removeParallaxMotionEffects];
609
598
  if (self->_eventEmitter) self->_eventEmitter->onBlur();
610
- [self sendBlurNotification:context];
611
599
  } completion:^(void){}];
612
600
  [self resignFirstResponder];
613
601
  }
@@ -1166,7 +1154,6 @@ const CGFloat BACKGROUND_COLOR_ZPOSITION = -1024.0f;
1166
1154
  // `autoFocus`
1167
1155
  if (oldViewProps.autoFocus != newViewProps.autoFocus) {
1168
1156
  _autoFocus = newViewProps.autoFocus;
1169
- [self handleFocusGuide];
1170
1157
  }
1171
1158
 
1172
1159
  _trapFocusUp = newViewProps.trapFocusUp;
@@ -1228,7 +1215,7 @@ const CGFloat BACKGROUND_COLOR_ZPOSITION = -1024.0f;
1228
1215
  [self requestFocusSelf];
1229
1216
  }
1230
1217
  }
1231
-
1218
+ [self handleFocusGuide];
1232
1219
  #endif
1233
1220
 
1234
1221
  if (_swiftUIWrapper != nullptr) {
@@ -70,11 +70,17 @@
70
70
 
71
71
  /**
72
72
  * Send Focus Notifications to listeners
73
+ * @deprecated This method emits focus events to TVEventHandler, which is deprecated.
74
+ * Use onFocus/onBlur component props instead. Will be removed when old arch is removed.
75
+ * See: https://github.com/react-native-tvos/react-native-tvos/issues/1037
73
76
  */
74
77
  - (void)sendFocusNotification:(UIFocusUpdateContext *)context;
75
78
 
76
79
  /**
77
80
  * Send Blur Notifications to listeners
81
+ * @deprecated This method emits blur events to TVEventHandler, which is deprecated.
82
+ * Use onFocus/onBlur component props instead. Will be removed when old arch is removed.
83
+ * See: https://github.com/react-native-tvos/react-native-tvos/issues/1037
78
84
  */
79
85
  - (void)sendBlurNotification:(UIFocusUpdateContext *)context;
80
86
 
@@ -1,4 +1,4 @@
1
- VERSION_NAME=0.83.1-0
1
+ VERSION_NAME=0.83.2-0
2
2
  react.internal.publishingGroup=io.github.react-native-tvos
3
3
  react.internal.hermesPublishingGroup=com.facebook.hermes
4
4
 
@@ -14,7 +14,7 @@ public object ReactNativeVersion {
14
14
  public val VERSION: Map<String, Any?> = mapOf(
15
15
  "major" to 0,
16
16
  "minor" to 83,
17
- "patch" to 1,
17
+ "patch" to 2,
18
18
  "prerelease" to "0"
19
19
  )
20
20
  }
@@ -1448,7 +1448,13 @@ public open class ReactViewGroup public constructor(context: Context?) :
1448
1448
  if (isFocusDestinationsSet) {
1449
1449
  val destination = findDestinationView()
1450
1450
 
1451
- if (destination != null && requestFocusViewOrAncestor(destination)) {
1451
+ // Destination is set but there's no such element on the tree
1452
+ // Just skip it to prevent cyclic issues.
1453
+ if (destination == null) {
1454
+ return false
1455
+ }
1456
+
1457
+ if (destination.requestFocus()) {
1452
1458
  return true
1453
1459
  }
1454
1460
  }
@@ -1472,9 +1478,7 @@ public open class ReactViewGroup public constructor(context: Context?) :
1472
1478
  }
1473
1479
 
1474
1480
  // Try moving the focus to the first focusable element otherwise.
1475
- if (moveFocusToFirstFocusable(this)) {
1476
- return true
1477
- }
1481
+ return moveFocusToFirstFocusable(this)
1478
1482
  }
1479
1483
 
1480
1484
  return super.requestFocus(direction, previouslyFocusedRect)
@@ -1606,21 +1610,5 @@ public open class ReactViewGroup public constructor(context: Context?) :
1606
1610
  fun setViewClipped(view: View, clipped: Boolean) {
1607
1611
  view.setTag(R.id.view_clipped, clipped)
1608
1612
  }
1609
-
1610
- private fun requestFocusViewOrAncestor(destination: View): Boolean {
1611
- var v: View? = destination
1612
- while (v != null) {
1613
- if (v.requestFocus()) {
1614
- return true
1615
- }
1616
- val parent = v.parent
1617
- v = if (parent is View) {
1618
- parent
1619
- } else {
1620
- null
1621
- }
1622
- }
1623
- return false
1624
- }
1625
1613
  }
1626
1614
  }
@@ -109,13 +109,13 @@ public open class ReactViewManager : ReactClippingViewManager<ReactViewGroup>()
109
109
 
110
110
  @ReactProp(name = "tvFocusable")
111
111
  public open fun setTvFocusable(view: ReactViewGroup, focusable: Boolean) {
112
- setFocusable(view, focusable)
113
112
  if (!focusable) {
114
113
  view.isFocusable = false
115
114
  view.descendantFocusability = ViewGroup.FOCUS_BLOCK_DESCENDANTS
116
115
  } else {
117
116
  view.descendantFocusability = ViewGroup.FOCUS_AFTER_DESCENDANTS
118
117
  }
118
+ setFocusable(view, focusable)
119
119
  }
120
120
 
121
121
  @ReactProp(name = ViewProps.ACCESSIBILITY_ORDER)
@@ -14,14 +14,14 @@
14
14
 
15
15
  #define REACT_NATIVE_VERSION_MAJOR 0
16
16
  #define REACT_NATIVE_VERSION_MINOR 83
17
- #define REACT_NATIVE_VERSION_PATCH 1
17
+ #define REACT_NATIVE_VERSION_PATCH 2
18
18
 
19
19
  namespace facebook::react {
20
20
 
21
21
  constexpr struct {
22
22
  int32_t Major = 0;
23
23
  int32_t Minor = 83;
24
- int32_t Patch = 1;
24
+ int32_t Patch = 2;
25
25
  std::string_view Prerelease = "0";
26
26
  } ReactNativeVersion;
27
27
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-tvos",
3
- "version": "0.83.1-0",
3
+ "version": "0.83.2-0",
4
4
  "description": "A framework for building native apps using React",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -91,6 +91,7 @@
91
91
  "React-Core.podspec",
92
92
  "React-Core-prebuilt.podspec",
93
93
  "react-native.config.js",
94
+ "tvosCommands.js",
94
95
  "React.podspec",
95
96
  "React",
96
97
  "!React/Fabric/RCTThirdPartyFabricComponentsProvider.*",
@@ -164,12 +165,12 @@
164
165
  },
165
166
  "dependencies": {
166
167
  "@jest/create-cache-key-function": "^29.7.0",
167
- "@react-native/assets-registry": "0.83.1",
168
- "@react-native/codegen": "0.83.1",
169
- "@react-native/community-cli-plugin": "0.83.1",
170
- "@react-native/gradle-plugin": "0.83.1",
171
- "@react-native/js-polyfills": "0.83.1",
172
- "@react-native/normalize-colors": "0.83.1",
168
+ "@react-native/assets-registry": "0.83.2",
169
+ "@react-native/codegen": "0.83.2",
170
+ "@react-native/community-cli-plugin": "0.83.2",
171
+ "@react-native/gradle-plugin": "0.83.2",
172
+ "@react-native/js-polyfills": "0.83.2",
173
+ "@react-native/normalize-colors": "0.83.2",
173
174
  "abort-controller": "^3.0.0",
174
175
  "anser": "^1.4.9",
175
176
  "ansi-regex": "^5.0.0",
@@ -179,7 +180,7 @@
179
180
  "commander": "^12.0.0",
180
181
  "flow-enums-runtime": "^0.0.6",
181
182
  "glob": "^7.1.1",
182
- "hermes-compiler": "0.14.0",
183
+ "hermes-compiler": "0.14.1",
183
184
  "invariant": "^2.2.4",
184
185
  "jest-environment-node": "^29.7.0",
185
186
  "memoize-one": "^5.0.0",
@@ -197,7 +198,7 @@
197
198
  "whatwg-fetch": "^3.0.0",
198
199
  "ws": "^7.5.10",
199
200
  "yargs": "^17.6.2",
200
- "@react-native-tvos/virtualized-lists": "0.83.1-0"
201
+ "@react-native-tvos/virtualized-lists": "0.83.2-0"
201
202
  },
202
203
  "codegenConfig": {
203
204
  "libraries": [
@@ -1 +1 @@
1
- hermes-v0.14.0
1
+ hermes-v0.14.1
@@ -1,2 +1,2 @@
1
- HERMES_VERSION_NAME=0.14.0
1
+ HERMES_VERSION_NAME=0.14.1
2
2
  HERMES_V1_VERSION_NAME=250829098.0.4
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @flow
3
+ */
4
+
5
+ let apple;
6
+ try {
7
+ apple = require('@react-native-community/cli-platform-apple');
8
+ } catch {
9
+ if (verbose) {
10
+ console.warn(
11
+ '@react-native-community/cli-platform-apple not found, the react-native.config.js may be unusable.'
12
+ );
13
+ }
14
+ }
15
+
16
+ const platformName = 'tvos';
17
+
18
+ const run = {
19
+ name: `run-${platformName}`,
20
+ description: 'builds your app and starts it on a tvOS simulator or Apple TV device',
21
+ func: apple.createRun({platformName}),
22
+ examples: [
23
+ {
24
+ desc: 'Run on a specific simulator',
25
+ cmd: `npx react-native run-${platformName} --simulator "Apple TV"`,
26
+ },
27
+ ],
28
+ options: apple.getRunOptions({platformName}),
29
+ };
30
+
31
+ const log = {
32
+ name: `log-${platformName}`,
33
+ description: 'displays system logs from a connected tvOS device or simulator',
34
+ func: apple.createLog({platformName: platformName}),
35
+ options: apple.getLogOptions({platformName}),
36
+ };
37
+
38
+ const build = {
39
+ name: `build-${platformName}`,
40
+ description: 'builds your app for tvOS',
41
+ func: apple.createBuild({platformName}),
42
+ examples: [
43
+ {
44
+ desc: 'Build the app for all tvOS devices in Release mode',
45
+ cmd: `npx react-native build-${platformName} --mode "Release"`,
46
+ },
47
+ ],
48
+ options: apple.getBuildOptions({platformName}),
49
+ };
50
+
51
+ module.exports = [run, log, build];
@@ -52,6 +52,13 @@ declare module 'react-native' {
52
52
  disableGestureHandlersCancelTouches(): void;
53
53
  };
54
54
 
55
+ /**
56
+ * Hardware event received from TVEventHandler
57
+ *
58
+ * Note: The 'blur' and 'focus' event types are deprecated and will no longer be
59
+ * emitted on new architecture (Fabric). Use onFocus/onBlur component props instead.
60
+ * See: https://github.com/react-native-tvos/react-native-tvos/issues/1037
61
+ */
55
62
  export type HWEvent = {
56
63
  eventType: 'up' | 'down' | 'right' | 'left' | 'longUp' | 'longDown' | 'longRight' | 'longLeft' | 'blur' | 'focus' | 'pan' | string;
57
64
  eventKeyAction?: -1 | 1 | 0 | number | undefined;