{"version":3,"sources":["webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/firehose/index.jsx"],"names":["messages","defineMessages","title","id","defaultMessage","filter_regex","ColumnSettings","intl","useIntl","dispatch","useAppDispatch","settings","useAppSelector","state","getIn","onChange","useCallback","key","checked","changeSetting","_jsx","className","SettingToggle","settingPath","label","FormattedMessage","SettingText","formatMessage","Firehose","_ref","feedType","multiColumn","signedIn","useIdentity","columnRef","useRef","allowLocalOnly","regex","onlyMedia","hasUnread","handlePin","addColumn","other","body","onlyRemote","handleLoadMore","maxId","expandCommunityTimeline","expandPublicTimeline","handleHeaderClick","_columnRef$current","current","scrollTop","useEffect","disconnect","connectCommunityStream","connectPublicStream","_disconnect","prependBanner","DismissableBanner","values","domain","emptyMessage","_jsxs","Column","bindToDocument","ref","children","ColumnHeader","icon","iconComponent","PublicIcon","active","onPin","onClick","NavLink","exact","to","tagName","StatusListContainer","prepend","timelineId","onLoadMore","trackScroll","scrollKey","Helmet","name","content"],"mappings":"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","file":"js/flavours/glitch/async/firehose-45ac08a30f986d54b5e5.chunk.js","sourcesContent":["import PropTypes from 'prop-types';\nimport { useRef, useCallback, useEffect } from 'react';\n\nimport { useIntl, defineMessages, FormattedMessage } from 'react-intl';\n\nimport { Helmet } from 'react-helmet';\nimport { NavLink } from 'react-router-dom';\n\nimport { useIdentity } from '@/flavours/glitch/identity_context';\nimport PublicIcon from '@/material-icons/400-24px/public.svg?react';\nimport { addColumn } from 'flavours/glitch/actions/columns';\nimport { changeSetting } from 'flavours/glitch/actions/settings';\nimport { connectPublicStream, connectCommunityStream } from 'flavours/glitch/actions/streaming';\nimport { expandPublicTimeline, expandCommunityTimeline } from 'flavours/glitch/actions/timelines';\nimport { DismissableBanner } from 'flavours/glitch/components/dismissable_banner';\nimport SettingText from 'flavours/glitch/components/setting_text';\nimport { domain } from 'flavours/glitch/initial_state';\nimport { useAppDispatch, useAppSelector } from 'flavours/glitch/store';\n\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport SettingToggle from '../notifications/components/setting_toggle';\nimport StatusListContainer from '../ui/containers/status_list_container';\n\nconst messages = defineMessages({\n  title: { id: 'column.firehose', defaultMessage: 'Live feeds' },\n  filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' },\n});\n\nconst ColumnSettings = () => {\n  const intl = useIntl();\n  const dispatch = useAppDispatch();\n  const settings = useAppSelector((state) => state.getIn(['settings', 'firehose']));\n  const onChange = useCallback(\n    (key, checked) => dispatch(changeSetting(['firehose', ...key], checked)),\n    [dispatch],\n  );\n\n  return (\n    <div className='column-settings'>\n      <section>\n        <div className='column-settings__row'>\n          <SettingToggle\n            settings={settings}\n            settingPath={['onlyMedia']}\n            onChange={onChange}\n            label={<FormattedMessage id='community.column_settings.media_only' defaultMessage='Media only' />}\n          />\n\n          <SettingToggle\n            settings={settings}\n            settingPath={['allowLocalOnly']}\n            onChange={onChange}\n            label={<FormattedMessage id='firehose.column_settings.allow_local_only' defaultMessage='Show local-only posts in \"All\"' />}\n          />\n        </div>\n      </section>\n\n      <section>\n        <h3><FormattedMessage id='home.column_settings.advanced' defaultMessage='Advanced' /></h3>\n\n        <div className='column-settings__row'>\n          <SettingText\n            settings={settings}\n            settingPath={['regex', 'body']}\n            onChange={onChange}\n            label={intl.formatMessage(messages.filter_regex)}\n          />\n        </div>\n      </section>\n    </div>\n  );\n};\n\nconst Firehose = ({ feedType, multiColumn }) => {\n  const dispatch = useAppDispatch();\n  const intl = useIntl();\n  const { signedIn } = useIdentity();\n  const columnRef = useRef(null);\n\n  const allowLocalOnly = useAppSelector((state) => state.getIn(['settings', 'firehose', 'allowLocalOnly']));\n  const regex = useAppSelector((state) => state.getIn(['settings', 'firehose', 'regex', 'body']));\n\n  const onlyMedia = useAppSelector((state) => state.getIn(['settings', 'firehose', 'onlyMedia'], false));\n  const hasUnread = useAppSelector((state) => state.getIn(['timelines', `${feedType}${feedType === 'public' && allowLocalOnly ? ':allow_local_only' : ''}${onlyMedia ? ':media' : ''}`, 'unread'], 0) > 0);\n\n  const handlePin = useCallback(\n    () => {\n      switch(feedType) {\n      case 'community':\n        dispatch(addColumn('COMMUNITY', { other: { onlyMedia }, regex: { body: regex } }));\n        break;\n      case 'public':\n        dispatch(addColumn('PUBLIC', { other: { onlyMedia, allowLocalOnly }, regex: { body: regex }  }));\n        break;\n      case 'public:remote':\n        dispatch(addColumn('REMOTE', { other: { onlyMedia, onlyRemote: true }, regex: { body: regex }  }));\n        break;\n      }\n    },\n    [dispatch, onlyMedia, feedType, allowLocalOnly, regex],\n  );\n\n  const handleLoadMore = useCallback(\n    (maxId) => {\n      switch(feedType) {\n      case 'community':\n        dispatch(expandCommunityTimeline({ maxId, onlyMedia }));\n        break;\n      case 'public':\n        dispatch(expandPublicTimeline({ maxId, onlyMedia, allowLocalOnly }));\n        break;\n      case 'public:remote':\n        dispatch(expandPublicTimeline({ maxId, onlyMedia, onlyRemote: true }));\n        break;\n      }\n    },\n    [dispatch, onlyMedia, allowLocalOnly, feedType],\n  );\n\n  const handleHeaderClick = useCallback(() => columnRef.current?.scrollTop(), []);\n\n  useEffect(() => {\n    let disconnect;\n\n    switch(feedType) {\n    case 'community':\n      dispatch(expandCommunityTimeline({ onlyMedia }));\n      if (signedIn) {\n        disconnect = dispatch(connectCommunityStream({ onlyMedia }));\n      }\n      break;\n    case 'public':\n      dispatch(expandPublicTimeline({ onlyMedia, allowLocalOnly }));\n      if (signedIn) {\n        disconnect = dispatch(connectPublicStream({ onlyMedia, allowLocalOnly }));\n      }\n      break;\n    case 'public:remote':\n      dispatch(expandPublicTimeline({ onlyMedia, onlyRemote: true }));\n      if (signedIn) {\n        disconnect = dispatch(connectPublicStream({ onlyMedia, onlyRemote: true }));\n      }\n      break;\n    }\n\n    return () => disconnect?.();\n  }, [dispatch, signedIn, feedType, onlyMedia, allowLocalOnly]);\n\n  const prependBanner = feedType === 'community' ? (\n    <DismissableBanner id='community_timeline'>\n      <FormattedMessage\n        id='dismissable_banner.community_timeline'\n        defaultMessage='These are the most recent public posts from people whose accounts are hosted by {domain}.'\n        values={{ domain }}\n      />\n    </DismissableBanner>\n  ) : (\n    <DismissableBanner id='public_timeline'>\n      <FormattedMessage\n        id='dismissable_banner.public_timeline'\n        defaultMessage='These are the most recent public posts from people on the social web that people on {domain} follow.'\n        values={{ domain }}\n      />\n    </DismissableBanner>\n  );\n\n  const emptyMessage = feedType === 'community' ? (\n    <FormattedMessage\n      id='empty_column.community'\n      defaultMessage='The local timeline is empty. Write something publicly to get the ball rolling!'\n    />\n  ) : (\n    <FormattedMessage\n      id='empty_column.public'\n      defaultMessage='There is nothing here! Write something publicly, or manually follow users from other servers to fill it up'\n    />\n  );\n\n  return (\n    <Column bindToDocument={!multiColumn} ref={columnRef} label={intl.formatMessage(messages.title)}>\n      <ColumnHeader\n        icon='globe'\n        iconComponent={PublicIcon}\n        active={hasUnread}\n        title={intl.formatMessage(messages.title)}\n        onPin={handlePin}\n        onClick={handleHeaderClick}\n        multiColumn={multiColumn}\n      >\n        <ColumnSettings />\n      </ColumnHeader>\n\n      <div className='account__section-headline'>\n        <NavLink exact to='/public/local'>\n          <FormattedMessage tagName='div' id='firehose.local' defaultMessage='This server' />\n        </NavLink>\n\n        <NavLink exact to='/public/remote'>\n          <FormattedMessage tagName='div' id='firehose.remote' defaultMessage='Other servers' />\n        </NavLink>\n\n        <NavLink exact to='/public'>\n          <FormattedMessage tagName='div' id='firehose.all' defaultMessage='All' />\n        </NavLink>\n      </div>\n\n      <StatusListContainer\n        prepend={prependBanner}\n        timelineId={`${feedType}${feedType === 'public' && allowLocalOnly ? ':allow_local_only' : ''}${onlyMedia ? ':media' : ''}`}\n        onLoadMore={handleLoadMore}\n        trackScroll\n        scrollKey='firehose'\n        emptyMessage={emptyMessage}\n        bindToDocument={!multiColumn}\n        regex={regex}\n      />\n\n      <Helmet>\n        <title>{intl.formatMessage(messages.title)}</title>\n        <meta name='robots' content='noindex' />\n      </Helmet>\n    </Column>\n  );\n};\n\nFirehose.propTypes = {\n  multiColumn: PropTypes.bool,\n  feedType: PropTypes.string,\n};\n\nexport default Firehose;\n"],"sourceRoot":""}