Skip to content

Commit 4518594

Browse files
douglowderfacebook-github-bot
authored andcommitted
Fix tvOS compile issues; enable TVEventHandler in Modal (fix facebook#15389)
Summary: **Motivation** Fix an issue (facebook#15389) where `TVEventHandler` would not work when a modal was visible. The solution adds the gesture recognizers from the native `RCTTVRemoteHandler` to the native modal view (except for the menu button recognizer, which still needs special handling in modals). This PR also fixes some breakages in compiling React Native for tvOS. **Test plan** Compilation fixes should enable tvOS compile test to pass in Travis CI. The modal fix can be tested with the following component, modified from the original source in facebook#15389 . ``` javascript import React, { Component } from 'react'; import ReactNative from 'ReactNative'; import { Text, View, StyleSheet, TouchableHighlight, TVEventHandler, Modal, } from 'react-native'; export default class Events extends Component { constructor(props) { super(props); this.state = { modalVisible: false, }; this._tvEventHandler = new TVEventHandler(); } _enableTVEventHandler() { this._tvEventHandler.enable(this, (cmp, evt) => { const myTag = ReactNative.findNodeHandle(cmp); console.log('Event.js TVEventHandler: ', evt.eventType); // if (evt.eventType !== 'blur' && evt.eventType !== 'focus') { // console.log('Event.js TVEventHandler: ', evt.eventType); // } }); } _disableTVEventHandler() { if (this._tvEventHandler) { this._tvEventHandler.disable(); delete this._tvEventHandler; } } componentDidMount() { this._enableTVEventHandler(); } componentWillUnmount() { this._disableTVEventHandler(); } _renderRow() { return ( <View style={styles.row}> { Array.from({ length: 7 }).map((_, index) => { return ( <TouchableHighlight key={index} onPress={() => { this.setState({ modalVisible: !this.state.modalVisible }); }} > <View style={styles.item}> <Text style={styles.itemText}>{ index }</Text> </View> </TouchableHighlight> ); }) } </View> ); } onTVEvent(cmp, evt) { console.log('Modal.js TVEventHandler: ', evt.eventType); } hideModal() { this.setState({ modalVisible: false }); } render() { return ( <View style={styles.container}> <Modal visible={this.state.modalVisible} onRequestClose={() => this.hideModal()}> <View style={styles.modal}> { this._renderRow() } { this._renderRow() } </View> </Modal> { this._renderRow() } { this._renderRow() } </View> ); } } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: 'darkslategrey', }, row: { flexDirection: 'row', padding: 30, }, item: { width: 200, height: 100, borderColor: 'cyan', borderWidth: 2, margin: 30, alignItems: 'center', justifyContent: 'center', }, itemText: { fontSize: 40, color: 'cyan', }, modal: { flex: 1, backgroundColor: 'steelblue', }, }); ``` **Release Notes** After this change, the `onRequestClose` property will be required for a `Modal` in Apple TV. Closes facebook#16076 Differential Revision: D6288801 Pulled By: hramos fbshipit-source-id: 446ae94a060387324aa9e528bd93cdabc9b5b37f
1 parent e04f82c commit 4518594

File tree

12 files changed

+266
-78
lines changed

12 files changed

+266
-78
lines changed

Libraries/Text/RCTText.xcodeproj/project.pbxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
2D3B5F3A1D9B106F00451313 /* RCTTextFieldManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1362F0FF1B4D51F400E06D8C /* RCTTextFieldManager.m */; };
2323
2D3B5F3B1D9B106F00451313 /* RCTTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 131B6ABD1AF0CD0600FFC3E0 /* RCTTextView.m */; };
2424
2D3B5F3C1D9B106F00451313 /* RCTTextViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 131B6ABF1AF0CD0600FFC3E0 /* RCTTextViewManager.m */; };
25+
2DEAB2901F84BA4300FC6B42 /* RCTFontAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = A85C82991F742AA20036C019 /* RCTFontAttributes.m */; };
2526
58B511CE1A9E6C5C00147676 /* RCTRawTextManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B511C71A9E6C5C00147676 /* RCTRawTextManager.m */; };
2627
58B511CF1A9E6C5C00147676 /* RCTShadowRawText.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B511C91A9E6C5C00147676 /* RCTShadowRawText.m */; };
2728
58B511D01A9E6C5C00147676 /* RCTShadowText.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B511CB1A9E6C5C00147676 /* RCTShadowText.m */; };

