diff options
author | Ondřej Hruška <ondra@ondrovo.com> | 2017-07-27 00:41:28 +0200 |
---|---|---|
committer | Ondřej Hruška <ondra@ondrovo.com> | 2017-07-27 00:41:28 +0200 |
commit | cb69e35b3b13a67df5216b2c5fd657a62b3bda7a (patch) | |
tree | ee076b48136dfbccfd9b9009eb05551f9d9baa31 /app/javascript/glitch | |
parent | e82021e0e634c4cf4ba1880c6c47fac16c839d2e (diff) |
Add visibility icon to Detailed status
Diffstat (limited to 'app/javascript/glitch')
-rw-r--r-- | app/javascript/glitch/components/status/header.js | 24 | ||||
-rw-r--r-- | app/javascript/glitch/components/status/index.js | 3 | ||||
-rw-r--r-- | app/javascript/glitch/components/status/visibility_icon.js | 48 |
3 files changed, 56 insertions, 19 deletions
diff --git a/app/javascript/glitch/components/status/header.js b/app/javascript/glitch/components/status/header.js index 3187fa7fb..5ce59fba4 100644 --- a/app/javascript/glitch/components/status/header.js +++ b/app/javascript/glitch/components/status/header.js @@ -29,6 +29,7 @@ import Avatar from '../../../mastodon/components/avatar'; import AvatarOverlay from '../../../mastodon/components/avatar_overlay'; import DisplayName from '../../../mastodon/components/display_name'; import IconButton from '../../../mastodon/components/icon_button'; +import VisibilityIcon from './visibility_icon'; /* * * * */ @@ -94,7 +95,7 @@ icons) into a single `<header>` element. export default class StatusHeader extends React.PureComponent { static propTypes = { - account: ImmutablePropTypes.map.isRequired, + status: ImmutablePropTypes.map.isRequired, friend: ImmutablePropTypes.map, mediaIcon: PropTypes.string, collapsible: PropTypes.bool, @@ -102,7 +103,6 @@ export default class StatusHeader extends React.PureComponent { parseClick: PropTypes.func.isRequired, setExpansion: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, - visibility: PropTypes.string, }; /* @@ -135,8 +135,8 @@ status. */ handleAccountClick = (e) => { - const { account, parseClick } = this.props; - parseClick(e, `/accounts/${+account.get('id')}`); + const { status, parseClick } = this.props; + parseClick(e, `/accounts/${+status.getIn(['account', 'id'])}`); } /* @@ -150,21 +150,15 @@ has a very straightforward rendering process. render () { const { - account, + status, friend, mediaIcon, collapsible, collapsed, intl, - visibility, } = this.props; - const visibilityClass = { - public: 'globe', - unlisted: 'unlock-alt', - private: 'lock', - direct: 'envelope', - }[visibility]; + const account = status.get('account'); return ( <header className='status__info'> @@ -186,11 +180,7 @@ it is rendered as a float. /> ) : null} {( - <i - className={`status__visibility-icon fa fa-fw fa-${visibilityClass}`} - title={intl.formatMessage(messages[visibility])} - aria-hidden='true' - /> + <VisibilityIcon visibility={status.get('visibility')} /> )} {collapsible ? ( <IconButton diff --git a/app/javascript/glitch/components/status/index.js b/app/javascript/glitch/components/status/index.js index b7ec8b4ca..5571b3c85 100644 --- a/app/javascript/glitch/components/status/index.js +++ b/app/javascript/glitch/components/status/index.js @@ -704,10 +704,9 @@ collapsed. /> ) : null} <StatusHeader - account={status.get('account')} + status={status} friend={account} mediaIcon={mediaIcon} - visibility={status.get('visibility')} collapsible={settings.getIn(['collapsed', 'enabled'])} collapsed={isExpanded === false} parseClick={parseClick} diff --git a/app/javascript/glitch/components/status/visibility_icon.js b/app/javascript/glitch/components/status/visibility_icon.js new file mode 100644 index 000000000..017b69cbb --- /dev/null +++ b/app/javascript/glitch/components/status/visibility_icon.js @@ -0,0 +1,48 @@ +// Package imports // +import React from 'react'; +import PropTypes from 'prop-types'; +import { defineMessages, injectIntl } from 'react-intl'; +import ImmutablePureComponent from 'react-immutable-pure-component'; + +const messages = defineMessages({ + public: { id: 'privacy.public.short', defaultMessage: 'Public' }, + unlisted: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' }, + private: { id: 'privacy.private.short', defaultMessage: 'Followers-only' }, + direct: { id: 'privacy.direct.short', defaultMessage: 'Direct' }, +}); + +@injectIntl +export default class VisibilityIcon extends ImmutablePureComponent { + + static propTypes = { + visibility: PropTypes.string, + intl: PropTypes.object.isRequired, + withLabel: PropTypes.bool, + }; + + render() { + const { withLabel, visibility, intl } = this.props; + + const visibilityClass = { + public: 'globe', + unlisted: 'unlock-alt', + private: 'lock', + direct: 'envelope', + }[visibility]; + + const label = intl.formatMessage(messages[visibility]); + + const icon = (<i + className={`status__visibility-icon fa fa-fw fa-${visibilityClass}`} + title={label} + aria-hidden='true' + />); + + if (withLabel) { + return (<span style={{ whiteSpace: 'nowrap' }}>{icon} {label}</span>); + } else { + return icon; + } + } + +} |