{"version":3,"sources":["webpack:///./app/javascript/hooks/useSearchParam.ts","webpack:///./app/javascript/mastodon/features/directory/components/account_card.tsx","webpack:///./app/javascript/mastodon/features/directory/index.tsx"],"names":["useSearchParam","name","defaultValue","_searchParams$get","searchParams","search","useLocation","useMemo","URLSearchParams","useSearchParams","history","useHistory","value","get","setValue","useCallback","delete","set","push","toString","messages","defineMessages","unfollow","id","defaultMessage","follow","cancel_follow_request","requested","unblock","unmute","edit_profile","getAccount","makeGetAccount","AccountCard","_ref","accountId","intl","useIntl","account","useAppSelector","s","dispatch","useAppDispatch","handleMouseEnter","_ref2","currentTarget","autoPlayGif","querySelectorAll","forEach","emoji","original","getAttribute","src","handleMouseLeave","_ref3","staticUrl","handleFollow","getIn","openModal","modalType","modalProps","followAccount","handleBlock","_account$relationship","relationship","blocking","unblockAccount","handleMute","_account$relationship2","muting","unmuteAccount","handleEditProfile","window","open","actionBtn","me","_jsx","Button","text","formatMessage","title","onClick","_account$relationship3","disabled","blocked_by","className","classNames","Link","to","alt","Avatar","size","DisplayName","length","onMouseEnter","onMouseLeave","dangerouslySetInnerHTML","__html","ShortNumber","FormattedMessage","recentlyActive","newArrivals","local","federated","Directory","_localParamBool","columnId","multiColumn","params","column","useRef","orderParam","setOrderParam","localParam","setLocalParam","localParamBool","order","handlePin","removeColumn","addColumn","domain","meta","accountIds","state","user_lists","ImmutableList","isLoading","useEffect","fetchDirectory","handleMove","dir","moveColumn","handleHeaderClick","_column$current","current","scrollTop","handleChangeOrder","e","changeColumnParams","target","handleChangeLocal","handleLoadMore","expandDirectory","pinned","scrollableArea","role","RadioButton","label","checked","onChange","LoadingIndicator","map","LoadMore","visible","_jsxs","Column","bindToDocument","ref","children","ColumnHeader","icon","iconComponent","PeopleIcon","onPin","onMove","ScrollContainer","scrollKey","Helmet","content"],"mappings":"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","file":"js/features/directory-4d78ce2749a4a63d7b65.chunk.js","sourcesContent":["import { useMemo, useCallback } from 'react';\n\nimport { useLocation, useHistory } from 'react-router';\n\nexport function useSearchParams() {\n  const { search } = useLocation();\n\n  return useMemo(() => new URLSearchParams(search), [search]);\n}\n\nexport function useSearchParam(name: string, defaultValue?: string) {\n  const searchParams = useSearchParams();\n  const history = useHistory();\n\n  const value = searchParams.get(name) ?? defaultValue;\n\n  const setValue = useCallback(\n    (value: string | null) => {\n      if (value === null) {\n        searchParams.delete(name);\n      } else {\n        searchParams.set(name, value);\n      }\n\n      history.push({ search: searchParams.toString() });\n    },\n    [history, name, searchParams],\n  );\n\n  return [value, setValue] as const;\n}\n","import type { MouseEventHandler } from 'react';\nimport { useCallback } from 'react';\n\nimport { FormattedMessage, defineMessages, useIntl } from 'react-intl';\n\nimport classNames from 'classnames';\nimport { Link } from 'react-router-dom';\n\nimport {\n  followAccount,\n  unblockAccount,\n  unmuteAccount,\n} from 'mastodon/actions/accounts';\nimport { openModal } from 'mastodon/actions/modal';\nimport { Avatar } from 'mastodon/components/avatar';\nimport { Button } from 'mastodon/components/button';\nimport { DisplayName } from 'mastodon/components/display_name';\nimport { ShortNumber } from 'mastodon/components/short_number';\nimport { autoPlayGif, me } from 'mastodon/initial_state';\nimport type { Account } from 'mastodon/models/account';\nimport { makeGetAccount } from 'mastodon/selectors';\nimport { useAppDispatch, useAppSelector } from 'mastodon/store';\n\nconst messages = defineMessages({\n  unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },\n  follow: { id: 'account.follow', defaultMessage: 'Follow' },\n  cancel_follow_request: {\n    id: 'account.cancel_follow_request',\n    defaultMessage: 'Withdraw follow request',\n  },\n  requested: {\n    id: 'account.requested',\n    defaultMessage: 'Awaiting approval. Click to cancel follow request',\n  },\n  unblock: { id: 'account.unblock_short', defaultMessage: 'Unblock' },\n  unmute: { id: 'account.unmute_short', defaultMessage: 'Unmute' },\n  edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },\n});\n\nconst getAccount = makeGetAccount();\n\nexport const AccountCard: React.FC<{ accountId: string }> = ({ accountId }) => {\n  const intl = useIntl();\n  const account = useAppSelector((s) => getAccount(s, accountId));\n  const dispatch = useAppDispatch();\n\n  const handleMouseEnter = useCallback<MouseEventHandler>(\n    ({ currentTarget }) => {\n      if (autoPlayGif) {\n        return;\n      }\n      const emojis =\n        currentTarget.querySelectorAll<HTMLImageElement>('.custom-emoji');\n\n      emojis.forEach((emoji) => {\n        const original = emoji.getAttribute('data-original');\n        if (original) emoji.src = original;\n      });\n    },\n    [],\n  );\n\n  const handleMouseLeave = useCallback<MouseEventHandler>(\n    ({ currentTarget }) => {\n      if (autoPlayGif) {\n        return;\n      }\n\n      const emojis =\n        currentTarget.querySelectorAll<HTMLImageElement>('.custom-emoji');\n\n      emojis.forEach((emoji) => {\n        const staticUrl = emoji.getAttribute('data-static');\n        if (staticUrl) emoji.src = staticUrl;\n      });\n    },\n    [],\n  );\n\n  const handleFollow = useCallback(() => {\n    if (!account) return;\n\n    if (\n      account.getIn(['relationship', 'following']) ||\n      account.getIn(['relationship', 'requested'])\n    ) {\n      dispatch(\n        openModal({ modalType: 'CONFIRM_UNFOLLOW', modalProps: { account } }),\n      );\n    } else {\n      dispatch(followAccount(account.get('id')));\n    }\n  }, [account, dispatch]);\n\n  const handleBlock = useCallback(() => {\n    if (account?.relationship?.blocking) {\n      dispatch(unblockAccount(account.get('id')));\n    }\n  }, [account, dispatch]);\n\n  const handleMute = useCallback(() => {\n    if (account?.relationship?.muting) {\n      dispatch(unmuteAccount(account.get('id')));\n    }\n  }, [account, dispatch]);\n\n  const handleEditProfile = useCallback(() => {\n    window.open('/settings/profile', '_blank');\n  }, []);\n\n  if (!account) return null;\n\n  let actionBtn;\n\n  if (me !== account.get('id')) {\n    if (!account.get('relationship')) {\n      // Wait until the relationship is loaded\n      actionBtn = '';\n    } else if (account.getIn(['relationship', 'requested'])) {\n      actionBtn = (\n        <Button\n          text={intl.formatMessage(messages.cancel_follow_request)}\n          title={intl.formatMessage(messages.requested)}\n          onClick={handleFollow}\n        />\n      );\n    } else if (account.getIn(['relationship', 'muting'])) {\n      actionBtn = (\n        <Button\n          text={intl.formatMessage(messages.unmute)}\n          onClick={handleMute}\n        />\n      );\n    } else if (!account.getIn(['relationship', 'blocking'])) {\n      actionBtn = (\n        <Button\n          disabled={account.relationship?.blocked_by}\n          className={classNames({\n            'button--destructive': account.getIn(['relationship', 'following']),\n          })}\n          text={intl.formatMessage(\n            account.getIn(['relationship', 'following'])\n              ? messages.unfollow\n              : messages.follow,\n          )}\n          onClick={handleFollow}\n        />\n      );\n    } else if (account.getIn(['relationship', 'blocking'])) {\n      actionBtn = (\n        <Button\n          text={intl.formatMessage(messages.unblock)}\n          onClick={handleBlock}\n        />\n      );\n    }\n  } else {\n    actionBtn = (\n      <Button\n        text={intl.formatMessage(messages.edit_profile)}\n        onClick={handleEditProfile}\n      />\n    );\n  }\n\n  return (\n    <div className='account-card'>\n      <Link to={`/@${account.get('acct')}`} className='account-card__permalink'>\n        <div className='account-card__header'>\n          <img\n            src={\n              autoPlayGif ? account.get('header') : account.get('header_static')\n            }\n            alt=''\n          />\n        </div>\n\n        <div className='account-card__title'>\n          <div className='account-card__title__avatar'>\n            <Avatar account={account as Account} size={56} />\n          </div>\n          <DisplayName account={account as Account} />\n        </div>\n      </Link>\n\n      {account.get('note').length > 0 && (\n        <div\n          className='account-card__bio translate'\n          onMouseEnter={handleMouseEnter}\n          onMouseLeave={handleMouseLeave}\n          dangerouslySetInnerHTML={{ __html: account.get('note_emojified') }}\n        />\n      )}\n\n      <div className='account-card__actions'>\n        <div className='account-card__counters'>\n          <div className='account-card__counters__item'>\n            <ShortNumber value={account.get('statuses_count')} />\n            <small>\n              <FormattedMessage id='account.posts' defaultMessage='Posts' />\n            </small>\n          </div>\n\n          <div className='account-card__counters__item'>\n            <ShortNumber value={account.get('followers_count')} />{' '}\n            <small>\n              <FormattedMessage\n                id='account.followers'\n                defaultMessage='Followers'\n              />\n            </small>\n          </div>\n\n          <div className='account-card__counters__item'>\n            <ShortNumber value={account.get('following_count')} />{' '}\n            <small>\n              <FormattedMessage\n                id='account.following'\n                defaultMessage='Following'\n              />\n            </small>\n          </div>\n        </div>\n\n        <div className='account-card__actions__button'>{actionBtn}</div>\n      </div>\n    </div>\n  );\n};\n","import type { ChangeEventHandler } from 'react';\nimport { useCallback, useEffect, useRef } from 'react';\n\nimport { defineMessages, useIntl } from 'react-intl';\n\nimport { Helmet } from 'react-helmet';\n\nimport { List as ImmutableList } from 'immutable';\n\nimport PeopleIcon from '@/material-icons/400-24px/group.svg?react';\nimport {\n  addColumn,\n  removeColumn,\n  moveColumn,\n  changeColumnParams,\n} from 'mastodon/actions/columns';\nimport { fetchDirectory, expandDirectory } from 'mastodon/actions/directory';\nimport Column from 'mastodon/components/column';\nimport { ColumnHeader } from 'mastodon/components/column_header';\nimport { LoadMore } from 'mastodon/components/load_more';\nimport { LoadingIndicator } from 'mastodon/components/loading_indicator';\nimport { RadioButton } from 'mastodon/components/radio_button';\nimport ScrollContainer from 'mastodon/containers/scroll_container';\nimport { useAppDispatch, useAppSelector } from 'mastodon/store';\n\nimport { useSearchParam } from '../../../hooks/useSearchParam';\n\nimport { AccountCard } from './components/account_card';\n\nconst messages = defineMessages({\n  title: { id: 'column.directory', defaultMessage: 'Browse profiles' },\n  recentlyActive: {\n    id: 'directory.recently_active',\n    defaultMessage: 'Recently active',\n  },\n  newArrivals: { id: 'directory.new_arrivals', defaultMessage: 'New arrivals' },\n  local: { id: 'directory.local', defaultMessage: 'From {domain} only' },\n  federated: {\n    id: 'directory.federated',\n    defaultMessage: 'From known fediverse',\n  },\n});\n\nexport const Directory: React.FC<{\n  columnId?: string;\n  multiColumn?: boolean;\n  params?: { order: string; local?: boolean };\n}> = ({ columnId, multiColumn, params }) => {\n  const intl = useIntl();\n  const dispatch = useAppDispatch();\n\n  const column = useRef<Column>(null);\n\n  const [orderParam, setOrderParam] = useSearchParam('order');\n  const [localParam, setLocalParam] = useSearchParam('local');\n\n  let localParamBool: boolean | undefined;\n\n  if (localParam === 'false') {\n    localParamBool = false;\n  }\n\n  const order = orderParam ?? params?.order ?? 'active';\n  const local = localParamBool ?? params?.local ?? true;\n\n  const handlePin = useCallback(() => {\n    if (columnId) {\n      dispatch(removeColumn(columnId));\n    } else {\n      dispatch(addColumn('DIRECTORY', { order, local }));\n    }\n  }, [dispatch, columnId, order, local]);\n\n  const domain = useAppSelector((s) => s.meta.get('domain') as string);\n  const accountIds = useAppSelector(\n    (state) =>\n      state.user_lists.getIn(\n        ['directory', 'items'],\n        ImmutableList(),\n      ) as ImmutableList<string>,\n  );\n  const isLoading = useAppSelector(\n    (state) =>\n      state.user_lists.getIn(['directory', 'isLoading'], true) as boolean,\n  );\n\n  useEffect(() => {\n    void dispatch(fetchDirectory({ order, local }));\n  }, [dispatch, order, local]);\n\n  const handleMove = useCallback(\n    (dir: number) => {\n      dispatch(moveColumn(columnId, dir));\n    },\n    [dispatch, columnId],\n  );\n\n  const handleHeaderClick = useCallback(() => {\n    column.current?.scrollTop();\n  }, []);\n\n  const handleChangeOrder = useCallback<ChangeEventHandler<HTMLInputElement>>(\n    (e) => {\n      if (columnId) {\n        dispatch(changeColumnParams(columnId, ['order'], e.target.value));\n      } else {\n        setOrderParam(e.target.value);\n      }\n    },\n    [dispatch, columnId, setOrderParam],\n  );\n\n  const handleChangeLocal = useCallback<ChangeEventHandler<HTMLInputElement>>(\n    (e) => {\n      if (columnId) {\n        dispatch(\n          changeColumnParams(columnId, ['local'], e.target.value === '1'),\n        );\n      } else if (e.target.value === '1') {\n        setLocalParam('true');\n      } else {\n        setLocalParam('false');\n      }\n    },\n    [dispatch, columnId, setLocalParam],\n  );\n\n  const handleLoadMore = useCallback(() => {\n    void dispatch(expandDirectory({ order, local }));\n  }, [dispatch, order, local]);\n\n  const pinned = !!columnId;\n\n  const scrollableArea = (\n    <div className='scrollable'>\n      <div className='filter-form'>\n        <div className='filter-form__column' role='group'>\n          <RadioButton\n            name='order'\n            value='active'\n            label={intl.formatMessage(messages.recentlyActive)}\n            checked={order === 'active'}\n            onChange={handleChangeOrder}\n          />\n          <RadioButton\n            name='order'\n            value='new'\n            label={intl.formatMessage(messages.newArrivals)}\n            checked={order === 'new'}\n            onChange={handleChangeOrder}\n          />\n        </div>\n\n        <div className='filter-form__column' role='group'>\n          <RadioButton\n            name='local'\n            value='1'\n            label={intl.formatMessage(messages.local, { domain })}\n            checked={local}\n            onChange={handleChangeLocal}\n          />\n          <RadioButton\n            name='local'\n            value='0'\n            label={intl.formatMessage(messages.federated)}\n            checked={!local}\n            onChange={handleChangeLocal}\n          />\n        </div>\n      </div>\n\n      <div className='directory__list'>\n        {isLoading ? (\n          <LoadingIndicator />\n        ) : (\n          accountIds.map((accountId) => (\n            <AccountCard accountId={accountId} key={accountId} />\n          ))\n        )}\n      </div>\n\n      <LoadMore onClick={handleLoadMore} visible={!isLoading} />\n    </div>\n  );\n\n  return (\n    <Column\n      bindToDocument={!multiColumn}\n      ref={column}\n      label={intl.formatMessage(messages.title)}\n    >\n      <ColumnHeader\n        icon='address-book-o'\n        iconComponent={PeopleIcon}\n        title={intl.formatMessage(messages.title)}\n        onPin={handlePin}\n        onMove={handleMove}\n        onClick={handleHeaderClick}\n        pinned={pinned}\n        multiColumn={multiColumn}\n      />\n\n      {multiColumn && !pinned ? (\n        // @ts-expect-error ScrollContainer is not properly typed yet\n        <ScrollContainer scrollKey='directory'>\n          {scrollableArea}\n        </ScrollContainer>\n      ) : (\n        scrollableArea\n      )}\n\n      <Helmet>\n        <title>{intl.formatMessage(messages.title)}</title>\n        <meta name='robots' content='noindex' />\n      </Helmet>\n    </Column>\n  );\n};\n\n// eslint-disable-next-line import/no-default-export -- Needed because this is called as an async components\nexport default Directory;\n"],"sourceRoot":""}