MeScreen.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. import React, {Component} from 'react';
  2. import TitleBar from '../views/TitleBar';
  3. import ListItem from '../views/ListItem';
  4. import ListItemDivider from '../views/ListItemDivider';
  5. import StorageUtil from '../utils/StorageUtil';
  6. import CommonLoadingView from '../views/CommonLoadingView';
  7. import CountEmitter from '../event/CountEmitter';
  8. import Global from '../utils/Global';
  9. import Utils from '../utils/Utils';
  10. import Toast from '@remobile/react-native-toast';
  11. import {
  12. Dimensions,
  13. Image,
  14. PixelRatio,
  15. ScrollView,
  16. StyleSheet,
  17. Text,
  18. TouchableHighlight,
  19. TouchableOpacity,
  20. View
  21. } from 'react-native';
  22. const {width} = Dimensions.get('window');
  23. export default class MeScreen extends Component {
  24. static navigationOptions = {
  25. tabBarLabel: '我',
  26. tabBarIcon: ({focused, tintColor}) => {
  27. if (focused) {
  28. return (
  29. <Image style={styles.tabBarIcon} source={require('../../images/ic_me_selected.png')}/>
  30. );
  31. }
  32. return (
  33. <Image style={styles.tabBarIcon} source={require('../../images/ic_me_normal.png')}/>
  34. );
  35. },
  36. };
  37. constructor(props) {
  38. super(props);
  39. this.state = {
  40. username: '',
  41. loadingState: Global.loading,
  42. };
  43. this.loadUserInfo();
  44. }
  45. loadUserInfo() {
  46. StorageUtil.get('username', (error, object) => {
  47. if (!error && object != null) {
  48. let username = object.username;
  49. this.setState({username: username});
  50. let userInfoKey = 'userInfo-' + username;
  51. StorageUtil.get(userInfoKey, (error, object) => {
  52. if (!error && object != null) {
  53. this.setState({userInfo: object.info});
  54. this.setState({loadingState: Global.loadSuccess});
  55. } else {
  56. this.setState({loadingState: Global.loadError});
  57. }
  58. })
  59. } else {
  60. this.setState({loadingState: Global.loadError});
  61. }
  62. });
  63. }
  64. componentWillMount() {
  65. CountEmitter.addListener('updateAvatar', () => {
  66. // 刷新头像
  67. this.loadUserInfo();
  68. });
  69. CountEmitter.addListener('updateUserInfo', () => {
  70. // 刷新用户数据
  71. this.loadUserInfo();
  72. });
  73. }
  74. componentWillUnmount() {
  75. CountEmitter.removeListener('updateAvatar', ()=>{});
  76. CountEmitter.removeListener('updateUserInfo', ()=>{});
  77. }
  78. render() {
  79. switch (this.state.loadingState) {
  80. case Global.loading:
  81. return this.renderLoadingView();
  82. case Global.loadSuccess:
  83. return this.renderDetailView();
  84. case Global.loadError:
  85. return this.renderErrorView();
  86. }
  87. }
  88. renderLoadingView() {
  89. return (
  90. <View style={styles.container}>
  91. <TitleBar nav={this.props.navigation}/>
  92. <View style={styles.content}>
  93. <CommonLoadingView hintText={"正在获取联系人数据..."}/>
  94. </View>
  95. </View>
  96. );
  97. }
  98. renderErrorView() {
  99. return (
  100. <View style={styles.container}>
  101. <TitleBar nav={this.props.navigation}/>
  102. <TouchableOpacity style={styles.content} activeOpacity={0.6} onPress={() => this.loadUserInfo()}>
  103. <View style={[styles.content, {justifyContent: 'center', alignItems: 'center'}]}>
  104. <Text style={{fontSize: 17, color: '#999999'}}>加载用户数据失败</Text>
  105. <Text style={{fontSize: 17, color: '#999999', marginTop: 5}}>点击屏幕重试</Text>
  106. </View>
  107. </TouchableOpacity>
  108. </View>
  109. );
  110. }
  111. renderDetailView() {
  112. let avatar = require('../../images/avatar.png');
  113. if (!Utils.isEmpty(this.state.userInfo) && !Utils.isEmpty(this.state.userInfo.avatar)) {
  114. avatar = {uri: this.state.userInfo.avatar};
  115. }
  116. return (
  117. <View style={styles.container}>
  118. <TitleBar nav={this.props.navigation}/>
  119. <View style={styles.divider}></View>
  120. <ScrollView style={styles.content}>
  121. <View style={{width: width, height: 20}}/>
  122. <TouchableHighlight underlayColor={Global.touchableHighlightColor} onPress={() => {
  123. this.turnOnPage('PersonInfo', {userInfo: this.state.userInfo})
  124. }}>
  125. <View style={styles.meInfoContainer}>
  126. <Image style={styles.meInfoAvatar} source={avatar}/>
  127. <View style={styles.meInfoTextContainer}>
  128. <Text style={styles.meInfoNickName}>{this.state.username}</Text>
  129. <Text style={styles.meInfoWeChatId}>{"昵称:" + this.state.userInfo.nick}</Text>
  130. </View>
  131. <Image style={styles.meInfoQRCode} source={require('../../images/ic_qr_code.png')}/>
  132. </View>
  133. </TouchableHighlight>
  134. <View/>
  135. <View style={{width: width, height: 20}}/>
  136. <ListItem icon={require('../../images/ic_wallet.png')} text={"钱包"}/>
  137. <View style={{width: width, height: 20}}/>
  138. <ListItem icon={require('../../images/ic_collect.png')} text={"收藏"} showDivider={true}/>
  139. <ListItemDivider/>
  140. <ListItem icon={require('../../images/ic_gallery.png')} text={"相册"} showDivider={true} handleClick={() => {
  141. this.turnOnPage('Moment')
  142. }}/>
  143. <ListItemDivider/>
  144. <ListItem icon={require('../../images/ic_kabao.png')} text={"卡包"} showDivider={true} handleClick={() => {
  145. this.turnOnPage('CardPackage')
  146. }}/>
  147. <ListItemDivider/>
  148. <ListItem icon={require('../../images/ic_emoji.png')} text={"表情"}/>
  149. <View style={{width: width, height: 20}}/>
  150. <ListItem icon={require('../../images/ic_settings.png')} text={"设置"} handleClick={() => {
  151. this.turnOnPage('Settings')
  152. }}/>
  153. <View style={{width: width, height: 20}}/>
  154. </ScrollView>
  155. <View style={styles.divider}></View>
  156. </View>
  157. );
  158. }
  159. turnOnPage(pageName, params) {
  160. if (Utils.isEmpty(params)) {
  161. this.props.navigation.navigate(pageName);
  162. } else {
  163. this.props.navigation.navigate(pageName, params);
  164. }
  165. }
  166. }
  167. const styles = StyleSheet.create({
  168. container: {
  169. flex: 1,
  170. flexDirection: 'column',
  171. justifyContent: 'center',
  172. alignItems: 'center'
  173. },
  174. divider: {
  175. width: width,
  176. height: 1 / PixelRatio.get(),
  177. backgroundColor: '#D3D3D3'
  178. },
  179. content: {
  180. flex: 1,
  181. width: width,
  182. flexDirection: 'column',
  183. backgroundColor: Global.pageBackgroundColor,
  184. },
  185. tabBarIcon: {
  186. width: 24,
  187. height: 24,
  188. },
  189. meInfoContainer: {
  190. width: width,
  191. flexDirection: 'row',
  192. alignItems: 'center',
  193. paddingLeft: 15,
  194. paddingRight: 15,
  195. backgroundColor: '#FFFFFF',
  196. paddingTop: 10,
  197. paddingBottom: 10,
  198. },
  199. meInfoAvatar: {
  200. width: 60,
  201. height: 60,
  202. },
  203. meInfoTextContainer: {
  204. flex: 1,
  205. paddingLeft: 15,
  206. paddingRight: 15,
  207. },
  208. meInfoNickName: {
  209. color: '#000000',
  210. fontSize: 16,
  211. },
  212. meInfoWeChatId: {
  213. color: '#999999',
  214. fontSize: 14,
  215. marginTop: 5,
  216. },
  217. meInfoQRCode: {
  218. width: 25,
  219. height: 25,
  220. }
  221. });