{"version":3,"sources":["webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/flavours/glitch/features/account_gallery/index.js"],"names":["MediaItem","visible","displayMedia","_this","props","media","getIn","state","setState","render","label","icon","title","this","status","get","x","y","style","Object","jsx","className","backgroundImage","backgroundPosition","permalink","to","href","onInterceptClick","handleClick","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","LoadMoreMedia","onLoadMore","maxId","load_more","disabled","onClick","handleLoadMore","PropTypes","string","func","AccountGallery","connect","isAccount","params","accountId","medias","getAccountGallery","isLoading","hasMore","_this2","column","scrollTop","size","last","undefined","e","_e$target","target","scrollHeight","clientHeight","handleScrollToBottom","dispatch","expandAccountMediaTimeline","preventDefault","prevRouterProps","_ref","location","mastodonModalOpen","c","componentDidMount","fetchAccount","componentWillReceiveProps","nextProps","_this3","_this$props","missing_indicator","loadOlder","loading_indicator","handleLoadOlder","react_default","a","createElement","ref","setRef","profile_column_header","handleHeaderClick","react_router_scroll_4_es","scrollKey","shouldUpdateScroll","onScroll","handleScroll","header_container","role","index","account_gallery_LoadMoreMedia","media_item_MediaItem","object","list","bool"],"mappings":"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","file":"flavours/glitch/async/account_gallery.js","sourcesContent":["import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Permalink from 'flavours/glitch/components/permalink';\nimport { displayMedia } from 'flavours/glitch/util/initial_state';\n\nexport default class MediaItem extends ImmutablePureComponent {\n\n  static propTypes = {\n    media: ImmutablePropTypes.map.isRequired,\n  };\n\n  state = {\n    visible: displayMedia !== 'hide_all' && !this.props.media.getIn(['status', 'sensitive']) || displayMedia === 'show_all',\n  };\n\n  handleClick = () => {\n    if (!this.state.visible) {\n      this.setState({ visible: true });\n      return true;\n    }\n\n    return false;\n  }\n\n  render () {\n    const { media } = this.props;\n    const { visible } = this.state;\n    const status = media.get('status');\n    const focusX = media.getIn(['meta', 'focus', 'x']);\n    const focusY = media.getIn(['meta', 'focus', 'y']);\n    const x = ((focusX /  2) + .5) * 100;\n    const y = ((focusY / -2) + .5) * 100;\n    const style = {};\n\n    let label, icon, title;\n\n    if (media.get('type') === 'gifv') {\n      label = <span className='media-gallery__gifv__label'>GIF</span>;\n    }\n\n    if (visible) {\n      style.backgroundImage    = `url(${media.get('preview_url')})`;\n      style.backgroundPosition = `${x}% ${y}%`;\n      title                    = media.get('description');\n    } else {\n      icon = (\n        <span className='account-gallery__item__icons'>\n          <i className='fa fa-eye-slash' />\n        </span>\n      );\n      title = status.get('spoiler_text') || media.get('description');\n    }\n\n    return (\n      <div className='account-gallery__item'>\n        <Permalink\n          to={`/statuses/${status.get('id')}`}\n          href={status.get('url')}\n          style={style}\n          title={title}\n          onInterceptClick={this.handleClick}\n        >\n          {icon}\n          {label}\n        </Permalink>\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 { fetchAccount } from 'flavours/glitch/actions/accounts';\nimport { expandAccountMediaTimeline } from 'flavours/glitch/actions/timelines';\nimport LoadingIndicator from 'flavours/glitch/components/loading_indicator';\nimport Column from 'flavours/glitch/features/ui/components/column';\nimport ProfileColumnHeader from 'flavours/glitch/features/account/components/profile_column_header';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { getAccountGallery } from 'flavours/glitch/selectors';\nimport MediaItem from './components/media_item';\nimport HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container';\nimport { ScrollContainer } from 'react-router-scroll-4';\nimport LoadMore from 'flavours/glitch/components/load_more';\nimport MissingIndicator from 'flavours/glitch/components/missing_indicator';\n\nconst mapStateToProps = (state, props) => ({\n  isAccount: !!state.getIn(['accounts', props.params.accountId]),\n  medias: getAccountGallery(state, props.params.accountId),\n  isLoading: state.getIn(['timelines', `account:${props.params.accountId}:media`, 'isLoading']),\n  hasMore:   state.getIn(['timelines', `account:${props.params.accountId}:media`, 'hasMore']),\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\n@connect(mapStateToProps)\nexport default class AccountGallery extends ImmutablePureComponent {\n\n  static propTypes = {\n    params: PropTypes.object.isRequired,\n    dispatch: PropTypes.func.isRequired,\n    medias: ImmutablePropTypes.list.isRequired,\n    isLoading: PropTypes.bool,\n    hasMore: PropTypes.bool,\n    isAccount: PropTypes.bool,\n  };\n\n  componentDidMount () {\n    this.props.dispatch(fetchAccount(this.props.params.accountId));\n    this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId));\n  }\n\n  componentWillReceiveProps (nextProps) {\n    if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {\n      this.props.dispatch(fetchAccount(nextProps.params.accountId));\n      this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId));\n    }\n  }\n\n  handleHeaderClick = () => {\n    this.column.scrollTop();\n  }\n\n  handleScrollToBottom = () => {\n    if (this.props.hasMore) {\n      this.handleLoadMore(this.props.medias.size > 0 ? this.props.medias.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.params.accountId, { maxId }));\n  };\n\n  handleLoadOlder = (e) => {\n    e.preventDefault();\n    this.handleScrollToBottom();\n  }\n\n  shouldUpdateScroll = (prevRouterProps, { location }) => {\n    if ((((prevRouterProps || {}).location || {}).state || {}).mastodonModalOpen) return false;\n    return !(location.state && location.state.mastodonModalOpen);\n  }\n\n  setRef = c => {\n    this.column = c;\n  }\n\n  render () {\n    const { medias, isLoading, hasMore, isAccount } = this.props;\n\n    if (!isAccount) {\n      return (\n        <Column>\n          <MissingIndicator />\n        </Column>\n      );\n    }\n\n    let loadOlder = null;\n\n    if (!medias && isLoading) {\n      return (\n        <Column>\n          <LoadingIndicator />\n        </Column>\n      );\n    }\n\n    if (hasMore && !(isLoading && medias.size === 0)) {\n      loadOlder = <LoadMore visible={!isLoading} onClick={this.handleLoadOlder} />;\n    }\n\n    return (\n      <Column ref={this.setRef}>\n        <ProfileColumnHeader onClick={this.handleHeaderClick} />\n\n        <ScrollContainer scrollKey='account_gallery' shouldUpdateScroll={this.shouldUpdateScroll}>\n          <div className='scrollable scrollable--flex' onScroll={this.handleScroll}>\n            <HeaderContainer accountId={this.props.params.accountId} />\n\n            <div role='feed' className='account-gallery__container'>\n              {medias.map((media, index) => media === null ? (\n                <LoadMoreMedia\n                  key={'more:' + medias.getIn(index + 1, 'id')}\n                  maxId={index > 0 ? medias.getIn(index - 1, 'id') : null}\n                  onLoadMore={this.handleLoadMore}\n                />\n              ) : (\n                <MediaItem\n                  key={media.get('id')}\n                  media={media}\n                />\n              ))}\n              {loadOlder}\n            </div>\n\n            {isLoading && medias.size === 0 && (\n              <div className='scrollable__append'>\n                <LoadingIndicator />\n              </div>\n            )}\n          </div>\n        </ScrollContainer>\n      </Column>\n    );\n  }\n\n}\n"],"sourceRoot":""}