react-native-navigation的迁移库

StaticLifecycleOverlay.js 3.6KB

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