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'