summaryrefslogtreecommitdiff
path: root/priv/static/packs/features/account_gallery.js.map
diff options
context:
space:
mode:
Diffstat (limited to 'priv/static/packs/features/account_gallery.js.map')
-rw-r--r--priv/static/packs/features/account_gallery.js.map2
1 files changed, 1 insertions, 1 deletions
diff --git a/priv/static/packs/features/account_gallery.js.map b/priv/static/packs/features/account_gallery.js.map
index 6e91f9d92..6c6a30c94 100644
--- a/priv/static/packs/features/account_gallery.js.map
+++ b/priv/static/packs/features/account_gallery.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/account_gallery/components/media_item.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/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","icon","displayWidth","width","Math","floor","height","status","title","thumbnail","className","id","x","y","src","alt","style","objectPosition","onLoad","handleImageLoad","autoPlay","isIOS","label","classNames","autoplay","aria-label","role","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","loop","muted","href","onClick","handleClick","rel","ref","setCanvasRef","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","number","func","LoadMoreMedia","onLoadMore","maxId","disabled","handleLoadMore","shouldUpdateScroll","string","AccountGallery","connect","isAccount","params","accountId","attachments","getAccountGallery","isLoading","hasMore","size","last","undefined","scrollTop","scrollHeight","clientHeight","handleScrollToBottom","dispatch","expandAccountMediaTimeline","openModal","media","index","findIndex","offsetWidth","fetchAccount","componentWillReceiveProps","nextProps","multiColumn","loadOlder","handleLoadOlder","scrollKey","onScroll","handleScroll","handleRef","handleOpenMedia","object","list","bool"],"mappings":"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","file":"features/account_gallery.js","sourcesContent":["import { decode } from 'blurhash';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\nimport { autoPlayGif, displayMedia } from 'mastodon/initial_state';\nimport { isIOS } from 'mastodon/is_mobile';\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 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 let icon;\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 const label = attachment.get('type') === 'video' ? <Icon id='play' /> : 'GIF';\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\n <span className='media-gallery__gifv__label'>{label}</span>\n </div>\n );\n }\n\n if (!visible) {\n icon = (\n <span className='account-gallery__item__icons'>\n <Icon id='eye-slash' />\n </span>\n );\n }\n\n return (\n <div className='account-gallery__item' style={{ width, height }}>\n <a className='media-gallery__item-thumbnail' href={status.get('url')} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>\n <canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} />\n {visible && thumbnail}\n {!visible && 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 '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 'react-router-scroll-4';\nimport LoadMore from 'mastodon/components/load_more';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\nimport { openModal } from 'mastodon/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 shouldUpdateScroll: PropTypes.func,\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 multiColumn: 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 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 handleOpenMedia = attachment => {\n if (attachment.get('type') === 'video') {\n this.props.dispatch(openModal('VIDEO', { media: attachment, status: attachment.get('status') }));\n } else if (attachment.get('type') === 'audio') {\n this.props.dispatch(openModal('AUDIO', { 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, shouldUpdateScroll, isLoading, hasMore, isAccount, multiColumn } = 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>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <ScrollContainer scrollKey='account_gallery' shouldUpdateScroll={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
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/account_gallery/components/media_item.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/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","icon","displayWidth","width","Math","floor","height","status","title","thumbnail","className","id","x","y","src","alt","style","objectPosition","onLoad","handleImageLoad","autoPlay","isIOS","label","classNames","autoplay","aria-label","role","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","loop","muted","href","onClick","handleClick","rel","ref","setCanvasRef","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","number","func","LoadMoreMedia","onLoadMore","maxId","disabled","handleLoadMore","shouldUpdateScroll","string","AccountGallery","connect","isAccount","params","accountId","attachments","getAccountGallery","isLoading","hasMore","size","last","undefined","scrollTop","scrollHeight","clientHeight","handleScrollToBottom","dispatch","expandAccountMediaTimeline","openModal","media","index","findIndex","offsetWidth","fetchAccount","componentWillReceiveProps","nextProps","multiColumn","loadOlder","handleLoadOlder","scrollKey","onScroll","handleScroll","handleRef","handleOpenMedia","object","list","bool"],"mappings":"oWAUqBA,E,iNAQX,CACNC,QAA0B,aAAjBC,MAAgC,EAAKC,MAAMC,WAAWC,MAAM,CAAC,SAAU,eAAkC,aAAjBH,IACjGI,QAAQ,I,2CA2BK,SAAAC,GACb,EAAKC,OAASD,K,8CAGE,WAChB,EAAKE,SAAS,CAAEH,QAAQ,O,+CAGP,SAAAI,GACb,EAAKC,eACPD,EAAEE,OAAOC,U,+CAIM,SAAAH,GACb,EAAKC,gBACPD,EAAEE,OAAOE,QACTJ,EAAEE,OAAOG,YAAc,M,0CAQb,SAAAL,GACK,IAAbA,EAAEM,QAAkBN,EAAEO,SAAWP,EAAEQ,UACrCR,EAAES,iBAEE,EAAKC,MAAMnB,QACb,EAAKE,MAAMkB,YAAY,EAAKlB,MAAMC,YAElC,EAAKK,SAAS,CAAER,SAAS,Q,6BAxD/BqB,kBAAA,WACMC,KAAKpB,MAAMC,WAAWoB,IAAI,aAC5BD,KAAKE,W,EAITC,mBAAA,SAAoBC,GACdA,EAAUvB,WAAWoB,IAAI,cAAgBD,KAAKpB,MAAMC,WAAWoB,IAAI,aAAeD,KAAKpB,MAAMC,WAAWoB,IAAI,aAC9GD,KAAKE,W,EAITA,QAAA,WACE,IAAMG,EAASL,KAAKpB,MAAMC,WAAWoB,IAAI,YACnCK,EAASC,iBAAOF,EAAM,GAAI,IAEhC,GAAIC,EAAQ,CACV,IAAME,EAAYR,KAAKf,OAAOwB,WAAW,MACnCC,EAAY,IAAIC,UAAUL,EAAQ,GAAI,IAE5CE,EAAII,aAAaF,EAAW,EAAG,K,EAyBnCtB,YAAA,WACE,OAAQyB,MAAiF,IAAlE,CAAC,OAAQ,SAASC,QAAQd,KAAKpB,MAAMC,WAAWoB,IAAI,U,EAe7Ec,OAAA,WAAW,IAULC,EAVI,EAC6BhB,KAAKpB,MAAlCC,EADA,EACAA,WAAYoC,EADZ,EACYA,aADZ,EAEoBjB,KAAKH,MAAzBnB,EAFA,EAEAA,QAASK,EAFT,EAESA,OAEXmC,EAAYC,KAAKC,OAAOH,EAAe,GAAK,GAAK,EAA5C,KACLI,EAASH,EACTI,EAASzC,EAAWoB,IAAI,UACxBsB,EAAQD,EAAOrB,IAAI,iBAAmBpB,EAAWoB,IAAI,eAEvDuB,EAAY,GAGhB,GAA+B,YAA3B3C,EAAWoB,IAAI,cAEZ,GAA+B,UAA3BpB,EAAWoB,IAAI,QACxBuB,EACE,oBAAMC,UAAU,qCAAhB,EACE,YAAC,IAAD,CAAMC,GAAG,gBAGR,GAA+B,UAA3B7C,EAAWoB,IAAI,QAAqB,CAC7C,IAEM0B,EAAgC,MAFvB9C,EAAWC,MAAM,CAAC,OAAQ,QAAS,OAAS,GAEhC,EAAK,IAC1B8C,EAAgC,MAFvB/C,EAAWC,MAAM,CAAC,OAAQ,QAAS,OAAS,IAEhC,EAAK,IAEhC0C,EACE,mBACEK,IAAKhD,EAAWoB,IAAI,eACpB6B,IAAKjD,EAAWoB,IAAI,eACpBsB,MAAO1C,EAAWoB,IAAI,eACtB8B,MAAO,CAAEC,eAAmBL,EAAL,KAAWC,EAAX,KACvBK,OAAQjC,KAAKkC,uBAGZ,IAA2D,IAAvD,CAAC,OAAQ,SAASpB,QAAQjC,EAAWoB,IAAI,SAAiB,CACnE,IAAMkC,GAAYC,eAAWvB,IACvBwB,EAAsC,UAA3BxD,EAAWoB,IAAI,QAAsB,YAAC,IAAD,CAAMyB,GAAG,SAAY,MAE3EF,EACE,mBAAKC,UAAWa,IAAW,sBAAuB,CAAEC,SAAUJ,UAA9D,EACE,qBACEV,UAAU,qCACVe,aAAY3D,EAAWoB,IAAI,eAC3BsB,MAAO1C,EAAWoB,IAAI,eACtBwC,KAAK,cACLZ,IAAKhD,EAAWoB,IAAI,OACpByC,aAAc1C,KAAK2C,iBACnBC,aAAc5C,KAAK6C,iBACnBV,SAAUA,EACVW,MAAI,EACJC,OAAK,IAGP,oBAAMtB,UAAU,mCAAhB,EAA8CY,IAapD,OARK3D,IACHsC,EACE,oBAAMS,UAAU,qCAAhB,EACE,YAAC,IAAD,CAAMC,GAAG,gBAMb,mBAAKD,UAAU,wBAAwBM,MAAO,CAAEb,QAAOG,gBAAvD,EACE,iBAAGI,UAAU,gCAAgCuB,KAAM1B,EAAOrB,IAAI,OAAQgD,QAASjD,KAAKkD,YAAa3B,MAAOA,EAAOlC,OAAO,SAAS8D,IAAI,4BAAnI,EACE,4BAAQjC,MAAO,GAAIG,OAAQ,GAAI+B,IAAKpD,KAAKqD,aAAc5B,UAAWa,IAAW,yBAA0B,CAAE,iCAAkC5D,GAAWK,MACrJL,GAAW8C,GACV9C,GAAWsC,K,GAlJgBsC,K,YAAlB7E,E,YAEA,CACjBI,WAAY0E,IAAmBC,IAAIC,WACnCxC,aAAcyC,IAAUC,OAAOF,WAC/B3D,YAAa4D,IAAUE,KAAKH,a,ofCGhC,IAOMI,E,sNAQa,WACf,EAAKjF,MAAMkF,WAAW,EAAKlF,MAAMmF,U,qBAGnChD,OAAA,WACE,OACE,YAAC,IAAD,CACEiD,SAAUhE,KAAKpB,MAAMoF,SACrBf,QAASjD,KAAKiE,kB,GAhBMX,K,YAAtBO,E,YAEe,CACjBK,mBAAoBR,IAAUE,KAC9BG,MAAOL,IAAUS,OACjBL,WAAYJ,IAAUE,KAAKH,a,IAmBzBW,EADUC,mBA9BQ,SAACxE,EAAOjB,GAAR,MAAmB,CACzC0F,YAAazE,EAAMf,MAAM,CAAC,WAAYF,EAAM2F,OAAOC,YACnDC,YAAaC,YAAkB7E,EAAOjB,EAAM2F,OAAOC,WACnDG,UAAW9E,EAAMf,MAAM,CAAC,YAAD,WAAyBF,EAAM2F,OAAOC,UAAtC,SAAyD,cAChFI,QAAS/E,EAAMf,MAAM,CAAC,YAAD,WAAyBF,EAAM2F,OAAOC,UAAtC,SAAyD,e,kNAuCtE,CACNtD,MAAO,M,mDAec,WACjB,EAAKtC,MAAMgG,SACb,EAAKX,eAAe,EAAKrF,MAAM6F,YAAYI,KAAO,EAAI,EAAKjG,MAAM6F,YAAYK,OAAOhG,MAAM,CAAC,SAAU,YAASiG,M,2CAInG,SAAA5F,GAAM,IAAD,EACgCA,EAAEE,OAA5C2F,EADU,EACVA,UAGJ,IAJc,EACCC,aACWD,EAFZ,EACeE,eAGZ,EAAKtG,MAAM+F,WAC9B,EAAKQ,0B,6CAIQ,SAAApB,GACf,EAAKnF,MAAMwG,SAASC,YAA2B,EAAKzG,MAAM2F,OAAOC,UAAW,CAAET,c,8CAG9D,SAAA5E,GAChBA,EAAES,iBACF,EAAKuF,0B,8CAGW,SAAAtG,GAChB,GAA+B,UAA3BA,EAAWoB,IAAI,QACjB,EAAKrB,MAAMwG,SAASE,YAAU,QAAS,CAAEC,MAAO1G,EAAYyC,OAAQzC,EAAWoB,IAAI,kBAC9E,GAA+B,UAA3BpB,EAAWoB,IAAI,QACxB,EAAKrB,MAAMwG,SAASE,YAAU,QAAS,CAAEC,MAAO1G,EAAYyC,OAAQzC,EAAWoB,IAAI,iBAC9E,CACL,IAAMsF,EAAQ1G,EAAWC,MAAM,CAAC,SAAU,sBACpC0G,EAAQD,EAAME,WAAU,SAAA9D,GAAC,OAAIA,EAAE1B,IAAI,QAAUpB,EAAWoB,IAAI,SAElE,EAAKrB,MAAMwG,SAASE,YAAU,QAAS,CAAEC,QAAOC,QAAOlE,OAAQzC,EAAWoB,IAAI,iB,wCAItE,SAAAjB,GACNA,GACF,EAAKE,SAAS,CAAEgC,MAAOlC,EAAE0G,iB,6BAnD7B3F,kBAAA,WACEC,KAAKpB,MAAMwG,SAASO,YAAa3F,KAAKpB,MAAM2F,OAAOC,YACnDxE,KAAKpB,MAAMwG,SAASC,YAA2BrF,KAAKpB,MAAM2F,OAAOC,a,EAGnEoB,0BAAA,SAA2BC,GACrBA,EAAUtB,OAAOC,YAAcxE,KAAKpB,MAAM2F,OAAOC,WAAaqB,EAAUtB,OAAOC,YACjFxE,KAAKpB,MAAMwG,SAASO,YAAaE,EAAUtB,OAAOC,YAClDxE,KAAKpB,MAAMwG,SAASC,YAA2BrF,KAAKpB,MAAM2F,OAAOC,c,EA+CrEzD,OAAA,WAAW,IAAD,SACgFf,KAAKpB,MAArF6F,EADA,EACAA,YAAaP,EADb,EACaA,mBAAoBS,EADjC,EACiCA,UAAWC,EAD5C,EAC4CA,QAASN,EADrD,EACqDA,UAAWwB,EADhE,EACgEA,YAChE5E,EAAUlB,KAAKH,MAAfqB,MAER,IAAKoD,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAKG,GAAeE,EAClB,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAIoB,EAAY,KAMhB,OAJInB,GAAaD,GAAkC,IAArBF,EAAYI,OACxCkB,EAAY,YAAC,IAAD,CAAUrH,SAAUiG,EAAW1B,QAASjD,KAAKgG,mBAIzD,YAAC,IAAD,UACE,YAAC,IAAD,CAAkBF,YAAaA,IAE/B,YAAC,IAAD,CAAiBG,UAAU,kBAAkB/B,mBAAoBA,QAAjE,EACE,mBAAKzC,UAAU,8BAA8ByE,SAAUlG,KAAKmG,mBAA5D,EACE,YAAC,IAAD,CAAiB3B,UAAWxE,KAAKpB,MAAM2F,OAAOC,YAE9C,yBAAK/B,KAAK,OAAOhB,UAAU,6BAA6B2B,IAAKpD,KAAKoG,WAC/D3B,EAAYjB,KAAI,SAAC3E,EAAY2G,GAAb,OAAsC,OAAf3G,EACtC,YAAC,EAAD,CAAkEkF,MAAOyB,EAAQ,EAAIf,EAAY3F,MAAM0G,EAAQ,EAAG,MAAQ,KAAM1B,WAAY,EAAKG,gBAA7H,QAAUQ,EAAY3F,MAAM0G,EAAQ,EAAG,OAE3D,YAAC,EAAD,CAAsC3G,WAAYA,EAAYoC,aAAcC,EAAOpB,YAAa,EAAKuG,iBAArFxH,EAAWoB,IAAI,UAGhC8F,GAGFpB,GAAkC,IAArBF,EAAYI,MACxB,mBAAKpD,UAAU,2BAAf,EACE,YAAC,IAAD,S,GArHa6B,K,0BAER,CACjBiB,OAAQb,IAAU4C,OAAO7C,WACzB2B,SAAU1B,IAAUE,KAAKH,WACzBgB,YAAalB,IAAmBgD,KAAK9C,WACrCkB,UAAWjB,IAAU8C,KACrB5B,QAASlB,IAAU8C,KACnBlC,UAAWZ,IAAU8C,KACrBV,YAAapC,IAAU8C,O","file":"features/account_gallery.js","sourcesContent":["import { decode } from 'blurhash';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\nimport { autoPlayGif, displayMedia } from 'mastodon/initial_state';\nimport { isIOS } from 'mastodon/is_mobile';\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 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 let icon;\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 const label = attachment.get('type') === 'video' ? <Icon id='play' /> : 'GIF';\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\n <span className='media-gallery__gifv__label'>{label}</span>\n </div>\n );\n }\n\n if (!visible) {\n icon = (\n <span className='account-gallery__item__icons'>\n <Icon id='eye-slash' />\n </span>\n );\n }\n\n return (\n <div className='account-gallery__item' style={{ width, height }}>\n <a className='media-gallery__item-thumbnail' href={status.get('url')} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>\n <canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} />\n {visible && thumbnail}\n {!visible && 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 '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 'react-router-scroll-4';\nimport LoadMore from 'mastodon/components/load_more';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\nimport { openModal } from 'mastodon/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 shouldUpdateScroll: PropTypes.func,\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 multiColumn: 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 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 handleOpenMedia = attachment => {\n if (attachment.get('type') === 'video') {\n this.props.dispatch(openModal('VIDEO', { media: attachment, status: attachment.get('status') }));\n } else if (attachment.get('type') === 'audio') {\n this.props.dispatch(openModal('AUDIO', { 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, shouldUpdateScroll, isLoading, hasMore, isAccount, multiColumn } = 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>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <ScrollContainer scrollKey='account_gallery' shouldUpdateScroll={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