AccountConfig.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. import React, {Component} from 'react';
  2. import {FormattedMessage} from 'react-intl';
  3. import {Icon, Row, Col, Input, Button, Spin} from 'antd';
  4. import './index.css'
  5. import avatar from '../images/avatar.jpg';
  6. import classnames from 'classnames';
  7. import {Mutation, Query} from "react-apollo";
  8. import {GET_USER, UPDATE_USER} from "../gql";
  9. import gql from "graphql-tag";
  10. import {getCookie} from "../cookie";
  11. class AccountConfig extends Component {
  12. constructor(props) {
  13. super(props);
  14. this.state = {
  15. overNickname: false,
  16. editNickname: false,
  17. overTelephone: false,
  18. editTelephone: false,
  19. overEmail: false,
  20. editEmail: false,
  21. userID: ''
  22. };
  23. }
  24. componentWillMount() {
  25. this.setState({
  26. userID: getCookie('user_id')
  27. })
  28. }
  29. cancelEdit = (kind) => {
  30. let key = `edit${kind[0].toUpperCase()}${kind.slice(1)}`;
  31. this.setState({
  32. [key]: false
  33. })
  34. };
  35. render() {
  36. let {userID} = this.state;
  37. return (
  38. <Query query={gql(GET_USER)} variables={{id: userID}}>
  39. {
  40. ({loading, error, data}) => {
  41. if (loading) {
  42. return <Spin style={{marginLeft: 3}}/>
  43. }
  44. if (error) {
  45. return 'error!';
  46. }
  47. if (data.user_by_id === null) {
  48. return (
  49. <Row style={{marginTop: 100}}>
  50. <Col span={12} offset={6} className={'login-wrapper'}>
  51. <Row>
  52. <Col span={4} offset={20}>
  53. <div className="back-to-login" onClick={() => {
  54. this.props.history.push({
  55. pathname: '/login',
  56. })
  57. }}>
  58. <FormattedMessage id="login"/> <Icon type="right"
  59. style={{color: '#848fa6'}}/>
  60. </div>
  61. </Col>
  62. </Row>
  63. <div className={'no-login-tip'}>
  64. <span>你还没有登录</span>
  65. </div>
  66. </Col>
  67. </Row>
  68. )
  69. } else {
  70. return (
  71. <div>
  72. <Row style={{marginTop: 100}}>
  73. <Col span={12} offset={6} className={'login-wrapper'}>
  74. <div className={'mask'} style={{backgroundImage: `url(${avatar})`}}>
  75. <div className={'mask-black'}>
  76. <div className={'tip'}>
  77. <Icon style={{fontSize: 30, display: 'block'}} type="camera"/>
  78. <span style={{paddingTop: 5, display: 'block'}}
  79. className={'tip-span'}><FormattedMessage
  80. id="modify avatar"/></span>
  81. </div>
  82. </div>
  83. </div>
  84. <Row>
  85. <Col span={20} offset={4} className={'message-wrapper'}>
  86. <Row>
  87. <Col span={20}>
  88. {
  89. this.state.editNickname ?
  90. <EditNickname cancelEdit={this.cancelEdit}
  91. userID={userID}
  92. data={data.user_by_id}/>
  93. :
  94. <div className={'nickname'} onMouseOver={() => {
  95. this.setState({overNickname: true})
  96. }} onMouseLeave={() => {
  97. this.setState({overNickname: false})
  98. }}>
  99. {
  100. data.user_by_id.nickname || 'please input'
  101. }
  102. {
  103. this.state.overNickname ?
  104. <span style={{
  105. paddingLeft: '5px',
  106. paddingRight: '5px'
  107. }}
  108. onClick={() => {
  109. this.setState({
  110. editNickname: true,
  111. overNickname: false
  112. })
  113. }}>
  114. <Icon style={{fontSize: '18px'}} type="edit"
  115. theme="twoTone"/>
  116. <span className={'modify'}> <FormattedMessage
  117. id="modify"/></span></span>
  118. :
  119. ''
  120. }
  121. </div>
  122. }
  123. </Col>
  124. <Col span={4}>
  125. <div className="back-to-login" onClick={() => {
  126. this.props.history.push({
  127. pathname: '/login',
  128. })
  129. }}>
  130. <FormattedMessage id="login"/> <Icon type="right"
  131. style={{color: '#848fa6'}}/>
  132. </div>
  133. </Col>
  134. </Row>
  135. <Row className={'message'}>
  136. <Col span={5}>
  137. <span className={'message-title'}><FormattedMessage
  138. id="tel"/></span>
  139. </Col>
  140. <Col span={19}>
  141. {
  142. this.state.editTelephone ?
  143. <Edit kind={'telephone'} cancelEdit={this.cancelEdit} userID={userID} data={data.user_by_id}/>
  144. :
  145. <div className={'message-content'}
  146. onMouseOver={() => {
  147. this.setState({overTelephone: true})
  148. }} onMouseLeave={() => {
  149. this.setState({overTelephone: false})
  150. }}>
  151. {
  152. data.user_by_id.telephone || 'please input'
  153. }
  154. {
  155. this.state.overTelephone ?
  156. <span style={{
  157. paddingLeft: '5px',
  158. paddingRight: '5px'
  159. }}
  160. onClick={() => {
  161. this.setState({
  162. editTelephone: true,
  163. overTelephone: false
  164. })
  165. }}>
  166. <Icon style={{fontSize: '18px'}} type="edit"
  167. theme="twoTone"/>
  168. <span className={'modify'}> <FormattedMessage
  169. id="modify"/></span></span>
  170. :
  171. ''
  172. }
  173. </div>
  174. }
  175. </Col>
  176. </Row>
  177. <Row className={'message'}>
  178. <Col span={5}>
  179. <span className={'message-title'}><FormattedMessage
  180. id="email"/></span>
  181. </Col>
  182. <Col span={19}>
  183. {
  184. this.state.editEmail ?
  185. <Edit kind={'email'} cancelEdit={this.cancelEdit} userID={userID} data={data.user_by_id}/>
  186. :
  187. <div className={'message-content'}
  188. onMouseOver={() => {
  189. this.setState({overEmail: true})
  190. }} onMouseLeave={() => {
  191. this.setState({overEmail: false})
  192. }}>
  193. {
  194. data.user_by_id.email || 'please input'
  195. }
  196. {
  197. this.state.overEmail ?
  198. <span style={{
  199. paddingLeft: '5px',
  200. paddingRight: '5px'
  201. }}
  202. onClick={() => {
  203. this.setState({
  204. editEmail: true,
  205. overEmail: false
  206. })
  207. }}>
  208. <Icon style={{fontSize: '18px'}} type="edit"
  209. theme="twoTone"/>
  210. <span className={'modify'}> <FormattedMessage
  211. id="modify"/></span>
  212. </span>
  213. :
  214. ''
  215. }
  216. </div>
  217. }
  218. </Col>
  219. </Row>
  220. </Col>
  221. </Row>
  222. </Col>
  223. </Row>
  224. </div>
  225. )
  226. }
  227. }
  228. }
  229. </Query>
  230. )
  231. }
  232. }
  233. export default AccountConfig;
  234. class EditNickname extends Component {
  235. constructor(props) {
  236. super(props);
  237. this.state = {
  238. nickname: this.props.data.nickname
  239. }
  240. }
  241. componentWillReceiveProps(next) {
  242. this.setState({
  243. nickname: next.data.nickname
  244. });
  245. }
  246. render() {
  247. let {email, telephone, openid, avatar} = this.props.data;
  248. return (
  249. <Mutation
  250. mutation={gql(UPDATE_USER)}
  251. onCompleted={(data) => this.props.cancelEdit('nickname')}
  252. >
  253. {(update_schema, {loading, error}) => {
  254. if (loading)
  255. return <Spin style={{marginLeft: 30, marginTop: 10}}/>;
  256. if (error)
  257. return 'error';
  258. let varObj = {
  259. id: this.props.userID,
  260. email,
  261. updatedAt: new Date().getTime(),
  262. telephone,
  263. openid,
  264. avatar,
  265. nickname: this.state.nickname
  266. };
  267. return (
  268. <Row className={'message-top'}>
  269. <Col span={5}>
  270. <span className={'message-title message-title-high'}><FormattedMessage
  271. id="nickname"/></span>
  272. </Col>
  273. <Col span={19}>
  274. <span className={'message-content'}>
  275. <Input onChange={(e) => {
  276. this.setState({nickname: e.target.value})
  277. }} value={this.state.nickname}/>
  278. <Button type={'primary'} onClick={() => {
  279. update_schema({variables: varObj});
  280. }}><FormattedMessage id="save"/></Button>
  281. <Button onClick={() => this.props.cancelEdit('nickname')}><FormattedMessage
  282. id="cancel"/></Button>
  283. </span>
  284. </Col>
  285. </Row>
  286. )
  287. }}
  288. </Mutation>
  289. )
  290. }
  291. }
  292. class Edit extends Component {
  293. constructor(props) {
  294. super(props);
  295. this.state = {
  296. telephone: props.data.telephone,
  297. email: props.data.email,
  298. avatar: props.data.avatar,
  299. }
  300. }
  301. componentWillReceiveProps(next) {
  302. this.setState({
  303. telephone: next.data.telephone,
  304. email: next.data.email,
  305. avatar: next.data.avatar,
  306. });
  307. }
  308. render() {
  309. let {kind} = this.props;
  310. return (
  311. <Mutation
  312. mutation={gql(UPDATE_USER)}
  313. onCompleted={(data) => this.props.cancelEdit(kind)}
  314. >
  315. {(update_schema, {loading, error}) => {
  316. if (loading)
  317. return <Spin style={{marginLeft: 30, marginTop: 10}}/>;
  318. if (error)
  319. return 'error';
  320. let {email, telephone, openid, avatar, nickname} = this.props.data;
  321. let varObj = {
  322. id: this.props.userID,
  323. email,
  324. updatedAt: new Date().getTime(),
  325. telephone,
  326. openid,
  327. avatar,
  328. nickname
  329. };
  330. return (
  331. <span className={'message-content'}>
  332. <Input onChange={(e) => {
  333. this.setState({[kind]: e.target.value})
  334. }} value={this.state[kind]}/>
  335. <Button type={'primary'} onClick={() => {
  336. update_schema({variables: {...varObj, [kind]:this.state[kind]}});
  337. }}><FormattedMessage id="save"/></Button>
  338. <Button onClick={() => this.props.cancelEdit(kind)}><FormattedMessage id="cancel"/></Button>
  339. </span>
  340. )
  341. }}
  342. </Mutation>
  343. )
  344. }
  345. }