import React, {Component} from 'react'; import 'antd/dist/antd.css'; import './App.css'; import {Button, ConfigProvider, Dropdown, Layout, Menu, Tooltip} from 'antd'; import {Link, Route, Switch} from 'react-router-dom'; import Cluster from "./components/Cluster"; import Topic from "./components/Topic"; import TopicInfo from "./components/TopicInfo"; import TopicData from "./components/TopicData"; import Broker from "./components/Broker"; import ConsumerGroup from "./components/ConsumerGroup"; import ConsumerGroupInfo from "./components/ConsumerGroupInfo"; import {NT_PACKAGE} from "./utils/utils"; import zhCN from "antd/es/locale-provider/zh_CN"; import enUS from "antd/es/locale-provider/en_US"; import zh_CN from './locales/zh_CN'; import en_US from './locales/en_US'; import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; import 'dayjs/locale/zh-cn'; import {FormattedMessage, IntlProvider} from 'react-intl'; import Login from "./components/Login"; import request from "./common/request"; import { GithubOutlined } from '@ant-design/icons'; import Info from "./components/Info"; const {Header, Content, Footer} = Layout; dayjs.extend(relativeTime); class App extends Component { state = { package: NT_PACKAGE(), locale: 'en-us', info: { username: '' } } componentDidMount() { let locale = localStorage.getItem('locale'); if (!locale) { locale = 'en-us'; } dayjs.locale(locale); this.setState({ locale: locale }) this.loadUserInfo(); } setLocale = (locale) => { localStorage.setItem('locale', locale); window.location.reload(); } getAntDesignLocale = (locale) => { switch (locale) { case 'en-us': return enUS; case 'zh-cn': return zhCN; default: return undefined; } } loadUserInfo = async () => { let info = await request.get('/info'); this.setState({ info: info }) } logout = async () => { await request.post('/logout'); window.location.reload(); } render() { const menu = ( <Menu> <Menu.Item> <a href="/#" onClick={() => { this.setLocale('zh-cn'); }}> 简体中文 </a> </Menu.Item> <Menu.Item> <a href="/#" onClick={() => { this.setLocale('en-us'); }}> English </a> </Menu.Item> </Menu> ); const infoMenu = ( <Menu> <Menu.Item> <Link to={`/info`}> <FormattedMessage id="change-password"/> </Link> </Menu.Item> <Menu.Item> <a href="/#" onClick={() => { this.logout(); }}> <FormattedMessage id="logout"/> </a> </Menu.Item> </Menu> ); let messages = {} messages['en-us'] = en_US; messages['zh-cn'] = zh_CN; return ( <IntlProvider locale={this.state.locale} messages={messages[this.state.locale]}> <ConfigProvider locale={this.getAntDesignLocale(this.state.locale)}> <div className="App"> <Switch> <Route path="/login" component={Login}/> <Route> <Layout style={{minHeight: '100vh'}}> <Header className="header"> <div className='km-header'> <div style={{flex: '1 1 0%'}}> <Link to={'/'}> <span className='km-header-logo'>Kafka Map</span> </Link> </div> <div className='km-header-right'> <Dropdown overlay={infoMenu}> <span className={'km-header-right-item'}> {this.state.info.username} </span> </Dropdown> </div> <div className='km-header-right'> <Dropdown overlay={menu}> <span className={'km-header-right-item'}> <i className="anticon"> <svg viewBox="0 0 24 24" focusable="false" width="1em" height="1em" fill="currentColor" aria-hidden="true"> <path d="M0 0h24v24H0z" fill="none"/> <path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z " className="css-c4d79v"/> </svg> </i> </span> </Dropdown> </div> <div className='km-header-right'> <span className={'km-header-right-item'}> <Tooltip title="star"> <Button type="text" style={{color: 'white'}} href='https://github.com/dushixiang/kafka-map' icon={<GithubOutlined/>}> </Button> </Tooltip> </span> </div> </div> </Header> <Content className='km-container'> <Layout> <Content> <Route path="/" exact component={Cluster}/> <Route path="/topic" component={Topic}/> <Route path="/broker" component={Broker}/> <Route path="/consumer-group" component={ConsumerGroup}/> <Route path="/consumer-group-info" component={ConsumerGroupInfo}/> <Route path="/topic-info" component={TopicInfo}/> <Route path="/topic-data" component={TopicData}/> <Route path="/info" component={Info}/> </Content> </Layout> </Content> <Footer style={{textAlign: 'center'}}>kafka map ©2021 Created by dushixiang Version:{this.state.package['version']}</Footer> </Layout> </Route> </Switch> </div> </ConfigProvider> </IntlProvider> ); } } export default App;