{"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<HTMLVideoElement>) => {\n      if (e.target instanceof HTMLVideoElement) {\n        void e.target.play();\n      }\n    },\n    [],\n  );\n\n  const handleMouseLeave = useCallback(\n    (e: React.MouseEvent<HTMLVideoElement>) => {\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<HTMLAnchorElement>) => {\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(<AltTextBadge key='alt' description={description} />);\n  }\n\n  if (!visible) {\n    thumbnail = (\n      <div className='media-gallery__item__overlay'>\n        <Icon id='eye-slash' icon={VisibilityOffIcon} />\n      </div>\n    );\n  } else if (type === 'audio') {\n    thumbnail = (\n      <>\n        <img\n          src={previewUrl || avatarUrl}\n          alt={description}\n          title={description}\n          lang={lang}\n          onLoad={handleImageLoad}\n        />\n\n        <div className='media-gallery__item__overlay media-gallery__item__overlay--corner'>\n          <Icon id='music' icon={HeadphonesIcon} />\n        </div>\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      <img\n        src={previewUrl}\n        alt={description}\n        title={description}\n        lang={lang}\n        style={{ objectPosition: `${x}% ${y}%` }}\n        onLoad={handleImageLoad}\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      <div className='media-gallery__gifv'>\n        <video\n          className='media-gallery__item-gifv-thumbnail'\n          aria-label={description}\n          title={description}\n          lang={lang}\n          src={fullUrl}\n          onMouseEnter={handleMouseEnter}\n          onMouseLeave={handleMouseLeave}\n          onLoadedData={handleImageLoad}\n          autoPlay={autoPlayGif}\n          playsInline\n          loop\n          muted\n        />\n\n        {type === 'video' && (\n          <div className='media-gallery__item__overlay media-gallery__item__overlay--corner'>\n            <Icon id='play' icon={MovieIcon} />\n          </div>\n        )}\n      </div>\n    );\n\n    if (type === 'gifv') {\n      badges.push(\n        <span\n          key='gif'\n          className='media-gallery__alt__label media-gallery__alt__label--non-interactive'\n        >\n          GIF\n        </span>,\n      );\n    } else {\n      badges.push(\n        <span\n          key='video'\n          className='media-gallery__alt__label media-gallery__alt__label--non-interactive'\n        >\n          {formatTime(Math.floor(duration))}\n        </span>,\n      );\n    }\n  }\n\n  return (\n    <div className='media-gallery__item media-gallery__item--square'>\n      <Blurhash\n        hash={blurhash}\n        className={classNames('media-gallery__preview', {\n          'media-gallery__preview--hidden': visible && loaded,\n        })}\n        dummy={!useBlurhash}\n      />\n\n      <a\n        className='media-gallery__item-thumbnail'\n        href={`/@${acct}/${statusId}`}\n        onClick={handleClick}\n        target='_blank'\n        rel='noopener noreferrer'\n      >\n        {thumbnail}\n      </a>\n\n      {badges.length > 0 && (\n        <div className='media-gallery__item__badges'>{badges}</div>\n      )}\n    </div>\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      <LoadMore\n        disabled={this.props.disabled}\n        onClick={this.handleLoadMore}\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        <BundleColumnError multiColumn={multiColumn} errorType='routing' />\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 />\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\nexport default connect(mapStateToProps)(AccountGallery);\n"],"sourceRoot":""}