mirror of
https://github.com/mastodon/mastodon.git
synced 2025-10-05 00:22:42 +00:00

Some checks failed
Check i18n / check-i18n (push) Waiting to run
Chromatic / Run Chromatic (push) Waiting to run
CodeQL / Analyze (actions) (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
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
Bundler Audit / security (push) Has been cancelled
Haml Linting / lint (push) Has been cancelled
62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
import { useMemo } from 'react';
|
|
import type { ComponentPropsWithoutRef, ElementType } from 'react';
|
|
|
|
import classNames from 'classnames';
|
|
|
|
import type { CustomEmojiMapArg } from '@/mastodon/features/emoji/types';
|
|
import { isModernEmojiEnabled } from '@/mastodon/utils/environment';
|
|
import { htmlStringToComponents } from '@/mastodon/utils/html';
|
|
|
|
import { AnimateEmojiProvider, CustomEmojiProvider } from './context';
|
|
import { textToEmojis } from './index';
|
|
|
|
type EmojiHTMLProps<Element extends ElementType = 'div'> = Omit<
|
|
ComponentPropsWithoutRef<Element>,
|
|
'dangerouslySetInnerHTML' | 'className'
|
|
> & {
|
|
htmlString: string;
|
|
extraEmojis?: CustomEmojiMapArg;
|
|
as?: Element;
|
|
className?: string;
|
|
};
|
|
|
|
export const ModernEmojiHTML = ({
|
|
extraEmojis,
|
|
htmlString,
|
|
as: asProp = 'div', // Rename for syntax highlighting
|
|
shallow,
|
|
className = '',
|
|
...props
|
|
}: EmojiHTMLProps<ElementType>) => {
|
|
const contents = useMemo(
|
|
() => htmlStringToComponents(htmlString, { onText: textToEmojis }),
|
|
[htmlString],
|
|
);
|
|
|
|
return (
|
|
<CustomEmojiProvider emojis={extraEmojis}>
|
|
<AnimateEmojiProvider {...props} as={asProp} className={className}>
|
|
{contents}
|
|
</AnimateEmojiProvider>
|
|
</CustomEmojiProvider>
|
|
);
|
|
};
|
|
|
|
export const LegacyEmojiHTML = <Element extends ElementType>(
|
|
props: EmojiHTMLProps<Element>,
|
|
) => {
|
|
const { as: asElement, htmlString, extraEmojis, className, ...rest } = props;
|
|
const Wrapper = asElement ?? 'div';
|
|
return (
|
|
<Wrapper
|
|
{...rest}
|
|
dangerouslySetInnerHTML={{ __html: htmlString }}
|
|
className={classNames(className, 'animate-parent')}
|
|
/>
|
|
);
|
|
};
|
|
|
|
export const EmojiHTML = isModernEmojiEnabled()
|
|
? ModernEmojiHTML
|
|
: LegacyEmojiHTML;
|