RNTester/RNTester.xcodeproj/project.pbxproj

Lines changed: 68 additions & 29 deletions
Large diffs are not rendered by default.

RNTester/RNTester/Images.xcassets/AppIcon.appiconset/Contents.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@
4545
"idiom" : "iphone",
4646
"filename" : "Icon-60@3x.png",
4747
"scale" : "3x"
48+
},
49+
{
50+
"idiom" : "ios-marketing",
51+
"size" : "1024x1024",
52+
"scale" : "1x"
4853
}
4954
],
5055
"info" : {

RNTester/js/ListExampleShared.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ function pressItem(context: Object, key: string) {
201201
}
202202

203203
function renderSmallSwitchOption(context: Object, key: string) {
204+
if(Platform.isTVOS) {
205+
return null;
206+
}
204207
return (
205208
<View style={styles.option}>
206209
<Text>{key}:</Text>

RNTester/js/ModalExample.js

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ var ReactNative = require('react-native');
1616
var {
1717
Modal,
1818
Picker,
19+
Platform,
1920
StyleSheet,
2021
Switch,
2122
Text,
@@ -91,6 +92,15 @@ class ModalExample extends React.Component<{}, $FlowFixMeState> {
9192
this.setState({transparent: !this.state.transparent});
9293
};
9394

95+
renderSwitch() {
96+
if (Platform.isTVOS) {
97+
return null;
98+
}
99+
return (
100+
<Switch value={this.state.transparent} onValueChange={this._toggleTransparent} />
101+
);
102+
}
103+
94104
render() {
95105
var modalBackgroundStyle = {
96106
backgroundColor: this.state.transparent ? 'rgba(0, 0, 0, 0.5)' : '#f5fcff',
@@ -140,9 +150,21 @@ class ModalExample extends React.Component<{}, $FlowFixMeState> {
140150

141151
<View style={styles.row}>
142152
<Text style={styles.rowTitle}>Transparent</Text>
143-
<Switch value={this.state.transparent} onValueChange={this._toggleTransparent} />
153+
{this.renderSwitch()}
144154
</View>
145-
155+
{this.renderPickers()}
156+
<Button onPress={this._setModalVisible.bind(this, true)}>
157+
Present
158+
</Button>
159+
</View>
160+
);
161+
}
162+
renderPickers() {
163+
if (Platform.isTVOS) {
164+
return null;
165+
}
166+
return (
167+
<View>
146168
<View>
147169
<Text style={styles.rowTitle}>Presentation style</Text>
148170
<Picker
@@ -173,15 +195,12 @@ class ModalExample extends React.Component<{}, $FlowFixMeState> {
173195
<Item label="Default supportedOrientations" value={5} />
174196
</Picker>
175197
</View>
176-
177-
<Button onPress={this._setModalVisible.bind(this, true)}>
178-
Present
179-
</Button>
180198
</View>
181199
);
182200
}
183201
}
184202

203+
185204
exports.examples = [
186205
{
187206
title: 'Modal Presentation',

React/Base/RCTRootView.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge
9191

9292
#if TARGET_OS_TV
9393
self.tvRemoteHandler = [RCTTVRemoteHandler new];
94-
for (UIGestureRecognizer *gr in self.tvRemoteHandler.tvRemoteGestureRecognizers) {
95-
[self addGestureRecognizer:gr];
94+
for (NSString *key in [self.tvRemoteHandler.tvRemoteGestureRecognizers allKeys]) {
95+
[self addGestureRecognizer:self.tvRemoteHandler.tvRemoteGestureRecognizers[key]];
9696
}
9797
#endif
9898

React/Base/RCTTVRemoteHandler.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,26 @@
99

1010
#import <UIKit/UIKit.h>
1111

12+
13+
extern NSString *const RCTTVRemoteEventMenu;
14+
extern NSString *const RCTTVRemoteEventPlayPause;
15+
extern NSString *const RCTTVRemoteEventSelect;
16+
17+
extern NSString *const RCTTVRemoteEventLongPlayPause;
18+
extern NSString *const RCTTVRemoteEventLongSelect;
19+
20+
extern NSString *const RCTTVRemoteEventLeft;
21+
extern NSString *const RCTTVRemoteEventRight;
22+
extern NSString *const RCTTVRemoteEventUp;
23+
extern NSString *const RCTTVRemoteEventDown;
24+
25+
extern NSString *const RCTTVRemoteEventSwipeLeft;
26+
extern NSString *const RCTTVRemoteEventSwipeRight;
27+
extern NSString *const RCTTVRemoteEventSwipeUp;
28+
extern NSString *const RCTTVRemoteEventSwipeDown;
29+
1230
@interface RCTTVRemoteHandler : NSObject
1331

14-
@property (nonatomic, copy, readonly) NSArray *tvRemoteGestureRecognizers;
32+
@property (nonatomic, copy, readonly) NSDictionary *tvRemoteGestureRecognizers;
1533

1634
@end

React/Base/RCTTVRemoteHandler.m

Lines changed: 61 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,71 +26,102 @@
2626
#import "RCTDevMenu.h"
2727
#endif
2828

29+
NSString *const RCTTVRemoteEventMenu = @"menu";
30+
NSString *const RCTTVRemoteEventPlayPause = @"playPause";
31+
NSString *const RCTTVRemoteEventSelect = @"select";
32+
33+
NSString *const RCTTVRemoteEventLongPlayPause = @"longPlayPause";
34+
NSString *const RCTTVRemoteEventLongSelect = @"longSelect";
35+
36+
NSString *const RCTTVRemoteEventLeft = @"left";
37+
NSString *const RCTTVRemoteEventRight = @"right";
38+
NSString *const RCTTVRemoteEventUp = @"up";
39+
NSString *const RCTTVRemoteEventDown = @"down";
40+
41+
NSString *const RCTTVRemoteEventSwipeLeft = @"swipeLeft";
42+
NSString *const RCTTVRemoteEventSwipeRight = @"swipeRight";
43+
NSString *const RCTTVRemoteEventSwipeUp = @"swipeUp";
44+
NSString *const RCTTVRemoteEventSwipeDown = @"swipeDown";
45+
46+
2947
@implementation RCTTVRemoteHandler {
30-
NSMutableArray<UIGestureRecognizer *> *_tvRemoteGestureRecognizers;
48+
NSMutableDictionary<NSString *, UIGestureRecognizer *> *_tvRemoteGestureRecognizers;
3149
}
3250

3351
- (instancetype)init
3452
{
3553
if ((self = [super init])) {
36-
_tvRemoteGestureRecognizers = [NSMutableArray array];
54+
_tvRemoteGestureRecognizers = [NSMutableDictionary dictionary];
3755

3856
// Recognizers for Apple TV remote buttons
3957

4058
// Play/Pause
4159
[self addTapGestureRecognizerWithSelector:@selector(playPausePressed:)
42-
pressType:UIPressTypePlayPause];
60+
pressType:UIPressTypePlayPause
61+
name:RCTTVRemoteEventPlayPause];
4362

4463
// Menu
4564
[self addTapGestureRecognizerWithSelector:@selector(menuPressed:)
46-
pressType:UIPressTypeMenu];
65+
pressType:UIPressTypeMenu
66+
name:RCTTVRemoteEventMenu];
4767

4868
// Select
4969
[self addTapGestureRecognizerWithSelector:@selector(selectPressed:)
50-
pressType:UIPressTypeSelect];
70+
pressType:UIPressTypeSelect
71+
name:RCTTVRemoteEventSelect];
5172

5273
// Up
5374
[self addTapGestureRecognizerWithSelector:@selector(swipedUp:)
54-
pressType:UIPressTypeUpArrow];
75+
pressType:UIPressTypeUpArrow
76+
name:RCTTVRemoteEventUp];
5577

5678
// Down
5779
[self addTapGestureRecognizerWithSelector:@selector(swipedDown:)
58-
pressType:UIPressTypeDownArrow];
80+
pressType:UIPressTypeDownArrow
81+
name:RCTTVRemoteEventDown];
5982

6083
// Left
6184
[self addTapGestureRecognizerWithSelector:@selector(swipedLeft:)
62-
pressType:UIPressTypeLeftArrow];
85+
pressType:UIPressTypeLeftArrow
86+
name:RCTTVRemoteEventLeft];
6387

6488
// Right
6589
[self addTapGestureRecognizerWithSelector:@selector(swipedRight:)
66-
pressType:UIPressTypeRightArrow];
90+
pressType:UIPressTypeRightArrow
91+
name:RCTTVRemoteEventRight];
6792

6893
// Recognizers for long button presses
6994
// We don't intercept long menu press -- that's used by the system to go to the home screen
7095

7196
[self addLongPressGestureRecognizerWithSelector:@selector(longPlayPausePressed:)
72-
pressType:UIPressTypePlayPause];
97+
pressType:UIPressTypePlayPause
98+
name:RCTTVRemoteEventLongPlayPause];
7399

74100
[self addLongPressGestureRecognizerWithSelector:@selector(longSelectPressed:)
75-
pressType:UIPressTypeSelect];
101+
pressType:UIPressTypeSelect
102+
name:RCTTVRemoteEventLongSelect];
76103

77104
// Recognizers for Apple TV remote trackpad swipes
78105

79106
// Up
80107
[self addSwipeGestureRecognizerWithSelector:@selector(swipedUp:)
81-
direction:UISwipeGestureRecognizerDirectionUp];
108+
direction:UISwipeGestureRecognizerDirectionUp
109+
name:RCTTVRemoteEventSwipeUp];
82110

