{"version":3,"sources":["webpack:///app/javascript/home/mastodon/live/app/javascript/flavours/glitch/features/directory/components/account_card.tsx","webpack:///app/javascript/home/mastodon/live/app/javascript/flavours/glitch/features/directory/index.tsx"],"names":["messages","defineMessages","unfollow","id","defaultMessage","follow","cancel_follow_request","cancelFollowRequestConfirm","requested","unblock","unmute","unfollowConfirm","edit_profile","getAccount","makeGetAccount","AccountCard","_ref","accountId","intl","useIntl","account","useAppSelector","s","dispatch","useAppDispatch","handleMouseEnter","useCallback","_ref2","currentTarget","autoPlayGif","querySelectorAll","forEach","emoji","original","getAttribute","src","handleMouseLeave","_ref3","staticUrl","handleFollow","getIn","openModal","modalType","modalProps","message","_jsx","FormattedMessage","values","name","get","confirm","formatMessage","onConfirm","unfollowAccount","followAccount","handleBlock","_account$relationship","relationship","blocking","unblockAccount","handleMute","_account$relationship2","muting","unmuteAccount","handleEditProfile","window","open","actionBtn","me","Button","text","title","onClick","_account$relationship3","disabled","blocked_by","className","classNames","Permalink","href","to","concat","alt","Avatar","size","DisplayName","length","onMouseEnter","onMouseLeave","dangerouslySetInnerHTML","__html","ShortNumber","value","recentlyActive","newArrivals","local","federated","Directory","_state$order","_state$local","columnId","multiColumn","params","state","setState","useState","order","column","useRef","handlePin","removeColumn","addColumn","domain","meta","accountIds","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/glitch/async/directory-4156e5e60375d43b1107.chunk.js","sourcesContent":["import type { MouseEventHandler } from 'react';\nimport { useCallback } from 'react';\n\nimport { FormattedMessage, defineMessages, useIntl } from 'react-intl';\n\nimport classNames from 'classnames';\n\nimport {\n  followAccount,\n  unfollowAccount,\n  unblockAccount,\n  unmuteAccount,\n} from 'flavours/glitch/actions/accounts';\nimport { openModal } from 'flavours/glitch/actions/modal';\nimport { Avatar } from 'flavours/glitch/components/avatar';\nimport { Button } from 'flavours/glitch/components/button';\nimport { DisplayName } from 'flavours/glitch/components/display_name';\nimport { Permalink } from 'flavours/glitch/components/permalink';\nimport { ShortNumber } from 'flavours/glitch/components/short_number';\nimport { autoPlayGif, me } from 'flavours/glitch/initial_state';\nimport type { Account } from 'flavours/glitch/models/account';\nimport { makeGetAccount } from 'flavours/glitch/selectors';\nimport { useAppDispatch, useAppSelector } from 'flavours/glitch/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  cancelFollowRequestConfirm: {\n    id: 'confirmations.cancel_follow_request.confirm',\n    defaultMessage: 'Withdraw 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  unfollowConfirm: {\n    id: 'confirmations.unfollow.confirm',\n    defaultMessage: 'Unfollow',\n  },\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 (account.getIn(['relationship', 'following'])) {\n      dispatch(\n        openModal({\n          modalType: 'CONFIRM',\n          modalProps: {\n            message: (\n              <FormattedMessage\n                id='confirmations.unfollow.message'\n                defaultMessage='Are you sure you want to unfollow {name}?'\n                values={{ name: <strong>@{account.get('acct')}</strong> }}\n              />\n            ),\n            confirm: intl.formatMessage(messages.unfollowConfirm),\n            onConfirm: () => {\n              dispatch(unfollowAccount(account.get('id')));\n            },\n          },\n        }),\n      );\n    } else if (account.getIn(['relationship', 'requested'])) {\n      dispatch(\n        openModal({\n          modalType: 'CONFIRM',\n          modalProps: {\n            message: (\n              <FormattedMessage\n                id='confirmations.cancel_follow_request.message'\n                defaultMessage='Are you sure you want to withdraw your request to follow {name}?'\n                values={{ name: <strong>@{account.get('acct')}</strong> }}\n              />\n            ),\n            confirm: intl.formatMessage(messages.cancelFollowRequestConfirm),\n            onConfirm: () => {\n              dispatch(unfollowAccount(account.get('id')));\n            },\n          },\n        }),\n      );\n    } else {\n      dispatch(followAccount(account.get('id')));\n    }\n  }, [account, dispatch, intl]);\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      <Permalink\n        href={account.get('url')}\n        to={`/@${account.get('acct')}`}\n        className='account-card__permalink'\n      >\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      </Permalink>\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, useState } 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 'flavours/glitch/actions/columns';\nimport {\n  fetchDirectory,\n  expandDirectory,\n} from 'flavours/glitch/actions/directory';\nimport Column from 'flavours/glitch/components/column';\nimport { ColumnHeader } from 'flavours/glitch/components/column_header';\nimport { LoadMore } from 'flavours/glitch/components/load_more';\nimport { LoadingIndicator } from 'flavours/glitch/components/loading_indicator';\nimport { RadioButton } from 'flavours/glitch/components/radio_button';\nimport ScrollContainer from 'flavours/glitch/containers/scroll_container';\nimport { useAppDispatch, useAppSelector } from 'flavours/glitch/store';\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 [state, setState] = useState<{\n    order: string | null;\n    local: boolean | null;\n  }>({\n    order: null,\n    local: null,\n  });\n\n  const column = useRef<Column>(null);\n\n  const order = state.order ?? params?.order ?? 'active';\n  const local = state.local ?? params?.local ?? false;\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        setState((s) => ({ order: e.target.value, local: s.local }));\n      }\n    },\n    [dispatch, columnId],\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 {\n        setState((s) => ({ local: e.target.value === '1', order: s.order }));\n      }\n    },\n    [dispatch, columnId],\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":""}