forked from AkkomaGang/akkoma
1 line
No EOL
47 KiB
Text
1 line
No EOL
47 KiB
Text
{"version":3,"sources":["webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/notification.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/notification_container.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/clear_column_button.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/column_settings.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/column_settings_container.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/filter_bar.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js","webpack:///app/javascript/builds/pleroma/mastofe/app/javascript/mastodon/features/notifications/index.js"],"names":["notificationForScreenReader","intl","message","timestamp","output","push","formatDate","hour","minute","month","day","join","Notification","injectIntl","_this$props","_this","props","notification","onMoveUp","get","_this$props2","onMoveDown","context","router","history","handleOpenProfile","getIn","e","preventDefault","_this$props3","onMention","status","onFavourite","onReblog","onToggleHidden","getHandlers","reply","this","handleMention","favourite","handleHotkeyFavourite","boost","handleHotkeyBoost","mention","open","handleOpen","openProfile","moveUp","handleMoveUp","moveDown","handleMoveDown","toggleHidden","handleHotkeyToggleHidden","renderFollow","account","link","Object","jsx","react_hotkeys_index_es","handlers","className","tabIndex","aria-label","formatMessage","id","defaultMessage","name","icon","fixedWidth","title","index_es","values","account_container","withNote","hidden","renderMention","status_container","withDismiss","contextType","renderFavourite","muted","renderReblog","render","displayNameHtml","__html","permalink","href","to","dangerouslySetInnerHTML","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","isRequired","bool","func","option","connect","getNotification","makeGetNotification","getStatus","makeGetStatus","state","accountId","dispatch","mentionCompose","onModalReblog","reblog","unreblog","shiftKey","boostModal","openModal","unfavourite","revealStatus","hideStatus","ClearColumnButton","onClick","React","PureComponent","ColumnSettings","path","checked","onChange","concat","settings","pushSettings","onClear","filterShowStr","filterAdvancedStr","alertStr","showStr","soundStr","showPushSettings","pushStr","clear_column_button_ClearColumnButton","role","aria-labelledby","setting_toggle","prefix","settingPath","label","onPushChange","messages","defineMessages","clearMessage","clearConfirm","_ref","changePushNotifications","slice","changeSetting","setFilter","confirm","onConfirm","clearNotifications","tooltips","mentions","favourites","boosts","follows","FilterBar","notificationType","selectFilter","selectedFilter","advancedMode","newActiveFilter","getNotifications","createSelector","ImmutableList","filter","item","keys","showFilterBar","allowedType","excludedTypes","notifications","filterNot","includes","Notifications","isLoading","isUnread","hasMore","maxId","expandNotifications","debounce_default","last","leading","scrollTopNotifications","columnId","removeColumn","addColumn","dir","moveColumn","column","scrollTop","c","elementIndex","findIndex","_selectChild","componentWillUnmount","handleLoadOlder","cancel","handleScrollToTop","handleScroll","index","element","node","querySelector","focus","_this2","shouldUpdateScroll","multiColumn","pinned","emptyMessage","scrollableContent","filterBarContainer","filter_bar_container","size","load_gap","disabled","handleLoadGap","notification_container","scrollContainer","scrollable_list","scrollKey","trackScroll","showLoading","onLoadMore","onScrollToTop","onScroll","react_default","a","createElement","ref","setColumnRef","column_header","active","onPin","handlePin","onMove","handleMove","handleHeaderClick","column_settings_container"],"mappings":"iUAWMA,EAA8B,SAACC,EAAMC,EAASC,GAClD,IAAMC,EAAS,CAACF,GAIhB,OAFAE,EAAOC,KAAKJ,EAAKK,WAAWH,EAAW,CAAEI,KAAM,UAAWC,OAAQ,UAAWC,MAAO,QAASC,IAAK,aAE3FN,EAAOO,KAAK,OAIfC,EADUC,2NAoBC,WAAM,IAAAC,EACgBC,EAAKC,MAAhCC,EADWH,EACXG,cACRC,EAFmBJ,EACGI,UACbD,EAAaE,IAAI,kEAGX,WAAM,IAAAC,EACgBL,EAAKC,MAAlCC,EADaG,EACbH,cACRI,EAFqBD,EACCC,YACXJ,EAAaE,IAAI,8DAGjB,WAAM,IACTF,EAAiBF,EAAKC,MAAtBC,aAEJA,EAAaE,IAAI,UACnBJ,EAAKO,QAAQC,OAAOC,QAAQnB,KAA5B,aAA8CY,EAAaE,IAAI,WAE/DJ,EAAKU,kFAIW,WAAM,IAChBR,EAAiBF,EAAKC,MAAtBC,aACRF,EAAKO,QAAQC,OAAOC,QAAQnB,KAA5B,aAA8CY,EAAaS,MAAM,CAAC,UAAW,kEAG/D,SAAAC,GACdA,EAAEC,iBADiB,IAAAC,EAGiBd,EAAKC,MAAjCC,EAHWY,EAGXZ,cACRa,EAJmBD,EAGGC,WACZb,EAAaE,IAAI,WAAYJ,EAAKO,QAAQC,OAAOC,2EAGrC,WAAM,IACpBO,EAAWhB,EAAKC,MAAhBe,OACJA,GAAQhB,EAAKC,MAAMgB,YAAYD,iEAGjB,SAAAJ,GAAK,IACfI,EAAWhB,EAAKC,MAAhBe,OACJA,GAAQhB,EAAKC,MAAMiB,SAASF,EAAQJ,wEAGf,WAAM,IACvBI,EAAWhB,EAAKC,MAAhBe,OACJA,GAAQhB,EAAKC,MAAMkB,eAAeH,mDAGxCI,YAAA,WACE,MAAO,CACLC,MAAOC,KAAKC,cACZC,UAAWF,KAAKG,sBAChBC,MAAOJ,KAAKK,kBACZC,QAASN,KAAKC,cACdM,KAAMP,KAAKQ,WACXC,YAAaT,KAAKZ,kBAClBsB,OAAQV,KAAKW,aACbC,SAAUZ,KAAKa,eACfC,aAAcd,KAAKe,6BAIvBC,aAAA,SAAcpC,EAAcqC,EAASC,GAAM,IACjCtD,EAASoC,KAAKrB,MAAdf,KAER,OACEuD,OAAAC,EAAA,EAAAD,CAACE,EAAA,QAAD,CAASC,SAAUtB,KAAKF,oBAAxB,EACEqB,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6CAA6CC,SAAS,IAAIC,aAAY9D,EAA4BC,EAAMA,EAAK8D,cAAc,CAAEC,GAAI,sBAAuBC,eAAgB,uBAAyB,CAAEC,KAAMZ,EAAQnC,IAAI,UAAYF,EAAaE,IAAI,qBAAjQ,EACEqC,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,8BAAf,EACEJ,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6CAAf,EACEJ,OAAAC,EAAA,EAAAD,CAACW,EAAA,EAAD,CAAMH,GAAG,YAAYI,YAAU,KAGjCZ,OAAAC,EAAA,EAAAD,CAAA,QAAMa,MAAOpD,EAAaE,IAAI,oBAA9B,EACEqC,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,sBAAsBC,eAAe,sBAAsBM,OAAQ,CAAEL,KAAMX,OAIpGC,OAAAC,EAAA,EAAAD,CAACgB,EAAA,EAAD,CAAkBR,GAAIV,EAAQnC,IAAI,MAAOsD,UAAU,EAAOC,OAAQrC,KAAKrB,MAAM0D,cAMrFC,cAAA,SAAe1D,GACb,OACEuC,OAAAC,EAAA,EAAAD,CAACoB,EAAA,EAAD,CACEZ,GAAI/C,EAAaE,IAAI,UACrB0D,aAAW,EACXH,OAAQrC,KAAKrB,MAAM0D,OACnBrD,WAAYgB,KAAKa,eACjBhC,SAAUmB,KAAKW,aACf8B,YAAY,qBAKlBC,gBAAA,SAAiB9D,EAAcsC,GAAM,IAC3BtD,EAASoC,KAAKrB,MAAdf,KAER,OACEuD,OAAAC,EAAA,EAAAD,CAACE,EAAA,QAAD,CAASC,SAAUtB,KAAKF,oBAAxB,EACEqB,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,gDAAgDC,SAAS,IAAIC,aAAY9D,EAA4BC,EAAMA,EAAK8D,cAAc,CAAEC,GAAI,yBAA0BC,eAAgB,iCAAmC,CAAEC,KAAMjD,EAAaS,MAAM,CAAC,UAAW,WAAaT,EAAaE,IAAI,qBAArS,EACEqC,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,8BAAf,EACEJ,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6CAAf,EACEJ,OAAAC,EAAA,EAAAD,CAACW,EAAA,EAAD,CAAMH,GAAG,OAAOJ,UAAU,YAAYQ,YAAU,KAGlDZ,OAAAC,EAAA,EAAAD,CAAA,QAAMa,MAAOpD,EAAaE,IAAI,oBAA9B,EACEqC,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,yBAAyBC,eAAe,gCAAgCM,OAAQ,CAAEL,KAAMX,OAIjHC,OAAAC,EAAA,EAAAD,CAACoB,EAAA,EAAD,CAAiBZ,GAAI/C,EAAaE,IAAI,UAAWmC,QAASrC,EAAaE,IAAI,WAAY6D,OAAK,EAACH,aAAW,EAACH,SAAUrC,KAAKrB,MAAM0D,cAMtIO,aAAA,SAAchE,EAAcsC,GAAM,IACxBtD,EAASoC,KAAKrB,MAAdf,KAER,OACEuD,OAAAC,EAAA,EAAAD,CAACE,EAAA,QAAD,CAASC,SAAUtB,KAAKF,oBAAxB,EACEqB,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6CAA6CC,SAAS,IAAIC,aAAY9D,EAA4BC,EAAMA,EAAK8D,cAAc,CAAEC,GAAI,sBAAuBC,eAAgB,8BAAgC,CAAEC,KAAMjD,EAAaS,MAAM,CAAC,UAAW,WAAaT,EAAaE,IAAI,qBAA5R,EACEqC,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,8BAAf,EACEJ,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6CAAf,EACEJ,OAAAC,EAAA,EAAAD,CAACW,EAAA,EAAD,CAAMH,GAAG,UAAUI,YAAU,KAG/BZ,OAAAC,EAAA,EAAAD,CAAA,QAAMa,MAAOpD,EAAaE,IAAI,oBAA9B,EACEqC,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,sBAAsBC,eAAe,6BAA6BM,OAAQ,CAAEL,KAAMX,OAI3GC,OAAAC,EAAA,EAAAD,CAACoB,EAAA,EAAD,CAAiBZ,GAAI/C,EAAaE,IAAI,UAAWmC,QAASrC,EAAaE,IAAI,WAAY6D,OAAK,EAACH,aAAW,EAACH,OAAQrC,KAAKrB,MAAM0D,cAMpIQ,OAAA,WAAU,IACAjE,EAAiBoB,KAAKrB,MAAtBC,aACFqC,EAAmBrC,EAAaE,IAAI,WACpCgE,EAAmB,CAAEC,OAAQ9B,EAAQnC,IAAI,sBACzCoC,EAAmBC,OAAAC,EAAA,EAAAD,CAAA,gBAAKA,OAAAC,EAAA,EAAAD,CAAC6B,EAAA,EAAD,CAAWzB,UAAU,6BAA6B0B,KAAMhC,EAAQnC,IAAI,OAAQkD,MAAOf,EAAQnC,IAAI,QAASoE,GAAE,aAAejC,EAAQnC,IAAI,MAASqE,wBAAyBL,KAErM,OAAOlE,EAAaE,IAAI,SACxB,IAAK,SACH,OAAOkB,KAAKgB,aAAapC,EAAcqC,EAASC,GAClD,IAAK,UACH,OAAOlB,KAAKsC,cAAc1D,GAC5B,IAAK,YACH,OAAOoB,KAAK0C,gBAAgB9D,EAAcsC,GAC5C,IAAK,SACH,OAAOlB,KAAK4C,aAAahE,EAAcsC,GAGzC,OAAO,SAhLgBkC,kCAEH,CACpBlE,OAAQmE,IAAUC,mCAGD,CACjB1E,aAAc2E,IAAmBC,IAAIC,WACrCpB,OAAQgB,IAAUK,KAClB7E,SAAUwE,IAAUM,KAAKF,WACzBzE,WAAYqE,IAAUM,KAAKF,WAC3BhE,UAAW4D,IAAUM,KAAKF,WAC1B9D,YAAa0D,IAAUM,KAAKF,WAC5B7D,SAAUyD,IAAUM,KAAKF,WACzB5D,eAAgBwD,IAAUM,KAAKF,WAC/B/D,OAAQ2D,IAAUO,OAClBhG,KAAMyF,IAAUC,OAAOG,8DCkCZI,oBArDa,WAC1B,IAAMC,EAAkBC,cAClBC,EAAYC,cAUlB,OARwB,SAACC,EAAOvF,GAC9B,IAAMC,EAAekF,EAAgBI,EAAOvF,EAAMC,aAAcD,EAAMwF,WACtE,MAAO,CACLvF,aAAcA,EACdc,OAAQd,EAAaE,IAAI,UAAYkF,EAAUE,EAAO,CAAEvC,GAAI/C,EAAaE,IAAI,YAAe,QAOvE,SAAAsF,GAAQ,MAAK,CACtC3E,UAAW,SAACwB,EAAS/B,GACnBkF,EAASC,YAAepD,EAAS/B,KAGnCoF,cALsC,SAKvB5E,GACb0E,EAASG,YAAO7E,KAGlBE,SATsC,SAS5BF,EAAQJ,GACZI,EAAOZ,IAAI,aACbsF,EAASI,YAAS9E,IAEdJ,EAAEmF,WAAaC,IACjB1E,KAAKsE,cAAc5E,GAEnB0E,EAASO,YAAU,QAAS,CAAEjF,SAAQE,SAAUI,KAAKsE,kBAK3D3E,YArBsC,SAqBzBD,GACPA,EAAOZ,IAAI,cACbsF,EAASQ,YAAYlF,IAErB0E,EAASlE,YAAUR,KAIvBG,eA7BsC,SA6BtBH,GACVA,EAAOZ,IAAI,UACbsF,EAASS,YAAanF,EAAOZ,IAAI,QAEjCsF,EAASU,YAAWpF,EAAOZ,IAAI,WAKtB+E,CAAiDtF,GCjE3CwG,oGAMnBlC,OAAA,WACE,OACE1B,OAAAC,EAAA,EAAAD,CAAA,UAAQI,UAAU,sCAAsCC,SAAS,IAAIwD,QAAShF,KAAKrB,MAAMqG,cAAzF,EAAkG7D,OAAAC,EAAA,EAAAD,CAACW,EAAA,EAAD,CAAMH,GAAG,WAA3G,IAAuHR,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,sBAAsBC,eAAe,6BARxIqD,IAAMC,wBCEhCC,4MASJ,SAACC,EAAMC,GACpB3G,EAAKC,MAAM2G,SAAX,CAAqB,QAArBC,OAAgCH,GAAOC,2CAGzCxC,OAAA,WAAU,IAAApE,EAC8CuB,KAAKrB,MAAnD6G,EADA/G,EACA+G,SAAUC,EADVhH,EACUgH,aAAcH,EADxB7G,EACwB6G,SAAUI,EADlCjH,EACkCiH,QAEpCC,EAAgBxE,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,gDAAgDC,eAAe,SACpGgE,EAAoBzE,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,oDAAoDC,eAAe,2BAC5GiE,EAAY1E,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,sCAAsCC,eAAe,0BACtFkE,EAAY3E,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,qCAAqCC,eAAe,mBACrFmE,EAAY5E,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,sCAAsCC,eAAe,eAEtFoE,EAAmBP,EAAa3G,IAAI,mBAAqB2G,EAAa3G,IAAI,gBAC1EmH,EAAUD,GAAoB7E,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,qCAAqCC,eAAe,uBAE7G,OACET,OAAAC,EAAA,EAAAD,CAAA,gBACEA,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6BAAf,EACEJ,OAAAC,EAAA,EAAAD,CAAC+E,EAAD,CAAmBlB,QAASU,KAG9BvE,OAAAC,EAAA,EAAAD,CAAA,OAAKgF,KAAK,QAAQC,kBAAgB,iCAAlC,EACEjF,OAAAC,EAAA,EAAAD,CAAA,QAAMQ,GAAG,2BAA2BJ,UAAU,iCAA9C,EACEJ,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,oDAAoDC,eAAe,sBAE1FT,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6BAAf,EACEJ,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAe1E,GAAG,kBAAkB2E,OAAO,gBAAgBd,SAAUA,EAAUe,YAAa,CAAC,cAAe,QAASjB,SAAUA,EAAUkB,MAAOb,IAChJxE,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAe1E,GAAG,kBAAkB2E,OAAO,gBAAgBd,SAAUA,EAAUe,YAAa,CAAC,cAAe,YAAajB,SAAUA,EAAUkB,MAAOZ,MAIxJzE,OAAAC,EAAA,EAAAD,CAAA,OAAKgF,KAAK,QAAQC,kBAAgB,6BAAlC,EACEjF,OAAAC,EAAA,EAAAD,CAAA,QAAMQ,GAAG,uBAAuBJ,UAAU,iCAA1C,EAAqEJ,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,uCAAuCC,eAAe,oBAEhJT,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6BAAf,EACEJ,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,wBAAwBd,SAAUA,EAAUe,YAAa,CAAC,SAAU,UAAWjB,SAAUA,EAAUkB,MAAOX,IAC/HG,GAAoB7E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,qBAAqBd,SAAUC,EAAcc,YAAa,CAAC,SAAU,UAAWjB,SAAUtF,KAAKyG,aAAcD,MAAOP,IAC/J9E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,gBAAgBd,SAAUA,EAAUe,YAAa,CAAC,QAAS,UAAWjB,SAAUA,EAAUkB,MAAOV,IACvH3E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,gBAAgBd,SAAUA,EAAUe,YAAa,CAAC,SAAU,UAAWjB,SAAUA,EAAUkB,MAAOT,MAI5H5E,OAAAC,EAAA,EAAAD,CAAA,OAAKgF,KAAK,QAAQC,kBAAgB,gCAAlC,EACEjF,OAAAC,EAAA,EAAAD,CAAA,QAAMQ,GAAG,0BAA0BJ,UAAU,iCAA7C,EAAwEJ,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,0CAA0CC,eAAe,iBAEtJT,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6BAAf,EACEJ,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,wBAAwBd,SAAUA,EAAUe,YAAa,CAAC,SAAU,aAAcjB,SAAUA,EAAUkB,MAAOX,IAClIG,GAAoB7E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,qBAAqBd,SAAUC,EAAcc,YAAa,CAAC,SAAU,aAAcjB,SAAUtF,KAAKyG,aAAcD,MAAOP,IAClK9E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,gBAAgBd,SAAUA,EAAUe,YAAa,CAAC,QAAS,aAAcjB,SAAUA,EAAUkB,MAAOV,IAC1H3E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,gBAAgBd,SAAUA,EAAUe,YAAa,CAAC,SAAU,aAAcjB,SAAUA,EAAUkB,MAAOT,MAI/H5E,OAAAC,EAAA,EAAAD,CAAA,OAAKgF,KAAK,QAAQC,kBAAgB,8BAAlC,EACEjF,OAAAC,EAAA,EAAAD,CAAA,QAAMQ,GAAG,wBAAwBJ,UAAU,iCAA3C,EAAsEJ,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,wCAAwCC,eAAe,eAElJT,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6BAAf,EACEJ,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,wBAAwBd,SAAUA,EAAUe,YAAa,CAAC,SAAU,WAAYjB,SAAUA,EAAUkB,MAAOX,IAChIG,GAAoB7E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,qBAAqBd,SAAUC,EAAcc,YAAa,CAAC,SAAU,WAAYjB,SAAUtF,KAAKyG,aAAcD,MAAOP,IAChK9E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,gBAAgBd,SAAUA,EAAUe,YAAa,CAAC,QAAS,WAAYjB,SAAUA,EAAUkB,MAAOV,IACxH3E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,gBAAgBd,SAAUA,EAAUe,YAAa,CAAC,SAAU,WAAYjB,SAAUA,EAAUkB,MAAOT,MAI7H5E,OAAAC,EAAA,EAAAD,CAAA,OAAKgF,KAAK,QAAQC,kBAAgB,6BAAlC,EACEjF,OAAAC,EAAA,EAAAD,CAAA,QAAMQ,GAAG,uBAAuBJ,UAAU,iCAA1C,EAAqEJ,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,uCAAuCC,eAAe,aAEhJT,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,6BAAf,EACEJ,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,wBAAwBd,SAAUA,EAAUe,YAAa,CAAC,SAAU,UAAWjB,SAAUA,EAAUkB,MAAOX,IAC/HG,GAAoB7E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,qBAAqBd,SAAUC,EAAcc,YAAa,CAAC,SAAU,UAAWjB,SAAUtF,KAAKyG,aAAcD,MAAOP,IAC/J9E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,gBAAgBd,SAAUA,EAAUe,YAAa,CAAC,QAAS,UAAWjB,SAAUA,EAAUkB,MAAOV,IACvH3E,OAAAC,EAAA,EAAAD,CAACkF,EAAA,EAAD,CAAeC,OAAO,gBAAgBd,SAAUA,EAAUe,YAAa,CAAC,SAAU,UAAWjB,SAAUA,EAAUkB,MAAOT,WAjFxFd,IAAMC,gCCE5CwB,EAAWC,YAAe,CAC9BC,aAAY,CAAAjF,GAAA,mCAAAC,eAAA,sEACZiF,aAAY,CAAAlF,GAAA,sBAAAC,eAAA,yBA+BCpD,cAAWqF,kBA5BF,SAAAK,GAAK,MAAK,CAChCsB,SAAUtB,EAAM7E,MAAM,CAAC,WAAY,kBACnCoG,aAAcvB,EAAMpF,IAAI,wBAGC,SAACsF,EAAD0C,GAAA,IAAalJ,EAAbkJ,EAAalJ,KAAb,MAAyB,CAElD0H,SAFkD,SAExCF,EAAMC,GACE,SAAZD,EAAK,GACPhB,EAAS2C,YAAwB3B,EAAK4B,MAAM,GAAI3B,IAC3B,gBAAZD,EAAK,IACdhB,EAAS6C,YAAa,CAAE,iBAAF1B,OAAsBH,GAAOC,IACnDjB,EAAS8C,YAAU,SAEnB9C,EAAS6C,YAAa,CAAE,iBAAF1B,OAAsBH,GAAOC,KAIvDK,QAbkD,WAchDtB,EAASO,YAAU,UAAW,CAC5B9G,QAASD,EAAK8D,cAAcgF,EAASE,cACrCO,QAASvJ,EAAK8D,cAAcgF,EAASG,cACrCO,UAAW,kBAAMhD,EAASiD,sBAMNxD,CAA6CsB,ICrCjEmC,EAAWX,YAAe,CAC9BY,SAAQ,CAAA5F,GAAA,gCAAAC,eAAA,YACR4F,WAAU,CAAA7F,GAAA,kCAAAC,eAAA,cACV6F,OAAM,CAAA9F,GAAA,8BAAAC,eAAA,UACN8F,QAAO,CAAA/F,GAAA,+BAAAC,eAAA,aAIH+F,EADUnJ,wHAUdwG,QAAA,SAAS4C,GAAkB,IAAAlJ,EAAAsB,KACzB,OAAO,kBAAMtB,EAAKC,MAAMkJ,aAAaD,OAGvC/E,OAAA,WAAU,IAAApE,EACuCuB,KAAKrB,MAA5CmJ,EADArJ,EACAqJ,eAAgBC,EADhBtJ,EACgBsJ,aAAcnK,EAD9Ba,EAC8Bb,KA+DtC,OA9DyBmK,EAsBvB5G,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,iCAAf,EACEJ,OAAAC,EAAA,EAAAD,CAAA,UACEI,UAA8B,QAAnBuG,EAA2B,SAAW,GACjD9C,QAAShF,KAAKgF,QAAQ,aAFxB,EAIE7D,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CACEN,GAAG,2BACHC,eAAe,SAGnBT,OAAAC,EAAA,EAAAD,CAAA,UACEI,UAA8B,YAAnBuG,EAA+B,SAAW,GACrD9C,QAAShF,KAAKgF,QAAQ,WACtBhD,MAAOpE,EAAK8D,cAAc4F,EAASC,gBAHrC,EAKEpG,OAAAC,EAAA,EAAAD,CAACW,EAAA,EAAD,CAAMH,GAAG,KAAKI,YAAU,KAE1BZ,OAAAC,EAAA,EAAAD,CAAA,UACEI,UAA8B,cAAnBuG,EAAiC,SAAW,GACvD9C,QAAShF,KAAKgF,QAAQ,aACtBhD,MAAOpE,EAAK8D,cAAc4F,EAASE,kBAHrC,EAKErG,OAAAC,EAAA,EAAAD,CAACW,EAAA,EAAD,CAAMH,GAAG,OAAOI,YAAU,KAE5BZ,OAAAC,EAAA,EAAAD,CAAA,UACEI,UAA8B,WAAnBuG,EAA8B,SAAW,GACpD9C,QAAShF,KAAKgF,QAAQ,UACtBhD,MAAOpE,EAAK8D,cAAc4F,EAASG,cAHrC,EAKEtG,OAAAC,EAAA,EAAAD,CAACW,EAAA,EAAD,CAAMH,GAAG,UAAUI,YAAU,KAE/BZ,OAAAC,EAAA,EAAAD,CAAA,UACEI,UAA8B,WAAnBuG,EAA8B,SAAW,GACpD9C,QAAShF,KAAKgF,QAAQ,UACtBhD,MAAOpE,EAAK8D,cAAc4F,EAASI,eAHrC,EAKEvG,OAAAC,EAAA,EAAAD,CAACW,EAAA,EAAD,CAAMH,GAAG,YAAYI,YAAU,MAzDnCZ,OAAAC,EAAA,EAAAD,CAAA,OAAKI,UAAU,iCAAf,EACEJ,OAAAC,EAAA,EAAAD,CAAA,UACEI,UAA8B,QAAnBuG,EAA2B,SAAW,GACjD9C,QAAShF,KAAKgF,QAAQ,aAFxB,EAIE7D,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CACEN,GAAG,2BACHC,eAAe,SAGnBT,OAAAC,EAAA,EAAAD,CAAA,UACEI,UAA8B,YAAnBuG,EAA+B,SAAW,GACrD9C,QAAShF,KAAKgF,QAAQ,iBAFxB,EAIE7D,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CACEN,GAAG,gCACHC,eAAe,mBAhCHqD,IAAMC,mBCEfrB,oBAXa,SAAAK,GAAK,MAAK,CACpC4D,eAAgB5D,EAAM7E,MAAM,CAAC,WAAY,gBAAiB,cAAe,WACzE0I,aAAc7D,EAAM7E,MAAM,CAAC,WAAY,gBAAiB,cAAe,eAG9C,SAAC+E,GAAD,MAAe,CACxCyD,aADwC,SAC1BG,GACZ5D,EAAS8C,YAAUc,OAIRnE,CAAiD8D,8ECGhE,IAAMjB,GAAWC,YAAe,CAC9B3E,MAAK,CAAAL,GAAA,uBAAAC,eAAA,mBAGDqG,GAAmBC,YAAe,CACtC,SAAAhE,GAAK,OAAIA,EAAM7E,MAAM,CAAC,WAAY,gBAAiB,cAAe,UAClE,SAAA6E,GAAK,OAAIA,EAAM7E,MAAM,CAAC,WAAY,gBAAiB,cAAe,YAClE,SAAA6E,GAAK,OAAIiE,gBAAcjE,EAAM7E,MAAM,CAAC,WAAY,gBAAiB,UAAU+I,OAAO,SAAAC,GAAI,OAAKA,IAAMC,SACjG,SAAApE,GAAK,OAAIA,EAAM7E,MAAM,CAAC,gBAAiB,YACtC,SAACkJ,EAAeC,EAAaC,EAAeC,GAC7C,OAAKH,GAAiC,QAAhBC,EAMfE,EAAcN,OAAO,SAAAC,GAAI,OAAa,OAATA,GAAiBG,IAAgBH,EAAKvJ,IAAI,UAFrE4J,EAAcC,UAAU,SAAAN,GAAI,OAAa,OAATA,GAAiBI,EAAcG,SAASP,EAAKvJ,IAAI,aAetF+J,GAFUhF,kBARQ,SAAAK,GAAK,MAAK,CAChCqE,cAAerE,EAAM7E,MAAM,CAAC,WAAY,gBAAiB,cAAe,SACxEqJ,cAAeT,GAAiB/D,GAChC4E,UAAW5E,EAAM7E,MAAM,CAAC,gBAAiB,cAAc,GACvD0J,SAAqD,EAA3C7E,EAAM7E,MAAM,CAAC,gBAAiB,WACxC2J,QAAS9E,EAAM7E,MAAM,CAAC,gBAAiB,iBAIxCb,4NA2BiB,SAACyK,GACfvK,EAAKC,MAAMyF,SAAS8E,YAAoB,CAAED,uEAG1BE,IAAS,WACzB,IAAMC,EAAO1K,EAAKC,MAAM+J,cAAcU,OACtC1K,EAAKC,MAAMyF,SAAS8E,YAAoB,CAAED,MAAOG,GAAQA,EAAKtK,IAAI,UACjE,IAAK,CAAEuK,SAAS,iEAECF,IAAS,WAC3BzK,EAAKC,MAAMyF,SAASkF,aAAuB,KAC1C,6DAEYH,IAAS,WACtBzK,EAAKC,MAAMyF,SAASkF,aAAuB,KAC1C,0DAES,WAAM,IAAA7K,EACeC,EAAKC,MAA5B4K,EADQ9K,EACR8K,SAAUnF,EADF3F,EACE2F,SAGhBA,EADEmF,EACOC,YAAaD,GAEbE,YAAU,gBAAiB,4DAI3B,SAACC,GAAQ,IAAA3K,EACWL,EAAKC,MAA5B4K,EADYxK,EACZwK,UACRnF,EAFoBrF,EACFqF,UACTuF,YAAWJ,EAAUG,kEAGZ,WAClBhL,EAAKkL,OAAOC,qEAGC,SAAAC,GACbpL,EAAKkL,OAASE,2DAGD,SAAAnI,GACb,IAAMoI,EAAerL,EAAKC,MAAM+J,cAAcsB,UAAU,SAAA3B,GAAI,OAAa,OAATA,GAAiBA,EAAKvJ,IAAI,QAAU6C,IAAM,EAC1GjD,EAAKuL,aAAaF,8DAGH,SAAApI,GACf,IAAMoI,EAAerL,EAAKC,MAAM+J,cAAcsB,UAAU,SAAA3B,GAAI,OAAa,OAATA,GAAiBA,EAAKvJ,IAAI,QAAU6C,IAAM,EAC1GjD,EAAKuL,aAAaF,mDAtDpBG,qBAAA,WACElK,KAAKmK,gBAAgBC,SACrBpK,KAAKqK,kBAAkBD,SACvBpK,KAAKsK,aAAaF,SAClBpK,KAAKrB,MAAMyF,SAASkF,aAAuB,OAqD7CW,aAAA,SAAcM,GACZ,IAAMC,EAAUxK,KAAK4J,OAAOa,KAAKC,cAAjB,wBAAsDH,EAAQ,GAA9D,gBAEZC,GACFA,EAAQG,WAIZ9H,OAAA,WAAU,IAAA+H,EAAA5K,KAAAR,EACgHQ,KAAKrB,MAArHf,EADA4B,EACA5B,KAAM8K,EADNlJ,EACMkJ,cAAemC,EADrBrL,EACqBqL,mBAAoB/B,EADzCtJ,EACyCsJ,UAAWC,EADpDvJ,EACoDuJ,SAAUQ,EAD9D/J,EAC8D+J,SAAUuB,EADxEtL,EACwEsL,YAAa9B,EADrFxJ,EACqFwJ,QAAST,EAD9F/I,EAC8F+I,cAChGwC,IAAWxB,EACXyB,EAAe7J,OAAAC,EAAA,EAAAD,CAACc,EAAA,EAAD,CAAkBN,GAAG,6BAA6BC,eAAe,0FAElFqJ,EAAoB,KAElBC,EAAqB3C,EACtBpH,OAAAC,EAAA,EAAAD,CAACgK,EAAD,IACD,KAGFF,EADEnC,GAAa9I,KAAKiL,kBACAjL,KAAKiL,kBACK,EAArBvC,EAAc0C,MAAYpC,EACfN,EAAclF,IAAI,SAAC6E,EAAMkC,GAAP,OAA0B,OAATlC,EACrDlH,OAAAC,EAAA,EAAAD,CAACkK,GAAA,EAAD,CAEEC,SAAUxC,EACVG,MAAe,EAARsB,EAAY7B,EAAcrJ,MAAM,CAACkL,EAAQ,EAAG,OAAS,KAC5DvF,QAAS4F,EAAKW,eAHT,OAAS7C,EAAcrJ,MAAM,CAACkL,EAAQ,EAAG,QAMhDpJ,OAAAC,EAAA,EAAAD,CAACqK,EAAD,CAEE5M,aAAcyJ,EACdlE,UAAWkE,EAAKvJ,IAAI,WACpBD,SAAU+L,EAAKjK,aACf3B,WAAY4L,EAAK/J,gBAJZwH,EAAKvJ,IAAI,SAQE,KAGtBkB,KAAKiL,kBAAoBA,EAEzB,IAAMQ,EACJtK,OAAAC,EAAA,EAAAD,CAACuK,GAAA,EAAD,CACEC,UAAS,iBAAmBpC,EAC5BqC,aAAcb,EACdjC,UAAWA,EACX+C,YAAa/C,GAAoC,IAAvBJ,EAAc0C,KACxCpC,QAASA,EACTgC,aAAcA,EACdc,WAAY9L,KAAKmK,gBACjB4B,cAAe/L,KAAKqK,kBACpB2B,SAAUhM,KAAKsK,aACfO,mBAAoBA,QAVtB,EAYGI,GAIL,OACEgB,EAAAC,EAAAC,cAACvC,EAAA,EAAD,CAAQwC,IAAKpM,KAAKqM,aAAc7F,MAAO5I,EAAK8D,cAAcgF,GAAS1E,QACjEb,OAAAC,EAAA,EAAAD,CAACmL,EAAA,EAAD,CACExK,KAAK,OACLyK,OAAQxD,EACR/G,MAAOpE,EAAK8D,cAAcgF,GAAS1E,OACnCwK,MAAOxM,KAAKyM,UACZC,OAAQ1M,KAAK2M,WACb3H,QAAShF,KAAK4M,kBACd7B,OAAQA,EACRD,YAAaA,QARf,EAUE3J,OAAAC,EAAA,EAAAD,CAAC0L,EAAD,KAED3B,EACAO,OAxJmBxG,IAAMC,4CAeV,CACpB0G,aAAa","file":"features/notifications.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport StatusContainer from '../../../containers/status_container';\nimport AccountContainer from '../../../containers/account_container';\nimport { injectIntl, FormattedMessage } from 'react-intl';\nimport Permalink from '../../../components/permalink';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { HotKeys } from 'react-hotkeys';\nimport Icon from 'mastodon/components/icon';\n\nconst notificationForScreenReader = (intl, message, timestamp) => {\n const output = [message];\n\n output.push(intl.formatDate(timestamp, { hour: '2-digit', minute: '2-digit', month: 'short', day: 'numeric' }));\n\n return output.join(', ');\n};\n\nexport default @injectIntl\nclass Notification extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n notification: ImmutablePropTypes.map.isRequired,\n hidden: PropTypes.bool,\n onMoveUp: PropTypes.func.isRequired,\n onMoveDown: PropTypes.func.isRequired,\n onMention: PropTypes.func.isRequired,\n onFavourite: PropTypes.func.isRequired,\n onReblog: PropTypes.func.isRequired,\n onToggleHidden: PropTypes.func.isRequired,\n status: PropTypes.option,\n intl: PropTypes.object.isRequired,\n };\n\n handleMoveUp = () => {\n const { notification, onMoveUp } = this.props;\n onMoveUp(notification.get('id'));\n }\n\n handleMoveDown = () => {\n const { notification, onMoveDown } = this.props;\n onMoveDown(notification.get('id'));\n }\n\n handleOpen = () => {\n const { notification } = this.props;\n\n if (notification.get('status')) {\n this.context.router.history.push(`/statuses/${notification.get('status')}`);\n } else {\n this.handleOpenProfile();\n }\n }\n\n handleOpenProfile = () => {\n const { notification } = this.props;\n this.context.router.history.push(`/accounts/${notification.getIn(['account', 'id'])}`);\n }\n\n handleMention = e => {\n e.preventDefault();\n\n const { notification, onMention } = this.props;\n onMention(notification.get('account'), this.context.router.history);\n }\n\n handleHotkeyFavourite = () => {\n const { status } = this.props;\n if (status) this.props.onFavourite(status);\n }\n\n handleHotkeyBoost = e => {\n const { status } = this.props;\n if (status) this.props.onReblog(status, e);\n }\n\n handleHotkeyToggleHidden = () => {\n const { status } = this.props;\n if (status) this.props.onToggleHidden(status);\n }\n\n getHandlers () {\n return {\n reply: this.handleMention,\n favourite: this.handleHotkeyFavourite,\n boost: this.handleHotkeyBoost,\n mention: this.handleMention,\n open: this.handleOpen,\n openProfile: this.handleOpenProfile,\n moveUp: this.handleMoveUp,\n moveDown: this.handleMoveDown,\n toggleHidden: this.handleHotkeyToggleHidden,\n };\n }\n\n renderFollow (notification, account, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-follow focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow', defaultMessage: '{name} followed you' }, { name: account.get('acct') }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='user-plus' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.follow' defaultMessage='{name} followed you' values={{ name: link }} />\n </span>\n </div>\n\n <AccountContainer id={account.get('id')} withNote={false} hidden={this.props.hidden} />\n </div>\n </HotKeys>\n );\n }\n\n renderMention (notification) {\n return (\n <StatusContainer\n id={notification.get('status')}\n withDismiss\n hidden={this.props.hidden}\n onMoveDown={this.handleMoveDown}\n onMoveUp={this.handleMoveUp}\n contextType='notifications'\n />\n );\n }\n\n renderFavourite (notification, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-favourite focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.favourite', defaultMessage: '{name} favourited your status' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='star' className='star-icon' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.favourite' defaultMessage='{name} favourited your status' values={{ name: link }} />\n </span>\n </div>\n\n <StatusContainer id={notification.get('status')} account={notification.get('account')} muted withDismiss hidden={!!this.props.hidden} />\n </div>\n </HotKeys>\n );\n }\n\n renderReblog (notification, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-reblog focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.reblog', defaultMessage: '{name} boosted your status' }, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='retweet' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.reblog' defaultMessage='{name} boosted your status' values={{ name: link }} />\n </span>\n </div>\n\n <StatusContainer id={notification.get('status')} account={notification.get('account')} muted withDismiss hidden={this.props.hidden} />\n </div>\n </HotKeys>\n );\n }\n\n render () {\n const { notification } = this.props;\n const account = notification.get('account');\n const displayNameHtml = { __html: account.get('display_name_html') };\n const link = <bdi><Permalink className='notification__display-name' href={account.get('url')} title={account.get('acct')} to={`/accounts/${account.get('id')}`} dangerouslySetInnerHTML={displayNameHtml} /></bdi>;\n\n switch(notification.get('type')) {\n case 'follow':\n return this.renderFollow(notification, account, link);\n case 'mention':\n return this.renderMention(notification);\n case 'favourite':\n return this.renderFavourite(notification, link);\n case 'reblog':\n return this.renderReblog(notification, link);\n }\n\n return null;\n }\n\n}\n","import { connect } from 'react-redux';\nimport { makeGetNotification, makeGetStatus } from '../../../selectors';\nimport Notification from '../components/notification';\nimport { openModal } from '../../../actions/modal';\nimport { mentionCompose } from '../../../actions/compose';\nimport {\n reblog,\n favourite,\n unreblog,\n unfavourite,\n} from '../../../actions/interactions';\nimport {\n hideStatus,\n revealStatus,\n} from '../../../actions/statuses';\nimport { boostModal } from '../../../initial_state';\n\nconst makeMapStateToProps = () => {\n const getNotification = makeGetNotification();\n const getStatus = makeGetStatus();\n\n const mapStateToProps = (state, props) => {\n const notification = getNotification(state, props.notification, props.accountId);\n return {\n notification: notification,\n status: notification.get('status') ? getStatus(state, { id: notification.get('status') }) : null,\n };\n };\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = dispatch => ({\n onMention: (account, router) => {\n dispatch(mentionCompose(account, router));\n },\n\n onModalReblog (status) {\n dispatch(reblog(status));\n },\n\n onReblog (status, e) {\n if (status.get('reblogged')) {\n dispatch(unreblog(status));\n } else {\n if (e.shiftKey || !boostModal) {\n this.onModalReblog(status);\n } else {\n dispatch(openModal('BOOST', { status, onReblog: this.onModalReblog }));\n }\n }\n },\n\n onFavourite (status) {\n if (status.get('favourited')) {\n dispatch(unfavourite(status));\n } else {\n dispatch(favourite(status));\n }\n },\n\n onToggleHidden (status) {\n if (status.get('hidden')) {\n dispatch(revealStatus(status.get('id')));\n } else {\n dispatch(hideStatus(status.get('id')));\n }\n },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(Notification);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\n\nexport default class ClearColumnButton extends React.PureComponent {\n\n static propTypes = {\n onClick: PropTypes.func.isRequired,\n };\n\n render () {\n return (\n <button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.props.onClick}><Icon id='eraser' /> <FormattedMessage id='notifications.clear' defaultMessage='Clear notifications' /></button>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { FormattedMessage } from 'react-intl';\nimport ClearColumnButton from './clear_column_button';\nimport SettingToggle from './setting_toggle';\n\nexport default class ColumnSettings extends React.PureComponent {\n\n static propTypes = {\n settings: ImmutablePropTypes.map.isRequired,\n pushSettings: ImmutablePropTypes.map.isRequired,\n onChange: PropTypes.func.isRequired,\n onClear: PropTypes.func.isRequired,\n };\n\n onPushChange = (path, checked) => {\n this.props.onChange(['push', ...path], checked);\n }\n\n render () {\n const { settings, pushSettings, onChange, onClear } = this.props;\n\n const filterShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show' defaultMessage='Show' />;\n const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;\n const alertStr = <FormattedMessage id='notifications.column_settings.alert' defaultMessage='Desktop notifications' />;\n const showStr = <FormattedMessage id='notifications.column_settings.show' defaultMessage='Show in column' />;\n const soundStr = <FormattedMessage id='notifications.column_settings.sound' defaultMessage='Play sound' />;\n\n const showPushSettings = pushSettings.get('browserSupport') && pushSettings.get('isSubscribed');\n const pushStr = showPushSettings && <FormattedMessage id='notifications.column_settings.push' defaultMessage='Push notifications' />;\n\n return (\n <div>\n <div className='column-settings__row'>\n <ClearColumnButton onClick={onClear} />\n </div>\n\n <div role='group' aria-labelledby='notifications-filter-bar'>\n <span id='notifications-filter-bar' className='column-settings__section'>\n <FormattedMessage id='notifications.column_settings.filter_bar.category' defaultMessage='Quick filter bar' />\n </span>\n <div className='column-settings__row'>\n <SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'show']} onChange={onChange} label={filterShowStr} />\n <SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'advanced']} onChange={onChange} label={filterAdvancedStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-follow'>\n <span id='notifications-follow' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow' defaultMessage='New followers:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-favourite'>\n <span id='notifications-favourite' className='column-settings__section'><FormattedMessage id='notifications.column_settings.favourite' defaultMessage='Favourites:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'favourite']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'favourite']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'favourite']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-mention'>\n <span id='notifications-mention' className='column-settings__section'><FormattedMessage id='notifications.column_settings.mention' defaultMessage='Mentions:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'mention']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'mention']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'mention']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-reblog'>\n <span id='notifications-reblog' className='column-settings__section'><FormattedMessage id='notifications.column_settings.reblog' defaultMessage='Boosts:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'reblog']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ColumnSettings from '../components/column_settings';\nimport { changeSetting } from '../../../actions/settings';\nimport { setFilter } from '../../../actions/notifications';\nimport { clearNotifications } from '../../../actions/notifications';\nimport { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';\nimport { openModal } from '../../../actions/modal';\n\nconst messages = defineMessages({\n clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' },\n clearConfirm: { id: 'notifications.clear', defaultMessage: 'Clear notifications' },\n});\n\nconst mapStateToProps = state => ({\n settings: state.getIn(['settings', 'notifications']),\n pushSettings: state.get('push_notifications'),\n});\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n\n onChange (path, checked) {\n if (path[0] === 'push') {\n dispatch(changePushNotifications(path.slice(1), checked));\n } else if (path[0] === 'quickFilter') {\n dispatch(changeSetting(['notifications', ...path], checked));\n dispatch(setFilter('all'));\n } else {\n dispatch(changeSetting(['notifications', ...path], checked));\n }\n },\n\n onClear () {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.clearMessage),\n confirm: intl.formatMessage(messages.clearConfirm),\n onConfirm: () => dispatch(clearNotifications()),\n }));\n },\n\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\n\nconst tooltips = defineMessages({\n mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },\n favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' },\n boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' },\n follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' },\n});\n\nexport default @injectIntl\nclass FilterBar extends React.PureComponent {\n\n static propTypes = {\n selectFilter: PropTypes.func.isRequired,\n selectedFilter: PropTypes.string.isRequired,\n advancedMode: PropTypes.bool.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n onClick (notificationType) {\n return () => this.props.selectFilter(notificationType);\n }\n\n render () {\n const { selectedFilter, advancedMode, intl } = this.props;\n const renderedElement = !advancedMode ? (\n <div className='notification__filter-bar'>\n <button\n className={selectedFilter === 'all' ? 'active' : ''}\n onClick={this.onClick('all')}\n >\n <FormattedMessage\n id='notifications.filter.all'\n defaultMessage='All'\n />\n </button>\n <button\n className={selectedFilter === 'mention' ? 'active' : ''}\n onClick={this.onClick('mention')}\n >\n <FormattedMessage\n id='notifications.filter.mentions'\n defaultMessage='Mentions'\n />\n </button>\n </div>\n ) : (\n <div className='notification__filter-bar'>\n <button\n className={selectedFilter === 'all' ? 'active' : ''}\n onClick={this.onClick('all')}\n >\n <FormattedMessage\n id='notifications.filter.all'\n defaultMessage='All'\n />\n </button>\n <button\n className={selectedFilter === 'mention' ? 'active' : ''}\n onClick={this.onClick('mention')}\n title={intl.formatMessage(tooltips.mentions)}\n >\n <Icon id='at' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'favourite' ? 'active' : ''}\n onClick={this.onClick('favourite')}\n title={intl.formatMessage(tooltips.favourites)}\n >\n <Icon id='star' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'reblog' ? 'active' : ''}\n onClick={this.onClick('reblog')}\n title={intl.formatMessage(tooltips.boosts)}\n >\n <Icon id='retweet' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'follow' ? 'active' : ''}\n onClick={this.onClick('follow')}\n title={intl.formatMessage(tooltips.follows)}\n >\n <Icon id='user-plus' fixedWidth />\n </button>\n </div>\n );\n return renderedElement;\n }\n\n}\n","import { connect } from 'react-redux';\nimport FilterBar from '../components/filter_bar';\nimport { setFilter } from '../../../actions/notifications';\n\nconst makeMapStateToProps = state => ({\n selectedFilter: state.getIn(['settings', 'notifications', 'quickFilter', 'active']),\n advancedMode: state.getIn(['settings', 'notifications', 'quickFilter', 'advanced']),\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n selectFilter (newActiveFilter) {\n dispatch(setFilter(newActiveFilter));\n },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(FilterBar);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { expandNotifications, scrollTopNotifications } from '../../actions/notifications';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport NotificationContainer from './containers/notification_container';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport FilterBarContainer from './containers/filter_bar_container';\nimport { createSelector } from 'reselect';\nimport { List as ImmutableList } from 'immutable';\nimport { debounce } from 'lodash';\nimport ScrollableList from '../../components/scrollable_list';\nimport LoadGap from '../../components/load_gap';\n\nconst messages = defineMessages({\n title: { id: 'column.notifications', defaultMessage: 'Notifications' },\n});\n\nconst getNotifications = createSelector([\n state => state.getIn(['settings', 'notifications', 'quickFilter', 'show']),\n state => state.getIn(['settings', 'notifications', 'quickFilter', 'active']),\n state => ImmutableList(state.getIn(['settings', 'notifications', 'shows']).filter(item => !item).keys()),\n state => state.getIn(['notifications', 'items']),\n], (showFilterBar, allowedType, excludedTypes, notifications) => {\n if (!showFilterBar || allowedType === 'all') {\n // used if user changed the notification settings after loading the notifications from the server\n // otherwise a list of notifications will come pre-filtered from the backend\n // we need to turn it off for FilterBar in order not to block ourselves from seeing a specific category\n return notifications.filterNot(item => item !== null && excludedTypes.includes(item.get('type')));\n }\n return notifications.filter(item => item !== null && allowedType === item.get('type'));\n});\n\nconst mapStateToProps = state => ({\n showFilterBar: state.getIn(['settings', 'notifications', 'quickFilter', 'show']),\n notifications: getNotifications(state),\n isLoading: state.getIn(['notifications', 'isLoading'], true),\n isUnread: state.getIn(['notifications', 'unread']) > 0,\n hasMore: state.getIn(['notifications', 'hasMore']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Notifications extends React.PureComponent {\n\n static propTypes = {\n columnId: PropTypes.string,\n notifications: ImmutablePropTypes.list.isRequired,\n showFilterBar: PropTypes.bool.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n intl: PropTypes.object.isRequired,\n isLoading: PropTypes.bool,\n isUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n hasMore: PropTypes.bool,\n };\n\n static defaultProps = {\n trackScroll: true,\n };\n\n componentWillUnmount () {\n this.handleLoadOlder.cancel();\n this.handleScrollToTop.cancel();\n this.handleScroll.cancel();\n this.props.dispatch(scrollTopNotifications(false));\n }\n\n handleLoadGap = (maxId) => {\n this.props.dispatch(expandNotifications({ maxId }));\n };\n\n handleLoadOlder = debounce(() => {\n const last = this.props.notifications.last();\n this.props.dispatch(expandNotifications({ maxId: last && last.get('id') }));\n }, 300, { leading: true });\n\n handleScrollToTop = debounce(() => {\n this.props.dispatch(scrollTopNotifications(true));\n }, 100);\n\n handleScroll = debounce(() => {\n this.props.dispatch(scrollTopNotifications(false));\n }, 100);\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('NOTIFICATIONS', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setColumnRef = c => {\n this.column = c;\n }\n\n handleMoveUp = id => {\n const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) - 1;\n this._selectChild(elementIndex);\n }\n\n handleMoveDown = id => {\n const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) + 1;\n this._selectChild(elementIndex);\n }\n\n _selectChild (index) {\n const element = this.column.node.querySelector(`article:nth-of-type(${index + 1}) .focusable`);\n\n if (element) {\n element.focus();\n }\n }\n\n render () {\n const { intl, notifications, shouldUpdateScroll, isLoading, isUnread, columnId, multiColumn, hasMore, showFilterBar } = this.props;\n const pinned = !!columnId;\n const emptyMessage = <FormattedMessage id='empty_column.notifications' defaultMessage=\"You don't have any notifications yet. Interact with others to start the conversation.\" />;\n\n let scrollableContent = null;\n\n const filterBarContainer = showFilterBar\n ? (<FilterBarContainer />)\n : null;\n\n if (isLoading && this.scrollableContent) {\n scrollableContent = this.scrollableContent;\n } else if (notifications.size > 0 || hasMore) {\n scrollableContent = notifications.map((item, index) => item === null ? (\n <LoadGap\n key={'gap:' + notifications.getIn([index + 1, 'id'])}\n disabled={isLoading}\n maxId={index > 0 ? notifications.getIn([index - 1, 'id']) : null}\n onClick={this.handleLoadGap}\n />\n ) : (\n <NotificationContainer\n key={item.get('id')}\n notification={item}\n accountId={item.get('account')}\n onMoveUp={this.handleMoveUp}\n onMoveDown={this.handleMoveDown}\n />\n ));\n } else {\n scrollableContent = null;\n }\n\n this.scrollableContent = scrollableContent;\n\n const scrollContainer = (\n <ScrollableList\n scrollKey={`notifications-${columnId}`}\n trackScroll={!pinned}\n isLoading={isLoading}\n showLoading={isLoading && notifications.size === 0}\n hasMore={hasMore}\n emptyMessage={emptyMessage}\n onLoadMore={this.handleLoadOlder}\n onScrollToTop={this.handleScrollToTop}\n onScroll={this.handleScroll}\n shouldUpdateScroll={shouldUpdateScroll}\n >\n {scrollableContent}\n </ScrollableList>\n );\n\n return (\n <Column ref={this.setColumnRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='bell'\n active={isUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n >\n <ColumnSettingsContainer />\n </ColumnHeader>\n {filterBarContainer}\n {scrollContainer}\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} |