Skip to content

Commit a55c023

Browse files
chore(activity-message): convert ActivityMessage to TypeScript
Co-Authored-By: tjuanitas@box.com <tjuanitas@box.com>
1 parent fcf335a commit a55c023

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed

src/elements/content-sidebar/activity-feed/common/activity-message/ActivityMessage.js renamed to src/elements/content-sidebar/activity-feed/common/activity-message/ActivityMessage.js.flow

File renamed without changes.
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import * as React from 'react';
2+
import noop from 'lodash/noop';
3+
import { FormattedMessage } from 'react-intl';
4+
import CollapsableMessage from './CollapsableMessage';
5+
import formatTaggedMessage from '../../utils/formatTaggedMessage';
6+
import LoadingIndicator, { LoadingIndicatorSize } from '../../../../../components/loading-indicator';
7+
import messages from './messages';
8+
import ShowOriginalButton from './ShowOriginalButton';
9+
import TranslateButton from './TranslateButton';
10+
import { withFeatureConsumer, isFeatureEnabled } from '../../../../common/feature-checking';
11+
12+
import './ActivityMessage.scss';
13+
14+
interface Props {
15+
features: Record<string, boolean>;
16+
getUserProfileUrl?: (user: { id: string; name?: string; email?: string }) => string;
17+
id: string;
18+
isEdited?: boolean;
19+
onTranslate?: ({ id, tagged_message }: { id: string; tagged_message: string }) => void;
20+
tagged_message: string;
21+
translatedTaggedMessage?: string;
22+
translationEnabled?: boolean;
23+
translationFailed?: boolean | null;
24+
}
25+
26+
type State = {
27+
isLoading?: boolean;
28+
isTranslation?: boolean;
29+
};
30+
31+
class ActivityMessage extends React.Component<Props, State> {
32+
static defaultProps = {
33+
isEdited: false,
34+
translationEnabled: false,
35+
};
36+
37+
state = {
38+
isLoading: false,
39+
isTranslation: false,
40+
};
41+
42+
componentDidUpdate(prevProps: Props): void {
43+
const { translatedTaggedMessage, translationFailed } = this.props;
44+
const { translatedTaggedMessage: prevTaggedMessage, translationFailed: prevTranslationFailed } = prevProps;
45+
46+
if (prevTaggedMessage === translatedTaggedMessage || prevTranslationFailed === translationFailed) {
47+
return;
48+
}
49+
50+
if (translatedTaggedMessage || translationFailed) {
51+
this.setState({ isLoading: false });
52+
}
53+
}
54+
55+
getButton(isTranslation?: boolean): React.ReactNode {
56+
let button = null;
57+
if (isTranslation) {
58+
button = <ShowOriginalButton handleShowOriginal={this.handleShowOriginal} />;
59+
} else {
60+
button = <TranslateButton handleTranslate={this.handleTranslate} />;
61+
}
62+
63+
return button;
64+
}
65+
66+
handleTranslate = (event: React.MouseEvent): void => {
67+
const { id, tagged_message, onTranslate = noop, translatedTaggedMessage } = this.props;
68+
if (!translatedTaggedMessage) {
69+
this.setState({ isLoading: true });
70+
onTranslate({ id, tagged_message });
71+
}
72+
73+
this.setState({ isTranslation: true });
74+
event.preventDefault();
75+
};
76+
77+
handleShowOriginal = (event: React.MouseEvent): void => {
78+
this.setState({ isTranslation: false });
79+
event.preventDefault();
80+
};
81+
82+
render(): React.ReactNode {
83+
const {
84+
features,
85+
getUserProfileUrl,
86+
id,
87+
isEdited,
88+
tagged_message,
89+
translatedTaggedMessage,
90+
translationEnabled,
91+
} = this.props;
92+
const { isLoading, isTranslation } = this.state;
93+
const commentToDisplay =
94+
translationEnabled && isTranslation && translatedTaggedMessage ? translatedTaggedMessage : tagged_message;
95+
const MessageWrapper = isFeatureEnabled(features, 'activityFeed.collapsableMessages.enabled')
96+
? CollapsableMessage
97+
: React.Fragment;
98+
99+
return isLoading ? (
100+
<div className="bcs-ActivityMessageLoading">
101+
<LoadingIndicator size={LoadingIndicatorSize.SMALL} />
102+
</div>
103+
) : (
104+
<div className="bcs-ActivityMessage">
105+
<MessageWrapper>
106+
{formatTaggedMessage(commentToDisplay, id, false, getUserProfileUrl)}
107+
{isEdited && (
108+
<span className="bcs-ActivityMessage-edited">
109+
<FormattedMessage {...messages.activityMessageEdited} />
110+
</span>
111+
)}
112+
</MessageWrapper>
113+
{translationEnabled ? this.getButton(isTranslation) : null}
114+
</div>
115+
);
116+
}
117+
}
118+
119+
export { ActivityMessage };
120+
export default withFeatureConsumer(ActivityMessage);

0 commit comments

Comments
 (0)