83111
// Down
84112
[self addSwipeGestureRecognizerWithSelector:@selector(swipedDown:)
85-
direction:UISwipeGestureRecognizerDirectionDown];
113+
direction:UISwipeGestureRecognizerDirectionDown
114+
name:RCTTVRemoteEventSwipeDown];
86115

87116
// Left
88117
[self addSwipeGestureRecognizerWithSelector:@selector(swipedLeft:)
89-
direction:UISwipeGestureRecognizerDirectionLeft];
118+
direction:UISwipeGestureRecognizerDirectionLeft
119+
name:RCTTVRemoteEventSwipeLeft];
90120

91121
// Right
92122
[self addSwipeGestureRecognizerWithSelector:@selector(swipedRight:)
93-
direction:UISwipeGestureRecognizerDirectionRight];
123+
direction:UISwipeGestureRecognizerDirectionRight
124+
name:RCTTVRemoteEventSwipeRight];
94125

95126
}
96127

@@ -99,22 +130,22 @@ - (instancetype)init
99130

100131
- (void)playPausePressed:(UIGestureRecognizer *)r
101132
{
102-
[self sendAppleTVEvent:@"playPause" toView:r.view];
133+
[self sendAppleTVEvent:RCTTVRemoteEventPlayPause toView:r.view];
103134
}
104135

