index.js 6.6 KB
Newer Older
jim's avatar
jim committed
1
import React, { PureComponent } from 'react';
2
import { Select, message, Drawer, List, Switch, Divider, Icon, Button } from 'antd';
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
3
import { formatMessage } from 'umi/locale';
4
import { CopyToClipboard } from 'react-copy-to-clipboard';
jim's avatar
jim committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
import { connect } from 'dva';
import styles from './index.less';
import ThemeColor from './ThemeColor';
import BlockChecbox from './BlockChecbox';

const Body = ({ children, title, style }) => (
  <div
    style={{
      ...style,
      marginBottom: 24,
    }}
  >
    <h3 className={styles.title}>{title}</h3>
    {children}
  </div>
);

@connect(({ setting }) => ({ setting }))
class SettingDarwer extends PureComponent {
  getLayOutSetting = () => {
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
25
    const {
26
      setting: { grid, fixedHeader, layout, autoHideHeader, fixSiderbar },
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
27
    } = this.props;
jim's avatar
jim committed
28 29
    return [
      {
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
30
        title: formatMessage({ id: 'app.setting.gridmode' }),
jim's avatar
jim committed
31 32 33 34 35 36 37
        action: [
          <Select
            value={grid}
            size="small"
            onSelect={value => this.changeSetting('grid', value)}
            style={{ width: 80 }}
          >
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
38 39 40 41 42 43
            <Select.Option value="Wide">
              {formatMessage({ id: 'app.setting.gridmode.wide' })}
            </Select.Option>
            <Select.Option value="Fluid">
              {formatMessage({ id: 'app.setting.gridmode.fluid' })}
            </Select.Option>
jim's avatar
jim committed
44 45 46 47
          </Select>,
        ],
      },
      {
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
48
        title: formatMessage({ id: 'app.setting.fixedheader' }),
jim's avatar
jim committed
49 50 51 52 53 54 55 56 57
        action: [
          <Switch
            size="small"
            checked={!!fixedHeader}
            onChange={checked => this.changeSetting('fixedHeader', checked)}
          />,
        ],
      },
      {
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
58
        title: formatMessage({ id: 'app.setting.hideheader' }),
59
        hide: !fixedHeader,
jim's avatar
jim committed
60 61 62 63 64 65 66 67 68
        action: [
          <Switch
            size="small"
            checked={!!autoHideHeader}
            onChange={checked => this.changeSetting('autoHideHeader', checked)}
          />,
        ],
      },
      {
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
69
        title: formatMessage({ id: 'app.setting.fixedsidebar' }),
70
        hide: layout === 'topmenu',
jim's avatar
jim committed
71 72 73 74 75 76 77 78
        action: [
          <Switch
            size="small"
            checked={!!fixSiderbar}
            onChange={checked => this.changeSetting('fixSiderbar', checked)}
          />,
        ],
      },
jim's avatar
jim committed
79 80 81
    ].filter(item => {
      return !item.hide;
    });
jim's avatar
jim committed
82
  };
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
83

jim's avatar
jim committed
84
  changeSetting = (key, value) => {
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
85 86
    const { setting } = this.props;
    const nextState = { ...setting };
jim's avatar
jim committed
87 88 89 90 91 92 93 94
    nextState[key] = value;
    if (key === 'layout') {
      if (value === 'topmenu') {
        nextState.grid = 'Wide';
      } else {
        nextState.grid = 'Fluid';
      }
    }
jim's avatar
jim committed
95
    if (key === 'fixedHeader') {
96
      if (!value) {
jim's avatar
jim committed
97 98 99
        nextState.autoHideHeader = false;
      }
    }
jim's avatar
jim committed
100
    this.setState(nextState, () => {
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
101 102
      const { dispatch } = this.props;
      dispatch({
jim's avatar
jim committed
103 104 105 106 107
        type: 'setting/changeSetting',
        payload: this.state,
      });
    });
  };
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
108

jim's avatar
jim committed
109
  togglerContent = () => {
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
110 111
    const { setting } = this.props;
    this.changeSetting('collapse', !setting.collapse);
jim's avatar
jim committed
112
  };
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
113

jim's avatar
jim committed
114
  render() {
115 116
    const { setting } = this.props;
    const { collapse, silderTheme, themeColor, layout, colorWeak } = setting;
jim's avatar
jim committed
117
    return (
118 119 120 121
      <Drawer
        visible={collapse}
        width={273}
        onClose={this.togglerContent}
122
        placement="right"
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
        handler={
          <div className={styles.handle}>
            {!collapse ? (
              <Icon
                type="setting"
                style={{
                  color: '#FFF',
                  fontSize: 20,
                }}
              />
            ) : (
              <Icon
                type="close"
                style={{
                  color: '#FFF',
                  fontSize: 20,
                }}
              />
            )}
          </div>
        }
        onHandleClick={this.togglerContent}
145 146 147 148 149
        style={{
          zIndex: 999,
        }}
      >
        <div className={styles.content}>
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
150
          <Body title={formatMessage({ id: 'app.setting.pagestyle' })}>
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
            <BlockChecbox
              list={[
                {
                  key: 'dark',
                  url: 'https://gw.alipayobjects.com/zos/rmsportal/LCkqqYNmvBEbokSDscrm.svg',
                },
                {
                  key: 'light',
                  url: 'https://gw.alipayobjects.com/zos/rmsportal/jpRkZQMyYRryryPNtyIC.svg',
                },
              ]}
              value={silderTheme}
              onChange={value => this.changeSetting('silderTheme', value)}
            />
          </Body>
jim's avatar
jim committed
166

167
          <ThemeColor
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
168
            title={formatMessage({ id: 'app.setting.themecolor' })}
169 170 171
            value={themeColor}
            onChange={color => this.changeSetting('themeColor', color)}
          />
jim's avatar
jim committed
172

173
          <Divider />
jim's avatar
jim committed
174

้™ˆๅธ…'s avatar
้™ˆๅธ… committed
175
          <Body title={formatMessage({ id: 'app.setting.navigationmode' })}>
176 177 178 179 180 181 182 183 184 185 186 187 188
            <BlockChecbox
              list={[
                {
                  key: 'sidemenu',
                  url: 'https://gw.alipayobjects.com/zos/rmsportal/JopDzEhOqwOjeNTXkoje.svg',
                },
                {
                  key: 'topmenu',
                  url: 'https://gw.alipayobjects.com/zos/rmsportal/KDNDBbriJhLwuqMoxcAr.svg',
                },
              ]}
              value={layout}
              onChange={value => this.changeSetting('layout', value)}
jim's avatar
jim committed
189
            />
190
          </Body>
jim's avatar
jim committed
191

192 193 194 195 196
          <List
            split={false}
            dataSource={this.getLayOutSetting()}
            renderItem={item => <List.Item actions={item.action}>{item.title}</List.Item>}
          />
jim's avatar
jim committed
197

198 199
          <Divider />

้™ˆๅธ…'s avatar
้™ˆๅธ… committed
200
          <Body title={formatMessage({ id: 'app.setting.othersettings' })}>
201 202 203 204 205 206 207 208 209
            <List.Item
              actions={[
                <Switch
                  size="small"
                  checked={!!colorWeak}
                  onChange={checked => this.changeSetting('colorWeak', checked)}
                />,
              ]}
            >
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
210
              {formatMessage({ id: 'app.setting.weakmode' })}
211 212
            </List.Item>
          </Body>
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
213 214 215
          <Divider />
          <CopyToClipboard
            text={JSON.stringify(setting)}
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
216
            onCopy={() => message.success(formatMessage({ id: 'app.setting.copyinfo' }))}
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
217 218 219 220 221 222
          >
            <Button
              style={{
                width: 224,
              }}
            >
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
223
              <Icon type="copy" />
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
224
              {formatMessage({ id: 'app.setting.copy' })}
้™ˆๅธ…'s avatar
้™ˆๅธ… committed
225 226
            </Button>
          </CopyToClipboard>
afc163's avatar
afc163 committed
227 228 229
          <div className={styles.productionHint}>
            {formatMessage({ id: 'app.setting.production.hint' })}
          </div>
230
        </div>
231
      </Drawer>
jim's avatar
jim committed
232 233 234 235 236
    );
  }
}

export default SettingDarwer;