{"version":3,"sources":["webpack:///./app/javascript/mastodon/features/account_gallery/components/media_item.js","webpack:///./app/javascript/mastodon/features/account_gallery/index.js"],"names":["MediaItem","ImmutablePureComponent","state","visible","displayMedia","this","props","attachment","getIn","loaded","handleImageLoad","setState","handleMouseEnter","e","hoverToPlay","target","play","handleMouseLeave","pause","currentTime","handleClick","button","ctrlKey","metaKey","preventDefault","onOpenMedia","autoPlayGif","indexOf","get","render","displayWidth","width","Math","floor","height","status","title","thumbnail","label","icon","content","includes","src","alt","onLoad","id","x","y","style","objectPosition","className","role","onMouseEnter","onMouseLeave","autoPlay","playsInline","loop","muted","href","onClick","rel","hash","classNames","dummy","useBlurhash","propTypes","ImmutablePropTypes","map","isRequired","PropTypes","number","func","LoadMoreMedia","handleLoadMore","onLoadMore","maxId","disabled","string","AccountGallery","connect","params","acct","accountId","normalizeForLookup","isAccount","attachments","getAccountGallery","isLoading","hasMore","suspended","blockedBy","handleScrollToBottom","size","last","undefined","handleScroll","scrollTop","scrollHeight","clientHeight","dispatch","expandAccountMediaTimeline","handleLoadOlder","handleOpenMedia","statusId","openModal","media","options","index","findIndex","handleRef","c","offsetWidth","_load","fetchAccount","componentDidMount","lookupAccount","componentDidUpdate","prevProps","multiColumn","emptyMessage","loadOlder","defaultMessage","scrollKey","onScroll","ref","shape","list","bool"],"mappings":"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","file":"js/features/account_gallery-0c8940692fee7ed57f5a.chunk.js","sourcesContent":["import Blurhash from 'mastodon/components/blurhash';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\nimport { autoPlayGif, displayMedia, useBlurhash } from 'mastodon/initial_state';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nexport default class MediaItem extends ImmutablePureComponent {\n\n static propTypes = {\n attachment: ImmutablePropTypes.map.isRequired,\n displayWidth: PropTypes.number.isRequired,\n onOpenMedia: PropTypes.func.isRequired,\n };\n\n state = {\n visible: displayMedia !== 'hide_all' && !this.props.attachment.getIn(['status', 'sensitive']) || displayMedia === 'show_all',\n loaded: false,\n };\n\n handleImageLoad = () => {\n this.setState({ loaded: true });\n };\n\n handleMouseEnter = e => {\n if (this.hoverToPlay()) {\n e.target.play();\n }\n };\n\n handleMouseLeave = e => {\n if (this.hoverToPlay()) {\n e.target.pause();\n e.target.currentTime = 0;\n }\n };\n\n hoverToPlay () {\n return !autoPlayGif && ['gifv', 'video'].indexOf(this.props.attachment.get('type')) !== -1;\n }\n\n handleClick = e => {\n if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n\n if (this.state.visible) {\n this.props.onOpenMedia(this.props.attachment);\n } else {\n this.setState({ visible: true });\n }\n }\n };\n\n render () {\n const { attachment, displayWidth } = this.props;\n const { visible, loaded } = this.state;\n\n const width = `${Math.floor((displayWidth - 4) / 3) - 4}px`;\n const height = width;\n const status = attachment.get('status');\n const title = status.get('spoiler_text') || attachment.get('description');\n\n let thumbnail, label, icon, content;\n\n if (!visible) {\n icon = (\n <span className='account-gallery__item__icons'>\n <Icon id='eye-slash' />\n </span>\n );\n } else {\n if (['audio', 'video'].includes(attachment.get('type'))) {\n content = (\n <img\n src={attachment.get('preview_url') || attachment.getIn(['account', 'avatar_static'])}\n alt={attachment.get('description')}\n onLoad={this.handleImageLoad}\n />\n );\n\n if (attachment.get('type') === 'audio') {\n label = <Icon id='music' />;\n } else {\n label = <Icon id='play' />;\n }\n } else if (attachment.get('type') === 'image') {\n const focusX = attachment.getIn(['meta', 'focus', 'x']) || 0;\n const focusY = attachment.getIn(['meta', 'focus', 'y']) || 0;\n const x = ((focusX / 2) + .5) * 100;\n const y = ((focusY / -2) + .5) * 100;\n\n content = (\n <img\n src={attachment.get('preview_url')}\n alt={attachment.get('description')}\n style={{ objectPosition: `${x}% ${y}%` }}\n onLoad={this.handleImageLoad}\n />\n );\n } else if (attachment.get('type') === 'gifv') {\n content = (\n <video\n className='media-gallery__item-gifv-thumbnail'\n aria-label={attachment.get('description')}\n title={attachment.get('description')}\n role='application'\n src={attachment.get('url')}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n autoPlay={autoPlayGif}\n playsInline\n loop\n muted\n />\n );\n\n label = 'GIF';\n }\n\n thumbnail = (\n <div className='media-gallery__gifv'>\n {content}\n\n {label && <span className='media-gallery__gifv__label'>{label}</span>}\n </div>\n );\n }\n\n return (\n <div className='account-gallery__item' style={{ width, height }}>\n <a className='media-gallery__item-thumbnail' href={`/@${status.getIn(['account', 'acct'])}\\/${status.get('id')}`} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>\n <Blurhash\n hash={attachment.get('blurhash')}\n className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })}\n dummy={!useBlurhash}\n />\n\n {visible ? thumbnail : icon}\n </a>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { lookupAccount, fetchAccount } from 'mastodon/actions/accounts';\nimport { expandAccountMediaTimeline } from '../../actions/timelines';\nimport LoadingIndicator from 'mastodon/components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButton from 'mastodon/components/column_back_button';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { getAccountGallery } from 'mastodon/selectors';\nimport MediaItem from './components/media_item';\nimport HeaderContainer from '../account_timeline/containers/header_container';\nimport ScrollContainer from 'mastodon/containers/scroll_container';\nimport LoadMore from 'mastodon/components/load_more';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\nimport { openModal } from 'mastodon/actions/modal';\nimport { FormattedMessage } from 'react-intl';\nimport { normalizeForLookup } from 'mastodon/reducers/accounts_map';\n\nconst mapStateToProps = (state, { params: { acct, id } }) => {\n const accountId = id || state.getIn(['accounts_map', normalizeForLookup(acct)]);\n\n if (!accountId) {\n return {\n isLoading: true,\n };\n }\n\n return {\n accountId,\n isAccount: !!state.getIn(['accounts', accountId]),\n attachments: getAccountGallery(state, accountId),\n isLoading: state.getIn(['timelines', `account:${accountId}:media`, 'isLoading']),\n hasMore: state.getIn(['timelines', `account:${accountId}:media`, 'hasMore']),\n suspended: state.getIn(['accounts', accountId, 'suspended'], false),\n blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false),\n };\n};\n\nclass LoadMoreMedia extends ImmutablePureComponent {\n\n static propTypes = {\n maxId: PropTypes.string,\n onLoadMore: PropTypes.func.isRequired,\n };\n\n handleLoadMore = () => {\n this.props.onLoadMore(this.props.maxId);\n };\n\n render () {\n return (\n <LoadMore\n disabled={this.props.disabled}\n onClick={this.handleLoadMore}\n />\n );\n }\n\n}\n\nexport default @connect(mapStateToProps)\nclass AccountGallery extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.shape({\n acct: PropTypes.string,\n id: PropTypes.string,\n }).isRequired,\n accountId: PropTypes.string,\n dispatch: PropTypes.func.isRequired,\n attachments: ImmutablePropTypes.list.isRequired,\n isLoading: PropTypes.bool,\n hasMore: PropTypes.bool,\n isAccount: PropTypes.bool,\n blockedBy: PropTypes.bool,\n suspended: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n state = {\n width: 323,\n };\n\n _load () {\n const { accountId, isAccount, dispatch } = this.props;\n\n if (!isAccount) dispatch(fetchAccount(accountId));\n dispatch(expandAccountMediaTimeline(accountId));\n }\n\n componentDidMount () {\n const { params: { acct }, accountId, dispatch } = this.props;\n\n if (accountId) {\n this._load();\n } else {\n dispatch(lookupAccount(acct));\n }\n }\n\n componentDidUpdate (prevProps) {\n const { params: { acct }, accountId, dispatch } = this.props;\n\n if (prevProps.accountId !== accountId && accountId) {\n this._load();\n } else if (prevProps.params.acct !== acct) {\n dispatch(lookupAccount(acct));\n }\n }\n\n handleScrollToBottom = () => {\n if (this.props.hasMore) {\n this.handleLoadMore(this.props.attachments.size > 0 ? this.props.attachments.last().getIn(['status', 'id']) : undefined);\n }\n };\n\n handleScroll = e => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n const offset = scrollHeight - scrollTop - clientHeight;\n\n if (150 > offset && !this.props.isLoading) {\n this.handleScrollToBottom();\n }\n };\n\n handleLoadMore = maxId => {\n this.props.dispatch(expandAccountMediaTimeline(this.props.accountId, { maxId }));\n };\n\n handleLoadOlder = e => {\n e.preventDefault();\n this.handleScrollToBottom();\n };\n\n handleOpenMedia = attachment => {\n const { dispatch } = this.props;\n const statusId = attachment.getIn(['status', 'id']);\n\n if (attachment.get('type') === 'video') {\n dispatch(openModal('VIDEO', { media: attachment, statusId, options: { autoPlay: true } }));\n } else if (attachment.get('type') === 'audio') {\n dispatch(openModal('AUDIO', { media: attachment, statusId, options: { autoPlay: true } }));\n } else {\n const media = attachment.getIn(['status', 'media_attachments']);\n const index = media.findIndex(x => x.get('id') === attachment.get('id'));\n\n dispatch(openModal('MEDIA', { media, index, statusId }));\n }\n };\n\n handleRef = c => {\n if (c) {\n this.setState({ width: c.offsetWidth });\n }\n };\n\n render () {\n const { attachments, isLoading, hasMore, isAccount, multiColumn, blockedBy, suspended } = this.props;\n const { width } = this.state;\n\n if (!isAccount) {\n return (\n <Column>\n <MissingIndicator />\n </Column>\n );\n }\n\n if (!attachments && isLoading) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n let loadOlder = null;\n\n if (hasMore && !(isLoading && attachments.size === 0)) {\n loadOlder = <LoadMore visible={!isLoading} onClick={this.handleLoadOlder} />;\n }\n\n let emptyMessage;\n\n if (suspended) {\n emptyMessage = <FormattedMessage id='empty_column.account_suspended' defaultMessage='Account suspended' />;\n } else if (blockedBy) {\n emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;\n }\n\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <ScrollContainer scrollKey='account_gallery'>\n <div className='scrollable scrollable--flex' onScroll={this.handleScroll}>\n <HeaderContainer accountId={this.props.accountId} />\n\n {(suspended || blockedBy) ? (\n <div className='empty-column-indicator'>\n {emptyMessage}\n </div>\n ) : (\n <div role='feed' className='account-gallery__container' ref={this.handleRef}>\n {attachments.map((attachment, index) => attachment === null ? (\n <LoadMoreMedia key={'more:' + attachments.getIn(index + 1, 'id')} maxId={index > 0 ? attachments.getIn(index - 1, 'id') : null} onLoadMore={this.handleLoadMore} />\n ) : (\n <MediaItem key={attachment.get('id')} attachment={attachment} displayWidth={width} onOpenMedia={this.handleOpenMedia} />\n ))}\n\n {loadOlder}\n </div>\n )}\n\n {isLoading && attachments.size === 0 && (\n <div className='scrollable__append'>\n <LoadingIndicator />\n </div>\n )}\n </div>\n </ScrollContainer>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""}