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 <View
style={ style={
Object { Object {
@ -20562,6 +20571,15 @@ exports[`Storyshots Message Colored attachments 1`] = `
} }
} }
> >
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
}
}
/>
<View <View
style={ style={
Object { Object {
@ -20763,6 +20781,15 @@ exports[`Storyshots Message Colored attachments 1`] = `
} }
} }
> >
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
}
}
/>
<View <View
style={ style={
Object { Object {
@ -40307,6 +40334,268 @@ exports[`Storyshots Message Sequential thread messages following thread reply 1`
</RCTScrollView> </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`] = ` exports[`Storyshots Message Static avatar 1`] = `
<RCTScrollView <RCTScrollView
style={ style={
@ -43340,6 +43629,407 @@ exports[`Storyshots Message Temp 1`] = `
</RCTScrollView> </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`] = ` exports[`Storyshots Message Time format 1`] = `
<RCTScrollView <RCTScrollView
style={ style={
@ -47162,6 +47852,15 @@ exports[`Storyshots Message With file 1`] = `
} }
} }
> >
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
}
}
/>
<Text <Text
style={ style={
Array [ Array [
@ -47380,6 +48079,15 @@ exports[`Storyshots Message With file 1`] = `
} }
} }
> >
<View
style={
Object {
"alignItems": "center",
"flex": 1,
"flexDirection": "row",
}
}
/>
<Text <Text
style={ style={
Array [ 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`] = ` exports[`Storyshots Thread Messages.Item badge 1`] = `
<RCTScrollView> <RCTScrollView>
<View> <View>

View File

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

View File

@ -18,7 +18,7 @@ buildscript {
supportLibVersion = "28.0.0" supportLibVersion = "28.0.0"
libre_build = !(isPlay.toBoolean()) 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_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 { 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 SNIPPETED_MESSAGES = createRequestTypes('SNIPPETED_MESSAGES', ['OPEN', 'READY', 'CLOSE', 'MESSAGES_RECEIVED']);
export const DEEP_LINKING = createRequestTypes('DEEP_LINKING', ['OPEN']); export const DEEP_LINKING = createRequestTypes('DEEP_LINKING', ['OPEN']);
export const SORT_PREFERENCES = createRequestTypes('SORT_PREFERENCES', ['SET_ALL', 'SET']); 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_CUSTOM_EMOJIS = 'SET_CUSTOM_EMOJIS';
export const SET_ACTIVE_USERS = 'SET_ACTIVE_USERS'; export const SET_ACTIVE_USERS = 'SET_ACTIVE_USERS';
export const USERS_TYPING = createRequestTypes('USERS_TYPING', ['ADD', 'REMOVE', 'CLEAR']); 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, ...sharedStyles.textRegular,
height: 48, height: 48,
fontSize: 16, fontSize: 16,
paddingHorizontal: 14, padding: 14,
borderWidth: StyleSheet.hairlineWidth, borderWidth: StyleSheet.hairlineWidth,
borderRadius: 2 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} disabled={disabled}
inputStyle={inputStyle} 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> </Input>
); );
} }

View File

