|
| 1 | +import { connect } from 'react-redux'; |
1 | 2 | import React from 'react'; |
2 | 3 | import PropTypes from 'prop-types'; |
3 | | -import { FormattedMessage } from 'react-intl'; |
| 4 | +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; |
4 | 5 | import { Link } from 'react-router-dom'; |
5 | 6 | import { invitesEnabled, version, repository, source_url } from 'mastodon/initial_state'; |
| 7 | +import { logOut } from 'mastodon/utils/log_out'; |
| 8 | +import { openModal } from 'mastodon/actions/modal'; |
6 | 9 |
|
7 | | -const LinkFooter = ({ withHotkeys }) => ( |
8 | | - <div className='getting-started__footer'> |
9 | | - <ul> |
10 | | - {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>} |
11 | | - {withHotkeys && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>} |
12 | | - <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li> |
13 | | - <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li> |
14 | | - <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li> |
15 | | - <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li> |
16 | | - <li><a href='/settings/applications' target='_blank'><FormattedMessage id='getting_started.developers' defaultMessage='Developers' /></a> · </li> |
17 | | - <li><a href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a> · </li> |
18 | | - <li><a href='/auth/sign_out' data-method='delete'><FormattedMessage id='navigation_bar.logout' defaultMessage='Logout' /></a></li> |
19 | | - </ul> |
20 | | - |
21 | | - <p> |
22 | | - <FormattedMessage |
23 | | - id='getting_started.open_source_notice' |
24 | | - defaultMessage='Mastodon is open source software. You can contribute or report issues on GitHub at {github}.' |
25 | | - values={{ github: <span><a href={source_url} rel='noopener' target='_blank'>{repository}</a> (v{version})</span> }} |
26 | | - /> |
27 | | - </p> |
28 | | - </div> |
29 | | -); |
30 | | - |
31 | | -LinkFooter.propTypes = { |
32 | | - withHotkeys: PropTypes.bool, |
33 | | -}; |
| 10 | +const messages = defineMessages({ |
| 11 | + logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' }, |
| 12 | + logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' }, |
| 13 | +}); |
| 14 | + |
| 15 | +const mapDispatchToProps = (dispatch, { intl }) => ({ |
| 16 | + onLogout () { |
| 17 | + dispatch(openModal('CONFIRM', { |
| 18 | + message: intl.formatMessage(messages.logoutMessage), |
| 19 | + confirm: intl.formatMessage(messages.logoutConfirm), |
| 20 | + onConfirm: () => logOut(), |
| 21 | + })); |
| 22 | + }, |
| 23 | +}); |
| 24 | + |
| 25 | +export default @injectIntl |
| 26 | +@connect(null, mapDispatchToProps) |
| 27 | +class LinkFooter extends React.PureComponent { |
| 28 | + |
| 29 | + static propTypes = { |
| 30 | + withHotkeys: PropTypes.bool, |
| 31 | + onLogout: PropTypes.func.isRequired, |
| 32 | + intl: PropTypes.object.isRequired, |
| 33 | + }; |
| 34 | + |
| 35 | + handleLogoutClick = e => { |
| 36 | + e.preventDefault(); |
| 37 | + e.stopPropagation(); |
| 38 | + |
| 39 | + this.props.onLogout(); |
34 | 40 |
|
35 | | -export default LinkFooter; |
| 41 | + return false; |
| 42 | + } |
| 43 | + |
| 44 | + render () { |
| 45 | + const { withHotkeys } = this.props; |
| 46 | + |
| 47 | + return ( |
| 48 | + <div className='getting-started__footer'> |
| 49 | + <ul> |
| 50 | + {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>} |
| 51 | + {withHotkeys && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>} |
| 52 | + <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li> |
| 53 | + <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li> |
| 54 | + <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li> |
| 55 | + <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li> |
| 56 | + <li><a href='/settings/applications' target='_blank'><FormattedMessage id='getting_started.developers' defaultMessage='Developers' /></a> · </li> |
| 57 | + <li><a href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a> · </li> |
| 58 | + <li><a href='/auth/sign_out' onClick={this.handleLogoutClick}><FormattedMessage id='navigation_bar.logout' defaultMessage='Logout' /></a></li> |
| 59 | + </ul> |
| 60 | + |
| 61 | + <p> |
| 62 | + <FormattedMessage |
| 63 | + id='getting_started.open_source_notice' |
| 64 | + defaultMessage='Mastodon is open source software. You can contribute or report issues on GitHub at {github}.' |
| 65 | + values={{ github: <span><a href={source_url} rel='noopener' target='_blank'>{repository}</a> (v{version})</span> }} |
| 66 | + /> |
| 67 | + </p> |
| 68 | + </div> |
| 69 | + ); |
| 70 | + } |
| 71 | + |
| 72 | +}; |
0 commit comments