react-native-navigation的迁移库

StaticLifecycleOverlay.js 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. const React = require('react');
  2. const { Component } = require('react');
  3. const { View, Text, TouchableOpacity } = require('react-native');
  4. const { Navigation } = require('react-native-navigation');
  5. const TestIDs = require('../testIDs');
  6. let _overlayInstance;
  7. const logLifecycleEvent = (event) => {
  8. _overlayInstance.setState({
  9. events: [..._overlayInstance.state.events, event]
  10. });
  11. }
  12. class StaticLifecycleOverlay extends Component {
  13. static options() {
  14. return {
  15. layout: {
  16. componentBackgroundColor: 'transparent'
  17. }
  18. }
  19. }
  20. componentDidMount() {
  21. _overlayInstance = this;
  22. }
  23. componentWillUnmount() {
  24. _overlayInstance = null;
  25. }
  26. constructor(props) {
  27. super(props);
  28. this.state = {
  29. text: 'nothing yet',
  30. events: []
  31. };
  32. this.listeners = [];
  33. this.listeners.push(Navigation.events().registerComponentDidAppearListener((event) => {
  34. event.event = 'componentDidAppear';
  35. this.setState({
  36. events: [...this.state.events, { ...event }]
  37. });
  38. }));
  39. this.listeners.push(Navigation.events().registerComponentDidDisappearListener((event) => {
  40. event.event = 'componentDidDisappear';
  41. this.setState({
  42. events: [...this.state.events, { ...event }]
  43. });
  44. }));
  45. this.listeners.push(Navigation.events().registerCommandListener((commandName) => {
  46. this.setState({
  47. events: [...this.state.events, { event: 'command started', commandName }]
  48. });
  49. }));
  50. this.listeners.push(Navigation.events().registerNavigationButtonPressedListener(({ componentId, buttonId }) => {
  51. this.setState({
  52. events: [...this.state.events, { event: 'navigationButtonPressed', buttonId, componentId }]
  53. });
  54. }));
  55. this.listeners.push(Navigation.events().registerModalDismissedListener(({ componentId }) => {
  56. this.setState({
  57. events: [...this.state.events, { event: 'modalDismissed', componentId }]
  58. });
  59. }));
  60. }
  61. componentWillUnmount() {
  62. this.listeners.forEach(listener => listener.remove());
  63. this.listeners = [];
  64. alert('Overlay Unmounted');
  65. }
  66. renderEvent(event) {
  67. if (event.commandId) {
  68. return <Text style={styles.h2}>{`${event.commandId}`}</Text>;
  69. } else if (event.commandName) {
  70. return <Text style={styles.h2}>{`${event.commandName}`}</Text>;
  71. } else if (event.componentName) {
  72. return <Text style={styles.h2}>{`${event.event} | ${event.componentName} | ${event.componentType}`}</Text>;
  73. } else if (event.buttonId) {
  74. return <Text style={styles.h2}>{`${event.event} | ${event.buttonId}`}</Text>;
  75. } else if (event.text){
  76. return <Text style={styles.h2}>{`${event.text}`}</Text>;
  77. } else {
  78. return <Text style={styles.h2}>{`${event.event} | ${event.componentId}`}</Text>;
  79. }
  80. }
  81. render() {
  82. const events = this.state.events.map((event, idx) =>
  83. (
  84. <View key={`${event.componentId}${idx}`}>
  85. {this.renderEvent(event)}
  86. </View>
  87. ));
  88. return (
  89. <View style={styles.root}>
  90. <Text style={styles.h1}>{`Static Lifecycle Events Overlay`}</Text>
  91. <View style={styles.events}>
  92. {events}
  93. </View>
  94. {this.renderDismissButton()}
  95. {this.renderClearButton()}
  96. </View>
  97. );
  98. }
  99. renderDismissButton = () => {
  100. return (
  101. <TouchableOpacity
  102. style={styles.dismissBtn}
  103. onPress={() => Navigation.dismissOverlay(this.props.componentId)}
  104. >
  105. <Text testID={TestIDs.DISMISS_BTN} style={{ color: 'red', alignSelf: 'center' }}>X</Text>
  106. </TouchableOpacity>
  107. );
  108. }
  109. renderClearButton = () => {
  110. return (
  111. <TouchableOpacity
  112. style={styles.clearBtn}
  113. onPress={() => this.setState({events: []})}
  114. >
  115. <Text testID={TestIDs.CLEAR_OVERLAY_EVENTS_BTN} style={{ color: 'red', alignSelf: 'center' }}>Clear</Text>
  116. </TouchableOpacity>
  117. );
  118. }
  119. }
  120. module.exports = {
  121. StaticLifecycleOverlay,
  122. logLifecycleEvent
  123. }
  124. const styles = {
  125. root: {
  126. position: 'absolute',
  127. bottom: 0,
  128. left: 0,
  129. right: 0,
  130. height: 150,
  131. backgroundColor: '#c1d5e0ae',
  132. flexDirection: 'column'
  133. },
  134. dismissBtn: {
  135. position: 'absolute',
  136. width: 35,
  137. height: 35,
  138. backgroundColor: 'white',
  139. justifyContent: 'center'
  140. },
  141. clearBtn: {
  142. position: 'absolute',
  143. right: 0,
  144. width: 35,
  145. height: 35,
  146. backgroundColor: 'white',
  147. justifyContent: 'center'
  148. },
  149. events: {
  150. flexDirection: 'column',
  151. marginHorizontal: 2
  152. },
  153. h1: {
  154. fontSize: 14,
  155. textAlign: 'center',
  156. margin: 4
  157. },
  158. h2: {
  159. fontSize: 10
  160. }
  161. };