App.jsx 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. import React, {Component} from 'react';
  2. import {Layout, Menu, Input, Button, Spin, Breadcrumb, Icon, Radio, LocaleProvider} from 'antd';
  3. import {BrowserRouter as Router, Route, Link, Switch, Redirect} from "react-router-dom";
  4. import gql from "graphql-tag";
  5. import {Query} from "react-apollo";
  6. import moment from 'moment';
  7. import 'moment/locale/zh-cn';
  8. import { FormattedMessage } from 'react-intl';
  9. import CloudFunction from '../cloudFunction/CloudFunction';
  10. import MonitorNotify from '../monitorNotify/MonitorNotify';
  11. import DataAnalysis from '../dataAnalysis/DataAnalysis';
  12. import DataStorage from '../dataStorage/DataStorage';
  13. import zhCN from 'antd/lib/locale-provider/zh_CN';
  14. import '../common/graphql/index.css';
  15. import './index.css'
  16. import TrialCase from "../trialCase/TrialCase";
  17. const {SubMenu} = Menu;
  18. const {Header, Sider} = Layout;
  19. moment.locale('en');
  20. class App extends Component {
  21. constructor(props) {
  22. super(props);
  23. sessionStorage.setItem("language","English");
  24. this.state = {
  25. menuLevel1: "trail",
  26. sideBar: "e-commerce",
  27. userID: '',
  28. hasLogin: false,
  29. user: {
  30. nickname: '',
  31. avatar: ''
  32. },
  33. collapsed: false,
  34. inlineCollapsed: false,
  35. locale: undefined,
  36. language: sessionStorage.getItem("language")
  37. };
  38. }
  39. onCollapse = (collapsed) => {
  40. console.log(collapsed);
  41. this.setState({collapsed});
  42. };
  43. switchMenu = (menuName, e) => {
  44. console.log('menuName', menuName, 'e', e);
  45. this.setState({
  46. [menuName]: e.key,
  47. });
  48. };
  49. changeLocale = (e) => {
  50. e.stopPropagation();
  51. let language = sessionStorage.getItem("language");
  52. console.log('now language',language);
  53. let local = language === "中文" ? zhCN : undefined;
  54. console.log('local',local);
  55. let changeLanguage = language === "中文" ? "English" : "中文";
  56. console.log('changeLanguage',changeLanguage);
  57. sessionStorage.setItem("language",changeLanguage);
  58. this.props.changeLanguage(changeLanguage);
  59. this.setState({
  60. language:changeLanguage,
  61. locale:local
  62. });
  63. if (!local) {
  64. moment.locale('en');
  65. } else {
  66. moment.locale('zh-cn');
  67. }
  68. };
  69. login = (id) => {
  70. const GET_USER = gql`
  71. query USER($id: ID!) {
  72. user_by_id(id: $id) {
  73. avatar,
  74. nickname
  75. }
  76. }
  77. `;
  78. return (
  79. <Query query={GET_USER} variables={{id}}>
  80. {
  81. ({loading, error, data}) => {
  82. if (loading) {
  83. return <Spin style={{marginLeft: 3}}/>
  84. }
  85. if (error) {
  86. return 'error!';
  87. }
  88. if (data.user_by_id === null)
  89. return (
  90. <div>
  91. <span style={{marginRight: '10px'}}>no such person</span>
  92. <Button onClick={() => {
  93. this.setState({hasLogin: false})
  94. }}>relogin</Button>
  95. </div>
  96. );
  97. else {
  98. // 不可使用 this.setState, 会报错。
  99. // Warning: Cannot update during an existing state transition (such as within `render`).
  100. // Render methods should be a pure function of props and state.
  101. this.state.user = {
  102. avatar: data.user_by_id.avatar,
  103. nickname: data.user_by_id.nickname
  104. };
  105. console.log(data);
  106. return (
  107. <div>
  108. <span style={{marginRight: '10px'}}>welcome, {data.user_by_id.nickname}</span>
  109. <Button onClick={() => {
  110. this.setState({hasLogin: false})
  111. }}>exit</Button>
  112. </div>
  113. );
  114. }
  115. }
  116. }
  117. </Query>
  118. )
  119. };
  120. render() {
  121. const { locale,language } = this.state;
  122. console.log('locale1',locale);
  123. return (
  124. <Router>
  125. <Layout style={{minHeight: '100vh'}}>
  126. <Header className="header" style={{position: 'fixed', zIndex: 1, width: '100%'}}>
  127. <Link to="/">
  128. <div className="logo-wrapper">
  129. <div className='logo'/>
  130. </div>
  131. </Link>
  132. <Menu
  133. theme="dark"
  134. mode="horizontal"
  135. // defaultSelectedKeys={['cloud-function']}
  136. style={{lineHeight: '64px'}}
  137. onClick={(e) => this.switchMenu('menuLevel1', e)}
  138. >
  139. <Menu.Item key="cloud-function">
  140. <Link to="/cloud-function"><FormattedMessage id="Cloud Function"/></Link>
  141. </Menu.Item>
  142. <Menu.Item key="data-storage">
  143. <Link to="/data-storage/"><FormattedMessage id="Data Storage"/></Link>
  144. </Menu.Item>
  145. <Menu.Item key="data-analysis">
  146. <Link to="/data-analysis/"><FormattedMessage id="Data Analysis"/></Link>
  147. </Menu.Item>
  148. <Menu.Item key="monitor-notification">
  149. <Link to="/monitor-notification/"><FormattedMessage id="Monitor Notification"/></Link>
  150. </Menu.Item>
  151. </Menu>
  152. <div className="change-locale">
  153. <Button size="small" onClick={(e)=>this.changeLocale(e)}>{language}</Button>
  154. </div>
  155. {/*<div className='login'>*/}
  156. {/*{*/}
  157. {/*this.state.hasLogin ?*/}
  158. {/*this.login(this.state.userID)*/}
  159. {/*:*/}
  160. {/*<div>*/}
  161. {/*<span style={{marginRight: 20}}>login:</span>*/}
  162. {/*<Input*/}
  163. {/*placeholder="id, eg: 'xy_1'"*/}
  164. {/*onChange={(e) => {*/}
  165. {/*// antd 获取不到 target,百度来的下面这句代码*/}
  166. {/*e.persist();*/}
  167. {/*this.setState({userID: e.target.value});*/}
  168. {/*}}*/}
  169. {/*onPressEnter={() => {*/}
  170. {/*this.setState({hasLogin: true})*/}
  171. {/*}}*/}
  172. {/*style={{width: 200}}*/}
  173. {/*/>*/}
  174. {/*</div>*/}
  175. {/*}*/}
  176. {/*</div>*/}
  177. </Header>
  178. <Sider
  179. width={200}
  180. style={{background: '#fff', marginTop: '64px', zIndex: '0'}}
  181. collapsible
  182. collapsed={this.state.collapsed}
  183. onCollapse={this.onCollapse}
  184. >
  185. <Menu
  186. theme="dark"
  187. mode="inline"
  188. inlineCollapsed={this.state.inlineCollapsed}
  189. defaultSelectedKeys={['e-commerce']}
  190. defaultOpenKeys={['trial-case']}
  191. // openKeys={['cloud-function']}
  192. onClick={(e) => this.switchMenu('sideBar', e)}
  193. selectedKeys={[this.state.sideBar]}
  194. style={{
  195. borderRight: 0,
  196. overflow: 'auto',
  197. height: '100vh',
  198. left: '0',
  199. width: '200px',
  200. position: 'fixed'
  201. }}
  202. >
  203. <SubMenu key="trial-case" title={<span><Icon type="appstore" theme="twoTone"/><span>Trial Case</span></span>}>
  204. <Menu.Item key="e-commerce"><Link to="/">e-commerce</Link></Menu.Item>
  205. <Menu.Item key="keep accounts"><Link to="/">keep accounts</Link></Menu.Item>
  206. <Menu.Item key="appointment"><Link to="/">appointment</Link></Menu.Item>
  207. </SubMenu>
  208. {(() => {
  209. switch (this.state.menuLevel1) {
  210. case 'cloud-function':
  211. return (
  212. <SubMenu
  213. key="cloud-function"
  214. title={<span><Icon type="cloud"
  215. theme="twoTone"/><span>Cloud Function</span></span>}>
  216. <Menu.Item key="wechat-service">wechat-service</Menu.Item>
  217. <Menu.Item key="graphql-service">graphql-service</Menu.Item>
  218. <Menu.Item
  219. key="quantization-service">quantization-service</Menu.Item>
  220. </SubMenu>
  221. );
  222. case 'data-storage':
  223. return (
  224. <SubMenu
  225. key="data-storage"
  226. title={<span><Icon type="database"
  227. theme="twoTone"/><span>Data Storage</span></span>}>
  228. <Menu.Item key="snbl-mongo">snbl-mongo</Menu.Item>
  229. </SubMenu>
  230. );
  231. case 'data-analysis':
  232. return (
  233. <SubMenu
  234. key="data-analysis"
  235. title={<span><Icon type="fund"
  236. theme="twoTone"/><span>data Analysis</span></span>}>
  237. <Menu.Item key="metabase">metabase</Menu.Item>
  238. </SubMenu>
  239. );
  240. case 'monitor-notification':
  241. return (
  242. <SubMenu
  243. key="monitor-notification"
  244. title={<span><Icon type="alert" theme="twoTone"/><span>Monitor Notification</span></span>}>
  245. <Menu.Item key="monitor">monitor</Menu.Item>
  246. <Menu.Item key="graphql-events">graphql-events</Menu.Item>
  247. <Menu.Item key="stock-signal">stock-signal</Menu.Item>
  248. </SubMenu>
  249. );
  250. default:
  251. return (
  252. <SubMenu
  253. key="cloud-function"
  254. title={<span><Icon type="cloud"
  255. theme="twoTone"/><span>Cloud Function</span></span>}>
  256. <Menu.Item key="wechat-service">wechat-service</Menu.Item>
  257. <Menu.Item key="graphql-service">graphql-service</Menu.Item>
  258. <Menu.Item
  259. key="quantization-service">quantization-service</Menu.Item>
  260. </SubMenu>
  261. );
  262. }
  263. })()}
  264. <SubMenu key="my-create"
  265. title={<span><Icon type="user"
  266. theme="outlined"/><span>My Create</span></span>}>
  267. <Menu.Item key="8">option9</Menu.Item>
  268. </SubMenu>
  269. </Menu>
  270. </Sider>
  271. <LocaleProvider locale={locale}>
  272. <Layout style={{marginTop: '64px', zIndex: '0'}} key={locale ? locale.locale : 'en'/* Have to refresh for production environment */} >
  273. <Switch>
  274. <Route path="/" exact component={TrialCase}/>
  275. <Route path="/cloud-function" component={CloudFunction}/>
  276. <Route path="/data-storage/" component={DataStorage}/>
  277. <Route path="/data-analysis/" component={DataAnalysis}/>
  278. <Route path="/monitor-notification/" component={MonitorNotify}/>
  279. <Redirect path="*" to="/"/>
  280. </Switch>
  281. </Layout>
  282. </LocaleProvider>
  283. </Layout>
  284. </Router>
  285. );
  286. }
  287. }
  288. export default App;