Merge branch 'develop' into new.support-new-message-parser

This commit is contained in:
Diego Mello 2021-09-06 14:47:44 -03:00 committed by GitHub
commit 3c7ad9a427
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
52 changed files with 13196 additions and 12593 deletions

View File

@ -20361,6 +20361,15 @@ exports[`Storyshots Message Colored attachments 1`] = `
}
}
>
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
}
}
/>
<View
style={
Object {
@ -20562,6 +20571,15 @@ exports[`Storyshots Message Colored attachments 1`] = `
}
}
>
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
}
}
/>
<View
style={
Object {
@ -20763,6 +20781,15 @@ exports[`Storyshots Message Colored attachments 1`] = `
}
}
>
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
}
}
/>
<View
style={
Object {
@ -40307,6 +40334,268 @@ exports[`Storyshots Message Sequential thread messages following thread reply 1`
</RCTScrollView>
`;
exports[`Storyshots Message Show a button as attachment 1`] = `
<RCTScrollView
style={
Object {
"backgroundColor": "#ffffff",
}
}
>
<View>
<View
accessible={true}
focusable={true}
onClick={[Function]}
onResponderGrant={[Function]}
onResponderMove={[Function]}
onResponderRelease={[Function]}
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
style={
Object {
"backgroundColor": null,
"opacity": 1,
}
}
>
<View>
<View
style={
Array [
Object {
"flexDirection": "column",
"paddingHorizontal": 14,
"paddingVertical": 4,
"width": "100%",
},
undefined,
]
}
>
<View
style={
Object {
"flexDirection": "row",
}
}
>
<View
style={
Array [
Object {
"borderRadius": 4,
"height": 36,
"width": 36,
},
Object {
"marginTop": 4,
},
]
}
>
<View
accessible={true}
focusable={true}
onClick={[Function]}
onResponderGrant={[Function]}
onResponderMove={[Function]}
onResponderRelease={[Function]}
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
style={
Object {
"opacity": 1,
}
}
>
<View
style={
Array [
Object {
"overflow": "hidden",
},
Object {
"borderRadius": 4,
"height": 36,
"width": 36,
},
]
}
>
<FastImageView
resizeMode="cover"
source={
Object {
"headers": undefined,
"priority": "high",
"uri": "https://open.rocket.chat/avatar/diego.mello?format=png&size=36",
}
}
style={
Object {
"bottom": 0,
"left": 0,
"position": "absolute",
"right": 0,
"top": 0,
}
}
/>
</View>
</View>
</View>
<View
style={
Array [
Object {
"flex": 1,
"marginLeft": 46,
},
Object {
"marginLeft": 10,
},
]
}
>
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
"justifyContent": "space-between",
}
}
>
<View
accessible={true}
focusable={true}
onClick={[Function]}
onResponderGrant={[Function]}
onResponderMove={[Function]}
onResponderRelease={[Function]}
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
style={
Object {
"alignItems": "center",
"flexDirection": "row",
"flexShrink": 1,
"opacity": 1,
}
}
>
<Text
numberOfLines={1}
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "500",
"lineHeight": 22,
"textAlign": "left",
},
Object {
"color": "#0d0e12",
},
]
}
>
diego.mello
</Text>
</View>
<Text
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 12,
"fontWeight": "400",
"marginLeft": 8,
"textAlign": "left",
},
Object {
"color": "#9ca2a8",
},
]
}
>
10:00 AM
</Text>
</View>
<View />
<Text
style={
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "400",
"textAlign": "left",
}
}
>
Test Button
</Text>
<View
accessible={true}
focusable={true}
onClick={[Function]}
onResponderGrant={[Function]}
onResponderMove={[Function]}
onResponderRelease={[Function]}
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
style={
Object {
"backgroundColor": "#1d74f5",
"borderRadius": 2,
"height": 48,
"justifyContent": "center",
"marginBottom": 12,
"opacity": 1,
"paddingHorizontal": 14,
}
}
>
<Text
accessibilityLabel="Text button"
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "500",
"textAlign": "center",
},
Object {
"color": "#ffffff",
},
undefined,
]
}
>
Text button
</Text>
</View>
</View>
</View>
</View>
</View>
</View>
</View>
</RCTScrollView>
`;
exports[`Storyshots Message Static avatar 1`] = `
<RCTScrollView
style={
@ -43340,6 +43629,407 @@ exports[`Storyshots Message Temp 1`] = `
</RCTScrollView>
`;
exports[`Storyshots Message Thumbnail from server 1`] = `
<RCTScrollView
style={
Object {
"backgroundColor": "#ffffff",
}
}
>
<View>
<View
accessible={true}
focusable={true}
onClick={[Function]}
onResponderGrant={[Function]}
onResponderMove={[Function]}
onResponderRelease={[Function]}
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
style={
Object {
"backgroundColor": null,
"opacity": 1,
}
}
>
<View>
<View
style={
Array [
Object {
"flexDirection": "column",
"paddingHorizontal": 14,
"paddingVertical": 4,
"width": "100%",
},
undefined,
]
}
>
<View
style={
Object {
"flexDirection": "row",
}
}
>
<View
style={
Array [
Object {
"borderRadius": 4,
"height": 36,
"width": 36,
},
Object {
"marginTop": 4,
},
]
}
>
<View
accessible={true}
focusable={true}
onClick={[Function]}
onResponderGrant={[Function]}
onResponderMove={[Function]}
onResponderRelease={[Function]}
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
style={
Object {
"opacity": 1,
}
}
>
<View
style={
Array [
Object {
"overflow": "hidden",
},
Object {
"borderRadius": 4,
"height": 36,
"width": 36,
},
]
}
>
<FastImageView
resizeMode="cover"
source={
Object {
"headers": undefined,
"priority": "high",
"uri": "https://open.rocket.chat/avatar/diego.mello?format=png&size=36",
}
}
style={
Object {
"bottom": 0,
"left": 0,
"position": "absolute",
"right": 0,
"top": 0,
}
}
/>
</View>
</View>
</View>
<View
style={
Array [
Object {
"flex": 1,
"marginLeft": 46,
},
Object {
"marginLeft": 10,
},
]
}
>
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
"justifyContent": "space-between",
}
}
>
<View
accessible={true}
focusable={true}
onClick={[Function]}
onResponderGrant={[Function]}
onResponderMove={[Function]}
onResponderRelease={[Function]}
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
style={
Object {
"alignItems": "center",
"flexDirection": "row",
"flexShrink": 1,
"opacity": 1,
}
}
>
<Text
numberOfLines={1}
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "500",
"lineHeight": 22,
"textAlign": "left",
},
Object {
"color": "#0d0e12",
},
]
}
>
diego.mello
</Text>
</View>
<Text
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 12,
"fontWeight": "400",
"marginLeft": 8,
"textAlign": "left",
},
Object {
"color": "#9ca2a8",
},
]
}
>
10:00 AM
</Text>
</View>
<View>
<Text
numberOfLines={0}
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "400",
"textAlign": "left",
},
undefined,
Object {
"color": "#2f343d",
},
]
}
>
<Text
accessibilityLabel="this is a thumbnail"
numberOfLines={0}
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "400",
"textAlign": "left",
},
Array [
Object {},
Object {
"alignItems": "flex-start",
"flexDirection": "row",
"flexWrap": "wrap",
"justifyContent": "flex-start",
"marginBottom": 0,
"marginTop": 0,
},
],
]
}
>
this is a thumbnail
</Text>
</Text>
</View>
<View
accessible={true}
focusable={true}
onClick={[Function]}
onResponderGrant={[Function]}
onResponderMove={[Function]}
onResponderRelease={[Function]}
onResponderTerminate={[Function]}
onResponderTerminationRequest={[Function]}
onStartShouldSetResponder={[Function]}
style={
Object {
"alignItems": "center",
"alignSelf": "flex-start",
"backgroundColor": "#f3f4f5",
"borderColor": "#e1e5e8",
"borderRadius": 4,
"borderWidth": 1,
"flex": 1,
"flexDirection": "row",
"marginTop": 6,
"opacity": 1,
}
}
>
<View
style={
Object {
"borderRadius": 4,
"flex": 1,
"flexDirection": "column",
"padding": 15,
}
}
>
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
}
}
>
<Text
style={
Array [
Object {
"backgroundColor": "transparent",
"flex": 1,
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "500",
"marginBottom": 3,
"textAlign": "left",
},
Object {
"color": "#2f343d",
},
]
}
>
Title
</Text>
</View>
<View
style={
Array [
Object {
"overflow": "hidden",
},
Object {
"borderTopLeftRadius": 4,
"borderTopRightRadius": 4,
"flex": 1,
"height": 200,
"marginBottom": 1,
"width": null,
},
]
}
>
<FastImageView
resizeMode="cover"
source={
Object {
"uri": "https://images-na.ssl-images-amazon.com/images/I/71jKxPAMFbL._AC_SL1500_.jpg",
}
}
style={
Object {
"bottom": 0,
"left": 0,
"position": "absolute",
"right": 0,
"top": 0,
}
}
/>
</View>
<Text
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "400",
"textAlign": "left",
},
undefined,
Object {
"color": "#2f343d",
},
]
}
>
<Text
accessibilityLabel="Image text"
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "400",
"textAlign": "left",
},
Array [
Object {},
Object {
"alignItems": "flex-start",
"flexDirection": "row",
"flexWrap": "wrap",
"justifyContent": "flex-start",
"marginBottom": 0,
"marginTop": 0,
},
],
]
}
>
Image text
</Text>
</Text>
</View>
</View>
</View>
</View>
</View>
</View>
</View>
</View>
</RCTScrollView>
`;
exports[`Storyshots Message Time format 1`] = `
<RCTScrollView
style={
@ -47162,6 +47852,15 @@ exports[`Storyshots Message With file 1`] = `
}
}
>
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
}
}
/>
<Text
style={
Array [
@ -47380,6 +48079,15 @@ exports[`Storyshots Message With file 1`] = `
}
}
>
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
}
}
/>
<Text
style={
Array [
@ -70722,6 +71430,189 @@ Array [
]
`;
exports[`Storyshots Text Input Short and Long Text 1`] = `
<View
style={
Object {
"paddingHorizontal": 14,
}
}
>
<View
style={
Array [
Object {
"marginBottom": 10,
},
undefined,
]
}
>
<Text
accessibilityLabel={null}
contentDescription={null}
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 14,
"fontWeight": "600",
"marginBottom": 10,
"textAlign": "left",
},
Object {
"color": "#0d0e12",
},
undefined,
]
}
>
Short Text
</Text>
<View
style={
Object {
"position": "relative",
}
}
>
<TextInput
accessibilityLabel="placeholder"
allowFontScaling={true}
autoCapitalize="none"
autoCorrect={false}
contentDescription="placeholder"
keyboardAppearance="light"
placeholder="placeholder"
placeholderTextColor="#9ca2a8"
rejectResponderTermination={true}
style={
Array [
Object {
"color": "#0d0e12",
},
Array [
Object {
"backgroundColor": "transparent",
"borderRadius": 2,
"borderWidth": 0.5,
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "400",
"height": 48,
"padding": 14,
"textAlign": "left",
},
undefined,
undefined,
Object {
"backgroundColor": "#ffffff",
"borderColor": "#cbcbcc",
"color": "#0d0e12",
},
undefined,
undefined,
],
Object {
"textAlign": "auto",
},
]
}
underlineColorAndroid="transparent"
value="Rocket.Chat"
/>
</View>
</View>
<View
style={
Array [
Object {
"marginBottom": 10,
},
undefined,
]
}
>
<Text
accessibilityLabel={null}
contentDescription={null}
style={
Array [
Object {
"backgroundColor": "transparent",
"fontFamily": "System",
"fontSize": 14,
"fontWeight": "600",
"marginBottom": 10,
"textAlign": "left",
},
Object {
"color": "#0d0e12",
},
undefined,
]
}
>
Long Text
</Text>
<View
style={
Object {
"position": "relative",
}
}
>
<TextInput
accessibilityLabel="placeholder"
allowFontScaling={true}
autoCapitalize="none"
autoCorrect={false}
contentDescription="placeholder"
keyboardAppearance="light"
placeholder="placeholder"
placeholderTextColor="#9ca2a8"
rejectResponderTermination={true}
style={
Array [
Object {
"color": "#0d0e12",
},
Array [
Object {
"backgroundColor": "transparent",
"borderRadius": 2,
"borderWidth": 0.5,
"fontFamily": "System",
"fontSize": 16,
"fontWeight": "400",
"height": 48,
"padding": 14,
"textAlign": "left",
},
undefined,
undefined,
Object {
"backgroundColor": "#ffffff",
"borderColor": "#cbcbcc",
"color": "#0d0e12",
},
undefined,
undefined,
],
Object {
"textAlign": "auto",
},
]
}
underlineColorAndroid="transparent"
value="https://open.rocket.chat/images/logo/android-chrome-512x512.png"
/>
</View>
</View>
</View>
`;
exports[`Storyshots Thread Messages.Item badge 1`] = `
<RCTScrollView>
<View>

