diff --git a/app/containers/message/Discussion.js b/app/containers/message/Discussion.tsx
similarity index 88%
rename from app/containers/message/Discussion.js
rename to app/containers/message/Discussion.tsx
index 86650f38c..7d7d207a9 100644
--- a/app/containers/message/Discussion.js
+++ b/app/containers/message/Discussion.tsx
@@ -1,6 +1,5 @@
import React, { useContext } from 'react';
import { View, Text } from 'react-native';
-import PropTypes from 'prop-types';
import Touchable from './Touchable';
import { formatMessageCount, BUTTON_HIT_SLOP } from './utils';
@@ -12,9 +11,14 @@ import { themes } from '../../constants/colors';
import MessageContext from './Context';
import { formatDateThreads } from '../../utils/room';
-const Discussion = React.memo(({
- msg, dcount, dlm, theme
-}) => {
+interface IMessageDiscussion {
+ msg: string;
+ dcount: number;
+ dlm: string;
+ theme: string;
+}
+
+const Discussion = React.memo(({ msg, dcount, dlm, theme }: IMessageDiscussion) => {
let time;
if (dlm) {
time = formatDateThreads(dlm);
@@ -57,12 +61,6 @@ const Discussion = React.memo(({
return true;
});
-Discussion.propTypes = {
- msg: PropTypes.string,
- dcount: PropTypes.number,
- dlm: PropTypes.string,
- theme: PropTypes.string
-};
Discussion.displayName = 'MessageDiscussion';
export default Discussion;
diff --git a/app/containers/message/Emoji.js b/app/containers/message/Emoji.tsx
similarity index 62%
rename from app/containers/message/Emoji.js
rename to app/containers/message/Emoji.tsx
index e8b817da0..7d7f3cb2e 100644
--- a/app/containers/message/Emoji.js
+++ b/app/containers/message/Emoji.tsx
@@ -1,13 +1,18 @@
import React from 'react';
import { Text } from 'react-native';
-import PropTypes from 'prop-types';
import shortnameToUnicode from '../../utils/shortnameToUnicode';
import CustomEmoji from '../EmojiPicker/CustomEmoji';
-const Emoji = React.memo(({
- content, baseUrl, standardEmojiStyle, customEmojiStyle, getCustomEmoji
-}) => {
+interface IMessageEmoji {
+ content: any;
+ baseUrl: string;
+ standardEmojiStyle: object;
+ customEmojiStyle: object;
+ getCustomEmoji: Function;
+}
+
+const Emoji = React.memo(({ content, baseUrl, standardEmojiStyle, customEmojiStyle, getCustomEmoji }: IMessageEmoji) => {
const parsedContent = content.replace(/^:|:$/g, '');
const emoji = getCustomEmoji(parsedContent);
if (emoji) {
@@ -16,13 +21,6 @@ const Emoji = React.memo(({
return { shortnameToUnicode(content) };
}, () => true);
-Emoji.propTypes = {
- content: PropTypes.string,
- baseUrl: PropTypes.string,
- standardEmojiStyle: PropTypes.object,
- customEmojiStyle: PropTypes.object,
- getCustomEmoji: PropTypes.func
-};
Emoji.displayName = 'MessageEmoji';
export default Emoji;
diff --git a/app/containers/message/Encrypted.js b/app/containers/message/Encrypted.tsx
similarity index 80%
rename from app/containers/message/Encrypted.js
rename to app/containers/message/Encrypted.tsx
index 38d3bf16b..1c3ac0801 100644
--- a/app/containers/message/Encrypted.js
+++ b/app/containers/message/Encrypted.tsx
@@ -1,5 +1,4 @@
import React, { useContext } from 'react';
-import PropTypes from 'prop-types';
import Touchable from './Touchable';
import { E2E_MESSAGE_TYPE } from '../../lib/encryption/constants';
@@ -9,7 +8,12 @@ import { BUTTON_HIT_SLOP } from './utils';
import MessageContext from './Context';
import styles from './styles';
-const Encrypted = React.memo(({ type, theme }) => {
+interface IMessageEncrypted {
+ type: string;
+ theme: string;
+}
+
+const Encrypted = React.memo(({ type, theme }: IMessageEncrypted) => {
if (type !== E2E_MESSAGE_TYPE) {
return null;
}
@@ -21,9 +25,5 @@ const Encrypted = React.memo(({ type, theme }) => {
);
});
-Encrypted.propTypes = {
- type: PropTypes.string,
- theme: PropTypes.string
-};
export default Encrypted;
diff --git a/app/containers/message/Image.js b/app/containers/message/Image.tsx
similarity index 75%
rename from app/containers/message/Image.js
rename to app/containers/message/Image.tsx
index 6f466b3b3..9c3a97cbc 100644
--- a/app/containers/message/Image.js
+++ b/app/containers/message/Image.tsx
@@ -13,11 +13,28 @@ import { formatAttachmentUrl } from '../../lib/utils';
import { themes } from '../../constants/colors';
import MessageContext from './Context';
+type TMessageButton = {
+ children: JSX.Element;
+ onPress: Function;
+ theme: string;
+}
+
+type TMessageImage = {
+ img: string;
+ theme: string;
+}
+
+interface IMessageImage {
+ file: { image_url: string; description: string; };
+ imageUrl: string;
+ showAttachment: Function;
+ theme: string;
+ getCustomEmoji: Function;
+}
+
const ImageProgress = createImageProgress(FastImage);
-const Button = React.memo(({
- children, onPress, theme
-}) => (
+const Button = React.memo(({children, onPress, theme}: TMessageButton) => (
));
-export const MessageImage = React.memo(({ img, theme }) => (
+export const MessageImage = React.memo(({ img, theme }: TMessageImage) => (
(
/>
));
-const ImageContainer = React.memo(({
- file, imageUrl, showAttachment, getCustomEmoji, theme
-}) => {
+const ImageContainer = React.memo(({file, imageUrl, showAttachment, getCustomEmoji, theme}: IMessageImage) => {
const { baseUrl, user } = useContext(MessageContext);
const img = imageUrl || formatAttachmentUrl(file.image_url, user.id, user.token, baseUrl);
if (!img) {
@@ -55,6 +70,8 @@ const ImageContainer = React.memo(({
@@ -68,26 +85,8 @@ const ImageContainer = React.memo(({
);
}, (prevProps, nextProps) => dequal(prevProps.file, nextProps.file) && prevProps.theme === nextProps.theme);
-ImageContainer.propTypes = {
- file: PropTypes.object,
- imageUrl: PropTypes.string,
- showAttachment: PropTypes.func,
- theme: PropTypes.string,
- getCustomEmoji: PropTypes.func
-};
ImageContainer.displayName = 'MessageImageContainer';
-
-MessageImage.propTypes = {
- img: PropTypes.string,
- theme: PropTypes.string
-};
ImageContainer.displayName = 'MessageImage';
-
-Button.propTypes = {
- children: PropTypes.node,
- onPress: PropTypes.func,
- theme: PropTypes.string
-};
ImageContainer.displayName = 'MessageButton';
export default ImageContainer;
diff --git a/app/containers/message/Reactions.js b/app/containers/message/Reactions.tsx
similarity index 75%
rename from app/containers/message/Reactions.js
rename to app/containers/message/Reactions.tsx
index 7502057f6..5a399cf1b 100644
--- a/app/containers/message/Reactions.js
+++ b/app/containers/message/Reactions.tsx
@@ -1,6 +1,5 @@
import React, { useContext } from 'react';
import { View, Text } from 'react-native';
-import PropTypes from 'prop-types';
import Touchable from './Touchable';
import { CustomIcon } from '../../lib/Icons';
@@ -11,7 +10,26 @@ import { themes } from '../../constants/colors';
import { withTheme } from '../../theme';
import MessageContext from './Context';
-const AddReaction = React.memo(({ theme }) => {
+type TMessageAddReaction = {
+ theme: string
+};
+
+type TMessageReaction = {
+ reaction: {
+ usernames: [];
+ emoji: object;
+ };
+ getCustomEmoji: Function;
+ theme: string;
+};
+
+interface IMessageReactions {
+ reactions: object[];
+ getCustomEmoji: Function;
+ theme: string;
+}
+
+const AddReaction = React.memo(({ theme }: TMessageAddReaction) => {
const { reactionInit } = useContext(MessageContext);
return (
{
);
});
-const Reaction = React.memo(({
- reaction, getCustomEmoji, theme
-}) => {
- const {
- onReactionPress, onReactionLongPress, baseUrl, user
- } = useContext(MessageContext);
- const reacted = reaction.usernames.findIndex(item => item === user.username) !== -1;
+const Reaction = React.memo(({reaction, getCustomEmoji, theme}: TMessageReaction) => {
+ const { onReactionPress, onReactionLongPress, baseUrl, user } = useContext(MessageContext);
+ const reacted = reaction.usernames.findIndex((item: TMessageReaction) => item === user.username) !== -1;
return (
onReactionPress(reaction.emoji)}
@@ -60,15 +74,13 @@ const Reaction = React.memo(({
);
});
-const Reactions = React.memo(({
- reactions, getCustomEmoji, theme
-}) => {
+const Reactions = React.memo(({ reactions, getCustomEmoji, theme }: IMessageReactions) => {
if (!Array.isArray(reactions) || reactions.length === 0) {
return null;
}
return (
- {reactions.map(reaction => (
+ {reactions.map((reaction: any) => (
{
+const RCTouchable: any = React.memo(({ children, ...props }: any) => {
const { onLongPress } = useContext(MessageContext);
return (
@@ -16,10 +15,9 @@ const RCTouchable = React.memo(({ children, ...props }) => {
);
});
-RCTouchable.propTypes = {
- children: PropTypes.node
-};
-RCTouchable.Ripple = (...args) => Touchable.Ripple(...args);
+
+// @ts-ignore
+RCTouchable.Ripple = (...args: any[]) => Touchable.Ripple(...args);
RCTouchable.SelectableBackgroundBorderless = () => Touchable.SelectableBackgroundBorderless();
export default RCTouchable;
diff --git a/app/containers/message/constants.js b/app/containers/message/constants.ts
similarity index 100%
rename from app/containers/message/constants.js
rename to app/containers/message/constants.ts
diff --git a/app/containers/message/styles.js b/app/containers/message/styles.ts
similarity index 98%
rename from app/containers/message/styles.js
rename to app/containers/message/styles.ts
index dd0dff627..3d4334f7c 100644
--- a/app/containers/message/styles.js
+++ b/app/containers/message/styles.ts
@@ -3,7 +3,7 @@ import { StyleSheet } from 'react-native';
import sharedStyles from '../../views/Styles';
import { isTablet } from '../../utils/deviceInfo';
-export default StyleSheet.create({
+export default StyleSheet.create({
root: {
flexDirection: 'row'
},
diff --git a/app/containers/message/utils.js b/app/containers/message/utils.ts
similarity index 89%
rename from app/containers/message/utils.js
rename to app/containers/message/utils.ts
index 22f4d90ca..e793daf90 100644
--- a/app/containers/message/utils.js
+++ b/app/containers/message/utils.ts
@@ -1,7 +1,7 @@
import I18n from '../../i18n';
import { DISCUSSION } from './constants';
-export const formatMessageCount = (count, type) => {
+export const formatMessageCount = (count: number, type: string) => {
const discussion = type === DISCUSSION;
let text = discussion ? I18n.t('No_messages_yet') : null;
if (count === 1) {
@@ -60,9 +60,13 @@ export const SYSTEM_MESSAGE_TYPES_WITH_AUTHOR_NAME = [
SYSTEM_MESSAGE_TYPES.USER_LEFT_CHANNEL
];
-export const getInfoMessage = ({
- type, role, msg, author
-}) => {
+type TInfoMessage = {
+ type: string;
+ role: string;
+ msg: string;
+ author: { username: string };
+}
+export const getInfoMessage = ({type, role, msg, author}: TInfoMessage) => {
const { username } = author;
if (type === 'rm') {
return I18n.t('Message_removed');
@@ -110,13 +114,13 @@ export const getInfoMessage = ({
return '';
};
-export const getMessageTranslation = (message, autoTranslateLanguage) => {
+export const getMessageTranslation = (message: {translations: any}, autoTranslateLanguage: string) => {
if (!autoTranslateLanguage) {
return null;
}
const { translations } = message;
if (translations) {
- const translation = translations.find(trans => trans.language === autoTranslateLanguage);
+ const translation = translations.find((trans: any) => trans.language === autoTranslateLanguage);
return translation && translation.value;
}
return null;
diff --git a/app/externalModules.d.ts b/app/externalModules.d.ts
index 2a8d0014c..b87ff6322 100644
--- a/app/externalModules.d.ts
+++ b/app/externalModules.d.ts
@@ -2,3 +2,4 @@ declare module 'rn-extensions-share';
declare module 'commonmark';
declare module 'commonmark-react-renderer';
declare module 'remove-markdown';
+declare module 'react-native-image-progress'