@ -1,11 +1,35 @@
import React from 'react'; import React, { useContext } from 'react';
import { dequal } from 'dequal'; import { dequal } from 'dequal';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Text } from 'react-native';
import Image from './Image'; import Image from './Image';
import Audio from './Audio'; import Audio from './Audio';
import Video from './Video'; import Video from './Video';
import Reply from './Reply'; 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(({ const Attachments = React.memo(({
attachments, timeFormat, showAttachment, getCustomEmoji, theme attachments, timeFormat, showAttachment, getCustomEmoji, theme
@ -24,6 +48,9 @@ const Attachments = React.memo(({
if (file.video_url) { if (file.video_url) {
return <Video key={file.video_url} file={file} showAttachment={showAttachment} getCustomEmoji={getCustomEmoji} theme={theme} />; 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 // eslint-disable-next-line react/no-array-index-key
return <Reply key={index} index={index} attachment={file} timeFormat={timeFormat} getCustomEmoji={getCustomEmoji} theme={theme} />; return <Reply key={index} index={index} attachment={file} timeFormat={timeFormat} getCustomEmoji={getCustomEmoji} theme={theme} />;
@ -38,5 +65,12 @@ Attachments.propTypes = {
theme: PropTypes.string theme: PropTypes.string
}; };
Attachments.displayName = 'MessageAttachments'; Attachments.displayName = 'MessageAttachments';
AttachedActions.propTypes = {
attachment: PropTypes.shape({
actions: PropTypes.array,
text: PropTypes.string
}),
theme: PropTypes.string
};
export default Attachments; export default Attachments;

View File

@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
import moment from 'moment'; import moment from 'moment';
import { transparentize } from 'color2k'; import { transparentize } from 'color2k';
import { dequal } from 'dequal'; import { dequal } from 'dequal';
import FastImage from '@rocket.chat/react-native-fast-image';
import Touchable from './Touchable'; import Touchable from './Touchable';
import Markdown from '../markdown'; import Markdown from '../markdown';
@ -66,17 +67,29 @@ const styles = StyleSheet.create({
}, },
marginBottom: { marginBottom: {
marginBottom: 4 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 }) => { 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; const time = attachment.message_link && attachment.ts ? moment(attachment.ts).format(timeFormat) : null;
return ( return (
<View style={styles.authorContainer}> <View style={styles.authorContainer}>
{attachment.author_name ? <Text style={[styles.author, { color: themes[theme].bodyText }]}>{attachment.author_name}</Text> : null} {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} {time ? <Text style={[styles.time, { color: themes[theme].auxiliaryText }]}>{ time }</Text> : null}
</View> </View>
); );
@ -112,6 +125,15 @@ const Description = React.memo(({
return true; 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 }) => { const Fields = React.memo(({ attachment, theme, getCustomEmoji }) => {
if (!attachment.fields) { if (!attachment.fields) {
return null; return null;
@ -191,6 +213,7 @@ const Reply = React.memo(({
timeFormat={timeFormat} timeFormat={timeFormat}
theme={theme} theme={theme}
/> />
<UrlImage image={attachment.thumb_url} />
<Description <Description
attachment={attachment} attachment={attachment}
getCustomEmoji={getCustomEmoji} getCustomEmoji={getCustomEmoji}
@ -223,6 +246,10 @@ Reply.propTypes = {
}; };
Reply.displayName = 'MessageReply'; Reply.displayName = 'MessageReply';
UrlImage.propTypes = {
image: PropTypes.string
};
Title.propTypes = { Title.propTypes = {
attachment: PropTypes.object, attachment: PropTypes.object,
timeFormat: PropTypes.string, timeFormat: PropTypes.string,

View File

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

View File

@ -763,11 +763,15 @@
"Load_More": "Load More", "Load_More": "Load More",
"Load_Newer": "Load Newer", "Load_Newer": "Load Newer",
"Load_Older": "Load Older", "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", "Left_The_Room_Successfully": "Left the room successfully",
"Deleted_The_Team_Successfully": "Team deleted successfully", "Deleted_The_Team_Successfully": "Team deleted successfully",
"Deleted_The_Room_Successfully": "Room deleted successfully", "Deleted_The_Room_Successfully": "Room deleted successfully",
"Convert_to_Channel": "Convert to Channel", "Convert_to_Channel": "Convert to Channel",
"Converting_Team_To_Channel": "Converting Team 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.", "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", "Left_The_Team_Successfully": "Saiu do time com sucesso",
"Add_Existing_Channel": "Adicionar Canal Existente", "Add_Existing_Channel": "Adicionar Canal Existente",
"invalid-room": "Sala inválida", "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", "Left_The_Room_Successfully": "Saiu da sala com sucesso",
"Deleted_The_Team_Successfully": "Time deletado com sucesso", "Deleted_The_Team_Successfully": "Time deletado com sucesso",
"Deleted_The_Room_Successfully": "Sala deletada 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 parseQuery from './lib/methods/helpers/parseQuery';
import { initializePushNotifications, onNotification } from './notifications/push'; import { initializePushNotifications, onNotification } from './notifications/push';
import store from './lib/createStore'; import store from './lib/createStore';
import { loggerConfig, analytics } from './utils/log'; import { toggleAnalyticsEventsReport, toggleCrashErrorsReport } from './utils/log';
import { ThemeContext } from './theme'; import { ThemeContext } from './theme';
import { DimensionsContext } from './dimensions'; import { DimensionsContext } from './dimensions';
import RocketChat, { THEME_PREFERENCES_KEY } from './lib/rocketchat'; import RocketChat, { THEME_PREFERENCES_KEY } from './lib/rocketchat';
@ -188,11 +188,11 @@ export default class Root extends React.Component {
initCrashReport = () => { initCrashReport = () => {
RocketChat.getAllowCrashReport() RocketChat.getAllowCrashReport()
.then((allowCrashReport) => { .then((allowCrashReport) => {
if (!allowCrashReport) { toggleCrashErrorsReport(allowCrashReport);
loggerConfig.autoNotify = false; });
loggerConfig.registerBeforeSendCallback(() => false); RocketChat.getAllowAnalyticsEvents()
analytics().setAnalyticsCollectionEnabled(false); .then((allowAnalyticsEvents) => {
} toggleAnalyticsEventsReport(allowAnalyticsEvents);
}); });
} }

View File

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

View File

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

View File

@ -8,7 +8,7 @@ const styles = StyleSheet.create({
input: { input: {
...I18nManager.isRTL ...I18nManager.isRTL
? { textAlign: 'right' } ? { 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 app from './app';
import sortPreferences from './sortPreferences'; import sortPreferences from './sortPreferences';
import share from './share'; import share from './share';
import crashReport from './crashReport';
import customEmojis from './customEmojis'; import customEmojis from './customEmojis';
import activeUsers from './activeUsers'; import activeUsers from './activeUsers';
import usersTyping from './usersTyping'; import usersTyping from './usersTyping';
@ -35,7 +34,6 @@ export default combineReducers({
rooms, rooms,
sortPreferences, sortPreferences,
share, share,
crashReport,
customEmojis, customEmojis,
activeUsers, activeUsers,
usersTyping, usersTyping,

View File

@ -109,8 +109,23 @@ const handleSuccess = function* handleSuccess({ data }) {
}; };
const handleFailure = function handleFailure({ err, isTeam }) { 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(() => { 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')); showErrorAlert(msg, isTeam ? I18n.t('Create_Team') : I18n.t('Create_Channel'));
}, 300); }, 300);
}; };

View File

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

View File

@ -5,10 +5,24 @@ import events from './events';
const analytics = firebaseAnalytics || ''; const analytics = firebaseAnalytics || '';
let bugsnag = ''; let bugsnag = '';
let crashlytics; let crashlytics;
let reportCrashErrors = true;
let reportAnalyticsEvents = true;
export const getReportCrashErrorsValue = () => reportCrashErrors;
export const getReportAnalyticsEventsValue = () => reportAnalyticsEvents;
if (!isFDroidBuild) { if (!isFDroidBuild) {
bugsnag = require('@bugsnag/react-native').default; 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; 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) => { export default (e) => {
if (e instanceof Error && bugsnag && e.message !== 'Aborted' && !__DEV__) { if (e instanceof Error && bugsnag && e.message !== 'Aborted' && !__DEV__) {
bugsnag.notify(e, (event) => { bugsnag.notify(e, (event) => {

View File

@ -74,7 +74,7 @@ class CreateChannelView extends React.Component {
if (!loading && loading !== prevProps.loading) { if (!loading && loading !== prevProps.loading) {
setTimeout(() => { setTimeout(() => {
if (failure) { 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); showErrorAlert(msg);
} else { } else {
const { rid, t, prid } = result; const { rid, t, prid } = result;

View File

@ -1,4 +1,5 @@
import React from 'react'; import React from 'react';
import { StyleSheet } from 'react-native';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import JitsiMeet, { JitsiMeetView as RNJitsiMeetView } from 'react-native-jitsi-meet'; import JitsiMeet, { JitsiMeetView as RNJitsiMeetView } from 'react-native-jitsi-meet';
import BackgroundTimer from 'react-native-background-timer'; import BackgroundTimer from 'react-native-background-timer';
@ -6,9 +7,10 @@ import { connect } from 'react-redux';
import RocketChat from '../lib/rocketchat'; import RocketChat from '../lib/rocketchat';
import { getUserSelector } from '../selectors/login'; import { getUserSelector } from '../selectors/login';
import ActivityIndicator from '../containers/ActivityIndicator';
import sharedStyles from './Styles';
import { logEvent, events } from '../utils/log'; import { logEvent, events } from '../utils/log';
import { isAndroid, isIOS } from '../utils/deviceInfo';
import { withTheme } from '../theme';
const formatUrl = (url, baseUrl, uriSize, avatarAuthURLFragment) => ( const formatUrl = (url, baseUrl, uriSize, avatarAuthURLFragment) => (
`${ baseUrl }/avatar/${ url }?format=png&width=${ uriSize }&height=${ uriSize }${ avatarAuthURLFragment }` `${ baseUrl }/avatar/${ url }?format=png&width=${ uriSize }&height=${ uriSize }${ avatarAuthURLFragment }`
@ -19,6 +21,7 @@ class JitsiMeetView extends React.Component {
navigation: PropTypes.object, navigation: PropTypes.object,
route: PropTypes.object, route: PropTypes.object,
baseUrl: PropTypes.string, baseUrl: PropTypes.string,
theme: PropTypes.string,
user: PropTypes.shape({ user: PropTypes.shape({
id: PropTypes.string, id: PropTypes.string,
username: PropTypes.string, username: PropTypes.string,
@ -30,43 +33,54 @@ class JitsiMeetView extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.rid = props.route.params?.rid; this.rid = props.route.params?.rid;
this.onConferenceTerminated = this.onConferenceTerminated.bind(this); this.url = props.route.params?.url;
this.onConferenceJoined = this.onConferenceJoined.bind(this);
this.jitsiTimeout = null; this.jitsiTimeout = null;
}
componentDidMount() { const { user, baseUrl } = props;
const { route, user, baseUrl } = this.props;
const { const {
name: displayName, id: userId, token, username name: displayName, id: userId, token, username
} = user; } = user;
const avatarAuthURLFragment = `&rc_token=${ token }&rc_uid=${ userId }`; const avatarAuthURLFragment = `&rc_token=${ token }&rc_uid=${ userId }`;
const avatar = formatUrl(username, baseUrl, 100, avatarAuthURLFragment); const avatar = formatUrl(username, baseUrl, 100, avatarAuthURLFragment);
this.state = {
setTimeout(() => { userInfo: {
const userInfo = {
displayName, displayName,
avatar avatar
},
loading: true
}; };
const url = route.params?.url; }
componentDidMount() {
const { route } = this.props;
const { userInfo } = this.state;
if (isIOS) {
setTimeout(() => {
const onlyAudio = route.params?.onlyAudio ?? false; const onlyAudio = route.params?.onlyAudio ?? false;
if (onlyAudio) { if (onlyAudio) {
JitsiMeet.audioCall(url, userInfo); JitsiMeet.audioCall(this.url, userInfo);
} else { } else {
JitsiMeet.call(url, userInfo); JitsiMeet.call(this.url, userInfo);
} }
}, 1000); }, 1000);
} }
}
componentWillUnmount() { componentWillUnmount() {
logEvent(events.JM_CONFERENCE_TERMINATE); logEvent(events.JM_CONFERENCE_TERMINATE);
if (this.jitsiTimeout) { if (this.jitsiTimeout) {
BackgroundTimer.clearInterval(this.jitsiTimeout); BackgroundTimer.clearInterval(this.jitsiTimeout);
this.jitsiTimeout = null;
BackgroundTimer.stopBackgroundTimer();
} }
JitsiMeet.endCall(); JitsiMeet.endCall();
} }
onConferenceWillJoin = () => {
this.setState({ loading: false });
}
// Jitsi Update Timeout needs to be called every 10 seconds to make sure // Jitsi Update Timeout needs to be called every 10 seconds to make sure
// call is not ended and is available to web users. // call is not ended and is available to web users.
onConferenceJoined = () => { onConferenceJoined = () => {
@ -74,6 +88,8 @@ class JitsiMeetView extends React.Component {
RocketChat.updateJitsiTimeout(this.rid).catch(e => console.log(e)); RocketChat.updateJitsiTimeout(this.rid).catch(e => console.log(e));
if (this.jitsiTimeout) { if (this.jitsiTimeout) {
BackgroundTimer.clearInterval(this.jitsiTimeout); BackgroundTimer.clearInterval(this.jitsiTimeout);
BackgroundTimer.stopBackgroundTimer();
this.jitsiTimeout = null;
} }
this.jitsiTimeout = BackgroundTimer.setInterval(() => { this.jitsiTimeout = BackgroundTimer.setInterval(() => {
RocketChat.updateJitsiTimeout(this.rid).catch(e => console.log(e)); RocketChat.updateJitsiTimeout(this.rid).catch(e => console.log(e));
@ -83,19 +99,25 @@ class JitsiMeetView extends React.Component {
onConferenceTerminated = () => { onConferenceTerminated = () => {
logEvent(events.JM_CONFERENCE_TERMINATE); logEvent(events.JM_CONFERENCE_TERMINATE);
const { navigation } = this.props; const { navigation } = this.props;
if (this.jitsiTimeout) {
BackgroundTimer.clearInterval(this.jitsiTimeout);
}
navigation.pop(); navigation.pop();
} }
render() { 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 ( return (
<>
<RNJitsiMeetView <RNJitsiMeetView
onConferenceWillJoin={this.onConferenceWillJoin}
onConferenceTerminated={this.onConferenceTerminated} onConferenceTerminated={this.onConferenceTerminated}
onConferenceJoined={this.onConferenceJoined} onConferenceJoined={this.onConferenceJoined}
style={sharedStyles.container} style={StyleSheet.absoluteFill}
options={options}
/> />
{loading ? <ActivityIndicator theme={theme} /> : null}
</>
); );
} }
} }
@ -105,4 +127,4 @@ const mapStateToProps = state => ({
baseUrl: state.server.server 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 PropTypes from 'prop-types';
import { Text, StyleSheet, ScrollView } from 'react-native'; import { Text, StyleSheet, ScrollView } from 'react-native';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { BLOCK_CONTEXT } from '@rocket.chat/ui-kit';
import { withTheme } from '../theme'; import { withTheme } from '../theme';
import { themes } from '../constants/colors'; import { themes } from '../constants/colors';
@ -15,9 +16,9 @@ import { LISTENER } from '../containers/Toast';
import EventEmitter from '../utils/events'; import EventEmitter from '../utils/events';
import scrollPersistTaps from '../utils/scrollPersistTaps'; import scrollPersistTaps from '../utils/scrollPersistTaps';
import { getUserSelector } from '../selectors/login'; import { getUserSelector } from '../selectors/login';
import Chips from '../containers/UIKit/MultiSelect/Chips';
import Button from '../containers/Button'; import Button from '../containers/Button';
import SafeAreaView from '../containers/SafeAreaView'; import SafeAreaView from '../containers/SafeAreaView';
import { MultiSelect } from '../containers/UIKit/MultiSelect';
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { container: {
@ -27,6 +28,14 @@ const styles = StyleSheet.create({
fontSize: 20, fontSize: 20,
paddingVertical: 10, paddingVertical: 10,
...sharedStyles.textMedium ...sharedStyles.textMedium
},
label: {
marginBottom: 10,
fontSize: 14,
...sharedStyles.textSemibold
},
multiSelect: {
marginBottom: 10
} }
}); });
@ -37,10 +46,11 @@ Title.propTypes = {
}; };
const LivechatEditView = ({ const LivechatEditView = ({
user, navigation, route, theme user, navigation, route, theme, editOmnichannelContact, editLivechatRoomCustomfields
}) => { }) => {
const [customFields, setCustomFields] = useState({}); const [customFields, setCustomFields] = useState({});
const [availableUserTags, setAvailableUserTags] = useState([]); const [availableUserTags, setAvailableUserTags] = useState([]);
const [permissions, setPermissions] = useState([]);
const params = {}; const params = {};
const inputs = {}; const inputs = {};
@ -54,21 +64,24 @@ const LivechatEditView = ({
const visitorCustomFields = result.customFields const visitorCustomFields = result.customFields
.filter(field => field.visibility !== 'hidden' && field.scope === 'visitor') .filter(field => field.visibility !== 'hidden' && field.scope === 'visitor')
.map(field => ({ [field._id]: (visitor.livechatData && visitor.livechatData[field._id]) || '' })) .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 const livechatCustomFields = result.customFields
.filter(field => field.visibility !== 'hidden' && field.scope === 'room') .filter(field => field.visibility !== 'hidden' && field.scope === 'room')
.map(field => ({ [field._id]: (livechat.livechatData && livechat.livechatData[field._id]) || '' })) .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 }); return setCustomFields({ visitor: visitorCustomFields, livechat: livechatCustomFields });
} }
}; };
const [tagParam, setTags] = useState(livechat?.tags || []); const [tagParam, setTags] = useState(livechat?.tags || []);
const [tagParamSelected, setTagParamSelected] = useState(livechat?.tags || []);
useEffect(() => { useEffect(() => {
setTags([...tagParam, ...availableUserTags]); const arr = [...tagParam, ...availableUserTags];
const uniqueArray = arr.filter((val, i) => arr.indexOf(val) === i);
setTags(uniqueArray);
}, [availableUserTags]); }, [availableUserTags]);
const getTagsList = async(agentDepartments) => { const getTagsList = async(agentDepartments) => {
@ -115,7 +128,7 @@ const LivechatEditView = ({
roomData.topic = params.topic; roomData.topic = params.topic;
} }
roomData.tags = tagParam; roomData.tags = tagParamSelected;
roomData.livechatData = {}; roomData.livechatData = {};
Object.entries(customFields?.livechat || {}).forEach(([key]) => { Object.entries(customFields?.livechat || {}).forEach(([key]) => {
@ -139,9 +152,15 @@ const LivechatEditView = ({
const onChangeText = (key, text) => { params[key] = text; }; const onChangeText = (key, text) => { params[key] = text; };
const getPermissions = async() => {
const permissionsArray = await RocketChat.hasPermission([editOmnichannelContact, editLivechatRoomCustomfields], livechat.rid);
setPermissions(permissionsArray);
};
useEffect(() => { useEffect(() => {
getAgentDepartments(); getAgentDepartments();
getCustomFields(); getCustomFields();
getPermissions();
}, []); }, []);
return ( return (
@ -162,6 +181,7 @@ const LivechatEditView = ({
onChangeText={text => onChangeText('name', text)} onChangeText={text => onChangeText('name', text)}
onSubmitEditing={() => { inputs.name.focus(); }} onSubmitEditing={() => { inputs.name.focus(); }}
theme={theme} theme={theme}
editable={!!permissions[0]}
/> />
<TextInput <TextInput
label={I18n.t('Email')} label={I18n.t('Email')}
@ -170,6 +190,7 @@ const LivechatEditView = ({
onChangeText={text => onChangeText('email', text)} onChangeText={text => onChangeText('email', text)}
onSubmitEditing={() => { inputs.phone.focus(); }} onSubmitEditing={() => { inputs.phone.focus(); }}
theme={theme} theme={theme}
editable={!!permissions[0]}
/> />
<TextInput <TextInput
label={I18n.t('Phone')} label={I18n.t('Phone')}
@ -179,13 +200,14 @@ const LivechatEditView = ({
onSubmitEditing={() => { onSubmitEditing={() => {
const keys = Object.keys(customFields?.visitor || {}); const keys = Object.keys(customFields?.visitor || {});
if (keys.length > 0) { if (keys.length > 0) {
const key = keys.pop(); const key = keys[0];
inputs[key].focus(); inputs[key].focus();
} else { } else {
inputs.topic.focus(); inputs.topic.focus();
} }
}} }}
theme={theme} theme={theme}
editable={!!permissions[0]}
/> />
{Object.entries(customFields?.visitor || {}).map(([key, value], index, array) => ( {Object.entries(customFields?.visitor || {}).map(([key, value], index, array) => (
<TextInput <TextInput
@ -195,11 +217,12 @@ const LivechatEditView = ({
onChangeText={text => onChangeText(key, text)} onChangeText={text => onChangeText(key, text)}
onSubmitEditing={() => { onSubmitEditing={() => {
if (array.length - 1 > index) { if (array.length - 1 > index) {
return inputs[array[index + 1]].focus(); return inputs[array[index + 1][0]].focus();
} }
inputs.topic.focus(); inputs.topic.focus();
}} }}
theme={theme} theme={theme}
editable={!!permissions[0]}
/> />
))} ))}
<Title <Title
@ -213,35 +236,29 @@ const LivechatEditView = ({
onChangeText={text => onChangeText('topic', text)} onChangeText={text => onChangeText('topic', text)}
onSubmitEditing={() => inputs.tags.focus()} onSubmitEditing={() => inputs.tags.focus()}
theme={theme} theme={theme}
editable={!!permissions[1]}
/> />
<TextInput <Text
inputRef={(e) => { inputs.tags = e; }} style={[
label={I18n.t('Tags')} styles.label,
iconRight='add' { color: themes[theme].titleText }
onIconRightPress={() => { ]}
const lastText = inputs.tags._lastNativeText || ''; >
if (lastText.length) { { I18n.t('Tags') }
setTags([...tagParam.filter(t => t !== lastText), lastText]); </Text>
inputs.tags.clear(); <MultiSelect
} options={tagParam.map(tag => ({ text: { text: tag }, value: tag }))}
}} onChange={({ value }) => {
onSubmitEditing={() => { setTagParamSelected([...value]);
const keys = Object.keys(customFields?.livechat || {});
if (keys.length > 0) {
const key = keys.pop();
inputs[key].focus();
} else {
submit();
}
}} }}
placeholder={{ text: I18n.t('Tags') }}
value={tagParamSelected}
context={BLOCK_CONTEXT.FORM}
multiselect
theme={theme} theme={theme}
/> disabled={!permissions[1]}
<Chips inputStyle={styles.multiSelect}
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}
/> />
{Object.entries(customFields?.livechat || {}).map(([key, value], index, array) => ( {Object.entries(customFields?.livechat || {}).map(([key, value], index, array) => (
@ -257,6 +274,7 @@ const LivechatEditView = ({
submit(); submit();
}} }}
theme={theme} theme={theme}
editable={!!permissions[1]}
/> />
))} ))}
@ -274,15 +292,19 @@ LivechatEditView.propTypes = {
user: PropTypes.object, user: PropTypes.object,
navigation: PropTypes.object, navigation: PropTypes.object,
route: PropTypes.object, route: PropTypes.object,
theme: PropTypes.string theme: PropTypes.string,
editOmnichannelContact: PropTypes.array,
editLivechatRoomCustomfields: PropTypes.array
}; };
LivechatEditView.navigationOptions = ({ LivechatEditView.navigationOptions = ({
title: I18n.t('Livechat_edit') title: I18n.t('Edit')
}); });
const mapStateToProps = state => ({ const mapStateToProps = state => ({
server: state.server.server, 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)); export default connect(mapStateToProps)(withTheme(LivechatEditView));

View File

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

View File

@ -739,7 +739,7 @@ class RoomView extends React.Component {
const { room } = this.state; const { room } = this.state;
if (rid === this.rid) { if (rid === this.rid) {
Navigation.navigate('RoomsListView'); 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) { if (this.isOmnichannel) {
await takeInquiry(room._id); await takeInquiry(room._id);
this.onJoin();
} else { } else {
const { joinCodeRequired } = room; const { joinCodeRequired } = room;
if (joinCodeRequired) { if (joinCodeRequired) {
@ -973,6 +974,7 @@ class RoomView extends React.Component {
onEncryptedPress={this.onEncryptedPress} onEncryptedPress={this.onEncryptedPress}
onDiscussionPress={this.onDiscussionPress} onDiscussionPress={this.onDiscussionPress}
onThreadPress={this.onThreadPress} onThreadPress={this.onThreadPress}
onAnswerButtonPress={this.sendMessage}
showAttachment={this.showAttachment} showAttachment={this.showAttachment}
reactionInit={this.onReactionInit} reactionInit={this.onReactionInit}
replyBroadcast={this.replyBroadcast} replyBroadcast={this.replyBroadcast}

View File

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

View File

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

View File

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

View File

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

18
ios/Pods/Manifest.lock generated
View File

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

View File

@ -1,7 +1,8 @@
APPLICATION_EXTENSION_API_ONLY = YES APPLICATION_EXTENSION_API_ONLY = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JitsiMeetSDK 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 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
PODS_BUILD_DIR = ${BUILD_DIR} PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 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 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_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" install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework"
fi fi
if [[ "$CONFIGURATION" == "Release" ]]; then 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_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" install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework"
fi fi
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 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 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_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" install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework"
fi fi
if [[ "$CONFIGURATION" == "Release" ]]; then 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_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" install_framework "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework"
fi fi
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 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 APPLICATION_EXTENSION_API_ONLY = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/react-native-jitsi-meet 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 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" 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" 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 APPLICATION_EXTENSION_API_ONLY = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/react-native-jitsi-meet 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 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" 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" 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 CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/react-native-orientation-locker
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos" FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 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" 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_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 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 CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/react-native-orientation-locker
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos" FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 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" 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_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

View File

@ -1179,16 +1179,16 @@
); );
inputPaths = ( inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh", "${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_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", "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework/OpenSSL",
); );
name = "[CP] Embed Pods Frameworks"; name = "[CP] Embed Pods Frameworks";
outputPaths = ( 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}/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", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -1225,16 +1225,16 @@
); );
inputPaths = ( inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat-frameworks.sh", "${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_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", "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework/OpenSSL",
); );
name = "[CP] Embed Pods Frameworks"; name = "[CP] Embed Pods Frameworks";
outputPaths = ( 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}/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", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -1726,7 +1726,7 @@
INFOPLIST_FILE = NotificationService/Info.plist; INFOPLIST_FILE = NotificationService/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0; IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; 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_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService; PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
@ -1763,7 +1763,7 @@
INFOPLIST_FILE = NotificationService/Info.plist; INFOPLIST_FILE = NotificationService/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0; IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; 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; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService; PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";

View File

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

View File

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

View File

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

View File

@ -854,3 +854,32 @@ stories.add('Ignored', () => (
stories.add('Custom style', () => ( stories.add('Custom style', () => (
<Message msg='Message' style={[styles.normalize, { backgroundColor: '#ddd' }]} /> <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/BackgroundContainer/index.stories.js';
import '../../app/containers/RoomHeader/RoomHeader.stories.js'; import '../../app/containers/RoomHeader/RoomHeader.stories.js';
import '../../app/views/RoomView/LoadMore/LoadMore.stories'; import '../../app/views/RoomView/LoadMore/LoadMore.stories';
import '../../app/containers/TextInput.stories';
// Change here to see themed storybook // Change here to see themed storybook
export const theme = 'light'; export const theme = 'light';

772
yarn.lock

File diff suppressed because it is too large Load Diff