105136
- (void)menuPressed:(UIGestureRecognizer *)r
106137
{
107-
[self sendAppleTVEvent:@"menu" toView:r.view];
138+
[self sendAppleTVEvent:RCTTVRemoteEventMenu toView:r.view];
108139
}
109140

110141
- (void)selectPressed:(UIGestureRecognizer *)r
111142
{
112-
[self sendAppleTVEvent:@"select" toView:r.view];
143+
[self sendAppleTVEvent:RCTTVRemoteEventSelect toView:r.view];
113144
}
114145

115146
- (void)longPlayPausePressed:(UIGestureRecognizer *)r
116147
{
117-
[self sendAppleTVEvent:@"longPlayPause" toView:r.view];
148+
[self sendAppleTVEvent:RCTTVRemoteEventLongPlayPause toView:r.view];
118149

119150
#if __has_include("RCTDevMenu.h") && RCT_DEV
120151
// If shake to show is enabled on device, use long play/pause event to show dev menu
@@ -124,53 +155,53 @@ - (void)longPlayPausePressed:(UIGestureRecognizer *)r
124155

125156
- (void)longSelectPressed:(UIGestureRecognizer *)r
126157
{
127-
[self sendAppleTVEvent:@"longSelect" toView:r.view];
158+
[self sendAppleTVEvent:RCTTVRemoteEventLongSelect toView:r.view];
128159
}
129160

130161
- (void)swipedUp:(UIGestureRecognizer *)r
131162
{
132-
[self sendAppleTVEvent:@"up" toView:r.view];
163+
[self sendAppleTVEvent:RCTTVRemoteEventUp toView:r.view];
133164
}
134165

135166
- (void)swipedDown:(UIGestureRecognizer *)r
136167
{
137-
[self sendAppleTVEvent:@"down" toView:r.view];
168+
[self sendAppleTVEvent:RCTTVRemoteEventDown toView:r.view];
138169
}
139170

140171
- (void)swipedLeft:(UIGestureRecognizer *)r
141172
{
142-
[self sendAppleTVEvent:@"left" toView:r.view];
173+
[self sendAppleTVEvent:RCTTVRemoteEventLeft toView:r.view];
143174
}
144175

145176
- (void)swipedRight:(UIGestureRecognizer *)r
146177
{
147-
[self sendAppleTVEvent:@"right" toView:r.view];
178+
[self sendAppleTVEvent:RCTTVRemoteEventRight toView:r.view];
148179
}
149180

150181
#pragma mark -
151182

152-
- (void)addLongPressGestureRecognizerWithSelector:(nonnull SEL)selector pressType:(UIPressType)pressType
183+
- (void)addLongPressGestureRecognizerWithSelector:(nonnull SEL)selector pressType:(UIPressType)pressType name:(NSString *)name
153184
{
154185
UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:selector];
155186
recognizer.allowedPressTypes = @[@(pressType)];
156187

157-
[_tvRemoteGestureRecognizers addObject:recognizer];
188+
_tvRemoteGestureRecognizers[name] = recognizer;
158189
}
159190

