{"version":3,"sources":["webpack:///./app/javascript/material-icons/400-24px/headphones-fill.svg","webpack:///./app/javascript/material-icons/400-24px/movie-fill.svg","webpack:///./app/javascript/mastodon/features/account_gallery/components/media_item.tsx","webpack:///./app/javascript/mastodon/features/account_gallery/index.jsx"],"names":["_path","_extends","Object","assign","bind","n","e","arguments","length","t","r","hasOwnProperty","call","apply","_ref","title","titleId","props","xmlns","height","viewBox","width","id","d","MediaItem","attachment","onOpenMedia","visible","setVisible","useState","displayMedia","getIn","loaded","setLoaded","handleImageLoad","useCallback","handleMouseEnter","target","HTMLVideoElement","play","handleMouseLeave","pause","currentTime","handleClick","button","ctrlKey","metaKey","preventDefault","status","get","description","previewUrl","fullUrl","avatarUrl","lang","blurhash","statusId","acct","type","thumbnail","badges","push","_jsx","AltTextBadge","_jsxs","_Fragment","children","src","alt","onLoad","className","Icon","icon","HeadphonesIcon","x","y","style","objectPosition","includes","duration","onMouseEnter","onMouseLeave","onLoadedData","autoPlay","autoPlayGif","playsInline","loop","muted","MovieIcon","formatTime","Math","floor","VisibilityOffIcon","Blurhash","hash","classNames","dummy","useBlurhash","href","onClick","rel","LoadMoreMedia","ImmutablePureComponent","constructor","_defineProperty","this","onLoadMore","maxId","render","LoadMore","disabled","handleLoadMore","PropTypes","string","func","isRequired","AccountGallery","hasMore","attachments","size","last","undefined","scrollTop","scrollHeight","clientHeight","isLoading","handleScrollToBottom","dispatch","expandAccountMediaTimeline","accountId","openModal","modalType","modalProps","media","options","index","findIndex","c","setState","offsetWidth","_load","isAccount","fetchAccount","componentDidMount","params","lookupAccount","componentDidUpdate","prevProps","multiColumn","blockedBy","suspended","state","BundleColumnError","errorType","Column","LoadingIndicator","emptyMessage","loadOlder","handleLoadOlder","FormattedMessage","defaultMessage","ColumnBackButton","ScrollContainer","scrollKey","onScroll","handleScroll","HeaderContainer","role","ref","handleRef","map","displayWidth","handleOpenMedia","shape","ImmutablePropTypes","list","bool","connect","mapStateToProps","normalizeForLookup","getAccountGallery"],"mappings":"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","file":"js/features/account_gallery-71e62d4d640d2bef4633.chunk.js","sourcesContent":["var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgHeadphonesFill(_ref) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n height: 24,\n viewBox: \"0 -960 960 960\",\n width: 24,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M360-120H200q-33 0-56.5-23.5T120-200v-280q0-75 28.5-140.5t77-114q48.5-48.5 114-77T480-840q75 0 140.5 28.5t114 77q48.5 48.5 77 114T840-480v280q0 33-23.5 56.5T760-120H600v-320h160v-40q0-117-81.5-198.5T480-760q-117 0-198.5 81.5T200-480v40h160v320Z\"\n })));\n}\nexport default SvgHeadphonesFill;","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgMovieFill(_ref) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n height: 24,\n viewBox: \"0 -960 960 960\",\n width: 24,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m160-800 80 160h120l-80-160h80l80 160h120l-80-160h80l80 160h120l-80-160h120q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800Z\"\n })));\n}\nexport default SvgMovieFill;","import { useState, useCallback } from 'react';\n\nimport classNames from 'classnames';\n\nimport HeadphonesIcon from '@/material-icons/400-24px/headphones-fill.svg?react';\nimport MovieIcon from '@/material-icons/400-24px/movie-fill.svg?react';\nimport VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react';\nimport { AltTextBadge } from 'mastodon/components/alt_text_badge';\nimport { Blurhash } from 'mastodon/components/blurhash';\nimport { Icon } from 'mastodon/components/icon';\nimport { formatTime } from 'mastodon/features/video';\nimport { autoPlayGif, displayMedia, useBlurhash } from 'mastodon/initial_state';\nimport type { Status, MediaAttachment } from 'mastodon/models/status';\n\nexport const MediaItem: React.FC<{\n attachment: MediaAttachment;\n onOpenMedia: (arg0: MediaAttachment) => void;\n}> = ({ attachment, onOpenMedia }) => {\n const [visible, setVisible] = useState(\n (displayMedia !== 'hide_all' &&\n !attachment.getIn(['status', 'sensitive'])) ||\n displayMedia === 'show_all',\n );\n const [loaded, setLoaded] = useState(false);\n\n const handleImageLoad = useCallback(() => {\n setLoaded(true);\n }, [setLoaded]);\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent) => {\n if (e.target instanceof HTMLVideoElement) {\n void e.target.play();\n }\n },\n [],\n );\n\n const handleMouseLeave = useCallback(\n (e: React.MouseEvent) => {\n if (e.target instanceof HTMLVideoElement) {\n e.target.pause();\n e.target.currentTime = 0;\n }\n },\n [],\n );\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n\n if (visible) {\n onOpenMedia(attachment);\n } else {\n setVisible(true);\n }\n }\n },\n [attachment, visible, onOpenMedia, setVisible],\n );\n\n const status = attachment.get('status') as Status;\n const description = (attachment.getIn(['translation', 'description']) ||\n attachment.get('description')) as string | undefined;\n const previewUrl = attachment.get('preview_url') as string;\n const fullUrl = attachment.get('url') as string;\n const avatarUrl = status.getIn(['account', 'avatar_static']) as string;\n const lang = status.get('language') as string;\n const blurhash = attachment.get('blurhash') as string;\n const statusId = status.get('id') as string;\n const acct = status.getIn(['account', 'acct']) as string;\n const type = attachment.get('type') as string;\n\n let thumbnail;\n\n const badges = [];\n\n if (description && description.length > 0) {\n badges.push();\n }\n\n if (!visible) {\n thumbnail = (\n
\n \n
\n );\n } else if (type === 'audio') {\n thumbnail = (\n <>\n \n\n
\n \n
\n \n );\n } else if (type === 'image') {\n const focusX = (attachment.getIn(['meta', 'focus', 'x']) || 0) as number;\n const focusY = (attachment.getIn(['meta', 'focus', 'y']) || 0) as number;\n const x = (focusX / 2 + 0.5) * 100;\n const y = (focusY / -2 + 0.5) * 100;\n\n thumbnail = (\n \n );\n } else if (['video', 'gifv'].includes(type)) {\n const duration = attachment.getIn([\n 'meta',\n 'original',\n 'duration',\n ]) as number;\n\n thumbnail = (\n
\n \n\n {type === 'video' && (\n
\n \n
\n )}\n
\n );\n\n if (type === 'gifv') {\n badges.push(\n \n GIF\n ,\n );\n } else {\n badges.push(\n \n {formatTime(Math.floor(duration))}\n ,\n );\n }\n }\n\n return (\n
\n \n\n \n {thumbnail}\n \n\n {badges.length > 0 && (\n
{badges}
\n )}\n
\n );\n};\n","import PropTypes from 'prop-types';\n\nimport { FormattedMessage } from 'react-intl';\n\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { connect } from 'react-redux';\n\nimport { lookupAccount, fetchAccount } from 'mastodon/actions/accounts';\nimport { openModal } from 'mastodon/actions/modal';\nimport { ColumnBackButton } from 'mastodon/components/column_back_button';\nimport { LoadMore } from 'mastodon/components/load_more';\nimport { LoadingIndicator } from 'mastodon/components/loading_indicator';\nimport ScrollContainer from 'mastodon/containers/scroll_container';\nimport BundleColumnError from 'mastodon/features/ui/components/bundle_column_error';\nimport { normalizeForLookup } from 'mastodon/reducers/accounts_map';\nimport { getAccountGallery } from 'mastodon/selectors';\n\nimport { expandAccountMediaTimeline } from '../../actions/timelines';\nimport HeaderContainer from '../account_timeline/containers/header_container';\nimport Column from '../ui/components/column';\n\nimport { MediaItem } from './components/media_item';\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 \n );\n }\n\n}\n\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 const lang = attachment.getIn(['status', 'language']);\n\n if (attachment.get('type') === 'video') {\n dispatch(openModal({\n modalType: 'VIDEO',\n modalProps: { media: attachment, statusId, lang, options: { autoPlay: true } },\n }));\n } else if (attachment.get('type') === 'audio') {\n dispatch(openModal({\n modalType: 'AUDIO',\n modalProps: { media: attachment, statusId, lang, options: { autoPlay: true } },\n }));\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({\n modalType: 'MEDIA',\n modalProps: { media, index, statusId, lang },\n }));\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 \n );\n }\n\n if (!attachments && isLoading) {\n return (\n \n \n \n );\n }\n\n let loadOlder = null;\n\n if (hasMore && !(isLoading && attachments.size === 0)) {\n loadOlder = ;\n }\n\n let emptyMessage;\n\n if (suspended) {\n emptyMessage = ;\n } else if (blockedBy) {\n emptyMessage = ;\n }\n\n return (\n \n \n\n \n
\n \n\n {(suspended || blockedBy) ? (\n
\n {emptyMessage}\n
\n ) : (\n
\n {attachments.map((attachment, index) => attachment === null ? (\n 0 ? attachments.getIn(index - 1, 'id') : null} onLoadMore={this.handleLoadMore} />\n ) : (\n \n ))}\n\n {loadOlder}\n
\n )}\n\n {isLoading && attachments.size === 0 && (\n
\n \n
\n )}\n
\n
\n
\n );\n }\n\n}\n\nexport default connect(mapStateToProps)(AccountGallery);\n"],"sourceRoot":""}