{"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":""}