View File

@ -144,7 +144,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode VERSIONCODE as Integer
versionName "4.19.0"
versionName "4.20.0"
vectorDrawables.useSupportLibrary = true
if (!isFoss) {
manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String]

View File

@ -18,7 +18,7 @@ buildscript {
supportLibVersion = "28.0.0"
libre_build = !(isPlay.toBoolean())
jitsi_url = isPlay ? "https://github.com/RocketChat/jitsi-maven-repository/raw/master/releases" : "https://github.com/RocketChat/jitsi-maven-repository/raw/libre/releases"
jitsi_version = isPlay ? "2.10.2" : "2.10.0-libre"
jitsi_version = isPlay ? "3.6.0" : "3.6.0-libre"
}
repositories {

View File

@ -53,8 +53,6 @@ export const LOGOUT = 'LOGOUT'; // logout is always success
export const SNIPPETED_MESSAGES = createRequestTypes('SNIPPETED_MESSAGES', ['OPEN', 'READY', 'CLOSE', 'MESSAGES_RECEIVED']);
export const DEEP_LINKING = createRequestTypes('DEEP_LINKING', ['OPEN']);
export const SORT_PREFERENCES = createRequestTypes('SORT_PREFERENCES', ['SET_ALL', 'SET']);
export const TOGGLE_CRASH_REPORT = 'TOGGLE_CRASH_REPORT';
export const TOGGLE_ANALYTICS_EVENTS = 'TOGGLE_ANALYTICS_EVENTS';
export const SET_CUSTOM_EMOJIS = 'SET_CUSTOM_EMOJIS';
export const SET_ACTIVE_USERS = 'SET_ACTIVE_USERS';
export const USERS_TYPING = createRequestTypes('USERS_TYPING', ['ADD', 'REMOVE', 'CLEAR']);

View File

@ -1,15 +0,0 @@
import * as types from './actionsTypes';
export function toggleCrashReport(value) {
return {
type: types.TOGGLE_CRASH_REPORT,
payload: value
};
}
export function toggleAnalyticsEvents(value) {
return {
type: types.TOGGLE_ANALYTICS_EVENTS,
payload: value
};
}

View File

@ -26,7 +26,7 @@ const styles = StyleSheet.create({
...sharedStyles.textRegular,
height: 48,
fontSize: 16,
paddingHorizontal: 14,
padding: 14,
borderWidth: StyleSheet.hairlineWidth,
borderRadius: 2
},

View File

@ -0,0 +1,43 @@
/* eslint-disable import/no-extraneous-dependencies, import/no-unresolved, import/extensions, react/prop-types */
import React from 'react';
import { storiesOf } from '@storybook/react-native';
import { View, StyleSheet } from 'react-native';
import TextInput from './TextInput';
const styles = StyleSheet.create({
paddingHorizontal: {
paddingHorizontal: 14
}
});
const stories = storiesOf('Text Input', module);
const item = {
name: 'Rocket.Chat',
longText: 'https://open.rocket.chat/images/logo/android-chrome-512x512.png'
};
const theme = 'light';
stories.add('Short and Long Text', () => (
<>
<View style={styles.paddingHorizontal}>
<TextInput
label='Short Text'
placeholder='placeholder'
value={item.name}
theme={theme}
/>
<TextInput
label='Long Text'
placeholder='placeholder'
value={item.longText}
theme={theme}
/>
</View>
</>
));

View File

@ -157,7 +157,7 @@ export const MultiSelect = React.memo(({
disabled={disabled}
inputStyle={inputStyle}
>
{items.length ? <Chips items={items} onSelect={onSelect} theme={theme} /> : <Text style={[styles.pickerText, { color: themes[theme].auxiliaryText }]}>{placeholder.text}</Text>}
{items.length ? <Chips items={items} onSelect={item => (disabled ? {} : onSelect(item))} theme={theme} /> : <Text style={[styles.pickerText, { color: themes[theme].auxiliaryText }]}>{placeholder.text}</Text>}
</Input>
);
}

View File

@ -1,11 +1,35 @@
import React from 'react';
import React, { useContext } from 'react';
import { dequal } from 'dequal';
import PropTypes from 'prop-types';
import { Text } from 'react-native';
import Image from './Image';
import Audio from './Audio';
import Video from './Video';
import Reply from './Reply';
import Button from '../Button';
import styles from './styles';
import MessageContext from './Context';
const AttachedActions = ({
attachment, theme
}) => {
const { onAnswerButtonPress } = useContext(MessageContext);
const attachedButtons = attachment.actions.map((element) => {
if (element.type === 'button') {
return <Button theme={theme} onPress={() => onAnswerButtonPress(element.msg)} title={element.text} />;
} else {
return null;
}
});
return (
<>
<Text style={styles.text}>{attachment.text}</Text>
{attachedButtons}
</>
);
};
const Attachments = React.memo(({
attachments, timeFormat, showAttachment, getCustomEmoji, theme
@ -24,6 +48,9 @@ const Attachments = React.memo(({
if (file.video_url) {
return <Video key={file.video_url} file={file} showAttachment={showAttachment} getCustomEmoji={getCustomEmoji} theme={theme} />;
}
if (file.actions && file.actions.length > 0) {
return <AttachedActions attachment={file} theme={theme} />;
}
// eslint-disable-next-line react/no-array-index-key
return <Reply key={index} index={index} attachment={file} timeFormat={timeFormat} getCustomEmoji={getCustomEmoji} theme={theme} />;
@ -38,5 +65,12 @@ Attachments.propTypes = {
theme: PropTypes.string
};
Attachments.displayName = 'MessageAttachments';
AttachedActions.propTypes = {
attachment: PropTypes.shape({
actions: PropTypes.array,
text: PropTypes.string
}),
theme: PropTypes.string
};
export default Attachments;

View File

@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
import moment from 'moment';
import { transparentize } from 'color2k';
import { dequal } from 'dequal';
import FastImage from '@rocket.chat/react-native-fast-image';
import Touchable from './Touchable';
import Markdown from '../markdown';
@ -66,17 +67,29 @@ const styles = StyleSheet.create({
},
marginBottom: {
marginBottom: 4
},
image: {
width: null,
height: 200,
flex: 1,
borderTopLeftRadius: 4,
borderTopRightRadius: 4,
marginBottom: 1
},
title: {
flex: 1,
fontSize: 16,
marginBottom: 3,
...sharedStyles.textMedium
}
});
const Title = React.memo(({ attachment, timeFormat, theme }) => {
if (!attachment.author_name) {
return null;
}
const time = attachment.message_link && attachment.ts ? moment(attachment.ts).format(timeFormat) : null;
return (
<View style={styles.authorContainer}>
{attachment.author_name ? <Text style={[styles.author, { color: themes[theme].bodyText }]}>{attachment.author_name}</Text> : null}
{attachment.title ? <Text style={[styles.title, { color: themes[theme].bodyText }]}>{attachment.title}</Text> : null}
{time ? <Text style={[styles.time, { color: themes[theme].auxiliaryText }]}>{ time }</Text> : null}
</View>
);
@ -112,6 +125,15 @@ const Description = React.memo(({
return true;
});
const UrlImage = React.memo(({ image }) => {
if (!image) {
return null;
}
const { baseUrl, user } = useContext(MessageContext);
image = image.includes('http') ? image : `${ baseUrl }/${ image }?rc_uid=${ user.id }&rc_token=${ user.token }`;
return <FastImage source={{ uri: image }} style={styles.image} resizeMode={FastImage.resizeMode.cover} />;
}, (prevProps, nextProps) => prevProps.image === nextProps.image);
const Fields = React.memo(({ attachment, theme, getCustomEmoji }) => {
if (!attachment.fields) {
return null;
@ -191,6 +213,7 @@ const Reply = React.memo(({
timeFormat={timeFormat}
theme={theme}
/>
<UrlImage image={attachment.thumb_url} />
<Description
attachment={attachment}
getCustomEmoji={getCustomEmoji}
@ -223,6 +246,10 @@ Reply.propTypes = {
};
Reply.displayName = 'MessageReply';
UrlImage.propTypes = {
image: PropTypes.string
};
Title.propTypes = {
attachment: PropTypes.object,
timeFormat: PropTypes.string,

View File

@ -41,6 +41,7 @@ class MessageContainer extends React.Component {
onEncryptedPress: PropTypes.func,
onDiscussionPress: PropTypes.func,
onThreadPress: PropTypes.func,
onAnswerButtonPress: PropTypes.func,
errorActionsShow: PropTypes.func,
replyBroadcast: PropTypes.func,
reactionInit: PropTypes.func,
@ -64,6 +65,7 @@ class MessageContainer extends React.Component {
onEncryptedPress: () => {},
onDiscussionPress: () => {},
onThreadPress: () => {},
onAnswerButtonPress: () => {},
errorActionsShow: () => {},
replyBroadcast: () => {},
reactionInit: () => {},
@ -190,6 +192,13 @@ class MessageContainer extends React.Component {
}
}
onAnswerButtonPress = (msg) => {
const { onAnswerButtonPress } = this.props;
if (onAnswerButtonPress) {
onAnswerButtonPress(msg, undefined, false);
}
}
onIgnoredMessagePress = () => {
this.setState({ isManualUnignored: true });
}
@ -367,6 +376,7 @@ class MessageContainer extends React.Component {
onDiscussionPress: this.onDiscussionPress,
onReactionLongPress: this.onReactionLongPress,
onLinkPress: this.onLinkPress,
onAnswerButtonPress: this.onAnswerButtonPress,
jumpToMessage,
threadBadgeColor,
toggleFollowThread,

View File

@ -763,11 +763,15 @@
"Load_More": "Load More",
"Load_Newer": "Load Newer",
"Load_Older": "Load Older",
"room-name-already-exists": "Room name already exists",
"error-team-creation": "Error team creation",
"unauthorized": "Unauthorized",
"Left_The_Room_Successfully": "Left the room successfully",
"Deleted_The_Team_Successfully": "Team deleted successfully",
"Deleted_The_Room_Successfully": "Room deleted successfully",
"Convert_to_Channel": "Convert to Channel",
"Converting_Team_To_Channel": "Converting Team to Channel",
"Select_Team_Channels_To_Delete": "Select the Teams Channels you would like to delete, the ones you do not select will be moved to the Workspace. \n\nNotice that public Channels will be public and visible to everyone.",
"You_are_converting_the_team": "You are converting this Team to a Channel"
"You_are_converting_the_team": "You are converting this Team to a Channel",
"creating_discussion": "creating discussion"
}

View File

@ -666,6 +666,9 @@
"Left_The_Team_Successfully": "Saiu do time com sucesso",
"Add_Existing_Channel": "Adicionar Canal Existente",
"invalid-room": "Sala inválida",
"room-name-already-exists": "Nome da sala já existe",
"error-team-creation": "Erro na criação do time",
"unauthorized": "Não autorizado",
"Left_The_Room_Successfully": "Saiu da sala com sucesso",
"Deleted_The_Team_Successfully": "Time deletado com sucesso",
"Deleted_The_Room_Successfully": "Sala deletada com sucesso",

View File

@ -19,7 +19,7 @@ import { deepLinkingOpen } from './actions/deepLinking';
import parseQuery from './lib/methods/helpers/parseQuery';
import { initializePushNotifications, onNotification } from './notifications/push';
import store from './lib/createStore';
import { loggerConfig, analytics } from './utils/log';
import { toggleAnalyticsEventsReport, toggleCrashErrorsReport } from './utils/log';
import { ThemeContext } from './theme';
import { DimensionsContext } from './dimensions';
import RocketChat, { THEME_PREFERENCES_KEY } from './lib/rocketchat';
@ -188,11 +188,11 @@ export default class Root extends React.Component {
initCrashReport = () => {
RocketChat.getAllowCrashReport()
.then((allowCrashReport) => {
if (!allowCrashReport) {
loggerConfig.autoNotify = false;
loggerConfig.registerBeforeSendCallback(() => false);
analytics().setAnalyticsCollectionEnabled(false);
}
toggleCrashErrorsReport(allowCrashReport);
});
RocketChat.getAllowAnalyticsEvents()
.then((allowAnalyticsEvents) => {
toggleAnalyticsEventsReport(allowAnalyticsEvents);
});
}

View File

@ -48,7 +48,9 @@ const PERMISSIONS = [
'view-user-administration',
'view-all-teams',
'view-all-team-channels',
'convert-team'
'convert-team',
'edit-omnichannel-contact',
'edit-livechat-room-customfields'
];
export async function setPermissions() {

View File

@ -178,6 +178,7 @@ class Touchable extends React.Component {
toggleRead = () => {
const { toggleRead, rid, isRead } = this.props;
if (toggleRead) {
toggleRead(rid, isRead);
}

View File

@ -8,7 +8,7 @@ const styles = StyleSheet.create({
input: {
...I18nManager.isRTL
? { textAlign: 'right' }
: { textAlign: 'left' }
: { textAlign: 'auto' }
}
});

View File

@ -1,25 +0,0 @@
import { TOGGLE_CRASH_REPORT, TOGGLE_ANALYTICS_EVENTS } from '../actions/actionsTypes';
const initialState = {
allowCrashReport: false,
allowAnalyticsEvents: false
};
export default (state = initialState, action) => {
switch (action.type) {
case TOGGLE_CRASH_REPORT:
return {
...state,
allowCrashReport: action.payload
};
case TOGGLE_ANALYTICS_EVENTS:
return {
...state,
allowAnalyticsEvents: action.payload
};
default:
return state;
}
};

View File

@ -10,7 +10,6 @@ import createChannel from './createChannel';
import app from './app';
import sortPreferences from './sortPreferences';
import share from './share';
import crashReport from './crashReport';
import customEmojis from './customEmojis';
import activeUsers from './activeUsers';
import usersTyping from './usersTyping';
@ -35,7 +34,6 @@ export default combineReducers({
rooms,
sortPreferences,
share,
crashReport,
customEmojis,
activeUsers,
usersTyping,

View File

@ -109,8 +109,23 @@ const handleSuccess = function* handleSuccess({ data }) {
};
const handleFailure = function handleFailure({ err, isTeam }) {
const errorArray = [
'room-name-already-exists',
'error-team-creation',
'unauthorized',
'error-duplicate-channel-name',
'error-invalid-room-name',
'team-name-already-exists'
];
setTimeout(() => {
const msg = err.data.errorType ? I18n.t(err.data.errorType, { room_name: err.data.details.channel_name }) : err.reason || I18n.t('There_was_an_error_while_action', { action: isTeam ? I18n.t('creating_team') : I18n.t('creating_channel') });
let msg = '';
const actionError = I18n.t('There_was_an_error_while_action', { action: isTeam ? I18n.t('creating_team') : I18n.t('creating_channel') });
if (err?.data?.errorType && err?.data?.details?.channel_name) {
msg = errorArray.includes(err.data.errorType) ? I18n.t(err.data.errorType, { room_name: err.data.details.channel_name }) : actionError;
} else {
msg = err?.reason || (errorArray.includes(err?.data?.error) ? I18n.t(err.data.error) : err.data.error || actionError);
}
showErrorAlert(msg, isTeam ? I18n.t('Create_Team') : I18n.t('Create_Channel'));
}, 300);
};

View File

@ -4,7 +4,6 @@ import RNBootSplash from 'react-native-bootsplash';
import UserPreferences from '../lib/userPreferences';
import { selectServerRequest } from '../actions/server';
import { setAllPreferences } from '../actions/sortPreferences';
import { toggleCrashReport, toggleAnalyticsEvents } from '../actions/crashReport';
import { APP } from '../actions/actionsTypes';
import RocketChat from '../lib/rocketchat';
import log from '../utils/log';
@ -15,12 +14,6 @@ import { appStart, ROOT_OUTSIDE, appReady } from '../actions/app';
export const initLocalSettings = function* initLocalSettings() {
const sortPreferences = yield RocketChat.getSortPreferences();
yield put(setAllPreferences(sortPreferences));
const allowCrashReport = yield RocketChat.getAllowCrashReport();
yield put(toggleCrashReport(allowCrashReport));
const allowAnalyticsEvents = yield RocketChat.getAllowAnalyticsEvents();
yield put(toggleAnalyticsEvents(allowAnalyticsEvents));
};
const restore = function* restore() {

View File

@ -5,10 +5,24 @@ import events from './events';
const analytics = firebaseAnalytics || '';
let bugsnag = '';
let crashlytics;
let reportCrashErrors = true;
let reportAnalyticsEvents = true;
export const getReportCrashErrorsValue = () => reportCrashErrors;
export const getReportAnalyticsEventsValue = () => reportAnalyticsEvents;
if (!isFDroidBuild) {
bugsnag = require('@bugsnag/react-native').default;
bugsnag.start();
bugsnag.start({
onBreadcrumb() {
return reportAnalyticsEvents;
},
onError(error) {
if (!reportAnalyticsEvents) { error.breadcrumbs = []; }
return reportCrashErrors;
}
});
crashlytics = require('@react-native-firebase/crashlytics').default;
}
@ -42,6 +56,16 @@ export const setCurrentScreen = (currentScreen) => {
}
};
export const toggleCrashErrorsReport = (value) => {
crashlytics().setCrashlyticsCollectionEnabled(value);
return reportCrashErrors = value;
};
export const toggleAnalyticsEventsReport = (value) => {
analytics().setAnalyticsCollectionEnabled(value);
return reportAnalyticsEvents = value;
};
export default (e) => {
if (e instanceof Error && bugsnag && e.message !== 'Aborted' && !__DEV__) {
bugsnag.notify(e, (event) => {

View File

@ -74,7 +74,7 @@ class CreateChannelView extends React.Component {
if (!loading && loading !== prevProps.loading) {
setTimeout(() => {
if (failure) {
const msg = error.reason || I18n.t('There_was_an_error_while_action', { action: I18n.t('creating_channel') });
const msg = error.reason || I18n.t('There_was_an_error_while_action', { action: I18n.t('creating_discussion') });
showErrorAlert(msg);
} else {
const { rid, t, prid } = result;

View File

@ -1,4 +1,5 @@
import React from 'react';
import { StyleSheet } from 'react-native';
import PropTypes from 'prop-types';
import JitsiMeet, { JitsiMeetView as RNJitsiMeetView } from 'react-native-jitsi-meet';
import BackgroundTimer from 'react-native-background-timer';
@ -6,9 +7,10 @@ import { connect } from 'react-redux';
import RocketChat from '../lib/rocketchat';
import { getUserSelector } from '../selectors/login';
import sharedStyles from './Styles';
import ActivityIndicator from '../containers/ActivityIndicator';
import { logEvent, events } from '../utils/log';
import { isAndroid, isIOS } from '../utils/deviceInfo';
import { withTheme } from '../theme';
const formatUrl = (url, baseUrl, uriSize, avatarAuthURLFragment) => (
`${ baseUrl }/avatar/${ url }?format=png&width=${ uriSize }&height=${ uriSize }${ avatarAuthURLFragment }`
@ -19,6 +21,7 @@ class JitsiMeetView extends React.Component {
navigation: PropTypes.object,
route: PropTypes.object,
baseUrl: PropTypes.string,
theme: PropTypes.string,
user: PropTypes.shape({
id: PropTypes.string,
username: PropTypes.string,
@ -30,43 +33,54 @@ class JitsiMeetView extends React.Component {
constructor(props) {
super(props);
this.rid = props.route.params?.rid;
this.onConferenceTerminated = this.onConferenceTerminated.bind(this);
this.onConferenceJoined = this.onConferenceJoined.bind(this);
this.url = props.route.params?.url;
this.jitsiTimeout = null;
}
componentDidMount() {
const { route, user, baseUrl } = this.props;
const { user, baseUrl } = props;
const {
name: displayName, id: userId, token, username
} = user;
const avatarAuthURLFragment = `&rc_token=${ token }&rc_uid=${ userId }`;
const avatar = formatUrl(username, baseUrl, 100, avatarAuthURLFragment);
setTimeout(() => {
const userInfo = {
this.state = {
userInfo: {
displayName,
avatar
};
const url = route.params?.url;
const onlyAudio = route.params?.onlyAudio ?? false;
if (onlyAudio) {
JitsiMeet.audioCall(url, userInfo);
} else {
JitsiMeet.call(url, userInfo);
}
}, 1000);
},
loading: true
};
}
componentDidMount() {
const { route } = this.props;
const { userInfo } = this.state;
if (isIOS) {
setTimeout(() => {
const onlyAudio = route.params?.onlyAudio ?? false;
if (onlyAudio) {
JitsiMeet.audioCall(this.url, userInfo);
} else {
JitsiMeet.call(this.url, userInfo);
}
}, 1000);
}
}
componentWillUnmount() {
logEvent(events.JM_CONFERENCE_TERMINATE);
if (this.jitsiTimeout) {
BackgroundTimer.clearInterval(this.jitsiTimeout);
this.jitsiTimeout = null;
BackgroundTimer.stopBackgroundTimer();
}
JitsiMeet.endCall();
}
onConferenceWillJoin = () => {
this.setState({ loading: false });
}
// Jitsi Update Timeout needs to be called every 10 seconds to make sure
// call is not ended and is available to web users.
onConferenceJoined = () => {
@ -74,6 +88,8 @@ class JitsiMeetView extends React.Component {
RocketChat.updateJitsiTimeout(this.rid).catch(e => console.log(e));
if (this.jitsiTimeout) {
BackgroundTimer.clearInterval(this.jitsiTimeout);
BackgroundTimer.stopBackgroundTimer();
this.jitsiTimeout = null;
}
this.jitsiTimeout = BackgroundTimer.setInterval(() => {
RocketChat.updateJitsiTimeout(this.rid).catch(e => console.log(e));
@ -83,19 +99,25 @@ class JitsiMeetView extends React.Component {
onConferenceTerminated = () => {
logEvent(events.JM_CONFERENCE_TERMINATE);
const { navigation } = this.props;
if (this.jitsiTimeout) {
BackgroundTimer.clearInterval(this.jitsiTimeout);
}
navigation.pop();
}
render() {
const { userInfo, loading } = this.state;
const { route, theme } = this.props;
const onlyAudio = route.params?.onlyAudio ?? false;
const options = isAndroid ? { url: this.url, userInfo, audioOnly: onlyAudio } : null;
return (
<RNJitsiMeetView
onConferenceTerminated={this.onConferenceTerminated}
onConferenceJoined={this.onConferenceJoined}
style={sharedStyles.container}
/>
<>
<RNJitsiMeetView
onConferenceWillJoin={this.onConferenceWillJoin}
onConferenceTerminated={this.onConferenceTerminated}
onConferenceJoined={this.onConferenceJoined}
style={StyleSheet.absoluteFill}
options={options}
/>
{loading ? <ActivityIndicator theme={theme} /> : null}
</>
);
}
}
@ -105,4 +127,4 @@ const mapStateToProps = state => ({
baseUrl: state.server.server
});
export default connect(mapStateToProps)(JitsiMeetView);
export default connect(mapStateToProps)(withTheme(JitsiMeetView));

View File

@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import { Text, StyleSheet, ScrollView } from 'react-native';
import { connect } from 'react-redux';
import { BLOCK_CONTEXT } from '@rocket.chat/ui-kit';
import { withTheme } from '../theme';
import { themes } from '../constants/colors';
@ -15,9 +16,9 @@ import { LISTENER } from '../containers/Toast';
import EventEmitter from '../utils/events';
import scrollPersistTaps from '../utils/scrollPersistTaps';
import { getUserSelector } from '../selectors/login';
import Chips from '../containers/UIKit/MultiSelect/Chips';
import Button from '../containers/Button';
import SafeAreaView from '../containers/SafeAreaView';
import { MultiSelect } from '../containers/UIKit/MultiSelect';
const styles = StyleSheet.create({
container: {
@ -27,6 +28,14 @@ const styles = StyleSheet.create({
fontSize: 20,
paddingVertical: 10,
...sharedStyles.textMedium
},
label: {
marginBottom: 10,
fontSize: 14,
...sharedStyles.textSemibold
},
multiSelect: {
marginBottom: 10
}
});
@ -37,10 +46,11 @@ Title.propTypes = {
};
const LivechatEditView = ({
user, navigation, route, theme
user, navigation, route, theme, editOmnichannelContact, editLivechatRoomCustomfields
}) => {
const [customFields, setCustomFields] = useState({});
const [availableUserTags, setAvailableUserTags] = useState([]);
const [permissions, setPermissions] = useState([]);
const params = {};
const inputs = {};
@ -54,21 +64,24 @@ const LivechatEditView = ({
const visitorCustomFields = result.customFields
.filter(field => field.visibility !== 'hidden' && field.scope === 'visitor')
.map(field => ({ [field._id]: (visitor.livechatData && visitor.livechatData[field._id]) || '' }))
.reduce((ret, field) => ({ [field]: field, ...ret }));
.reduce((ret, field) => ({ ...field, ...ret }));
const livechatCustomFields = result.customFields
.filter(field => field.visibility !== 'hidden' && field.scope === 'room')
.map(field => ({ [field._id]: (livechat.livechatData && livechat.livechatData[field._id]) || '' }))
.reduce((ret, field) => ({ [field]: field, ...ret }));
.reduce((ret, field) => ({ ...field, ...ret }));
return setCustomFields({ visitor: visitorCustomFields, livechat: livechatCustomFields });
}
};
const [tagParam, setTags] = useState(livechat?.tags || []);
const [tagParamSelected, setTagParamSelected] = useState(livechat?.tags || []);
useEffect(() => {
setTags([...tagParam, ...availableUserTags]);
const arr = [...tagParam, ...availableUserTags];
const uniqueArray = arr.filter((val, i) => arr.indexOf(val) === i);
setTags(uniqueArray);
}, [availableUserTags]);
const getTagsList = async(agentDepartments) => {
@ -115,7 +128,7 @@ const LivechatEditView = ({
roomData.topic = params.topic;
}
roomData.tags = tagParam;
roomData.tags = tagParamSelected;
roomData.livechatData = {};
Object.entries(customFields?.livechat || {}).forEach(([key]) => {
@ -139,9 +152,15 @@ const LivechatEditView = ({
const onChangeText = (key, text) => { params[key] = text; };
const getPermissions = async() => {
const permissionsArray = await RocketChat.hasPermission([editOmnichannelContact, editLivechatRoomCustomfields], livechat.rid);
setPermissions(permissionsArray);
};
useEffect(() => {
getAgentDepartments();
getCustomFields();
getPermissions();
}, []);
return (
@ -162,6 +181,7 @@ const LivechatEditView = ({
onChangeText={text => onChangeText('name', text)}
onSubmitEditing={() => { inputs.name.focus(); }}
theme={theme}
editable={!!permissions[0]}
/>
<TextInput
label={I18n.t('Email')}
@ -170,6 +190,7 @@ const LivechatEditView = ({
onChangeText={text => onChangeText('email', text)}
onSubmitEditing={() => { inputs.phone.focus(); }}
theme={theme}
editable={!!permissions[0]}
/>
<TextInput
label={I18n.t('Phone')}
@ -179,13 +200,14 @@ const LivechatEditView = ({
onSubmitEditing={() => {
const keys = Object.keys(customFields?.visitor || {});
if (keys.length > 0) {
const key = keys.pop();
const key = keys[0];
inputs[key].focus();
} else {
inputs.topic.focus();
}
}}
theme={theme}
editable={!!permissions[0]}
/>
{Object.entries(customFields?.visitor || {}).map(([key, value], index, array) => (
<TextInput
@ -195,11 +217,12 @@ const LivechatEditView = ({
onChangeText={text => onChangeText(key, text)}
onSubmitEditing={() => {
if (array.length - 1 > index) {
return inputs[array[index + 1]].focus();
return inputs[array[index + 1][0]].focus();
}
inputs.topic.focus();
}}
theme={theme}
editable={!!permissions[0]}
/>
))}
<Title
@ -213,35 +236,29 @@ const LivechatEditView = ({
onChangeText={text => onChangeText('topic', text)}
onSubmitEditing={() => inputs.tags.focus()}
theme={theme}
editable={!!permissions[1]}
/>
<TextInput
inputRef={(e) => { inputs.tags = e; }}
label={I18n.t('Tags')}
iconRight='add'
onIconRightPress={() => {
const lastText = inputs.tags._lastNativeText || '';
if (lastText.length) {
setTags([...tagParam.filter(t => t !== lastText), lastText]);
inputs.tags.clear();
}
}}
onSubmitEditing={() => {
const keys = Object.keys(customFields?.livechat || {});
if (keys.length > 0) {
const key = keys.pop();
inputs[key].focus();
} else {
submit();
}
<Text
style={[
styles.label,
{ color: themes[theme].titleText }
]}
>
{ I18n.t('Tags') }
</Text>
<MultiSelect
options={tagParam.map(tag => ({ text: { text: tag }, value: tag }))}
onChange={({ value }) => {
setTagParamSelected([...value]);
}}
placeholder={{ text: I18n.t('Tags') }}
value={tagParamSelected}
context={BLOCK_CONTEXT.FORM}
multiselect
theme={theme}
/>
<Chips
items={tagParam.map(tag => ({ text: { text: tag }, value: tag }))}
onSelect={tag => setTags(tagParam.filter(t => t !== tag.value) || [])}
style={{ backgroundColor: themes[theme].backgroundColor }}
theme={theme}
disabled={!permissions[1]}
inputStyle={styles.multiSelect}
/>
{Object.entries(customFields?.livechat || {}).map(([key, value], index, array) => (
@ -257,6 +274,7 @@ const LivechatEditView = ({
submit();
}}
theme={theme}
editable={!!permissions[1]}
/>
))}
@ -274,15 +292,19 @@ LivechatEditView.propTypes = {
user: PropTypes.object,
navigation: PropTypes.object,
route: PropTypes.object,
theme: PropTypes.string
theme: PropTypes.string,
editOmnichannelContact: PropTypes.array,
editLivechatRoomCustomfields: PropTypes.array
};
LivechatEditView.navigationOptions = ({
title: I18n.t('Livechat_edit')
title: I18n.t('Edit')
});
const mapStateToProps = state => ({
server: state.server.server,
user: getUserSelector(state)
user: getUserSelector(state),
editOmnichannelContact: state.permissions['edit-omnichannel-contact'],
editLivechatRoomCustomfields: state.permissions['edit-livechat-room-customfields']
});
export default connect(mapStateToProps)(withTheme(LivechatEditView));

View File

@ -55,6 +55,8 @@ class RoomInfoView extends React.Component {
isMasterDetail: PropTypes.bool,
jitsiEnabled: PropTypes.bool,
editRoomPermission: PropTypes.array,
editOmnichannelContact: PropTypes.array,
editLivechatRoomCustomfields: PropTypes.array,
roles: PropTypes.array
}
@ -184,7 +186,9 @@ class RoomInfoView extends React.Component {
loadRoom = async() => {
const { room: roomState } = this.state;
const { route, editRoomPermission } = this.props;
const {
route, editRoomPermission, editOmnichannelContact, editLivechatRoomCustomfields
} = this.props;
let room = route.params?.room;
if (room && room.observe) {
this.roomObservable = room.observe();
@ -204,8 +208,10 @@ class RoomInfoView extends React.Component {
}
}
const permissions = await RocketChat.hasPermission([editRoomPermission], room.rid);
if (permissions[0]) {
const permissionToEdit = this.isLivechat ? [editOmnichannelContact, editLivechatRoomCustomfields] : [editRoomPermission];
const permissions = await RocketChat.hasPermission(permissionToEdit, room.rid);
if (permissions.some(Boolean)) {
this.setState({ showEdit: true }, () => this.setHeader());
}
}
@ -370,6 +376,8 @@ const mapStateToProps = state => ({
isMasterDetail: state.app.isMasterDetail,
jitsiEnabled: state.settings.Jitsi_Enabled || false,
editRoomPermission: state.permissions['edit-room'],
editOmnichannelContact: state.permissions['edit-omnichannel-contact'],
editLivechatRoomCustomfields: state.permissions['edit-livechat-room-customfields'],
roles: state.roles
});

View File

@ -739,7 +739,7 @@ class RoomView extends React.Component {
const { room } = this.state;
if (rid === this.rid) {
Navigation.navigate('RoomsListView');
showErrorAlert(I18n.t('You_were_removed_from_channel', { channel: RocketChat.getRoomTitle(room) }), I18n.t('Oops'));
!this.isOmnichannel && showErrorAlert(I18n.t('You_were_removed_from_channel', { channel: RocketChat.getRoomTitle(room) }), I18n.t('Oops'));
}
}
@ -786,6 +786,7 @@ class RoomView extends React.Component {
if (this.isOmnichannel) {
await takeInquiry(room._id);
this.onJoin();
} else {
const { joinCodeRequired } = room;
if (joinCodeRequired) {
@ -973,6 +974,7 @@ class RoomView extends React.Component {
onEncryptedPress={this.onEncryptedPress}
onDiscussionPress={this.onDiscussionPress}
onThreadPress={this.onThreadPress}
onAnswerButtonPress={this.sendMessage}
showAttachment={this.showAttachment}
reactionInit={this.onReactionInit}
replyBroadcast={this.replyBroadcast}

View File

@ -637,6 +637,7 @@ class RoomsListView extends React.Component {
try {
const db = database.active;
const result = await RocketChat.toggleRead(isRead, rid);
if (result.success) {
const subCollection = db.get('subscriptions');
await db.action(async() => {
@ -644,6 +645,7 @@ class RoomsListView extends React.Component {
const subRecord = await subCollection.find(rid);
await subRecord.update((sub) => {
sub.alert = isRead;
sub.unread = 0;
});
} catch (e) {
log(e);

View File

@ -1,158 +1,119 @@
import React from 'react';
import React, { useEffect, useState } from 'react';
import { Switch } from 'react-native';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import AsyncStorage from '@react-native-community/async-storage';
import { useSelector } from 'react-redux';
import { toggleCrashReport as toggleCrashReportAction, toggleAnalyticsEvents as toggleAnalyticsEventsAction } from '../actions/crashReport';
import { SWITCH_TRACK_COLOR } from '../constants/colors';
import StatusBar from '../containers/StatusBar';
import * as List from '../containers/List';
import I18n from '../i18n';
import { CRASH_REPORT_KEY, ANALYTICS_EVENTS_KEY } from '../lib/rocketchat';
import {
loggerConfig, analytics, logEvent, events
logEvent, events, toggleCrashErrorsReport, toggleAnalyticsEventsReport, getReportCrashErrorsValue, getReportAnalyticsEventsValue
} from '../utils/log';
import SafeAreaView from '../containers/SafeAreaView';
import { isFDroidBuild } from '../constants/environment';
import { getUserSelector } from '../selectors/login';
class SecurityPrivacyView extends React.Component {
static navigationOptions = () => ({
title: I18n.t('Security_and_privacy')
});
const SecurityPrivacyView = ({ navigation }) => {
const [crashReportState, setCrashReportState] = useState(getReportCrashErrorsValue());
const [analyticsEventsState, setAnalyticsEventsState] = useState(getReportAnalyticsEventsValue());
static propTypes = {
navigation: PropTypes.object,
allowCrashReport: PropTypes.bool,
allowAnalyticsEvents: PropTypes.bool,
e2eEnabled: PropTypes.bool,
toggleCrashReport: PropTypes.func,
toggleAnalyticsEvents: PropTypes.func,
user: PropTypes.shape({
roles: PropTypes.array,
id: PropTypes.string
})
}
const e2eEnabled = useSelector(state => state.settings.E2E_Enable);
toggleCrashReport = (value) => {
useEffect(() => {
navigation.setOptions({
title: I18n.t('Security_and_privacy')
});
}, []);
const toggleCrashReport = (value) => {
logEvent(events.SE_TOGGLE_CRASH_REPORT);
AsyncStorage.setItem(CRASH_REPORT_KEY, JSON.stringify(value));
const { toggleCrashReport } = this.props;
toggleCrashReport(value);
if (!isFDroidBuild) {
loggerConfig.autoNotify = value;
if (value) {
loggerConfig.clearBeforeSendCallbacks();
} else {
loggerConfig.registerBeforeSendCallback(() => false);
}
}
}
setCrashReportState(value);
toggleCrashErrorsReport(value);
};
toggleAnalyticsEvents = (value) => {
const toggleAnalyticsEvents = (value) => {
logEvent(events.SE_TOGGLE_ANALYTICS_EVENTS);
const { toggleAnalyticsEvents } = this.props;
AsyncStorage.setItem(ANALYTICS_EVENTS_KEY, JSON.stringify(value));
toggleAnalyticsEvents(value);
analytics().setAnalyticsCollectionEnabled(value);
}
setAnalyticsEventsState(value);
toggleAnalyticsEventsReport(value);
};
navigateToScreen = (screen) => {
const navigateToScreen = (screen) => {
logEvent(events[`SP_GO_${ screen.replace('View', '').toUpperCase() }`]);
const { navigation } = this.props;
navigation.navigate(screen);
}
};
renderCrashReportSwitch = () => {
const { allowCrashReport } = this.props;
return (
<Switch
value={allowCrashReport}
trackColor={SWITCH_TRACK_COLOR}
onValueChange={this.toggleCrashReport}
/>
);
}
return (
<SafeAreaView testID='security-privacy-view'>
<StatusBar />
<List.Container testID='security-privacy-view-list'>
<List.Section>
<List.Separator />
{e2eEnabled
? (
<>
<List.Item
title='E2E_Encryption'
showActionIndicator
onPress={() => navigateToScreen('E2EEncryptionSecurityView')}
testID='security-privacy-view-e2e-encryption'
/>
<List.Separator />
</>
)
: null
}
<List.Item
title='Screen_lock'
showActionIndicator
onPress={() => navigateToScreen('ScreenLockConfigView')}
testID='security-privacy-view-screen-lock'
/>
<List.Separator />
</List.Section>
renderAnalyticsEventsSwitch = () => {
const { allowAnalyticsEvents } = this.props;
return (
<Switch
value={allowAnalyticsEvents}
trackColor={SWITCH_TRACK_COLOR}
onValueChange={this.toggleAnalyticsEvents}
/>
);
}
render() {
const { e2eEnabled } = this.props;
return (
<SafeAreaView testID='security-privacy-view'>
<StatusBar />
<List.Container testID='security-privacy-view-list'>
<List.Section>
<List.Separator />
{e2eEnabled
? (
<>
<List.Item
title='E2E_Encryption'
showActionIndicator
onPress={() => this.navigateToScreen('E2EEncryptionSecurityView')}
testID='security-privacy-view-e2e-encryption'
{!isFDroidBuild ? (
<>
<List.Section>
<List.Separator />
<List.Item
title='Log_analytics_events'
testID='security-privacy-view-analytics-events'
right={() => (
<Switch
value={analyticsEventsState}
trackColor={SWITCH_TRACK_COLOR}
onValueChange={toggleAnalyticsEvents}
/>
<List.Separator />
</>
)
: null
}
<List.Item
title='Screen_lock'
showActionIndicator
onPress={() => this.navigateToScreen('ScreenLockConfigView')}
testID='security-privacy-view-screen-lock'
/>
<List.Separator />
</List.Section>
)}
/>
<List.Separator />
<List.Item
title='Send_crash_report'
testID='security-privacy-view-crash-report'
right={() => (
<Switch
value={crashReportState}
trackColor={SWITCH_TRACK_COLOR}
onValueChange={toggleCrashReport}
/>
)}
/>
<List.Separator />
<List.Info info='Crash_report_disclaimer' />
</List.Section>
</>
) : null}
</List.Container>
</SafeAreaView>
);
};
{!isFDroidBuild ? (
<>
<List.Section>
<List.Separator />
<List.Item
title='Log_analytics_events'
testID='security-privacy-view-analytics-events'
right={() => this.renderAnalyticsEventsSwitch()}
/>
<List.Separator />
<List.Item
title='Send_crash_report'
testID='security-privacy-view-crash-report'
right={() => this.renderCrashReportSwitch()}
/>
<List.Separator />
<List.Info info='Crash_report_disclaimer' />
</List.Section>
</>
) : null}
</List.Container>
</SafeAreaView>
);
}
}
SecurityPrivacyView.propTypes = {
navigation: PropTypes.object
};
const mapStateToProps = state => ({
user: getUserSelector(state),
allowCrashReport: state.crashReport.allowCrashReport,
allowAnalyticsEvents: state.crashReport.allowAnalyticsEvents,
e2eEnabled: state.settings.E2E_Enable
});
const mapDispatchToProps = dispatch => ({
toggleCrashReport: params => dispatch(toggleCrashReportAction(params)),
toggleAnalyticsEvents: params => dispatch(toggleAnalyticsEventsAction(params))
});
export default connect(mapStateToProps, mapDispatchToProps)(SecurityPrivacyView);
export default SecurityPrivacyView;

View File

@ -160,7 +160,7 @@ PODS:
- GoogleUtilities/UserDefaults (6.7.1):
- GoogleUtilities/Logger
- hermes-engine (0.7.2)
- JitsiMeetSDK (2.10.2)
- JitsiMeetSDK (3.6.0)
- KeyCommands (2.0.3):
- React
- libevent (2.1.12)
@ -403,8 +403,8 @@ PODS:
- React-Core
- react-native-document-picker (5.2.0):
- React-Core
- react-native-jitsi-meet (2.4.0):
- JitsiMeetSDK
- react-native-jitsi-meet (3.6.0):
- JitsiMeetSDK (= 3.6.0)
- React
- react-native-mmkv-storage (0.3.5):
- MMKV (= 1.2.1)
@ -413,8 +413,8 @@ PODS:
- React-Core
- react-native-notifications (2.1.7):
- React
- react-native-orientation-locker (1.3.1):
- React-Core
- react-native-orientation-locker (1.1.8):
- React
- react-native-restart (0.0.22):
- React-Core
- react-native-safe-area-context (3.2.0):
@ -920,7 +920,7 @@ EXTERNAL SOURCES:
CHECKOUT OPTIONS:
JitsiMeetSDK:
:commit: 34660a3a34798fe28fcfd340f9ad30184b9fa0d1
:commit: 23797290da02324c09998a63781cd1fe0047211d
:git: https://github.com/RocketChat/jitsi-meet-ios-sdk-releases.git
SPEC CHECKSUMS:
@ -960,7 +960,7 @@ SPEC CHECKSUMS:
GoogleDataTransportCCTSupport: 489c1265d2c85b68187a83a911913d190012158d
GoogleUtilities: e121a3867449ce16b0e35ddf1797ea7a389ffdf2
hermes-engine: 7d97ba46a1e29bacf3e3c61ecb2804a5ddd02d4f
JitsiMeetSDK: ef6dd5cfa6d9badf009c7dba1a2c1365bfaae6b0
JitsiMeetSDK: 476329f72a866f714d2802bafe1729de6d644ccf
KeyCommands: f66c535f698ed14b3d3a4e58859d79a827ea907e
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
libwebp: 946cb3063cea9236285f7e9a8505d806d30e07f3
@ -986,11 +986,11 @@ SPEC CHECKSUMS:
react-native-cameraroll: 88f4e62d9ecd0e1f253abe4f685474f2ea14bfa2
react-native-cookies: 2cb6ef472da68610dfcf0eaee68464c244943abd
react-native-document-picker: f1b5398801b332c77bc62ae0eae2116f49bdff26
react-native-jitsi-meet: f2407aca85566e031ee7b222e497ee5ecb6623de
react-native-jitsi-meet: 3e3ac5d0445091154119f94342efd55c8b1124ce
react-native-mmkv-storage: 48729fe90e850ef2fdc9d3714b7030c7c51d82b0
react-native-netinfo: e849fc21ca2f4128a5726c801a82fc6f4a6db50d
react-native-notifications: ee8fd739853e72694f3af8b374c8ccb106b7b227
react-native-orientation-locker: 998c0744e26624407dac068c04c605b4af7304a2
react-native-orientation-locker: f0ca1a8e5031dab6b74bfb4ab33a17ed2c2fcb0d
react-native-restart: 733a51ad137f15b0f8dc34c4082e55af7da00979
react-native-safe-area-context: f0906bf8bc9835ac9a9d3f97e8bde2a997d8da79
react-native-simple-crypto: 9b358cdfd34169031d384a8d4ac2ffc40b323876

View File

@ -1,6 +1,6 @@
{
"name": "react-native-orientation-locker",
"version": "1.3.1",
"version": "1.1.8",
"summary": "A react-native module that can listen on orientation changing of device",
"description": "A react-native module that can listen on orientation changing of device, get current orientation, lock to preferred orientation.",
"authors": "Wonday",
@ -8,7 +8,7 @@
"homepage": "https://github.com/wonday/react-native-orientation-locker",
"source": {
"git": "https://github.com/wonday/react-native-orientation-locker.git",
"tag": "v1.3.1"
"tag": "v1.1.8"
},
"requires_arc": true,
"platforms": {
@ -22,7 +22,7 @@
],
"source_files": "iOS/**/*.{h,m}",
"dependencies": {
"React-Core": [
"React": [
]
}

18
ios/Pods/Manifest.lock generated
View File

@ -160,7 +160,7 @@ PODS:
- GoogleUtilities/UserDefaults (6.7.1):
- GoogleUtilities/Logger
- hermes-engine (0.7.2)
- JitsiMeetSDK (2.10.2)
- JitsiMeetSDK (3.6.0)
- KeyCommands (2.0.3):
- React
- libevent (2.1.12)
@ -403,8 +403,8 @@ PODS:
- React-Core
- react-native-document-picker (5.2.0):
- React-Core
- react-native-jitsi-meet (2.4.0):
- JitsiMeetSDK
- react-native-jitsi-meet (3.6.0):
- JitsiMeetSDK (= 3.6.0)
- React
- react-native-mmkv-storage (0.3.5):
- MMKV (= 1.2.1)
@ -413,8 +413,8 @@ PODS:
- React-Core
- react-native-notifications (2.1.7):
- React
- react-native-orientation-locker (1.3.1):
- React-Core
- react-native-orientation-locker (1.1.8):
- React
- react-native-restart (0.0.22):
- React-Core
- react-native-safe-area-context (3.2.0):
@ -920,7 +920,7 @@ EXTERNAL SOURCES:
CHECKOUT OPTIONS:
JitsiMeetSDK:
:commit: 34660a3a34798fe28fcfd340f9ad30184b9fa0d1
:commit: 23797290da02324c09998a63781cd1fe0047211d
:git: https://github.com/RocketChat/jitsi-meet-ios-sdk-releases.git
SPEC CHECKSUMS:
@ -960,7 +960,7 @@ SPEC CHECKSUMS:
GoogleDataTransportCCTSupport: 489c1265d2c85b68187a83a911913d190012158d
GoogleUtilities: e121a3867449ce16b0e35ddf1797ea7a389ffdf2
hermes-engine: 7d97ba46a1e29bacf3e3c61ecb2804a5ddd02d4f
JitsiMeetSDK: ef6dd5cfa6d9badf009c7dba1a2c1365bfaae6b0
JitsiMeetSDK: 476329f72a866f714d2802bafe1729de6d644ccf
KeyCommands: f66c535f698ed14b3d3a4e58859d79a827ea907e
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
libwebp: 946cb3063cea9236285f7e9a8505d806d30e07f3
@ -986,11 +986,11 @@ SPEC CHECKSUMS:
react-native-cameraroll: 88f4e62d9ecd0e1f253abe4f685474f2ea14bfa2
react-native-cookies: 2cb6ef472da68610dfcf0eaee68464c244943abd
react-native-document-picker: f1b5398801b332c77bc62ae0eae2116f49bdff26
react-native-jitsi-meet: f2407aca85566e031ee7b222e497ee5ecb6623de
react-native-jitsi-meet: 3e3ac5d0445091154119f94342efd55c8b1124ce
react-native-mmkv-storage: 48729fe90e850ef2fdc9d3714b7030c7c51d82b0
react-native-netinfo: e849fc21ca2f4128a5726c801a82fc6f4a6db50d
react-native-notifications: ee8fd739853e72694f3af8b374c8ccb106b7b227
react-native-orientation-locker: 998c0744e26624407dac068c04c605b4af7304a2
react-native-orientation-locker: f0ca1a8e5031dab6b74bfb4ab33a17ed2c2fcb0d
react-native-restart: 733a51ad137f15b0f8dc34c4082e55af7da00979
react-native-safe-area-context: f0906bf8bc9835ac9a9d3f97e8bde2a997d8da79
react-native-simple-crypto: 9b358cdfd34169031d384a8d4ac2ffc40b323876

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,8 @@
APPLICATION_EXTENSION_API_ONLY = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JitsiMeetSDK
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JitsiMeetSDK/Frameworks"
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JitsiMeetSDK/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiMeetSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

@ -1,7 +1,8 @@
APPLICATION_EXTENSION_API_ONLY = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JitsiMeetSDK
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JitsiMeetSDK/Frameworks"
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JitsiMeetSDK/Frameworks" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiMeetSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

@ -175,15 +175,15 @@ code_sign_if_enabled() {
}
if [[ "$CONFIGURATION" == "Debug" ]]; then
install_framework "${PODS_ROOT}/JitsiMeetSDK/Frameworks/JitsiMeet.framework"
install_framework "${PODS_ROOT}/JitsiMeetSDK/Frameworks/WebRTC.framework"
install_framework "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos/hermes.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiMeetSDK/JitsiMeetSDK.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC/WebRTC.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework"
fi
if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "${PODS_ROOT}/JitsiMeetSDK/Frameworks/JitsiMeet.framework"
install_framework "${PODS_ROOT}/JitsiMeetSDK/Frameworks/WebRTC.framework"
install_framework "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos/hermes.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiMeetSDK/JitsiMeetSDK.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC/WebRTC.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework"
fi
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -175,15 +175,15 @@ code_sign_if_enabled() {
}
if [[ "$CONFIGURATION" == "Debug" ]]; then
install_framework "${PODS_ROOT}/JitsiMeetSDK/Frameworks/JitsiMeet.framework"
install_framework "${PODS_ROOT}/JitsiMeetSDK/Frameworks/WebRTC.framework"
install_framework "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos/hermes.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiMeetSDK/JitsiMeetSDK.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC/WebRTC.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework"
fi
if [[ "$CONFIGURATION" == "Release" ]]; then
install_framework "${PODS_ROOT}/JitsiMeetSDK/Frameworks/JitsiMeet.framework"
install_framework "${PODS_ROOT}/JitsiMeetSDK/Frameworks/WebRTC.framework"
install_framework "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos/hermes.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiMeetSDK/JitsiMeetSDK.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC/WebRTC.framework"
install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework"
fi
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
APPLICATION_EXTENSION_API_ONLY = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/react-native-jitsi-meet
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JitsiMeetSDK/Frameworks" "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos"
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JitsiMeetSDK/Frameworks" "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiMeetSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/react-native-jitsi-meet" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/DoubleConversion" "${PODS_ROOT}/Headers/Public/FBLazyVector" "${PODS_ROOT}/Headers/Public/FBReactNativeSpec" "${PODS_ROOT}/Headers/Public/RCT-Folly" "${PODS_ROOT}/Headers/Public/RCTRequired" "${PODS_ROOT}/Headers/Public/RCTTypeSafety" "${PODS_ROOT}/Headers/Public/React-Core" "${PODS_ROOT}/Headers/Public/React-RCTBlob" "${PODS_ROOT}/Headers/Public/React-RCTText" "${PODS_ROOT}/Headers/Public/React-callinvoker" "${PODS_ROOT}/Headers/Public/React-cxxreact" "${PODS_ROOT}/Headers/Public/React-jsi" "${PODS_ROOT}/Headers/Public/React-jsiexecutor" "${PODS_ROOT}/Headers/Public/React-jsinspector" "${PODS_ROOT}/Headers/Public/React-perflogger" "${PODS_ROOT}/Headers/Public/React-runtimeexecutor" "${PODS_ROOT}/Headers/Public/ReactCommon" "${PODS_ROOT}/Headers/Public/Yoga" "${PODS_ROOT}/Headers/Public/glog" "${PODS_ROOT}/Headers/Public/hermes-engine" "${PODS_ROOT}/Headers/Public/libevent" "${PODS_ROOT}/Headers/Public/react-native-jitsi-meet"
OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_ROOT}/Headers/Public/React/React-Core.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/yoga/Yoga.modulemap"

View File

@ -1,7 +1,7 @@
APPLICATION_EXTENSION_API_ONLY = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/react-native-jitsi-meet
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JitsiMeetSDK/Frameworks" "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos"
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JitsiMeetSDK/Frameworks" "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiMeetSDK" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/react-native-jitsi-meet" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/DoubleConversion" "${PODS_ROOT}/Headers/Public/FBLazyVector" "${PODS_ROOT}/Headers/Public/FBReactNativeSpec" "${PODS_ROOT}/Headers/Public/RCT-Folly" "${PODS_ROOT}/Headers/Public/RCTRequired" "${PODS_ROOT}/Headers/Public/RCTTypeSafety" "${PODS_ROOT}/Headers/Public/React-Core" "${PODS_ROOT}/Headers/Public/React-RCTBlob" "${PODS_ROOT}/Headers/Public/React-RCTText" "${PODS_ROOT}/Headers/Public/React-callinvoker" "${PODS_ROOT}/Headers/Public/React-cxxreact" "${PODS_ROOT}/Headers/Public/React-jsi" "${PODS_ROOT}/Headers/Public/React-jsiexecutor" "${PODS_ROOT}/Headers/Public/React-jsinspector" "${PODS_ROOT}/Headers/Public/React-perflogger" "${PODS_ROOT}/Headers/Public/React-runtimeexecutor" "${PODS_ROOT}/Headers/Public/ReactCommon" "${PODS_ROOT}/Headers/Public/Yoga" "${PODS_ROOT}/Headers/Public/glog" "${PODS_ROOT}/Headers/Public/hermes-engine" "${PODS_ROOT}/Headers/Public/libevent" "${PODS_ROOT}/Headers/Public/react-native-jitsi-meet"
OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_ROOT}/Headers/Public/React/React-Core.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/yoga/Yoga.modulemap"

View File

@ -3,7 +3,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/react-native-orientation-locker
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/react-native-orientation-locker" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/DoubleConversion" "${PODS_ROOT}/Headers/Public/RCT-Folly" "${PODS_ROOT}/Headers/Public/React-Core" "${PODS_ROOT}/Headers/Public/React-callinvoker" "${PODS_ROOT}/Headers/Public/React-cxxreact" "${PODS_ROOT}/Headers/Public/React-jsi" "${PODS_ROOT}/Headers/Public/React-jsiexecutor" "${PODS_ROOT}/Headers/Public/React-jsinspector" "${PODS_ROOT}/Headers/Public/React-perflogger" "${PODS_ROOT}/Headers/Public/React-runtimeexecutor" "${PODS_ROOT}/Headers/Public/Yoga" "${PODS_ROOT}/Headers/Public/glog" "${PODS_ROOT}/Headers/Public/hermes-engine" "${PODS_ROOT}/Headers/Public/libevent" "${PODS_ROOT}/Headers/Public/react-native-orientation-locker"
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/react-native-orientation-locker" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/DoubleConversion" "${PODS_ROOT}/Headers/Public/FBLazyVector" "${PODS_ROOT}/Headers/Public/FBReactNativeSpec" "${PODS_ROOT}/Headers/Public/RCT-Folly" "${PODS_ROOT}/Headers/Public/RCTRequired" "${PODS_ROOT}/Headers/Public/RCTTypeSafety" "${PODS_ROOT}/Headers/Public/React-Core" "${PODS_ROOT}/Headers/Public/React-RCTBlob" "${PODS_ROOT}/Headers/Public/React-RCTText" "${PODS_ROOT}/Headers/Public/React-callinvoker" "${PODS_ROOT}/Headers/Public/React-cxxreact" "${PODS_ROOT}/Headers/Public/React-jsi" "${PODS_ROOT}/Headers/Public/React-jsiexecutor" "${PODS_ROOT}/Headers/Public/React-jsinspector" "${PODS_ROOT}/Headers/Public/React-perflogger" "${PODS_ROOT}/Headers/Public/React-runtimeexecutor" "${PODS_ROOT}/Headers/Public/ReactCommon" "${PODS_ROOT}/Headers/Public/Yoga" "${PODS_ROOT}/Headers/Public/glog" "${PODS_ROOT}/Headers/Public/hermes-engine" "${PODS_ROOT}/Headers/Public/libevent" "${PODS_ROOT}/Headers/Public/react-native-orientation-locker"
OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_ROOT}/Headers/Public/React/React-Core.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/yoga/Yoga.modulemap"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

@ -3,7 +3,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/react-native-orientation-locker
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/react-native-orientation-locker" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/DoubleConversion" "${PODS_ROOT}/Headers/Public/RCT-Folly" "${PODS_ROOT}/Headers/Public/React-Core" "${PODS_ROOT}/Headers/Public/React-callinvoker" "${PODS_ROOT}/Headers/Public/React-cxxreact" "${PODS_ROOT}/Headers/Public/React-jsi" "${PODS_ROOT}/Headers/Public/React-jsiexecutor" "${PODS_ROOT}/Headers/Public/React-jsinspector" "${PODS_ROOT}/Headers/Public/React-perflogger" "${PODS_ROOT}/Headers/Public/React-runtimeexecutor" "${PODS_ROOT}/Headers/Public/Yoga" "${PODS_ROOT}/Headers/Public/glog" "${PODS_ROOT}/Headers/Public/hermes-engine" "${PODS_ROOT}/Headers/Public/libevent" "${PODS_ROOT}/Headers/Public/react-native-orientation-locker"
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/react-native-orientation-locker" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/DoubleConversion" "${PODS_ROOT}/Headers/Public/FBLazyVector" "${PODS_ROOT}/Headers/Public/FBReactNativeSpec" "${PODS_ROOT}/Headers/Public/RCT-Folly" "${PODS_ROOT}/Headers/Public/RCTRequired" "${PODS_ROOT}/Headers/Public/RCTTypeSafety" "${PODS_ROOT}/Headers/Public/React-Core" "${PODS_ROOT}/Headers/Public/React-RCTBlob" "${PODS_ROOT}/Headers/Public/React-RCTText" "${PODS_ROOT}/Headers/Public/React-callinvoker" "${PODS_ROOT}/Headers/Public/React-cxxreact" "${PODS_ROOT}/Headers/Public/React-jsi" "${PODS_ROOT}/Headers/Public/React-jsiexecutor" "${PODS_ROOT}/Headers/Public/React-jsinspector" "${PODS_ROOT}/Headers/Public/React-perflogger" "${PODS_ROOT}/Headers/Public/React-runtimeexecutor" "${PODS_ROOT}/Headers/Public/ReactCommon" "${PODS_ROOT}/Headers/Public/Yoga" "${PODS_ROOT}/Headers/Public/glog" "${PODS_ROOT}/Headers/Public/hermes-engine" "${PODS_ROOT}/Headers/Public/libevent" "${PODS_ROOT}/Headers/Public/react-native-orientation-locker"
OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_ROOT}/Headers/Public/React/React-Core.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/yoga/Yoga.modulemap"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

@ -1179,16 +1179,16 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh",
"${PODS_ROOT}/JitsiMeetSDK/Frameworks/JitsiMeet.framework",
"${PODS_ROOT}/JitsiMeetSDK/Frameworks/WebRTC.framework",
"${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos/hermes.framework",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiMeetSDK/JitsiMeetSDK.framework/JitsiMeetSDK",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC/WebRTC.framework/WebRTC",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework/OpenSSL",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JitsiMeet.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JitsiMeetSDK.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
);
runOnlyForDeploymentPostprocessing = 0;
@ -1225,16 +1225,16 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat-frameworks.sh",
"${PODS_ROOT}/JitsiMeetSDK/Frameworks/JitsiMeet.framework",
"${PODS_ROOT}/JitsiMeetSDK/Frameworks/WebRTC.framework",
"${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos/hermes.framework",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiMeetSDK/JitsiMeetSDK.framework/JitsiMeetSDK",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC/WebRTC.framework/WebRTC",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework/OpenSSL",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JitsiMeet.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JitsiMeetSDK.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
);
runOnlyForDeploymentPostprocessing = 0;
@ -1726,7 +1726,7 @@
INFOPLIST_FILE = NotificationService/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 4.19.0;
MARKETING_VERSION = 4.20.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
@ -1763,7 +1763,7 @@
INFOPLIST_FILE = NotificationService/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 4.19.0;
MARKETING_VERSION = 4.20.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
PRODUCT_NAME = "$(TARGET_NAME)";

View File

@ -26,7 +26,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>4.19.0</string>
<string>4.20.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>

View File

@ -26,7 +26,7 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>4.19.0</string>
<string>4.20.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>KeychainGroup</key>

View File

@ -1,6 +1,6 @@
{
"name": "rocket-chat-reactnative",
"version": "4.19.0",
"version": "4.20.0",
"private": true,
"scripts": {
"start": "react-native start",
@ -96,7 +96,7 @@
"react-native-navigation-bar-color": "2.0.1",
"react-native-notifications": "2.1.7",
"react-native-notifier": "1.6.1",
"react-native-orientation-locker": "1.3.1",
"react-native-orientation-locker": "1.1.8",
"react-native-picker-select": "^8.0.4",
"react-native-platform-touchable": "1.1.1",
"react-native-popover-view": "4.0.1",
@ -141,7 +141,7 @@
"@storybook/react-native": "5.3.25",
"@types/react-native": "^0.62.7",
"axios": "0.21.1",
"babel-jest": "27.0.2",
"babel-jest": "^27.0.6",
"babel-plugin-transform-remove-console": "^6.9.4",
"codecov": "3.8.2",
"detox": "18.17.0",
@ -152,7 +152,7 @@
"eslint-plugin-react-native": "3.8.1",
"husky": "^6.0.0",
"identity-obj-proxy": "^3.0.0",
"jest": "^26.6.3",
"jest": "^27.0.6",
"jest-cli": "^27.0.6",
"metro-react-native-babel-preset": "^0.64.0",
"mocha": "9.0.1",

View File

@ -854,3 +854,32 @@ stories.add('Ignored', () => (
stories.add('Custom style', () => (
<Message msg='Message' style={[styles.normalize, { backgroundColor: '#ddd' }]} />
));
stories.add('Show a button as attachment', () => (
<Message
attachments={[{
text: 'Test Button',
actions: [
{
type: 'button',
text: 'Text button',
msg: 'Response message',
msg_in_chat_window: true
}
]
}]}
/>
));
stories.add('Thumbnail from server', () => (
<Message
msg='this is a thumbnail'
attachments={[{
text: 'Image text',
thumb_url: 'https://images-na.ssl-images-amazon.com/images/I/71jKxPAMFbL._AC_SL1500_.jpg',
title: 'Title',
title_link: 'https://github.com/RocketChat/Rocket.Chat.ReactNative/pull/2975'
}]}
/>
));

View File

@ -16,6 +16,7 @@ import './MessageBody';
import '../../app/containers/BackgroundContainer/index.stories.js';
import '../../app/containers/RoomHeader/RoomHeader.stories.js';
import '../../app/views/RoomView/LoadMore/LoadMore.stories';
import '../../app/containers/TextInput.stories';
// Change here to see themed storybook
export const theme = 'light';

772
yarn.lock

File diff suppressed because it is too large Load Diff