mirror of
https://github.com/mastodon/mastodon.git
synced 2025-09-06 01:41:08 +00:00

Some checks are pending
Check i18n / check-i18n (push) Waiting to run
Chromatic / Run Chromatic (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Check formatting / lint (push) Waiting to run
CSS Linting / lint (push) Waiting to run
JavaScript Linting / lint (push) Waiting to run
Ruby Linting / lint (push) Waiting to run
JavaScript Testing / test (push) Waiting to run
Historical data migration test / test (14-alpine) (push) Waiting to run
Historical data migration test / test (15-alpine) (push) Waiting to run
Historical data migration test / test (16-alpine) (push) Waiting to run
Historical data migration test / test (17-alpine) (push) Waiting to run
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.2) (push) Blocked by required conditions
Ruby Testing / test (3.3) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (.ruby-version) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.2) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.3) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.2) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.3) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
79 lines
1.9 KiB
TypeScript
79 lines
1.9 KiB
TypeScript
import { useCallback } from 'react';
|
|
|
|
import { useLinks } from 'mastodon/hooks/useLinks';
|
|
|
|
import { EmojiHTML } from '../features/emoji/emoji_html';
|
|
import { isFeatureEnabled } from '../initial_state';
|
|
import { useAppSelector } from '../store';
|
|
|
|
interface AccountBioProps {
|
|
className: string;
|
|
accountId: string;
|
|
showDropdown?: boolean;
|
|
}
|
|
|
|
export const AccountBio: React.FC<AccountBioProps> = ({
|
|
className,
|
|
accountId,
|
|
showDropdown = false,
|
|
}) => {
|
|
const handleClick = useLinks(showDropdown);
|
|
const handleNodeChange = useCallback(
|
|
(node: HTMLDivElement | null) => {
|
|
if (!showDropdown || !node || node.childNodes.length === 0) {
|
|
return;
|
|
}
|
|
addDropdownToHashtags(node, accountId);
|
|
},
|
|
[showDropdown, accountId],
|
|
);
|
|
const note = useAppSelector((state) => {
|
|
const account = state.accounts.get(accountId);
|
|
if (!account) {
|
|
return '';
|
|
}
|
|
return isFeatureEnabled('modern_emojis')
|
|
? account.note
|
|
: account.note_emojified;
|
|
});
|
|
const extraEmojis = useAppSelector((state) => {
|
|
const account = state.accounts.get(accountId);
|
|
return account?.emojis;
|
|
});
|
|
|
|
if (note.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<div
|
|
className={`${className} translate`}
|
|
onClickCapture={handleClick}
|
|
ref={handleNodeChange}
|
|
>
|
|
<EmojiHTML htmlString={note} extraEmojis={extraEmojis} />
|
|
</div>
|
|
);
|
|
};
|
|
|
|
function addDropdownToHashtags(node: HTMLElement | null, accountId: string) {
|
|
if (!node) {
|
|
return;
|
|
}
|
|
for (const childNode of node.childNodes) {
|
|
if (!(childNode instanceof HTMLElement)) {
|
|
continue;
|
|
}
|
|
if (
|
|
childNode instanceof HTMLAnchorElement &&
|
|
(childNode.classList.contains('hashtag') ||
|
|
childNode.innerText.startsWith('#')) &&
|
|
!childNode.dataset.menuHashtag
|
|
) {
|
|
childNode.dataset.menuHashtag = accountId;
|
|
} else if (childNode.childNodes.length > 0) {
|
|
addDropdownToHashtags(childNode, accountId);
|
|
}
|
|
}
|
|
}
|