160-
- (void)addTapGestureRecognizerWithSelector:(nonnull SEL)selector pressType:(UIPressType)pressType
191+
- (void)addTapGestureRecognizerWithSelector:(nonnull SEL)selector pressType:(UIPressType)pressType name:(NSString *)name
161192
{
162193
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:selector];
163194
recognizer.allowedPressTypes = @[@(pressType)];
164195

165-
[_tvRemoteGestureRecognizers addObject:recognizer];
196+
_tvRemoteGestureRecognizers[name] = recognizer;
166197
}
167198

168-
- (void)addSwipeGestureRecognizerWithSelector:(nonnull SEL)selector direction:(UISwipeGestureRecognizerDirection)direction
199+
- (void)addSwipeGestureRecognizerWithSelector:(nonnull SEL)selector direction:(UISwipeGestureRecognizerDirection)direction name:(NSString *)name
169200
{
170201
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:selector];
171202
recognizer.direction = direction;
172203

173-
[_tvRemoteGestureRecognizers addObject:recognizer];
204+
_tvRemoteGestureRecognizers[name] = recognizer;
174205
}
175206

176207
- (void)sendAppleTVEvent:(NSString *)eventType toView:(__unused UIView *)v

React/React.xcodeproj/project.pbxproj

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,10 @@
263263
27595AD61E575C7800CCE2B1 /* Platform.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D21E03699D0018521A /* Platform.h */; };
264264
27595AD71E575C7800CCE2B1 /* SampleCxxModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D41E03699D0018521A /* SampleCxxModule.h */; };
265265
27595AD81E575C7800CCE2B1 /* SystraceSection.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D51E03699D0018521A /* SystraceSection.h */; };
266+
2D16E68E1FA4FD3900B85C8A /* RCTTVNavigationEventEmitter.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D0B842D1EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.h */; };
267+
2D1D83CD1F74E2CE00615550 /* libprivatedata-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9936F32F1F5F2E5B0010BF04 /* libprivatedata-tvOS.a */; };
268+
2D1D83CE1F74E2DA00615550 /* libdouble-conversion.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D383D621EBD27B9005632C8 /* libdouble-conversion.a */; };
269+
2D1D83EF1F74E76C00615550 /* RCTModalManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 91076A871F743AB00081B4FA /* RCTModalManager.m */; };
266270
2D3B5E931D9B087300451313 /* RCTErrorInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EDCA8A41D3591E700450C31 /* RCTErrorInfo.m */; };
267271
2D3B5E941D9B087900451313 /* RCTBundleURLProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 68EFE4ED1CF6EB3900A1DE13 /* RCTBundleURLProvider.m */; };
268272
2D3B5E951D9B087C00451313 /* RCTAssert.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CBBA4B1A601E3B00E9B192 /* RCTAssert.m */; };
@@ -520,7 +524,6 @@
520524
3D383D6D1EBD2940005632C8 /* libdouble-conversion.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139D7E881E25C6D100323FB7 /* libdouble-conversion.a */; };
521525
3D383D6E1EBD2940005632C8 /* libjschelpers.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D3CD90B1DE5FBD600167DC4 /* libjschelpers.a */; };
522526
3D383D6F1EBD2940005632C8 /* libthird-party.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139D7ECE1E25DB7D00323FB7 /* libthird-party.a */; };
523-
3D383D701EBD2949005632C8 /* libdouble-conversion.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D383D621EBD27B9005632C8 /* libdouble-conversion.a */; };
524527
3D383D711EBD2949005632C8 /* libjschelpers.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D3CD9181DE5FBD800167DC4 /* libjschelpers.a */; };
525528
3D383D721EBD2949005632C8 /* libthird-party.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D383D3C1EBD27B6005632C8 /* libthird-party.a */; };
526529
3D3C08891DE342FB00C268FA /* libyoga.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D3C059A1DE3340900C268FA /* libyoga.a */; };
@@ -1299,6 +1302,7 @@
12991302
dstPath = include/React;
13001303
dstSubfolderSpec = 16;
13011304
files = (
1305+
2D16E68E1FA4FD3900B85C8A /* RCTTVNavigationEventEmitter.h in Copy Headers */,
13021306
59500D481F71C67600B122B7 /* RCTUIManagerUtils.h in Copy Headers */,
13031307
3D0E37901F1CC5E100DCAC9F /* RCTWebSocketModule.h in Copy Headers */,
13041308
5960C1BF1F0804F50066FD5B /* RCTLayoutAnimation.h in Copy Headers */,
@@ -2210,7 +2214,8 @@
22102214
isa = PBXFrameworksBuildPhase;
22112215
buildActionMask = 2147483647;
22122216
files = (
2213-
3D383D701EBD2949005632C8 /* libdouble-conversion.a in Frameworks */,
2217+
2D1D83CE1F74E2DA00615550 /* libdouble-conversion.a in Frameworks */,
2218+
2D1D83CD1F74E2CE00615550 /* libprivatedata-tvOS.a in Frameworks */,
22142219
3D383D711EBD2949005632C8 /* libjschelpers.a in Frameworks */,
22152220
3D383D721EBD2949005632C8 /* libthird-party.a in Frameworks */,
22162221
3D8ED92C1E5B120100D83D20 /* libcxxreact.a in Frameworks */,
@@ -3997,6 +4002,7 @@
39974002
2D3B5EC61D9B095000451313 /* RCTProfileTrampoline-x86_64.S in Sources */,
39984003
2D3B5EA61D9B08CA00451313 /* RCTTouchEvent.m in Sources */,
39994004
2D8C2E331DA40441000EE098 /* RCTMultipartStreamReader.m in Sources */,
4005+
2D1D83EF1F74E76C00615550 /* RCTModalManager.m in Sources */,
40004006
2D3B5EF01D9B09E300451313 /* RCTWrapperViewController.m in Sources */,
40014007
2D3B5EEC1D9B09D400451313 /* RCTTabBarItemManager.m in Sources */,
40024008
2D3B5EB01D9B08FE00451313 /* RCTAlertManager.m in Sources */,

0 commit comments

Comments
 (0)