import React from 'react'; import { FormattedMessage, injectIntl, WrappedComponentProps } from 'react-intl'; import { Modal, message } from 'antd'; import { Link } from 'bisheng/router'; import RcFooter from 'rc-footer'; import { presetPalettes } from '@ant-design/colors'; import { AntDesignOutlined, MediumOutlined, TwitterOutlined, ZhihuOutlined, UsergroupAddOutlined, GithubOutlined, HistoryOutlined, ProfileOutlined, BugOutlined, IssuesCloseOutlined, BookOutlined, MessageOutlined, QuestionCircleOutlined, } from '@ant-design/icons'; import { isLocalStorageNameSupported, loadScript, getLocalizedPathname } from '../utils'; import ColorPicker from '../Color/ColorPicker'; class Footer extends React.Component { lessLoaded = false; state = { color: presetPalettes.blue.primary, }; componentDidMount() { // for some iOS // http://stackoverflow.com/a/14555361 if (!isLocalStorageNameSupported()) { return; } // 大版本发布后全局弹窗提示 // 1. 点击『知道了』之后不再提示 // 2. 超过截止日期后不再提示 if ( localStorage.getItem('antd@3.0.0-notification-sent') !== 'true' && Date.now() < new Date('2017/12/20').getTime() ) { this.infoNewVersion(); } } getColumns() { const { intl, location } = this.props; const isZhCN = intl.locale === 'zh-CN'; const getLinkHash = (path: string, hash: { zhCN: string; enUS: string }) => { const pathName = getLocalizedPathname(path, isZhCN, location.query, hash); const { pathname, query } = pathName; const pathnames = pathname.split('#'); if ('direction' in query) { return `${pathnames[0]}?direction=rtl#${pathnames[1]}`; } return pathname; }; const getLink = (path: string) => { const pathName = getLocalizedPathname(path, isZhCN, location.query); const { pathname, query } = pathName; if ('direction' in query) { return `${pathname}?direction=rtl}`; } return pathname; }; const col1 = { title: , items: [ { title: 'Ant Design Pro', url: 'https://pro.ant.design', openExternal: true, }, { title: 'Ant Design Charts', url: 'https://charts.ant.design', openExternal: true, }, { title: 'Ant Design Mobile', url: 'https://mobile.ant.design', openExternal: true, }, { title: 'NG-ZORRO', description: 'Ant Design of Angular', url: 'https://ng.ant.design', openExternal: true, }, { title: 'NG-ZORRO-MOBILE', url: 'https://ng.mobile.ant.design', openExternal: true, }, { title: 'Ant Design Vue', url: 'https://vue.ant.design', openExternal: true, }, { title: 'Ant Design Landing', description: , url: 'https://landing.ant.design', openExternal: true, }, { title: 'Scaffolds', description: , url: 'https://scaffold.ant.design', openExternal: true, }, { title: 'Umi', description: , url: 'https://umijs.org', openExternal: true, }, { title: 'Dumi', description: , url: 'https://d.umijs.org', openExternal: true, }, { title: 'Remax', description: , url: 'https://remaxjs.org/', openExternal: true, }, { title: 'ahooks', description: , url: 'https://github.com/alibaba/hooks', openExternal: true, }, { title: 'Ant Motion', description: , url: 'https://motion.ant.design', openExternal: true, }, { title: , url: getLinkHash('/docs/resources', { zhCN: '设计资源', enUS: 'Design-Resources', }), LinkComponent: Link, }, { title: , url: 'https://ant-design.gitee.io/', }, ], }; const col2 = { title: , items: [ { icon: , title: , url: 'https://github.com/websemantics/awesome-ant-design', openExternal: true, }, { icon: , title: 'Medium', url: 'http://medium.com/ant-design/', openExternal: true, }, { icon: , title: 'Twitter', url: 'http://twitter.com/antdesignui', openExternal: true, }, { icon: , title: , url: 'http://zhuanlan.zhihu.com/antdesign', openExternal: true, }, { icon: , title: , url: 'http://zhuanlan.zhihu.com/xtech', openExternal: true, }, { icon: ( seeconf ), title: 'SEE Conf', description: , url: 'https://seeconf.antfin.com/', openExternal: true, }, ], }; if (isZhCN) { col2.items.push({ icon: , title: , url: getLinkHash('/docs/resources', { zhCN: '加入我们', enUS: 'JoinUs', }), LinkComponent: Link, } as any); } const col3 = { title: , items: [ { icon: , title: 'GitHub', url: 'https://github.com/ant-design/ant-design', openExternal: true, }, { icon: , title: , url: getLink('/changelog'), LinkComponent: Link, }, { icon: , title: , url: getLink('/docs/react/faq'), LinkComponent: Link, }, { icon: , title: , url: 'https://new-issue.ant.design/', openExternal: true, }, { icon: , title: , url: 'https://github.com/ant-design/ant-design/issues', openExternal: true, }, { icon: , title: , url: 'https://www.yuque.com/ant-design/course', openExternal: true, }, { icon: , title: , url: 'https://gitter.im/ant-design/ant-design', openExternal: true, }, { icon: , title: , url: 'https://gitter.im/ant-design/ant-design-english', openExternal: true, }, { icon: , title: , url: 'http://stackoverflow.com/questions/tagged/antd', openExternal: true, }, { icon: , title: , url: 'https://segmentfault.com/t/antd', openExternal: true, }, ], }; const col4 = { icon: ( Ant XTech ), title: , items: [ { icon: ( yuque ), title: , url: 'https://yuque.com', description: , openExternal: true, }, { icon: ( yunfengdie ), title: , url: 'https://yunfengdie.com', description: , openExternal: true, }, { icon: ( AntV ), title: 'AntV', url: 'https://antv.vision', description: , openExternal: true, }, { icon: ( Egg ), title: 'Egg', url: 'https://eggjs.org', description: , openExternal: true, }, { icon: ( kitchen ), title: 'Kitchen', description: , url: 'https://kitchen.alipay.com', openExternal: true, }, { icon: ( xtech ), title: , url: 'https://xtech.antfin.com/', openExternal: true, }, { title: this.renderThemeChanger(), style: { marginTop: 20, }, }, ], }; return [col1, col2, col3, col4]; } handleColorChange = (color: string) => { const { intl: { messages }, } = this.props; message.loading({ content: messages['app.footer.primary-color-changing'], key: 'change-primary-color', }); const changeColor = () => { (window as any).less .modifyVars({ '@primary-color': color, }) .then(() => { message.success({ content: messages['app.footer.primary-color-changed'], key: 'change-primary-color', }); this.setState({ color }); }); }; const lessUrl = 'https://gw.alipayobjects.com/os/lib/less/3.10.3/dist/less.min.js'; if (this.lessLoaded) { changeColor(); } else { (window as any).less = { async: true, javascriptEnabled: true, }; loadScript(lessUrl).then(() => { this.lessLoaded = true; changeColor(); }); } }; infoNewVersion() { const { intl: { messages }, } = this.props; Modal.info({ title: messages['app.publish.title'], content: (
Ant Design

{messages['app.publish.greeting']} antd@3.0.0 {messages['app.publish.intro']} {messages['app.publish.old-version-guide']} 2x.ant.design {messages['app.publish.old-version-tips']}

), okText: 'OK', onOk: () => localStorage.setItem('antd@3.0.0-notification-sent', 'true'), className: 'new-version-info-modal', width: 470, }); } renderThemeChanger() { const { color } = this.state; const colors = Object.keys(presetPalettes).filter(item => item !== 'grey'); return ( presetPalettes[c][5]), ...colors.map(c => presetPalettes[c][4]), ...colors.map(c => presetPalettes[c][6]), ]} onChangeComplete={this.handleColorChange} /> ); } render() { return ( Made with by {/* eslint-disable-next-line react/jsx-curly-brace-presence */}{' '} } /> ); } } export default injectIntl(Footer);