Change in-app links to keep you in-app (#20540)
* Change in-app links to keep you in-app * refactor Permalink into Link * rewrite link hrefs in status content * please linter * please linter again
This commit is contained in:
		| @@ -3,13 +3,13 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import Avatar from './avatar'; | ||||
| import DisplayName from './display_name'; | ||||
| import Permalink from './permalink'; | ||||
| import IconButton from './icon_button'; | ||||
| import { defineMessages, injectIntl } from 'react-intl'; | ||||
| import ImmutablePureComponent from 'react-immutable-pure-component'; | ||||
| import { me } from '../initial_state'; | ||||
| import RelativeTimestamp from './relative_timestamp'; | ||||
| import Skeleton from 'mastodon/components/skeleton'; | ||||
| import { Link } from 'react-router-dom'; | ||||
|  | ||||
| const messages = defineMessages({ | ||||
|   follow: { id: 'account.follow', defaultMessage: 'Follow' }, | ||||
| @@ -140,11 +140,11 @@ class Account extends ImmutablePureComponent { | ||||
|     return ( | ||||
|       <div className='account'> | ||||
|         <div className='account__wrapper'> | ||||
|           <Permalink key={account.get('id')} className='account__display-name' title={account.get('acct')} href={account.get('url')} to={`/@${account.get('acct')}`}> | ||||
|           <Link key={account.get('id')} className='account__display-name' title={account.get('acct')} to={`/@${account.get('acct')}`}> | ||||
|             <div className='account__avatar-wrapper'><Avatar account={account} size={size} /></div> | ||||
|             {mute_expires_at} | ||||
|             <DisplayName account={account} /> | ||||
|           </Permalink> | ||||
|           </Link> | ||||
|  | ||||
|           <div className='account__relationship'> | ||||
|             {buttons} | ||||
|   | ||||
| @@ -50,7 +50,7 @@ export default class Trends extends React.PureComponent { | ||||
|             <Hashtag | ||||
|               key={hashtag.name} | ||||
|               name={hashtag.name} | ||||
|               href={`/admin/tags/${hashtag.id}`} | ||||
|               to={`/admin/tags/${hashtag.id}`} | ||||
|               people={hashtag.history[0].accounts * 1 + hashtag.history[1].accounts * 1} | ||||
|               uses={hashtag.history[0].uses * 1 + hashtag.history[1].uses * 1} | ||||
|               history={hashtag.history.reverse().map(day => day.uses)} | ||||
|   | ||||
| @@ -4,7 +4,7 @@ import { Sparklines, SparklinesCurve } from 'react-sparklines'; | ||||
| import { FormattedMessage } from 'react-intl'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import ImmutablePropTypes from 'react-immutable-proptypes'; | ||||
| import Permalink from './permalink'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import ShortNumber from 'mastodon/components/short_number'; | ||||
| import Skeleton from 'mastodon/components/skeleton'; | ||||
| import classNames from 'classnames'; | ||||
| @@ -53,7 +53,6 @@ export const accountsCountRenderer = (displayNumber, pluralReady) => ( | ||||
| export const ImmutableHashtag = ({ hashtag }) => ( | ||||
|   <Hashtag | ||||
|     name={hashtag.get('name')} | ||||
|     href={hashtag.get('url')} | ||||
|     to={`/tags/${hashtag.get('name')}`} | ||||
|     people={hashtag.getIn(['history', 0, 'accounts']) * 1 + hashtag.getIn(['history', 1, 'accounts']) * 1} | ||||
|     history={hashtag.get('history').reverse().map((day) => day.get('uses')).toArray()} | ||||
| @@ -64,12 +63,12 @@ ImmutableHashtag.propTypes = { | ||||
|   hashtag: ImmutablePropTypes.map.isRequired, | ||||
| }; | ||||
|  | ||||
| const Hashtag = ({ name, href, to, people, uses, history, className, description, withGraph }) => ( | ||||
| const Hashtag = ({ name, to, people, uses, history, className, description, withGraph }) => ( | ||||
|   <div className={classNames('trends__item', className)}> | ||||
|     <div className='trends__item__name'> | ||||
|       <Permalink href={href} to={to}> | ||||
|       <Link to={to}> | ||||
|         {name ? <React.Fragment>#<span>{name}</span></React.Fragment> : <Skeleton width={50} />} | ||||
|       </Permalink> | ||||
|       </Link> | ||||
|  | ||||
|       {description ? ( | ||||
|         <span>{description}</span> | ||||
| @@ -98,7 +97,6 @@ const Hashtag = ({ name, href, to, people, uses, history, className, description | ||||
|  | ||||
| Hashtag.propTypes = { | ||||
|   name: PropTypes.string, | ||||
|   href: PropTypes.string, | ||||
|   to: PropTypes.string, | ||||
|   people: PropTypes.number, | ||||
|   description: PropTypes.node, | ||||
|   | ||||
| @@ -1,40 +0,0 @@ | ||||
| import React from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
|  | ||||
| export default class Permalink extends React.PureComponent { | ||||
|  | ||||
|   static contextTypes = { | ||||
|     router: PropTypes.object, | ||||
|   }; | ||||
|  | ||||
|   static propTypes = { | ||||
|     className: PropTypes.string, | ||||
|     href: PropTypes.string.isRequired, | ||||
|     to: PropTypes.string.isRequired, | ||||
|     children: PropTypes.node, | ||||
|     onInterceptClick: PropTypes.func, | ||||
|   }; | ||||
|  | ||||
|   handleClick = e => { | ||||
|     if (this.props.onInterceptClick && this.props.onInterceptClick()) { | ||||
|       e.preventDefault(); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) { | ||||
|       e.preventDefault(); | ||||
|       this.context.router.history.push(this.props.to); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   render () { | ||||
|     const { href, children, className, onInterceptClick, ...other } = this.props; | ||||
|  | ||||
|     return ( | ||||
|       <a target='_blank' href={href} onClick={this.handleClick} {...other} className={`permalink${className ? ' ' + className : ''}`}> | ||||
|         {children} | ||||
|       </a> | ||||
|     ); | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -378,7 +378,7 @@ class Status extends ImmutablePureComponent { | ||||
|       prepend = ( | ||||
|         <div className='status__prepend'> | ||||
|           <div className='status__prepend-icon-wrapper'><Icon id='retweet' className='status__prepend-icon' fixedWidth /></div> | ||||
|           <FormattedMessage id='status.reblogged_by' defaultMessage='{name} boosted' values={{ name: <a onClick={this.handlePrependAccountClick} data-id={status.getIn(['account', 'id'])} href={status.getIn(['account', 'url'])} className='status__display-name muted'><bdi><strong dangerouslySetInnerHTML={display_name_html} /></bdi></a> }} /> | ||||
|           <FormattedMessage id='status.reblogged_by' defaultMessage='{name} boosted' values={{ name: <a onClick={this.handlePrependAccountClick} data-id={status.getIn(['account', 'id'])} href={`/@${status.getIn(['account', 'acct'])}`} className='status__display-name muted'><bdi><strong dangerouslySetInnerHTML={display_name_html} /></bdi></a> }} /> | ||||
|         </div> | ||||
|       ); | ||||
|  | ||||
| @@ -392,7 +392,7 @@ class Status extends ImmutablePureComponent { | ||||
|       prepend = ( | ||||
|         <div className='status__prepend'> | ||||
|           <div className='status__prepend-icon-wrapper'><Icon id='reply' className='status__prepend-icon' fixedWidth /></div> | ||||
|           <FormattedMessage id='status.replied_to' defaultMessage='Replied to {name}' values={{ name: <a onClick={this.handlePrependAccountClick} data-id={status.getIn(['account', 'id'])} href={status.getIn(['account', 'url'])} className='status__display-name muted'><bdi><strong dangerouslySetInnerHTML={display_name_html} /></bdi></a> }} /> | ||||
|           <FormattedMessage id='status.replied_to' defaultMessage='Replied to {name}' values={{ name: <a onClick={this.handlePrependAccountClick} data-id={status.getIn(['account', 'id'])} href={`/@${status.getIn(['account', 'acct'])}`} className='status__display-name muted'><bdi><strong dangerouslySetInnerHTML={display_name_html} /></bdi></a> }} /> | ||||
|         </div> | ||||
|       ); | ||||
|     } | ||||
| @@ -511,12 +511,12 @@ class Status extends ImmutablePureComponent { | ||||
|  | ||||
|           <div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted })} data-id={status.get('id')}> | ||||
|             <div className='status__info'> | ||||
|               <a onClick={this.handleClick} href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'> | ||||
|               <a onClick={this.handleClick} href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'> | ||||
|                 <span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span> | ||||
|                 <RelativeTimestamp timestamp={status.get('created_at')} />{status.get('edited_at') && <abbr title={intl.formatMessage(messages.edited, { date: intl.formatDate(status.get('edited_at'), { hour12: false, year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })}> *</abbr>} | ||||
|               </a> | ||||
|  | ||||
|               <a onClick={this.handleAccountClick} href={status.getIn(['account', 'url'])} title={status.getIn(['account', 'acct'])} className='status__display-name' target='_blank' rel='noopener noreferrer'> | ||||
|               <a onClick={this.handleAccountClick} href={`/@${status.getIn(['account', 'acct'])}`} title={status.getIn(['account', 'acct'])} className='status__display-name' target='_blank' rel='noopener noreferrer'> | ||||
|                 <div className='status__avatar'> | ||||
|                   {statusAvatar} | ||||
|                 </div> | ||||
|   | ||||
| @@ -2,7 +2,7 @@ import React from 'react'; | ||||
| import ImmutablePropTypes from 'react-immutable-proptypes'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import { FormattedMessage, injectIntl } from 'react-intl'; | ||||
| import Permalink from './permalink'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import classnames from 'classnames'; | ||||
| import PollContainer from 'mastodon/containers/poll_container'; | ||||
| import Icon from 'mastodon/components/icon'; | ||||
| @@ -91,8 +91,10 @@ class StatusContent extends React.PureComponent { | ||||
|       if (mention) { | ||||
|         link.addEventListener('click', this.onMentionClick.bind(this, mention), false); | ||||
|         link.setAttribute('title', mention.get('acct')); | ||||
|         link.setAttribute('href', `/@${mention.get('acct')}`); | ||||
|       } else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) { | ||||
|         link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false); | ||||
|         link.setAttribute('href', `/tags/${link.text.slice(1)}`); | ||||
|       } else { | ||||
|         link.setAttribute('title', link.href); | ||||
|         link.classList.add('unhandled-link'); | ||||
| @@ -242,9 +244,9 @@ class StatusContent extends React.PureComponent { | ||||
|       let mentionsPlaceholder = ''; | ||||
|  | ||||
|       const mentionLinks = status.get('mentions').map(item => ( | ||||
|         <Permalink to={`/@${item.get('acct')}`} href={item.get('url')} key={item.get('id')} className='mention'> | ||||
|         <Link to={`/@${item.get('acct')}`} key={item.get('id')} className='mention'> | ||||
|           @<span>{item.get('username')}</span> | ||||
|         </Permalink> | ||||
|         </Link> | ||||
|       )).reduce((aggregate, item) => [...aggregate, item, ' '], []); | ||||
|  | ||||
|       const toggleText = hidden ? <FormattedMessage id='status.show_more' defaultMessage='Show more' /> : <FormattedMessage id='status.show_less' defaultMessage='Show less' />; | ||||
|   | ||||
| @@ -39,7 +39,6 @@ class FeaturedTags extends ImmutablePureComponent { | ||||
|           <Hashtag | ||||
|             key={featuredTag.get('name')} | ||||
|             name={featuredTag.get('name')} | ||||
|             href={featuredTag.get('url')} | ||||
|             to={`/@${account.get('acct')}/tagged/${featuredTag.get('name')}`} | ||||
|             uses={featuredTag.get('statuses_count') * 1} | ||||
|             withGraph={false} | ||||
|   | ||||
| @@ -129,7 +129,7 @@ export default class MediaItem extends ImmutablePureComponent { | ||||
|  | ||||
|     return ( | ||||
|       <div className='account-gallery__item' style={{ width, height }}> | ||||
|         <a className='media-gallery__item-thumbnail' href={status.get('url')} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'> | ||||
|         <a className='media-gallery__item-thumbnail' href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'> | ||||
|           <Blurhash | ||||
|             hash={attachment.get('blurhash')} | ||||
|             className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} | ||||
|   | ||||
| @@ -4,7 +4,7 @@ import { FormattedMessage } from 'react-intl'; | ||||
| import ImmutablePureComponent from 'react-immutable-pure-component'; | ||||
| import AvatarOverlay from '../../../components/avatar_overlay'; | ||||
| import DisplayName from '../../../components/display_name'; | ||||
| import Permalink from 'mastodon/components/permalink'; | ||||
| import { Link } from 'react-router-dom'; | ||||
|  | ||||
| export default class MovedNote extends ImmutablePureComponent { | ||||
|  | ||||
| @@ -23,12 +23,12 @@ export default class MovedNote extends ImmutablePureComponent { | ||||
|         </div> | ||||
|  | ||||
|         <div className='moved-account-banner__action'> | ||||
|           <Permalink href={to.get('url')} to={`/@${to.get('acct')}`} className='detailed-status__display-name'> | ||||
|           <Link to={`/@${to.get('acct')}`} className='detailed-status__display-name'> | ||||
|             <div className='detailed-status__display-avatar'><AvatarOverlay account={to} friend={from} /></div> | ||||
|             <DisplayName account={to} /> | ||||
|           </Permalink> | ||||
|           </Link> | ||||
|  | ||||
|           <Permalink href={to.get('url')} to={`/@${to.get('acct')}`} className='button'><FormattedMessage id='account.go_to_profile' defaultMessage='Go to profile' /></Permalink> | ||||
|           <Link to={`/@${to.get('acct')}`} className='button'><FormattedMessage id='account.go_to_profile' defaultMessage='Go to profile' /></Link> | ||||
|         </div> | ||||
|       </div> | ||||
|     ); | ||||
|   | ||||
| @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; | ||||
| import ImmutablePropTypes from 'react-immutable-proptypes'; | ||||
| import ActionBar from './action_bar'; | ||||
| import Avatar from '../../../components/avatar'; | ||||
| import Permalink from '../../../components/permalink'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import IconButton from '../../../components/icon_button'; | ||||
| import { FormattedMessage } from 'react-intl'; | ||||
| import ImmutablePureComponent from 'react-immutable-pure-component'; | ||||
| @@ -19,15 +19,15 @@ export default class NavigationBar extends ImmutablePureComponent { | ||||
|   render () { | ||||
|     return ( | ||||
|       <div className='navigation-bar'> | ||||
|         <Permalink href={this.props.account.get('url')} to={`/@${this.props.account.get('acct')}`}> | ||||
|         <Link to={`/@${this.props.account.get('acct')}`}> | ||||
|           <span style={{ display: 'none' }}>{this.props.account.get('acct')}</span> | ||||
|           <Avatar account={this.props.account} size={46} /> | ||||
|         </Permalink> | ||||
|         </Link> | ||||
|  | ||||
|         <div className='navigation-bar__profile'> | ||||
|           <Permalink href={this.props.account.get('url')} to={`/@${this.props.account.get('acct')}`}> | ||||
|           <Link to={`/@${this.props.account.get('acct')}`}> | ||||
|             <strong className='navigation-bar__profile-account'>@{this.props.account.get('acct')}</strong> | ||||
|           </Permalink> | ||||
|           </Link> | ||||
|  | ||||
|           <a href='/settings/profile' className='navigation-bar__profile-edit'><FormattedMessage id='navigation_bar.edit_profile' defaultMessage='Edit profile' /></a> | ||||
|         </div> | ||||
|   | ||||
| @@ -50,7 +50,7 @@ class ReplyIndicator extends ImmutablePureComponent { | ||||
|         <div className='reply-indicator__header'> | ||||
|           <div className='reply-indicator__cancel'><IconButton title={intl.formatMessage(messages.cancel)} icon='times' onClick={this.handleClick} inverted /></div> | ||||
|  | ||||
|           <a href={status.getIn(['account', 'url'])} onClick={this.handleAccountClick} className='reply-indicator__display-name'> | ||||
|           <a href={`/@${status.getIn(['account', 'acct'])}`} onClick={this.handleAccountClick} className='reply-indicator__display-name'> | ||||
|             <div className='reply-indicator__display-avatar'><Avatar account={status.get('account')} size={24} /></div> | ||||
|             <DisplayName account={status.get('account')} /> | ||||
|           </a> | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import AttachmentList from 'mastodon/components/attachment_list'; | ||||
| import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; | ||||
| import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container'; | ||||
| import AvatarComposite from 'mastodon/components/avatar_composite'; | ||||
| import Permalink from 'mastodon/components/permalink'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import IconButton from 'mastodon/components/icon_button'; | ||||
| import RelativeTimestamp from 'mastodon/components/relative_timestamp'; | ||||
| import { HotKeys } from 'react-hotkeys'; | ||||
| @@ -133,7 +133,7 @@ class Conversation extends ImmutablePureComponent { | ||||
|  | ||||
|     menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete }); | ||||
|  | ||||
|     const names = accounts.map(a => <Permalink to={`/@${a.get('acct')}`} href={a.get('url')} key={a.get('id')} title={a.get('acct')}><bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: a.get('display_name_html') }} /></bdi></Permalink>).reduce((prev, cur) => [prev, ', ', cur]); | ||||
|     const names = accounts.map(a => <Link to={`/@${a.get('acct')}`} key={a.get('id')} title={a.get('acct')}><bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: a.get('display_name_html') }} /></bdi></Link>).reduce((prev, cur) => [prev, ', ', cur]); | ||||
|  | ||||
|     const handlers = { | ||||
|       reply: this.handleReply, | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import { connect } from 'react-redux'; | ||||
| import { makeGetAccount } from 'mastodon/selectors'; | ||||
| import Avatar from 'mastodon/components/avatar'; | ||||
| import DisplayName from 'mastodon/components/display_name'; | ||||
| import Permalink from 'mastodon/components/permalink'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import Button from 'mastodon/components/button'; | ||||
| import { FormattedMessage, injectIntl, defineMessages } from 'react-intl'; | ||||
| import { autoPlayGif, me, unfollowModal } from 'mastodon/initial_state'; | ||||
| @@ -169,7 +169,7 @@ class AccountCard extends ImmutablePureComponent { | ||||
|  | ||||
|     return ( | ||||
|       <div className='account-card'> | ||||
|         <Permalink href={account.get('url')} to={`/@${account.get('acct')}`} className='account-card__permalink'> | ||||
|         <Link to={`/@${account.get('acct')}`} className='account-card__permalink'> | ||||
|           <div className='account-card__header'> | ||||
|             <img | ||||
|               src={ | ||||
| @@ -183,7 +183,7 @@ class AccountCard extends ImmutablePureComponent { | ||||
|             <div className='account-card__title__avatar'><Avatar account={account} size={56} /></div> | ||||
|             <DisplayName account={account} /> | ||||
|           </div> | ||||
|         </Permalink> | ||||
|         </Link> | ||||
|  | ||||
|         {account.get('note').length > 0 && ( | ||||
|           <div | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import { connect } from 'react-redux'; | ||||
| import { makeGetAccount } from 'mastodon/selectors'; | ||||
| import Avatar from 'mastodon/components/avatar'; | ||||
| import DisplayName from 'mastodon/components/display_name'; | ||||
| import Permalink from 'mastodon/components/permalink'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import IconButton from 'mastodon/components/icon_button'; | ||||
| import { injectIntl, defineMessages } from 'react-intl'; | ||||
| import { followAccount, unfollowAccount } from 'mastodon/actions/accounts'; | ||||
| @@ -66,13 +66,13 @@ class Account extends ImmutablePureComponent { | ||||
|     return ( | ||||
|       <div className='account follow-recommendations-account'> | ||||
|         <div className='account__wrapper'> | ||||
|           <Permalink className='account__display-name account__display-name--with-note' title={account.get('acct')} href={account.get('url')} to={`/@${account.get('acct')}`}> | ||||
|           <Link className='account__display-name account__display-name--with-note' title={account.get('acct')} to={`/@${account.get('acct')}`}> | ||||
|             <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div> | ||||
|  | ||||
|             <DisplayName account={account} /> | ||||
|  | ||||
|             <div className='account__note'>{getFirstSentence(account.get('note_plain'))}</div> | ||||
|           </Permalink> | ||||
|           </Link> | ||||
|  | ||||
|           <div className='account__relationship'> | ||||
|             {button} | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import React from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import ImmutablePropTypes from 'react-immutable-proptypes'; | ||||
| import Permalink from '../../../components/permalink'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import Avatar from '../../../components/avatar'; | ||||
| import DisplayName from '../../../components/display_name'; | ||||
| import IconButton from '../../../components/icon_button'; | ||||
| @@ -30,10 +30,10 @@ class AccountAuthorize extends ImmutablePureComponent { | ||||
|     return ( | ||||
|       <div className='account-authorize__wrapper'> | ||||
|         <div className='account-authorize'> | ||||
|           <Permalink href={account.get('url')} to={`/@${account.get('acct')}`} className='detailed-status__display-name'> | ||||
|           <Link to={`/@${account.get('acct')}`} className='detailed-status__display-name'> | ||||
|             <div className='account-authorize__avatar'><Avatar account={account} size={48} /></div> | ||||
|             <DisplayName account={account} /> | ||||
|           </Permalink> | ||||
|           </Link> | ||||
|  | ||||
|           <div className='account__header__content translate' dangerouslySetInnerHTML={content} /> | ||||
|         </div> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import Avatar from 'mastodon/components/avatar'; | ||||
| import DisplayName from 'mastodon/components/display_name'; | ||||
| import Permalink from 'mastodon/components/permalink'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import IconButton from 'mastodon/components/icon_button'; | ||||
| import { defineMessages, injectIntl } from 'react-intl'; | ||||
| import ImmutablePureComponent from 'react-immutable-pure-component'; | ||||
| @@ -42,10 +42,10 @@ class FollowRequest extends ImmutablePureComponent { | ||||
|     return ( | ||||
|       <div className='account'> | ||||
|         <div className='account__wrapper'> | ||||
|           <Permalink key={account.get('id')} className='account__display-name' title={account.get('acct')} href={account.get('url')} to={`/@${account.get('acct')}`}> | ||||
|           <Link key={account.get('id')} className='account__display-name' title={account.get('acct')} to={`/@${account.get('acct')}`}> | ||||
|             <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div> | ||||
|             <DisplayName account={account} /> | ||||
|           </Permalink> | ||||
|           </Link> | ||||
|  | ||||
|           <div className='account__relationship'> | ||||
|             <IconButton title={intl.formatMessage(messages.authorize)} icon='check' onClick={onAuthorize} /> | ||||
|   | ||||
| @@ -10,7 +10,7 @@ import AccountContainer from 'mastodon/containers/account_container'; | ||||
| import Report from './report'; | ||||
| import FollowRequestContainer from '../containers/follow_request_container'; | ||||
| import Icon from 'mastodon/components/icon'; | ||||
| import Permalink from 'mastodon/components/permalink'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import classNames from 'classnames'; | ||||
|  | ||||
| const messages = defineMessages({ | ||||
| @@ -378,7 +378,7 @@ class Notification extends ImmutablePureComponent { | ||||
|  | ||||
|     const targetAccount = report.get('target_account'); | ||||
|     const targetDisplayNameHtml = { __html: targetAccount.get('display_name_html') }; | ||||
|     const targetLink = <bdi><Permalink className='notification__display-name' href={targetAccount.get('url')} title={targetAccount.get('acct')} to={`/@${targetAccount.get('acct')}`} dangerouslySetInnerHTML={targetDisplayNameHtml} /></bdi>; | ||||
|     const targetLink = <bdi><Link className='notification__display-name' title={targetAccount.get('acct')} to={`/@${targetAccount.get('acct')}`} dangerouslySetInnerHTML={targetDisplayNameHtml} /></bdi>; | ||||
|  | ||||
|     return ( | ||||
|       <HotKeys handlers={this.getHandlers()}> | ||||
| @@ -403,7 +403,7 @@ class Notification extends ImmutablePureComponent { | ||||
|     const { notification } = this.props; | ||||
|     const account          = notification.get('account'); | ||||
|     const displayNameHtml  = { __html: account.get('display_name_html') }; | ||||
|     const link             = <bdi><Permalink className='notification__display-name' href={account.get('url')} title={account.get('acct')} to={`/@${account.get('acct')}`} dangerouslySetInnerHTML={displayNameHtml} /></bdi>; | ||||
|     const link             = <bdi><Link className='notification__display-name' href={`/@${account.get('acct')}`} title={account.get('acct')} to={`/@${account.get('acct')}`} dangerouslySetInnerHTML={displayNameHtml} /></bdi>; | ||||
|  | ||||
|     switch(notification.get('type')) { | ||||
|     case 'follow': | ||||
|   | ||||
| @@ -184,7 +184,7 @@ class Footer extends ImmutablePureComponent { | ||||
|         <IconButton className='status__action-bar-button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} counter={status.get('replies_count')} obfuscateCount /> | ||||
|         <IconButton className={classNames('status__action-bar-button', { reblogPrivate })} disabled={!publicStatus && !reblogPrivate}  active={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} counter={status.get('reblogs_count')} /> | ||||
|         <IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} counter={status.get('favourites_count')} /> | ||||
|         {withOpenButton && <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.open)} icon='external-link' onClick={this.handleOpenClick} href={status.get('url')} />} | ||||
|         {withOpenButton && <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.open)} icon='external-link' onClick={this.handleOpenClick} href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} />} | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| @@ -261,7 +261,7 @@ class DetailedStatus extends ImmutablePureComponent { | ||||
|     return ( | ||||
|       <div style={outerStyle}> | ||||
|         <div ref={this.setRef} className={classNames('detailed-status', `detailed-status-${status.get('visibility')}`, { compact })}> | ||||
|           <a href={status.getIn(['account', 'url'])} onClick={this.handleAccountClick} className='detailed-status__display-name'> | ||||
|           <a href={`/@${status.getIn(['account', 'acct'])}`} onClick={this.handleAccountClick} className='detailed-status__display-name'> | ||||
|             <div className='detailed-status__display-avatar'><Avatar account={status.get('account')} size={46} /></div> | ||||
|             <DisplayName account={status.get('account')} localDomain={this.props.domain} /> | ||||
|           </a> | ||||
| @@ -276,7 +276,7 @@ class DetailedStatus extends ImmutablePureComponent { | ||||
|           {media} | ||||
|  | ||||
|           <div className='detailed-status__meta'> | ||||
|             <a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener noreferrer'> | ||||
|             <a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} target='_blank' rel='noopener noreferrer'> | ||||
|               <FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' /> | ||||
|             </a>{edited}{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink} | ||||
|           </div> | ||||
|   | ||||
| @@ -98,12 +98,12 @@ class BoostModal extends ImmutablePureComponent { | ||||
|         <div className='boost-modal__container'> | ||||
|           <div className={classNames('status', `status-${status.get('visibility')}`, 'light')}> | ||||
|             <div className='status__info'> | ||||
|               <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'> | ||||
|               <a href={`/@${status.getIn(['account', 'acct'])}\/${status.get('id')}`} className='status__relative-time' target='_blank' rel='noopener noreferrer'> | ||||
|                 <span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span> | ||||
|                 <RelativeTimestamp timestamp={status.get('created_at')} /> | ||||
|               </a> | ||||
|  | ||||
|               <a onClick={this.handleAccountClick} href={status.getIn(['account', 'url'])} className='status__display-name'> | ||||
|               <a onClick={this.handleAccountClick} href={`/@${status.getIn(['account', 'acct'])}`} className='status__display-name'> | ||||
|                 <div className='status__avatar'> | ||||
|                   <Avatar account={status.get('account')} size={48} /> | ||||
|                 </div> | ||||
|   | ||||
| @@ -4,16 +4,15 @@ import { Link, withRouter } from 'react-router-dom'; | ||||
| import { FormattedMessage } from 'react-intl'; | ||||
| import { registrationsOpen, me } from 'mastodon/initial_state'; | ||||
| import Avatar from 'mastodon/components/avatar'; | ||||
| import Permalink from 'mastodon/components/permalink'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import { connect } from 'react-redux'; | ||||
|  | ||||
| const Account = connect(state => ({ | ||||
|   account: state.getIn(['accounts', me]), | ||||
| }))(({ account }) => ( | ||||
|   <Permalink href={account.get('url')} to={`/@${account.get('acct')}`} title={account.get('acct')}> | ||||
|   <Link to={`/@${account.get('acct')}`} title={account.get('acct')}> | ||||
|     <Avatar account={account} size={35} /> | ||||
|   </Permalink> | ||||
|   </Link> | ||||
| )); | ||||
|  | ||||
| export default @withRouter | ||||
|   | ||||
		Reference in New Issue
	
	Block a user