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