fix(MM-63466): hashtag displaying in smaller font size (#9193)
This commit is contained in:
parent
62ab383773
commit
6ed8a56be4
2 changed files with 141 additions and 13 deletions
|
|
@ -5,15 +5,22 @@ import {screen} from '@testing-library/react-native';
|
|||
import * as CommonMark from 'commonmark';
|
||||
const {Node} = CommonMark;
|
||||
import React from 'react';
|
||||
import {StyleSheet} from 'react-native';
|
||||
|
||||
import {Preferences} from '@constants';
|
||||
import {renderWithIntl} from '@test/intl-test-helper';
|
||||
import {getMarkdownTextStyles} from '@utils/markdown';
|
||||
import {typography} from '@utils/typography';
|
||||
|
||||
import Markdown from './markdown';
|
||||
import Markdown, {testExports} from './markdown';
|
||||
import * as Transforms from './transform';
|
||||
|
||||
const Parser = jest.requireActual('commonmark').Parser;
|
||||
|
||||
jest.mock('@screens/navigation', () => ({
|
||||
dismissAllModalsAndPopToRoot: jest.fn(),
|
||||
}));
|
||||
|
||||
describe('Markdown', () => {
|
||||
const baseProps: React.ComponentProps<typeof Markdown> = {
|
||||
baseTextStyle: {},
|
||||
|
|
@ -137,4 +144,111 @@ describe('Markdown', () => {
|
|||
expect(screen.getByText('An error occurred while rendering this text')).toBeVisible();
|
||||
});
|
||||
});
|
||||
|
||||
describe('renderHashtagWithStyles', () => {
|
||||
const {renderHashtagWithStyles} = testExports;
|
||||
|
||||
test('should render hashtag with correct text and link styling', () => {
|
||||
const baseTextStyle = {
|
||||
color: '#000000',
|
||||
...typography('Body', 200),
|
||||
};
|
||||
const textStyles = getMarkdownTextStyles(baseProps.theme);
|
||||
const context: string[] = [];
|
||||
|
||||
renderWithIntl(
|
||||
renderHashtagWithStyles(context, 'test', textStyles, baseTextStyle),
|
||||
);
|
||||
|
||||
const hashtagElement = screen.getByText('#test');
|
||||
expect(hashtagElement).toBeVisible();
|
||||
|
||||
const flattenedStyle = StyleSheet.flatten(hashtagElement.props.style);
|
||||
expect(flattenedStyle).toMatchObject({
|
||||
fontSize: 16,
|
||||
color: baseProps.theme.linkColor,
|
||||
});
|
||||
});
|
||||
|
||||
test('should render hashtag in heading with correct heading font size', () => {
|
||||
const baseTextStyle = {
|
||||
color: '#000000',
|
||||
...typography('Body', 200),
|
||||
};
|
||||
const textStyles = getMarkdownTextStyles(baseProps.theme);
|
||||
const context: string[] = ['heading1'];
|
||||
|
||||
renderWithIntl(
|
||||
renderHashtagWithStyles(context, 'hashtag', textStyles, baseTextStyle),
|
||||
);
|
||||
|
||||
const hashtagElement = screen.getByText('#hashtag');
|
||||
expect(hashtagElement).toBeVisible();
|
||||
|
||||
const flattenedStyle = StyleSheet.flatten(hashtagElement.props.style);
|
||||
expect(flattenedStyle).toMatchObject({
|
||||
fontSize: 28,
|
||||
});
|
||||
});
|
||||
|
||||
test('should apply heading2 styles when in heading2 context', () => {
|
||||
const baseTextStyle = {
|
||||
color: '#000000',
|
||||
...typography('Body', 200),
|
||||
};
|
||||
const textStyles = getMarkdownTextStyles(baseProps.theme);
|
||||
const context: string[] = ['heading2'];
|
||||
|
||||
renderWithIntl(
|
||||
renderHashtagWithStyles(context, 'heading2tag', textStyles, baseTextStyle),
|
||||
);
|
||||
|
||||
const hashtagElement = screen.getByText('#heading2tag');
|
||||
expect(hashtagElement).toBeVisible();
|
||||
|
||||
const flattenedStyle = StyleSheet.flatten(hashtagElement.props.style);
|
||||
expect(flattenedStyle).toMatchObject({
|
||||
fontSize: 25,
|
||||
});
|
||||
});
|
||||
|
||||
test('should have clickable onPress handler', () => {
|
||||
const baseTextStyle = {
|
||||
color: '#000000',
|
||||
...typography('Body', 200),
|
||||
};
|
||||
const textStyles = getMarkdownTextStyles(baseProps.theme);
|
||||
const context: string[] = [];
|
||||
|
||||
renderWithIntl(
|
||||
renderHashtagWithStyles(context, 'clickable', textStyles, baseTextStyle),
|
||||
);
|
||||
|
||||
const hashtagElement = screen.getByText('#clickable');
|
||||
expect(hashtagElement.props.onPress).toBeDefined();
|
||||
});
|
||||
|
||||
test('should include both base text style and link color', () => {
|
||||
const baseTextStyle = {
|
||||
color: '#000000',
|
||||
...typography('Body', 200),
|
||||
fontFamily: 'OpenSans',
|
||||
};
|
||||
const textStyles = getMarkdownTextStyles(baseProps.theme);
|
||||
const context: string[] = [];
|
||||
|
||||
renderWithIntl(
|
||||
renderHashtagWithStyles(context, 'styled', textStyles, baseTextStyle),
|
||||
);
|
||||
|
||||
const hashtagElement = screen.getByText('#styled');
|
||||
const flattenedStyle = StyleSheet.flatten(hashtagElement.props.style);
|
||||
|
||||
expect(flattenedStyle).toMatchObject({
|
||||
fontSize: 16,
|
||||
fontFamily: 'OpenSans',
|
||||
color: baseProps.theme.linkColor,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -124,6 +124,27 @@ const getExtraPropsForNode = (node: any) => {
|
|||
return extraProps;
|
||||
};
|
||||
|
||||
const renderHashtagWithStyles = (
|
||||
context: string[],
|
||||
hashtag: string,
|
||||
textStyles: MarkdownTextStyles,
|
||||
baseTextStyle: StyleProp<TextStyle>,
|
||||
) => {
|
||||
const computedStyle = computeTextStyle(textStyles, baseTextStyle, context);
|
||||
const linkStyle = [computedStyle, textStyles.link];
|
||||
const headingIndex = context.findIndex((c) => c.includes('heading'));
|
||||
if (headingIndex > -1) {
|
||||
linkStyle.push(textStyles[context[headingIndex]]);
|
||||
}
|
||||
|
||||
return (
|
||||
<Hashtag
|
||||
hashtag={hashtag}
|
||||
linkStyle={linkStyle}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const Markdown = ({
|
||||
autolinkedUrlSchemes, baseTextStyle, blockStyles, channelId, channelMentions,
|
||||
disableAtChannelMentionHighlight, disableAtMentions, disableBlockQuote, disableChannelLink,
|
||||
|
|
@ -277,18 +298,7 @@ const Markdown = ({
|
|||
return renderText({context, literal: `#${hashtag}`});
|
||||
}
|
||||
|
||||
const linkStyle = [textStyles.link];
|
||||
const headingIndex = context.findIndex((c) => c.includes('heading'));
|
||||
if (headingIndex > -1) {
|
||||
linkStyle.push(textStyles[context[headingIndex]]);
|
||||
}
|
||||
|
||||
return (
|
||||
<Hashtag
|
||||
hashtag={hashtag}
|
||||
linkStyle={linkStyle}
|
||||
/>
|
||||
);
|
||||
return renderHashtagWithStyles(context, hashtag, textStyles, baseTextStyle);
|
||||
};
|
||||
|
||||
const renderHeading = ({children, level}: {children: ReactElement; level: string}) => {
|
||||
|
|
@ -662,4 +672,8 @@ const Markdown = ({
|
|||
return output;
|
||||
};
|
||||
|
||||
export const testExports = {
|
||||
renderHashtagWithStyles,
|
||||
};
|
||||
|
||||
export default Markdown;
|
||||
|
|
|
|||
Loading…
Reference in a new issue