Merge branch 'develop' of https://git.pleroma.social/pleroma/pleroma into develop
[akkoma] / priv / static / packs / flavours / glitch / async / account_gallery.js.map
index bc4e22a5e0649057cead9da58effe0842219b99d..196c914fcce36093e95f904ed98db662933e9d7e 100644 (file)
@@ -1 +1 @@
-{"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","medias","getAccountGallery","params","accountId","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","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';\n\nconst mapStateToProps = (state, props) => ({\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  };\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 } = this.props;\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":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/account_gallery/index.js"],"names":["MediaItem","visible","displayMedia","props","attachment","getIn","loaded","c","canvas","setState","e","hoverToPlay","target","play","pause","currentTime","button","ctrlKey","metaKey","preventDefault","state","onOpenMedia","componentDidMount","this","get","_decode","componentDidUpdate","prevProps","hash","pixels","decode","ctx","getContext","imageData","ImageData","putImageData","autoPlayGif","indexOf","render","displayWidth","width","Math","floor","height","status","title","thumbnail","className","id","x","y","src","alt","style","objectPosition","onLoad","handleImageLoad","autoPlay","isIOS","classNames","autoplay","aria-label","role","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","loop","muted","icon","href","onClick","handleClick","ref","setCanvasRef","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","number","func","LoadMoreMedia","onLoadMore","maxId","disabled","handleLoadMore","string","AccountGallery","connect","isAccount","params","accountId","attachments","getAccountGallery","isLoading","hasMore","column","scrollTop","size","last","undefined","scrollHeight","clientHeight","handleScrollToBottom","dispatch","expandAccountMediaTimeline","prevRouterProps","location","mastodonModalOpen","includes","openModal","media","index","findIndex","offsetWidth","fetchAccount","componentWillReceiveProps","nextProps","loadOlder","handleLoadOlder","setColumnRef","handleHeaderClick","scrollKey","shouldUpdateScroll","onScroll","handleScroll","handleRef","handleOpenMedia","object","list","bool"],"mappings":"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","file":"flavours/glitch/async/account_gallery.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Icon from 'flavours/glitch/components/icon';\nimport { autoPlayGif, displayMedia } from 'flavours/glitch/util/initial_state';\nimport classNames from 'classnames';\nimport { decode } from 'blurhash';\nimport { isIOS } from 'flavours/glitch/util/is_mobile';\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  componentDidMount () {\n    if (this.props.attachment.get('blurhash')) {\n      this._decode();\n    }\n  }\n\n  componentDidUpdate (prevProps) {\n    if (prevProps.attachment.get('blurhash') !== this.props.attachment.get('blurhash') && this.props.attachment.get('blurhash')) {\n      this._decode();\n    }\n  }\n\n  _decode () {\n    const hash   = this.props.attachment.get('blurhash');\n    const pixels = decode(hash, 32, 32);\n\n    if (pixels) {\n      const ctx       = this.canvas.getContext('2d');\n      const imageData = new ImageData(pixels, 32, 32);\n\n      ctx.putImageData(imageData, 0, 0);\n    }\n  }\n\n  setCanvasRef = c => {\n    this.canvas = c;\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 = '';\n\n    if (attachment.get('type') === 'unknown') {\n      // Skip\n    } else if (attachment.get('type') === 'audio') {\n      thumbnail = (\n        <span className='account-gallery__item__icons'>\n          <Icon id='music' />\n        </span>\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      thumbnail = (\n        <img\n          src={attachment.get('preview_url')}\n          alt={attachment.get('description')}\n          title={attachment.get('description')}\n          style={{ objectPosition: `${x}% ${y}%` }}\n          onLoad={this.handleImageLoad}\n        />\n      );\n    } else if (['gifv', 'video'].indexOf(attachment.get('type')) !== -1) {\n      const autoPlay = !isIOS() && autoPlayGif;\n\n      thumbnail = (\n        <div className={classNames('media-gallery__gifv', { autoplay: autoPlay })}>\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={autoPlay}\n            loop\n            muted\n          />\n          <span className='media-gallery__gifv__label'>GIF</span>\n        </div>\n      );\n    }\n\n    const icon = (\n      <span className='account-gallery__item__icons'>\n        <Icon id='eye-slash' />\n      </span>\n    );\n\n    return (\n      <div className='account-gallery__item' style={{ width, height }}>\n        <a className='media-gallery__item-thumbnail' href={status.get('url')} target='_blank' onClick={this.handleClick} title={title}>\n          <canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} />\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 { 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';\nimport { openModal } from 'flavours/glitch/actions/modal';\n\nconst mapStateToProps = (state, props) => ({\n  isAccount: !!state.getIn(['accounts', props.params.accountId]),\n  attachments: 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\nexport default @connect(mapStateToProps)\nclass AccountGallery extends ImmutablePureComponent {\n\n  static propTypes = {\n    params: PropTypes.object.isRequired,\n    dispatch: PropTypes.func.isRequired,\n    attachments: ImmutablePropTypes.list.isRequired,\n    isLoading: PropTypes.bool,\n    hasMore: PropTypes.bool,\n    isAccount: PropTypes.bool,\n  };\n\n  state = {\n    width: 323,\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.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.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  setColumnRef = c => {\n    this.column = c;\n  }\n\n  handleOpenMedia = attachment => {\n    if (['video', 'audio'].includes(attachment.get('type'))) {\n      this.props.dispatch(openModal('VIDEO', { media: attachment, status: attachment.get('status') }));\n    } else {\n      const media = attachment.getIn(['status', 'media_attachments']);\n      const index = media.findIndex(x => x.get('id') === attachment.get('id'));\n\n      this.props.dispatch(openModal('MEDIA', { media, index, status: attachment.get('status') }));\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 } = 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    return (\n      <Column ref={this.setColumnRef}>\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' 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            {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":""}
\ No newline at end of file