link_footer.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { connect } from 'react-redux';
  2. import React from 'react';
  3. import PropTypes from 'prop-types';
  4. import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
  5. import { Link } from 'react-router-dom';
  6. import { version, repository, source_url, profile_directory as profileDirectory } from 'mastodon/initial_state';
  7. import { logOut } from 'mastodon/utils/log_out';
  8. import { openModal } from 'mastodon/actions/modal';
  9. import { PERMISSION_INVITE_USERS } from 'mastodon/permissions';
  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. const mapDispatchToProps = (dispatch, { intl }) => ({
  15. onLogout () {
  16. dispatch(openModal('CONFIRM', {
  17. message: intl.formatMessage(messages.logoutMessage),
  18. confirm: intl.formatMessage(messages.logoutConfirm),
  19. closeWhenConfirm: false,
  20. onConfirm: () => logOut(),
  21. }));
  22. },
  23. });
  24. export default @injectIntl
  25. @connect(null, mapDispatchToProps)
  26. class LinkFooter extends React.PureComponent {
  27. static contextTypes = {
  28. identity: PropTypes.object,
  29. };
  30. static propTypes = {
  31. onLogout: PropTypes.func.isRequired,
  32. intl: PropTypes.object.isRequired,
  33. };
  34. handleLogoutClick = e => {
  35. e.preventDefault();
  36. e.stopPropagation();
  37. this.props.onLogout();
  38. return false;
  39. }
  40. render () {
  41. const { signedIn, permissions } = this.context.identity;
  42. const items = [];
  43. items.push(<a key='apps' href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Get the app' /></a>);
  44. items.push(<a key='about' href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About' /></a>);
  45. items.push(<a key='mastodon' href='https://joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.what_is_mastodon' defaultMessage='About Mastodon' /></a>);
  46. items.push(<a key='docs' href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a>);
  47. items.push(<Link key='privacy-policy' to='/privacy-policy'><FormattedMessage id='getting_started.privacy_policy' defaultMessage='Privacy Policy' /></Link>);
  48. items.push(<Link key='hotkeys' to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link>);
  49. if (profileDirectory) {
  50. items.push(<Link key='directory' to='/directory'><FormattedMessage id='getting_started.directory' defaultMessage='Directory' /></Link>);
  51. }
  52. if (signedIn) {
  53. if ((permissions & PERMISSION_INVITE_USERS) === PERMISSION_INVITE_USERS) {
  54. items.push(<a key='invites' href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a>);
  55. }
  56. items.push(<a key='security' href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a>);
  57. items.push(<a key='logout' href='/auth/sign_out' onClick={this.handleLogoutClick}><FormattedMessage id='navigation_bar.logout' defaultMessage='Logout' /></a>);
  58. }
  59. return (
  60. <div className='getting-started__footer'>
  61. <ul>
  62. <li>{items.reduce((prev, curr) => [prev, ' · ', curr])}</li>
  63. </ul>
  64. <p>
  65. <FormattedMessage
  66. id='getting_started.free_software_notice'
  67. defaultMessage='Mastodon is free, open source software. You can view the source code, contribute or report issues at {repository}.'
  68. values={{ repository: <span><a href={source_url} rel='noopener noreferrer' target='_blank'>{repository}</a> (v{version})</span> }}
  69. />
  70. </p>
  71. </div>
  72. );
  73. }
  74. };