To fix Storybook, make <Message> take renderReactionPicker

This commit is contained in:
Evan Hahn 2021-09-10 13:00:31 -05:00 committed by GitHub
parent 58c18ac420
commit 84ac7dd2df
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 53 additions and 14 deletions

View file

@ -47,6 +47,8 @@ const renderEmojiPicker: Props['renderEmojiPicker'] = ({
/> />
); );
const renderReactionPicker: Props['renderReactionPicker'] = () => <div />;
const MessageAudioContainer: React.FC<AudioAttachmentProps> = props => { const MessageAudioContainer: React.FC<AudioAttachmentProps> = props => {
const [active, setActive] = React.useState<{ const [active, setActive] = React.useState<{
id?: string; id?: string;
@ -135,6 +137,7 @@ const createProps = (overrideProps: Partial<Props> = {}): Props => ({
? ReadStatus.Read ? ReadStatus.Read
: overrideProps.readStatus, : overrideProps.readStatus,
renderEmojiPicker, renderEmojiPicker,
renderReactionPicker,
renderAudioAttachment, renderAudioAttachment,
replyToMessage: action('replyToMessage'), replyToMessage: action('replyToMessage'),
retrySend: action('retrySend'), retrySend: action('retrySend'),

View file

@ -63,7 +63,7 @@ import {
} from '../../types/Colors'; } from '../../types/Colors';
import { createRefMerger } from '../_util'; import { createRefMerger } from '../_util';
import { emojiToData } from '../emoji/lib'; import { emojiToData } from '../emoji/lib';
import { SmartReactionPicker } from '../../state/smart/ReactionPicker'; import type { SmartReactionPicker } from '../../state/smart/ReactionPicker';
import { getCustomColorStyle } from '../../util/getCustomColorStyle'; import { getCustomColorStyle } from '../../util/getCustomColorStyle';
import { offsetDistanceModifier } from '../../util/popperUtil'; import { offsetDistanceModifier } from '../../util/popperUtil';
@ -197,6 +197,9 @@ export type PropsHousekeeping = {
disableScroll?: boolean; disableScroll?: boolean;
collapseMetadata?: boolean; collapseMetadata?: boolean;
renderAudioAttachment: (props: AudioAttachmentProps) => JSX.Element; renderAudioAttachment: (props: AudioAttachmentProps) => JSX.Element;
renderReactionPicker: (
props: React.ComponentProps<typeof SmartReactionPicker>
) => JSX.Element;
}; };
export type PropsActions = { export type PropsActions = {
@ -1319,6 +1322,7 @@ export class Message extends React.PureComponent<Props, State> {
isTapToView, isTapToView,
reactToMessage, reactToMessage,
renderEmojiPicker, renderEmojiPicker,
renderReactionPicker,
replyToMessage, replyToMessage,
selectedReaction, selectedReaction,
} = this.props; } = this.props;
@ -1459,22 +1463,22 @@ export class Message extends React.PureComponent<Props, State> {
this.popperPreventOverflowModifier(), this.popperPreventOverflowModifier(),
]} ]}
> >
{({ ref, style }) => ( {({ ref, style }) =>
<SmartReactionPicker renderReactionPicker({
ref={ref} ref,
style={style} style,
selected={selectedReaction} selected: selectedReaction,
onClose={this.toggleReactionPicker} onClose: this.toggleReactionPicker,
onPick={emoji => { onPick: emoji => {
this.toggleReactionPicker(true); this.toggleReactionPicker(true);
reactToMessage(id, { reactToMessage(id, {
emoji, emoji,
remove: emoji === selectedReaction, remove: emoji === selectedReaction,
}); });
}} },
renderEmojiPicker={renderEmojiPicker} renderEmojiPicker,
/> })
)} }
</Popper>, </Popper>,
reactionPickerRoot reactionPickerRoot
)} )}

View file

@ -75,6 +75,7 @@ const createProps = (overrideProps: Partial<Props> = {}): Props => ({
reactToMessage: action('reactToMessage'), reactToMessage: action('reactToMessage'),
renderAudioAttachment: () => <div>*AudioAttachment*</div>, renderAudioAttachment: () => <div>*AudioAttachment*</div>,
renderEmojiPicker: () => <div />, renderEmojiPicker: () => <div />,
renderReactionPicker: () => <div />,
replyToMessage: action('replyToMessage'), replyToMessage: action('replyToMessage'),
retrySend: action('retrySend'), retrySend: action('retrySend'),
showContactDetail: action('showContactDetail'), showContactDetail: action('showContactDetail'),

View file

@ -68,6 +68,7 @@ export type PropsBackboneActions = Pick<
| 'reactToMessage' | 'reactToMessage'
| 'renderAudioAttachment' | 'renderAudioAttachment'
| 'renderEmojiPicker' | 'renderEmojiPicker'
| 'renderReactionPicker'
| 'replyToMessage' | 'replyToMessage'
| 'retrySend' | 'retrySend'
| 'showContactDetail' | 'showContactDetail'
@ -271,6 +272,7 @@ export class MessageDetail extends React.Component<Props> {
reactToMessage, reactToMessage,
renderAudioAttachment, renderAudioAttachment,
renderEmojiPicker, renderEmojiPicker,
renderReactionPicker,
replyToMessage, replyToMessage,
retrySend, retrySend,
showContactDetail, showContactDetail,
@ -319,6 +321,7 @@ export class MessageDetail extends React.Component<Props> {
reactToMessage={reactToMessage} reactToMessage={reactToMessage}
renderAudioAttachment={renderAudioAttachment} renderAudioAttachment={renderAudioAttachment}
renderEmojiPicker={renderEmojiPicker} renderEmojiPicker={renderEmojiPicker}
renderReactionPicker={renderReactionPicker}
replyToMessage={replyToMessage} replyToMessage={replyToMessage}
retrySend={retrySend} retrySend={retrySend}
showForwardMessageModal={showForwardMessageModal} showForwardMessageModal={showForwardMessageModal}

View file

@ -66,6 +66,7 @@ const defaultMessageProps: MessagesProps = {
reactToMessage: action('default--reactToMessage'), reactToMessage: action('default--reactToMessage'),
readStatus: ReadStatus.Read, readStatus: ReadStatus.Read,
renderEmojiPicker: () => <div />, renderEmojiPicker: () => <div />,
renderReactionPicker: () => <div />,
renderAudioAttachment: () => <div>*AudioAttachment*</div>, renderAudioAttachment: () => <div>*AudioAttachment*</div>,
replyToMessage: action('default--replyToMessage'), replyToMessage: action('default--replyToMessage'),
retrySend: action('default--retrySend'), retrySend: action('default--retrySend'),

View file

@ -387,6 +387,7 @@ const renderItem = (
id="" id=""
isSelected={false} isSelected={false}
renderEmojiPicker={() => <div />} renderEmojiPicker={() => <div />}
renderReactionPicker={() => <div />}
item={items[id]} item={items[id]}
i18n={i18n} i18n={i18n}
interactionMode="keyboard" interactionMode="keyboard"

View file

@ -32,6 +32,10 @@ const renderEmojiPicker: TimelineItemProps['renderEmojiPicker'] = ({
/> />
); );
const renderReactionPicker: TimelineItemProps['renderReactionPicker'] = () => (
<div />
);
const renderContact = (conversationId: string) => ( const renderContact = (conversationId: string) => (
<React.Fragment key={conversationId}>{conversationId}</React.Fragment> <React.Fragment key={conversationId}>{conversationId}</React.Fragment>
); );
@ -86,6 +90,7 @@ const getDefaultProps = () => ({
renderContact, renderContact,
renderUniversalTimerNotification, renderUniversalTimerNotification,
renderEmojiPicker, renderEmojiPicker,
renderReactionPicker,
renderAudioAttachment: () => <div>*AudioAttachment*</div>, renderAudioAttachment: () => <div>*AudioAttachment*</div>,
}); });

View file

@ -176,7 +176,10 @@ type PropsActionsType = MessageActionsType &
export type PropsType = PropsLocalType & export type PropsType = PropsLocalType &
PropsActionsType & PropsActionsType &
Pick<AllMessageProps, 'renderEmojiPicker' | 'renderAudioAttachment'>; Pick<
AllMessageProps,
'renderEmojiPicker' | 'renderAudioAttachment' | 'renderReactionPicker'
>;
export class TimelineItem extends React.PureComponent<PropsType> { export class TimelineItem extends React.PureComponent<PropsType> {
public render(): JSX.Element | null { public render(): JSX.Element | null {

View file

@ -13,12 +13,17 @@ import { StateType } from '../reducer';
import { getIntl, getInteractionMode } from '../selectors/user'; import { getIntl, getInteractionMode } from '../selectors/user';
import { renderAudioAttachment } from './renderAudioAttachment'; import { renderAudioAttachment } from './renderAudioAttachment';
import { renderEmojiPicker } from './renderEmojiPicker'; import { renderEmojiPicker } from './renderEmojiPicker';
import { renderReactionPicker } from './renderReactionPicker';
import { getContactNameColorSelector } from '../selectors/conversations'; import { getContactNameColorSelector } from '../selectors/conversations';
export { Contact } from '../../components/conversation/MessageDetail'; export { Contact } from '../../components/conversation/MessageDetail';
export type OwnProps = Omit< export type OwnProps = Omit<
MessageDetailProps, MessageDetailProps,
'i18n' | 'interactionMode' | 'renderAudioAttachment' | 'renderEmojiPicker' | 'i18n'
| 'interactionMode'
| 'renderAudioAttachment'
| 'renderEmojiPicker'
| 'renderReactionPicker'
>; >;
const mapStateToProps = ( const mapStateToProps = (
@ -81,6 +86,7 @@ const mapStateToProps = (
reactToMessage, reactToMessage,
renderAudioAttachment, renderAudioAttachment,
renderEmojiPicker, renderEmojiPicker,
renderReactionPicker,
replyToMessage, replyToMessage,
retrySend, retrySend,
showContactDetail, showContactDetail,

View file

@ -33,6 +33,7 @@ import { SmartHeroRow } from './HeroRow';
import { SmartTimelineLoadingRow } from './TimelineLoadingRow'; import { SmartTimelineLoadingRow } from './TimelineLoadingRow';
import { renderAudioAttachment } from './renderAudioAttachment'; import { renderAudioAttachment } from './renderAudioAttachment';
import { renderEmojiPicker } from './renderEmojiPicker'; import { renderEmojiPicker } from './renderEmojiPicker';
import { renderReactionPicker } from './renderReactionPicker';
import { getOwn } from '../../util/getOwn'; import { getOwn } from '../../util/getOwn';
import { assert } from '../../util/assert'; import { assert } from '../../util/assert';
@ -77,6 +78,7 @@ function renderItem(
id={messageId} id={messageId}
onHeightChange={createBoundOnHeightChange(onHeightChange, messageId)} onHeightChange={createBoundOnHeightChange(onHeightChange, messageId)}
renderEmojiPicker={renderEmojiPicker} renderEmojiPicker={renderEmojiPicker}
renderReactionPicker={renderReactionPicker}
renderAudioAttachment={renderAudioAttachment} renderAudioAttachment={renderAudioAttachment}
/> />
); );

View file

@ -0,0 +1,10 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import React, { ComponentProps } from 'react';
import { SmartReactionPicker } from './ReactionPicker';
export const renderReactionPicker = (
props: ComponentProps<typeof SmartReactionPicker>
): JSX.Element => <SmartReactionPicker {...props} />;