[NEW] Share extension (#942)

This commit is contained in:
Djorkaeff Alexandre 2019-07-18 14:44:02 -03:00 committed by Diego Mello
parent b4a062e574
commit 18ef6c5430
66 changed files with 6989 additions and 988 deletions

3
__mocks__/react-native-realm-path.js vendored Normal file
View File

@ -0,0 +1,3 @@
export default {
realmPath: ''
};

View File

@ -174,6 +174,8 @@ android {
dependencies {
addUnimodulesDependencies()
implementation "org.webkit:android-jsc:r241213"
implementation project(':rn-extensions-share')
implementation project(':rn-fetch-blob')
implementation project(':react-native-document-picker')
implementation project(':react-native-firebase')
implementation project(':react-native-webview')

View File

@ -5,8 +5,10 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission-sdk-23 android:name="android.permission.VIBRATE"/>
<application
@ -25,6 +27,7 @@
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
</intent-filter>
<intent-filter android:label="@string/app_name">
<action android:name="android.intent.action.VIEW" />
@ -36,6 +39,19 @@
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
<activity
android:noHistory="true"
android:name=".share.ShareActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:label="@string/share_extension_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" >
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -34,6 +34,8 @@ import com.learnium.RNDeviceInfo.RNDeviceInfo;
import com.actionsheet.ActionSheetPackage;
import io.realm.react.RealmReactPackage;
import com.swmansion.rnscreens.RNScreensPackage;
import chat.rocket.SharePackage;
import com.RNFetchBlob.RNFetchBlobPackage;
import chat.rocket.reactnative.generated.BasePackageList;
@ -69,6 +71,8 @@ public class MainApplication extends Application implements ReactApplication, IN
new RNCWebViewPackage(),
new OrientationPackage(),
new SplashScreenReactPackage(),
new SharePackage(),
new RNFetchBlobPackage(),
new RNGestureHandlerPackage(),
new RNScreensPackage(),
new ActionSheetPackage(),

View File

@ -0,0 +1,23 @@
package chat.rocket.reactnative.share;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
public class ShareActivity extends ReactActivity {
@Override
protected String getMainComponentName() {
return "ShareRocketChatRN";
}
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new ReactActivityDelegate(this, getMainComponentName()) {
@Override
protected ReactRootView createRootView() {
return new RNGestureHandlerEnabledRootView(ShareActivity.this);
}
};
}
}

View File

@ -0,0 +1,38 @@
package chat.rocket.reactnative.share;
import chat.rocket.reactnative.BuildConfig;
import chat.rocket.SharePackage;
import android.app.Application;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactPackage;
import java.util.Arrays;
import java.util.List;
public class ShareApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new SharePackage()
);
}
};
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
}

View File

@ -1,5 +1,5 @@
<resources>
<string name="app_name">Rocket.Chat Experimental</string>
<string name="share_extension_name">Rocket.Chat Experimental</string>
<string name="no_browser_found">No Browser Found</string>
</resources>

View File

@ -2,4 +2,19 @@
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:colorEdgeEffect">#aaaaaa</item>
</style>
<style name="Share.Window" parent="android:Theme">
<item name="android:windowEnterAnimation">@null</item>
<item name="android:windowExitAnimation">@null</item>
</style>
<style name="Theme.Share.Transparent" parent="android:Theme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@color/primary_dark</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowAnimationStyle">@style/Share.Window</item>
</style>
</resources>

View File

@ -38,4 +38,8 @@ include ':realm'
project(':realm').projectDir = new File(rootProject.projectDir, '../node_modules/realm/android')
include ':reactnativenotifications'
project(':reactnativenotifications').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-notifications/android')
include ':app'
include ':rn-fetch-blob'
project(':rn-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/rn-fetch-blob/android')
include ':app', ':rn-extensions-share'
project(':rn-extensions-share').projectDir = new File(rootProject.projectDir, '../node_modules/rn-extensions-share/android')

View File

@ -1,4 +1,5 @@
{
"name": "RocketChatRN",
"share": "ShareRocketChatRN",
"displayName": "RocketChatRN"
}

View File

@ -68,16 +68,16 @@ export default {
Threads_enabled: {
type: null
},
API_Gitlab_URL: {
type: 'valueAsString'
},
AutoTranslate_Enabled: {
type: 'valueAsBoolean'
},
FileUpload_MediaTypeWhiteList: {
type: 'valueAsString'
},
FileUpload_MaxFileSize: {
type: 'valueAsNumber'
},
API_Gitlab_URL: {
type: 'valueAsString'
},
AutoTranslate_Enabled: {
type: 'valueAsBoolean'
}
};

View File

@ -32,6 +32,15 @@ export const CloseModalButton = React.memo(({ navigation, testID }) => (
</CustomHeaderButtons>
));
export const CloseShareExtensionButton = React.memo(({ onPress, testID }) => (
<CustomHeaderButtons left>
{isIOS
? <Item title='cancel' onPress={onPress} testID={testID} />
: <Item title='close' iconName='cross' onPress={onPress} testID={testID} />
}
</CustomHeaderButtons>
));
export const MoreButton = React.memo(({ onPress, testID }) => (
<CustomHeaderButtons>
<Item title='more' iconName='menu' onPress={onPress} testID={testID} />
@ -50,6 +59,10 @@ CloseModalButton.propTypes = {
navigation: PropTypes.object.isRequired,
testID: PropTypes.string.isRequired
};
CloseShareExtensionButton.propTypes = {
onPress: PropTypes.func.isRequired,
testID: PropTypes.string.isRequired
};
MoreButton.propTypes = {
onPress: PropTypes.func.isRequired,
testID: PropTypes.string.isRequired

View File

@ -7,8 +7,12 @@ import { COLOR_TEXT_DESCRIPTION } from '../constants/colors';
const styles = StyleSheet.create({
style: {
marginRight: 7,
marginTop: 3,
tintColor: COLOR_TEXT_DESCRIPTION,
marginTop: 3
},
imageColor: {
tintColor: COLOR_TEXT_DESCRIPTION
},
iconColor: {
color: COLOR_TEXT_DESCRIPTION
},
discussion: {
@ -23,13 +27,15 @@ const RoomTypeIcon = React.memo(({ type, size, style }) => {
if (type === 'discussion') {
// FIXME: These are temporary only. We should have all room icons on <Customicon />, but our design team is still working on this.
return <CustomIcon name='chat' size={13} style={[styles.style, styles.discussion]} />;
return <CustomIcon name='chat' size={13} style={[styles.style, styles.iconColor, styles.discussion]} />;
}
if (type === 'c') {
return <Image source={{ uri: 'hashtag' }} style={[styles.style, style, { width: size, height: size }]} />;
return <Image source={{ uri: 'hashtag' }} style={[styles.style, styles.imageColor, style, { width: size, height: size }]} />;
} if (type === 'd') {
return <CustomIcon name='at' size={13} style={[styles.style, styles.iconColor, styles.discussion]} />;
}
return <Image source={{ uri: 'lock' }} style={[styles.style, style, { width: size, height: size }]} />;
return <Image source={{ uri: 'lock' }} style={[styles.style, styles.imageColor, style, { width: size, height: size }]} />;
});
RoomTypeIcon.propTypes = {

View File

@ -103,6 +103,7 @@ export default {
Avatar_changed_successfully: 'Avatar changed successfully!',
Avatar_Url: 'Avatar URL',
Away: 'Away',
Back: 'Back',
Block_user: 'Block user',
Broadcast_channel_Description: 'Only authorized users can write new messages, but the other users will be able to reply',
Broadcast_Channel: 'Broadcast Channel',
@ -310,6 +311,8 @@ export default {
Search_global_users: 'Search for global users',
Search_global_users_description: 'If you turn-on, you can search for any user from others companies or servers.',
Select_Avatar: 'Select Avatar',
Select_Channels: 'Select Channels',
Select_Server: 'Select Server',
Select_Users: 'Select Users',
Send: 'Send',
Send_audio_message: 'Send audio message',
@ -349,6 +352,7 @@ export default {
Thread: 'Thread',
Threads: 'Threads',
Timezone: 'Timezone',
To: 'To',
topic: 'topic',
Topic: 'Topic',
Translate: 'Translate',
@ -389,6 +393,7 @@ export default {
Welcome: 'Welcome',
Welcome_to_RocketChat: 'Welcome to Rocket.Chat',
Whats_your_2fa: 'What\'s your 2FA code?',
Without_Servers: 'Without Servers',
Yes_action_it: 'Yes, {{action}} it!',
Yesterday: 'Yesterday',
You_are_in_preview_mode: 'You are in preview mode',
@ -398,6 +403,7 @@ export default {
you_were_mentioned: 'you were mentioned',
you: 'you',
You: 'You',
You_need_to_access_at_least_one_RocketChat_server_to_share_something: 'You need to access at least one Rocket.Chat server to share something.',
Version_no: 'Version: {{version}}',
You_will_not_be_able_to_recover_this_message: 'You will not be able to recover this message!',
Change_Language: 'Change Language',

View File

@ -108,6 +108,7 @@ export default {
Avatar_changed_successfully: 'Avatar alterado com sucesso!',
Avatar_Url: 'Avatar URL',
Away: 'Ausente',
Back: 'Voltar',
Block_user: 'Bloquear usuário',
Broadcast_channel_Description: 'Somente usuários autorizados podem escrever novas mensagens, mas os outros usuários poderão responder',
Broadcast_Channel: 'Canal de Transmissão',
@ -301,6 +302,8 @@ export default {
Search_global_users: 'Busca por usuários globais',
Search_global_users_description: 'Caso ativado, busca por usuários de outras empresas ou servidores.',
Select_Avatar: 'Selecionar Avatar',
Select_Channels: 'Selecionar Canais',
Select_Server: 'Selecionar Servidor',
Select_Users: 'Selecionar Usuários',
Send: 'Enviar',
Send_audio_message: 'Enviar mensagem de áudio',
@ -333,6 +336,7 @@ export default {
Thread: 'Tópico',
Threads: 'Tópicos',
Timezone: 'Fuso horário',
To: 'Para',
topic: 'tópico',
Topic: 'Tópico',
Try_again: 'Tentar novamente',
@ -369,6 +373,7 @@ export default {
Welcome: 'Bem vindo',
Welcome_to_RocketChat: 'Bem vindo ao Rocket.Chat',
Whats_your_2fa: 'Qual seu código de autenticação?',
Without_Servers: 'Sem Servidores',
Yes_action_it: 'Sim, {{action}}!',
Yesterday: 'Ontem',
You_are_in_preview_mode: 'Está é uma prévia do canal',

View File

@ -5,18 +5,17 @@ import {
import { Provider } from 'react-redux';
import { useScreens } from 'react-native-screens'; // eslint-disable-line import/no-unresolved
import { Linking } from 'react-native';
import firebase from 'react-native-firebase';
import PropTypes from 'prop-types';
import { appInit } from './actions';
import { deepLinkingOpen } from './actions/deepLinking';
import Navigation from './lib/Navigation';
import Sidebar from './views/SidebarView';
import { HEADER_BACKGROUND, HEADER_TITLE, HEADER_BACK } from './constants/colors';
import parseQuery from './lib/methods/helpers/parseQuery';
import { initializePushNotifications, onNotification } from './notifications/push';
import store from './lib/createStore';
import NotificationBadge from './notifications/inApp';
import { defaultHeader, onNavigationStateChange } from './utils/navigation';
useScreens();
@ -34,17 +33,6 @@ const parseDeepLinking = (url) => {
return null;
};
const defaultHeader = {
headerStyle: {
backgroundColor: HEADER_BACKGROUND
},
headerTitleStyle: {
color: HEADER_TITLE
},
headerBackTitle: null,
headerTintColor: HEADER_BACK
};
// Outside
const OutsideStack = createStackNavigator({
OnboardingView: {
@ -262,28 +250,6 @@ const App = createAppContainer(createSwitchNavigator(
}
));
// gets the current screen from navigation state
const getActiveRouteName = (navigationState) => {
if (!navigationState) {
return null;
}
const route = navigationState.routes[navigationState.index];
// dive into nested navigators
if (route.routes) {
return getActiveRouteName(route);
}
return route.routeName;
};
const onNavigationStateChange = (prevState, currentState) => {
const currentScreen = getActiveRouteName(currentState);
const prevScreen = getActiveRouteName(prevState);
if (prevScreen !== currentScreen) {
firebase.analytics().setCurrentScreen(currentScreen);
}
};
export default class Root extends React.Component {
constructor(props) {
super(props);

View File

@ -1,4 +1,5 @@
import Realm from 'realm';
import RNRealmPath from 'react-native-realm-path';
// import { AsyncStorage } from 'react-native';
// Realm.clearTestState();
@ -408,7 +409,7 @@ const inMemorySchema = [usersTypingSchema, activeUsersSchema];
class DB {
databases = {
serversDB: new Realm({
path: 'default.realm',
path: `${ RNRealmPath.realmPath }default.realm`,
schema: [
userSchema,
serversSchema
@ -426,7 +427,7 @@ class DB {
}
}),
inMemoryDB: new Realm({
path: 'memory.realm',
path: `${ RNRealmPath.realmPath }memory.realm`,
schema: inMemorySchema,
schemaVersion: 2,
inMemory: true
@ -468,7 +469,7 @@ class DB {
setActiveDB(database = '') {
const path = database.replace(/(^\w+:|^)\/\//, '');
return this.databases.activeDB = new Realm({
path: `${ path }.realm`,
path: `${ RNRealmPath.realmPath }${ path }.realm`,
schema,
schemaVersion: 13,
migration: (oldRealm, newRealm) => {

View File

@ -730,14 +730,14 @@ const RocketChat = {
return JSON.parse(useMarkdown);
},
async getSortPreferences() {
const prefs = await AsyncStorage.getItem(SORT_PREFS_KEY);
return JSON.parse(prefs);
const prefs = await RNUserDefaults.objectForKey(SORT_PREFS_KEY);
return prefs;
},
async saveSortPreference(param) {
try {
let prefs = await RocketChat.getSortPreferences();
prefs = { ...prefs, ...param };
return await AsyncStorage.setItem(SORT_PREFS_KEY, JSON.stringify(prefs));
return await RNUserDefaults.setObjectForKey(SORT_PREFS_KEY, prefs);
} catch (error) {
console.warn(error);
}

View File

@ -5,7 +5,9 @@ import PropTypes from 'prop-types';
import Avatar from '../../containers/Avatar';
import Touch from '../../utils/touch';
import RoomTypeIcon from '../../containers/RoomTypeIcon';
import styles from './styles';
import styles, { ROW_HEIGHT } from './styles';
export { ROW_HEIGHT };
const DirectoryItemLabel = React.memo(({ text }) => {
if (!text) {
@ -30,7 +32,7 @@ const DirectoryItem = ({
/>
<View style={styles.directoryItemTextContainer}>
<View style={styles.directoryItemTextTitle}>
<RoomTypeIcon type='c' />
<RoomTypeIcon type={type} />
<Text style={styles.directoryItemName} numberOfLines={1}>{title}</Text>
</View>
<Text style={styles.directoryItemUsername} numberOfLines={1}>{description}</Text>

View File

@ -0,0 +1,49 @@
import { StyleSheet } from 'react-native';
import { COLOR_WHITE } from '../../constants/colors';
import sharedStyles from '../../views/Styles';
export const ROW_HEIGHT = 54;
export default StyleSheet.create({
directoryItemButton: {
height: ROW_HEIGHT,
backgroundColor: COLOR_WHITE
},
directoryItemContainer: {
flex: 1,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center',
paddingHorizontal: 15
},
directoryItemAvatar: {
marginRight: 12
},
directoryItemTextTitle: {
flexDirection: 'row',
alignItems: 'center'
},
directoryItemTextContainer: {
flex: 1,
flexDirection: 'column',
justifyContent: 'center'
},
directoryItemName: {
flex: 1,
fontSize: 17,
...sharedStyles.textMedium,
...sharedStyles.textColorNormal
},
directoryItemUsername: {
fontSize: 14,
...sharedStyles.textRegular,
...sharedStyles.textColorDescription
},
directoryItemLabel: {
fontSize: 14,
paddingLeft: 10,
...sharedStyles.textRegular,
...sharedStyles.textColorDescription
}
});

View File

@ -0,0 +1,53 @@
import React from 'react';
import PropTypes from 'prop-types';
import { View, Text } from 'react-native';
import FastImage from 'react-native-fast-image';
import { RectButton } from 'react-native-gesture-handler';
import log from '../../utils/log';
import Check from '../../containers/Check';
import styles, { ROW_HEIGHT } from './styles';
export { ROW_HEIGHT };
const ServerItem = React.memo(({
server, item, onPress, hasCheck
}) => (
<RectButton onPress={onPress} style={styles.serverItem} testID={`rooms-list-header-server-${ item.id }`}>
<View style={styles.serverItemContainer}>
{item.iconURL
? (
<FastImage
source={{
uri: item.iconURL,
priority: FastImage.priority.high
}}
defaultSource={{ uri: 'logo' }}
style={styles.serverIcon}
onError={() => log('err_loading_server_icon')}
/>
)
: (
<FastImage
source={{ uri: 'logo' }}
style={styles.serverIcon}
/>
)
}
<View style={styles.serverTextContainer}>
<Text style={styles.serverName}>{item.name || item.id}</Text>
<Text style={styles.serverUrl}>{item.id}</Text>
</View>
{item.id === server && hasCheck ? <Check /> : null}
</View>
</RectButton>
));
ServerItem.propTypes = {
onPress: PropTypes.func.isRequired,
item: PropTypes.object.isRequired,
hasCheck: PropTypes.bool,
server: PropTypes.string
};
export default ServerItem;

View File

@ -0,0 +1,39 @@
import { StyleSheet } from 'react-native';
import sharedStyles from '../../views/Styles';
import { COLOR_WHITE } from '../../constants/colors';
export const ROW_HEIGHT = 56;
export default StyleSheet.create({
serverItem: {
height: ROW_HEIGHT,
backgroundColor: COLOR_WHITE,
justifyContent: 'center'
},
serverItemContainer: {
flexDirection: 'row',
alignItems: 'center'
},
serverIcon: {
width: 38,
height: 38,
marginHorizontal: 15,
borderRadius: 4
},
serverTextContainer: {
flex: 1,
flexDirection: 'column',
justifyContent: 'center'
},
serverName: {
fontSize: 18,
...sharedStyles.textColorNormal,
...sharedStyles.textSemibold
},
serverUrl: {
fontSize: 15,
...sharedStyles.textColorDescription,
...sharedStyles.textRegular
}
});

78
app/share.js Normal file
View File

@ -0,0 +1,78 @@
import React from 'react';
import { View } from 'react-native';
import { createAppContainer, createStackNavigator, createSwitchNavigator } from 'react-navigation';
import { Provider } from 'react-redux';
import Navigation from './lib/Navigation';
import store from './lib/createStore';
import { appInit } from './actions';
import ShareListView from './views/ShareListView';
import ShareView from './views/ShareView';
import SelectServerView from './views/SelectServerView';
import AuthLoadingView from './views/AuthLoadingView';
import WithoutServersView from './views/WithoutServersView';
import sharedStyles from './views/Styles';
import { isNotch } from './utils/deviceInfo';
import { defaultHeader, onNavigationStateChange } from './utils/navigation';
const InsideNavigator = createStackNavigator({
ShareListView,
ShareView,
SelectServerView
}, {
initialRouteName: 'ShareListView',
defaultNavigationOptions: defaultHeader
});
const OutsideNavigator = createStackNavigator({
WithoutServersView
}, {
initialRouteName: 'WithoutServersView',
defaultNavigationOptions: defaultHeader
});
const AppContainer = createAppContainer(createSwitchNavigator({
OutsideStack: OutsideNavigator,
InsideStack: InsideNavigator,
AuthLoading: AuthLoadingView
},
{
initialRouteName: 'AuthLoading'
}));
class Root extends React.Component {
constructor(props) {
super(props);
store.dispatch(appInit());
this.state = {
isLandscape: false
};
}
handleLayout = (event) => {
const { width, height } = event.nativeEvent.layout;
this.setState({ isLandscape: width > height });
}
render() {
const { isLandscape } = this.state;
return (
<View
style={[sharedStyles.container, isLandscape && isNotch ? sharedStyles.notchLandscapeContainer : {}]}
onLayout={this.handleLayout}
>
<Provider store={store}>
<AppContainer
ref={(navigatorRef) => {
Navigation.setTopLevelNavigator(navigatorRef);
}}
onNavigationStateChange={onNavigationStateChange}
/>
</Provider>
</View>
);
}
}
export default Root;

36
app/utils/navigation.js Normal file
View File

@ -0,0 +1,36 @@
import firebase from 'react-native-firebase';
import { HEADER_BACKGROUND, HEADER_TITLE, HEADER_BACK } from '../constants/colors';
export const defaultHeader = {
headerStyle: {
backgroundColor: HEADER_BACKGROUND
},
headerTitleStyle: {
color: HEADER_TITLE
},
headerBackTitle: null,
headerTintColor: HEADER_BACK
};
// gets the current screen from navigation state
export const getActiveRouteName = (navigationState) => {
if (!navigationState) {
return null;
}
const route = navigationState.routes[navigationState.index];
// dive into nested navigators
if (route.routes) {
return getActiveRouteName(route);
}
return route.routeName;
};
export const onNavigationStateChange = (prevState, currentState) => {
const currentScreen = getActiveRouteName(currentState);
const prevScreen = getActiveRouteName(prevState);
if (prevScreen !== currentScreen) {
firebase.analytics().setCurrentScreen(currentScreen);
}
};

View File

@ -2,6 +2,27 @@ import moment from 'moment';
import I18n from '../i18n';
export const isOwner = room => room && room.roles && room.roles.length && !!room.roles.find(role => role === 'owner');
export const isMuted = (room, user) => room && room.muted && room.muted.find && !!room.muted.find(m => m === user.username);
export const isReadOnly = (room, user) => {
if (isOwner(room)) {
return false;
}
return (room && room.ro) || isMuted(room, user);
};
export const isBlocked = (room) => {
if (room) {
const { t, blocked, blocker } = room;
if (t === 'd' && (blocked || blocker)) {
return true;
}
}
return false;
};
export const capitalize = (s) => {
if (typeof s !== 'string') { return ''; }
return s.charAt(0).toUpperCase() + s.slice(1);

View File

@ -7,7 +7,7 @@ import { connect } from 'react-redux';
import { SafeAreaView } from 'react-navigation';
import RocketChat from '../../lib/rocketchat';
import DirectoryItem from './DirectoryItem';
import DirectoryItem from '../../presentation/DirectoryItem';
import sharedStyles from '../Styles';
import I18n from '../../i18n';
import Touch from '../../utils/touch';

View File

@ -98,46 +98,6 @@ export default StyleSheet.create({
marginHorizontal: 15,
flex: 1
},
directoryItemButton: {
height: 54,
backgroundColor: COLOR_WHITE
},
directoryItemContainer: {
flex: 1,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center',
paddingHorizontal: 15
},
directoryItemAvatar: {
marginRight: 12
},
directoryItemTextTitle: {
flexDirection: 'row',
alignItems: 'center'
},
directoryItemTextContainer: {
flex: 1,
flexDirection: 'column',
justifyContent: 'center'
},
directoryItemName: {
flex: 1,
fontSize: 17,
...sharedStyles.textMedium,
...sharedStyles.textColorNormal
},
directoryItemUsername: {
fontSize: 14,
...sharedStyles.textRegular,
...sharedStyles.textColorDescription
},
directoryItemLabel: {
fontSize: 14,
paddingLeft: 10,
...sharedStyles.textRegular,
...sharedStyles.textColorDescription
},
inverted: {
transform: [{ scaleY: -1 }]
},

View File

@ -42,6 +42,7 @@ import buildMessage from '../../lib/methods/helpers/buildMessage';
import FileModal from '../../containers/FileModal';
import ReactionsModal from '../../containers/ReactionsModal';
import { Toast } from '../../utils/info';
import { isReadOnly, isBlocked } from '../../utils/room';
@connect(state => ({
user: {
@ -455,37 +456,6 @@ export default class RoomView extends React.Component {
}
};
isOwner = () => {
const { room } = this.state;
return room && room.roles && room.roles.length && !!room.roles.find(role => role === 'owner');
}
isMuted = () => {
const { room } = this.state;
const { user } = this.props;
return room && room.muted && room.muted.find && !!room.muted.find(m => m === user.username);
}
isReadOnly = () => {
const { room } = this.state;
if (this.isOwner()) {
return false;
}
return (room && room.ro) || this.isMuted();
}
isBlocked = () => {
const { room } = this.state;
if (room) {
const { t, blocked, blocker } = room;
if (t === 'd' && (blocked || blocker)) {
return true;
}
}
return false;
}
// eslint-disable-next-line react/sort-comp
fetchThreadName = async(tmid) => {
try {
@ -576,7 +546,7 @@ export default class RoomView extends React.Component {
renderFooter = () => {
const { joined, room } = this.state;
const { navigation } = this.props;
const { navigation, user } = this.props;
if (!joined && !this.tmid) {
return (
@ -593,14 +563,14 @@ export default class RoomView extends React.Component {
</View>
);
}
if (this.isReadOnly()) {
if (isReadOnly(room, user)) {
return (
<View style={styles.readOnly}>
<Text style={styles.previewMode}>{I18n.t('This_room_is_read_only')}</Text>
</View>
);
}
if (this.isBlocked()) {
if (isBlocked(room)) {
return (
<View style={styles.readOnly}>
<Text style={styles.previewMode}>{I18n.t('This_room_is_blocked')}</Text>

View File

@ -0,0 +1,114 @@
import React from 'react';
import {
FlatList, StyleSheet, View
} from 'react-native';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { SafeAreaView } from 'react-navigation';
import I18n from '../i18n';
import database from '../lib/realm';
import StatusBar from '../containers/StatusBar';
import { selectServerRequest as selectServerRequestAction } from '../actions/server';
import {
COLOR_BACKGROUND_CONTAINER
} from '../constants/colors';
import Navigation from '../lib/Navigation';
import ServerItem, { ROW_HEIGHT } from '../presentation/ServerItem';
import sharedStyles from './Styles';
const getItemLayout = (data, index) => ({ length: ROW_HEIGHT, offset: ROW_HEIGHT * index, index });
const keyExtractor = item => item.id;
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: COLOR_BACKGROUND_CONTAINER
},
list: {
marginVertical: 32,
...sharedStyles.separatorVertical
},
separator: {
...sharedStyles.separatorBottom,
marginLeft: 48
}
});
@connect(state => ({
server: state.server.server
}), dispatch => ({
selectServerRequest: server => dispatch(selectServerRequestAction(server))
}))
export default class SelectServerView extends React.Component {
static navigationOptions = () => ({
title: I18n.t('Select_Server')
})
static propTypes = {
server: PropTypes.string,
selectServerRequest: PropTypes.func
}
constructor(props) {
super(props);
const { serversDB } = database.databases;
const servers = serversDB.objects('servers');
const filteredServers = servers.filter(server => server.roomsUpdatedAt);
this.state = {
servers: filteredServers
};
}
select = (server) => {
const {
server: currentServer, selectServerRequest
} = this.props;
if (currentServer !== server) {
selectServerRequest(server);
}
Navigation.navigate('ShareListView');
}
renderItem = ({ item }) => {
const { server } = this.props;
return (
<ServerItem
server={server}
onPress={() => this.select(item.id)}
item={item}
hasCheck
/>
);
}
renderSeparator = () => <View style={styles.separator} />;
render() {
const { servers } = this.state;
return (
<SafeAreaView
style={styles.container}
forceInset={{ bottom: 'never' }}
>
<StatusBar />
<View style={styles.list}>
<FlatList
data={servers}
keyExtractor={keyExtractor}
renderItem={this.renderItem}
getItemLayout={getItemLayout}
ItemSeparatorComponent={this.renderSeparator}
enableEmptySections
removeClippedSubviews
keyboardShouldPersistTaps='always'
windowSize={7}
bounces={false}
/>
</View>
</SafeAreaView>
);
}
}

View File

@ -0,0 +1,92 @@
import React, { PureComponent } from 'react';
import {
View, StyleSheet, Text, Platform
} from 'react-native';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { TextInput } from 'react-native-gesture-handler';
import I18n from '../../i18n';
import { COLOR_WHITE, HEADER_TITLE } from '../../constants/colors';
import sharedStyles from '../Styles';
import { setSearch as setSearchAction } from '../../actions/rooms';
import { isAndroid } from '../../utils/deviceInfo';
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center'
},
search: {
fontSize: 20,
color: COLOR_WHITE,
...sharedStyles.textRegular
},
title: {
...Platform.select({
ios: {
fontSize: 17,
...sharedStyles.textSemibold,
color: HEADER_TITLE
},
android: {
fontSize: 20,
...sharedStyles.textRegular,
color: HEADER_TITLE
}
})
}
});
@connect(state => ({
showSearchHeader: state.rooms.showSearchHeader
}), dispatch => ({
setSearch: searchText => dispatch(setSearchAction(searchText))
}))
class ShareListHeader extends PureComponent {
static propTypes = {
showSearchHeader: PropTypes.bool,
setSearch: PropTypes.func
}
componentDidUpdate(prevProps) {
const { showSearchHeader } = this.props;
if (showSearchHeader && prevProps.showSearchHeader !== showSearchHeader) {
setTimeout(() => {
this.searchInputRef.focus();
}, 300);
}
}
onSearchChangeText = (text) => {
const { setSearch } = this.props;
setSearch(text.trim());
}
setSearchInputRef = (ref) => {
this.searchInputRef = ref;
}
render() {
const {
showSearchHeader
} = this.props;
if (showSearchHeader && isAndroid) {
return (
<View style={styles.container}>
<TextInput
ref={this.setSearchInputRef}
style={styles.search}
placeholder={I18n.t('Search')}
placeholderTextColor='rgba(255, 255, 255, 0.5)'
onChangeText={this.onSearchChangeText}
/>
</View>
);
}
return <Text style={styles.title}>{I18n.t('Select_Channels')}</Text>;
}
}
export default ShareListHeader;

View File

@ -0,0 +1,494 @@
import React from 'react';
import PropTypes from 'prop-types';
import {
View, Text, LayoutAnimation, InteractionManager, FlatList, ScrollView, ActivityIndicator, Keyboard
} from 'react-native';
import { SafeAreaView } from 'react-navigation';
import ShareExtension from 'rn-extensions-share';
import { connect } from 'react-redux';
import RNFetchBlob from 'rn-fetch-blob';
import * as mime from 'react-native-mime-types';
import { isEqual } from 'lodash';
import Navigation from '../../lib/Navigation';
import database, { safeAddListener } from '../../lib/realm';
import debounce from '../../utils/debounce';
import { isIOS, isAndroid } from '../../utils/deviceInfo';
import I18n from '../../i18n';
import { CustomIcon } from '../../lib/Icons';
import log from '../../utils/log';
import {
openSearchHeader as openSearchHeaderAction,
closeSearchHeader as closeSearchHeaderAction
} from '../../actions/rooms';
import DirectoryItem, { ROW_HEIGHT } from '../../presentation/DirectoryItem';
import ServerItem, { ROW_HEIGHT as ROW_HEIGHT_SERVER } from '../../presentation/ServerItem';
import { CloseShareExtensionButton, CustomHeaderButtons, Item } from '../../containers/HeaderButton';
import SearchBar from '../RoomsListView/ListHeader/SearchBar';
import ShareListHeader from './Header';
import styles from './styles';
const SCROLL_OFFSET = 56;
const getItemLayoutChannel = (data, index) => ({ length: ROW_HEIGHT, offset: ROW_HEIGHT * index, index });
const getItemLayoutServer = (data, index) => ({ length: ROW_HEIGHT_SERVER, offset: ROW_HEIGHT_SERVER * index, index });
const keyExtractor = item => item.rid;
@connect(state => ({
userId: state.login.user && state.login.user.id,
token: state.login.user && state.login.user.token,
useRealName: state.settings.UI_Use_Real_Name,
searchText: state.rooms.searchText,
server: state.server.server,
loading: state.server.loading,
FileUpload_MediaTypeWhiteList: state.settings.FileUpload_MediaTypeWhiteList,
FileUpload_MaxFileSize: state.settings.FileUpload_MaxFileSize,
baseUrl: state.settings.baseUrl || state.server ? state.server.server : '',
sortBy: state.sortPreferences.sortBy,
groupByType: state.sortPreferences.groupByType,
showFavorites: state.sortPreferences.showFavorites
}), dispatch => ({
openSearchHeader: () => dispatch(openSearchHeaderAction()),
closeSearchHeader: () => dispatch(closeSearchHeaderAction())
}))
/** @extends React.Component */
export default class ShareListView extends React.Component {
static navigationOptions = ({ navigation }) => {
const searching = navigation.getParam('searching');
const cancelSearchingAndroid = navigation.getParam('cancelSearchingAndroid');
const initSearchingAndroid = navigation.getParam('initSearchingAndroid', () => {});
return {
headerBackTitle: isIOS ? I18n.t('Back') : null,
headerLeft: searching
? (
<CustomHeaderButtons left>
<Item title='cancel' iconName='cross' onPress={cancelSearchingAndroid} />
</CustomHeaderButtons>
)
: (
<CloseShareExtensionButton
onPress={ShareExtension.close}
testID='share-extension-close'
/>
),
headerTitle: <ShareListHeader />,
headerRight: (
searching
? null
: (
<CustomHeaderButtons>
{isAndroid ? <Item title='search' iconName='magnifier' onPress={initSearchingAndroid} /> : null}
</CustomHeaderButtons>
)
)
};
}
static propTypes = {
navigation: PropTypes.object,
server: PropTypes.string,
useRealName: PropTypes.bool,
searchText: PropTypes.string,
FileUpload_MediaTypeWhiteList: PropTypes.string,
FileUpload_MaxFileSize: PropTypes.number,
openSearchHeader: PropTypes.func,
closeSearchHeader: PropTypes.func,
baseUrl: PropTypes.string,
token: PropTypes.string,
userId: PropTypes.string,
sortBy: PropTypes.string,
groupByType: PropTypes.bool,
showFavorites: PropTypes.bool,
loading: PropTypes.bool
}
constructor(props) {
super(props);
this.data = [];
this.state = {
searching: false,
value: '',
isMedia: false,
mediaLoading: false,
loading: true,
fileInfo: null,
search: [],
discussions: [],
channels: [],
favorites: [],
chats: [],
privateGroup: [],
direct: [],
livechat: [],
servers: []
};
}
async componentDidMount() {
this.getSubscriptions();
const { navigation } = this.props;
navigation.setParams({
initSearchingAndroid: this.initSearchingAndroid,
cancelSearchingAndroid: this.cancelSearchingAndroid
});
try {
const { value, type } = await ShareExtension.data();
let fileInfo = null;
const isMedia = (type === 'media');
if (isMedia) {
this.setState({ mediaLoading: true });
const data = await RNFetchBlob.fs.stat(this.uriToPath(value));
fileInfo = {
name: data.filename,
description: '',
size: data.size,
type: mime.lookup(data.path),
store: 'Uploads',
path: isIOS ? data.path : `file://${ data.path }`
};
}
this.setState({
value, fileInfo, isMedia, mediaLoading: false
});
} catch (e) {
log('err_process_media_share_extension', e);
this.setState({ mediaLoading: false });
}
}
componentWillReceiveProps(nextProps) {
const { searchText, loading } = this.props;
if (nextProps.server && loading !== nextProps.loading) {
if (nextProps.loading) {
this.internalSetState({ loading: true });
} else {
this.getSubscriptions();
}
} else if (searchText !== nextProps.searchText) {
this.search(nextProps.searchText);
}
}
shouldComponentUpdate(nextProps, nextState) {
const { loading, searching } = this.state;
if (nextState.loading !== loading) {
return true;
}
if (nextState.searching !== searching) {
return true;
}
const { search } = this.state;
if (!isEqual(nextState.search, search)) {
return true;
}
return false;
}
// eslint-disable-next-line react/sort-comp
internalSetState = (...args) => {
const { navigation } = this.props;
if (isIOS && navigation.isFocused()) {
LayoutAnimation.easeInEaseOut();
}
this.setState(...args);
}
getSubscriptions = debounce(() => {
if (this.data && this.data.removeAllListeners) {
this.data.removeAllListeners();
}
const {
server, sortBy, showFavorites, groupByType
} = this.props;
const { serversDB } = database.databases;
if (server) {
this.data = database.objects('subscriptions').filtered('archived != true && open == true');
if (sortBy === 'alphabetical') {
this.data = this.data.sorted('name', false);
} else {
this.data = this.data.sorted('roomUpdatedAt', true);
}
// servers
this.servers = serversDB.objects('servers');
// favorites
if (showFavorites) {
this.favorites = this.data.filtered('f == true');
} else {
this.favorites = [];
}
// type
if (groupByType) {
this.discussions = this.data.filtered('prid != null');
this.channels = this.data.filtered('t == $0 AND prid == null', 'c');
this.privateGroup = this.data.filtered('t == $0 AND prid == null', 'p');
this.direct = this.data.filtered('t == $0 AND prid == null', 'd');
this.livechat = this.data.filtered('t == $0 AND prid == null', 'l');
} else {
this.chats = this.data;
}
safeAddListener(this.data, this.updateState);
}
}, 300);
uriToPath = uri => decodeURIComponent(isIOS ? uri.replace(/^file:\/\//, '') : uri);
// eslint-disable-next-line react/sort-comp
updateState = debounce(() => {
this.updateStateInteraction = InteractionManager.runAfterInteractions(() => {
this.internalSetState({
chats: this.chats ? this.chats.slice() : [],
favorites: this.favorites ? this.favorites.slice() : [],
discussions: this.discussions ? this.discussions.slice() : [],
channels: this.channels ? this.channels.slice() : [],
privateGroup: this.privateGroup ? this.privateGroup.slice() : [],
direct: this.direct ? this.direct.slice() : [],
livechat: this.livechat ? this.livechat.slice() : [],
servers: this.servers ? this.servers.slice() : [],
loading: false
});
this.forceUpdate();
});
}, 300);
getRoomTitle = (item) => {
const { useRealName } = this.props;
return ((item.prid || useRealName) && item.fname) || item.name;
}
shareMessage = (item) => {
const { value, isMedia, fileInfo } = this.state;
const { navigation } = this.props;
navigation.navigate('ShareView', {
rid: item.rid,
value,
isMedia,
fileInfo,
name: this.getRoomTitle(item)
});
}
canUploadFile = () => {
const { FileUpload_MediaTypeWhiteList, FileUpload_MaxFileSize } = this.props;
const { fileInfo: file, mediaLoading, loading } = this.state;
if (loading || mediaLoading) {
return true;
}
if (!(file && file.path)) {
return true;
}
if (file.size > FileUpload_MaxFileSize) {
return false;
}
if (!FileUpload_MediaTypeWhiteList) {
return false;
}
const allowedMime = FileUpload_MediaTypeWhiteList.split(',');
if (allowedMime.includes(file.type)) {
return true;
}
const wildCardGlob = '/*';
const wildCards = allowedMime.filter(item => item.indexOf(wildCardGlob) > 0);
if (wildCards.includes(file.type.replace(/(\/.*)$/, wildCardGlob))) {
return true;
}
return false;
}
search = (text) => {
const result = database.objects('subscriptions').filtered('name CONTAINS[c] $0', text);
const subscriptions = database.objects('subscriptions');
const data = result.length !== subscriptions.length ? result : [];
this.internalSetState({
search: data
});
}
initSearchingAndroid = () => {
const { openSearchHeader, navigation } = this.props;
this.setState({ searching: true });
navigation.setParams({ searching: true });
openSearchHeader();
}
cancelSearchingAndroid = () => {
if (isAndroid) {
const { closeSearchHeader, navigation } = this.props;
this.setState({ searching: false });
navigation.setParams({ searching: false });
closeSearchHeader();
this.internalSetState({ search: [] });
Keyboard.dismiss();
}
}
renderListHeader = () => <SearchBar onChangeSearchText={this.search} />;
renderSectionHeader = header => (
<View style={styles.headerContainer}>
<Text style={styles.headerText}>
{I18n.t(header)}
</Text>
</View>
)
renderItem = ({ item }) => {
const { userId, token, baseUrl } = this.props;
return (
<DirectoryItem
user={{
userId,
token
}}
title={this.getRoomTitle(item)}
baseUrl={baseUrl}
avatar={this.getRoomTitle(item)}
description={
item.t === 'c'
? (item.topic || item.description)
: item.fname
}
type={item.t}
onPress={() => this.shareMessage(item)}
testID={`share-extension-item-${ item.name }`}
/>
);
}
renderSeparator = () => <View style={styles.separator} />;
renderSection = (data, header) => {
if (data && data.length > 0) {
return (
<React.Fragment>
{this.renderSectionHeader(header)}
<View style={styles.bordered}>
<FlatList
data={data}
keyExtractor={keyExtractor}
style={styles.flatlist}
renderItem={this.renderItem}
ItemSeparatorComponent={this.renderSeparator}
getItemLayout={getItemLayoutServer}
enableEmptySections
removeClippedSubviews
keyboardShouldPersistTaps='always'
initialNumToRender={12}
windowSize={20}
/>
</View>
</React.Fragment>
);
}
return null;
}
renderServerSelector = () => {
const { servers } = this.state;
const { server } = this.props;
const currentServer = servers.find(serverFiltered => serverFiltered.id === server);
return currentServer ? (
<React.Fragment>
{this.renderSectionHeader('Select_Server')}
<View style={styles.bordered}>
<ServerItem
server={server}
onPress={() => Navigation.navigate('SelectServerView')}
item={currentServer}
/>
</View>
</React.Fragment>
) : null;
}
renderContent = () => {
const {
discussions, channels, privateGroup, direct, livechat, search, chats, favorites
} = this.state;
if (search.length > 0) {
return (
<FlatList
data={search}
extraData={search}
keyExtractor={keyExtractor}
style={styles.flatlist}
renderItem={this.renderItem}
getItemLayout={getItemLayoutChannel}
ItemSeparatorComponent={this.renderSeparator}
enableEmptySections
removeClippedSubviews
keyboardShouldPersistTaps='always'
initialNumToRender={12}
windowSize={20}
/>
);
}
return (
<View style={styles.content}>
{this.renderServerSelector()}
{this.renderSection(favorites, 'Favorites')}
{this.renderSection(discussions, 'Discussions')}
{this.renderSection(channels, 'Channels')}
{this.renderSection(direct, 'Direct_Messages')}
{this.renderSection(privateGroup, 'Private_Groups')}
{this.renderSection(livechat, 'Livechat')}
{this.renderSection(chats, 'Chats')}
</View>
);
}
renderScrollView = () => {
const { mediaLoading, loading } = this.state;
if (mediaLoading || loading) {
return <ActivityIndicator style={styles.loading} />;
}
return (
<ScrollView
style={styles.scroll}
contentOffset={isIOS ? { x: 0, y: SCROLL_OFFSET } : {}}
keyboardShouldPersistTaps='always'
>
{this.renderListHeader()}
{this.renderContent()}
</ScrollView>
);
}
renderError = () => {
const { fileInfo: file } = this.state;
const { FileUpload_MaxFileSize } = this.props;
const errorMessage = (FileUpload_MaxFileSize < file.size)
? 'error-file-too-large'
: 'error-invalid-file-type';
return (
<View style={styles.container}>
<Text style={styles.title}>{I18n.t(errorMessage)}</Text>
<CustomIcon name='circle-cross' size={120} style={styles.errorIcon} />
<Text style={styles.fileMime}>{ file.type }</Text>
</View>
);
}
render() {
const showError = !this.canUploadFile();
return (
<SafeAreaView style={styles.container} forceInset={{ bottom: 'never' }}>
{ showError ? this.renderError() : this.renderScrollView() }
</SafeAreaView>
);
}
}

View File

@ -0,0 +1,65 @@
import { StyleSheet } from 'react-native';
import { isIOS } from '../../utils/deviceInfo';
import sharedStyles from '../Styles';
import {
COLOR_BACKGROUND_CONTAINER, COLOR_WHITE, COLOR_DANGER
} from '../../constants/colors';
export default StyleSheet.create({
container: {
justifyContent: 'center',
alignItems: 'center',
flex: 1,
backgroundColor: COLOR_BACKGROUND_CONTAINER
},
content: {
flex: 1,
backgroundColor: isIOS ? COLOR_WHITE : '#E1E5E8'
},
flatlist: {
width: '100%',
backgroundColor: COLOR_WHITE
},
bordered: {
...sharedStyles.separatorVertical
},
scroll: {
width: '100%'
},
headerContainer: {
paddingHorizontal: 15,
backgroundColor: COLOR_BACKGROUND_CONTAINER,
paddingBottom: 10,
paddingTop: 17
},
headerText: {
...sharedStyles.textColorNormal,
...sharedStyles.textRegular,
fontSize: 17,
letterSpacing: 0.27,
flex: 1
},
separator: {
...sharedStyles.separatorBottom,
marginLeft: 48
},
loading: {
flex: 1
},
errorIcon: {
color: COLOR_DANGER
},
fileMime: {
...sharedStyles.textColorNormal,
...sharedStyles.textBold,
...sharedStyles.textAlignCenter,
fontSize: 20,
marginBottom: 20
},
title: {
fontSize: 14,
...sharedStyles.textColorTitle,
...sharedStyles.textBold
}
});

View File

@ -0,0 +1,23 @@
import React from 'react';
import {
StyleSheet, ActivityIndicator, View
} from 'react-native';
import { COLOR_TEXT } from '../../constants/colors';
const styles = StyleSheet.create({
container: {
height: '100%',
width: '100%',
position: 'absolute',
justifyContent: 'center',
alignItems: 'center'
}
});
const Loading = React.memo(() => (
<View style={styles.container}>
<ActivityIndicator size='large' color={COLOR_TEXT} />
</View>
));
export default Loading;

View File

@ -0,0 +1,231 @@
import React from 'react';
import PropTypes from 'prop-types';
import {
View, Text, TextInput, Image
} from 'react-native';
import { connect } from 'react-redux';
import ShareExtension from 'rn-extensions-share';
import {
COLOR_TEXT_DESCRIPTION
} from '../../constants/colors';
import I18n from '../../i18n';
import RocketChat from '../../lib/rocketchat';
import { CustomIcon } from '../../lib/Icons';
import log from '../../utils/log';
import styles from './styles';
import Loading from './Loading';
import database from '../../lib/realm';
import { CustomHeaderButtons, Item } from '../../containers/HeaderButton';
import { isReadOnly, isBlocked } from '../../utils/room';
@connect(state => ({
username: state.login.user && state.login.user.username
}))
export default class ShareView extends React.Component {
static navigationOptions = ({ navigation }) => {
const canSend = navigation.getParam('canSend', false);
return ({
title: I18n.t('Share'),
headerRight:
canSend
? (
<CustomHeaderButtons>
<Item
title={I18n.t('Send')}
onPress={navigation.getParam('sendMessage')}
testID='send-message-share-view'
buttonStyle={styles.send}
/>
</CustomHeaderButtons>
)
: null
});
}
static propTypes = {
navigation: PropTypes.object,
username: PropTypes.string.isRequired
};
constructor(props) {
super(props);
const { navigation } = this.props;
const rid = navigation.getParam('rid', '');
const name = navigation.getParam('name', '');
const value = navigation.getParam('value', '');
const isMedia = navigation.getParam('isMedia', false);
const fileInfo = navigation.getParam('fileInfo', {});
this.rooms = database.objects('subscriptions').filtered('rid = $0', rid);
this.state = {
rid,
value,
isMedia,
name,
fileInfo,
loading: false,
room: this.rooms[0] || { rid },
file: {
name: fileInfo ? fileInfo.name : '',
description: ''
}
};
}
componentDidMount() {
const { room } = this.state;
const { navigation, username } = this.props;
navigation.setParams({ sendMessage: this._sendMessage, canSend: !(isReadOnly(room, { username }) || isBlocked(room)) });
}
bytesToSize = bits => `${ ((bits / 8) / 1048576).toFixed(2) }MB`;
_sendMessage = async() => {
const { isMedia } = this.state;
this.setState({ loading: true });
if (isMedia) {
await this.sendMediaMessage();
} else {
await this.sendTextMessage();
}
this.setState({ loading: false });
ShareExtension.close();
}
sendMediaMessage = async() => {
const { rid, fileInfo, file } = this.state;
const { name, description } = file;
const fileMessage = { ...fileInfo, name, description };
if (fileInfo && rid !== '') {
try {
await RocketChat.sendFileMessage(rid, fileMessage, undefined);
} catch (e) {
log('err_send_media_message', e);
}
}
}
sendTextMessage = async() => {
const { value, rid } = this.state;
if (value !== '' && rid !== '') {
try {
await RocketChat.sendMessage(rid, value, undefined);
} catch (error) {
log('err_share_extension_send_message', error);
}
}
};
renderPreview = () => {
const { fileInfo } = this.state;
const icon = fileInfo.type.match(/image/)
? <Image source={{ isStatic: true, uri: fileInfo.path }} style={styles.mediaImage} />
: (
<View style={styles.mediaIconContainer}>
<CustomIcon name='file-generic' style={styles.mediaIcon} />
</View>
);
return (
<View style={styles.mediaContent}>
{icon}
<View style={styles.mediaInfo}>
<Text style={styles.mediaText} numberOfLines={1}>{fileInfo.name}</Text>
<Text style={styles.mediaText}>{this.bytesToSize(fileInfo.size)}</Text>
</View>
</View>
);
};
renderMediaContent = () => {
const { fileInfo, file } = this.state;
return fileInfo ? (
<View style={styles.mediaContainer}>
{this.renderPreview()}
<View style={styles.mediaInputContent}>
<TextInput
style={[styles.mediaNameInput, styles.input]}
placeholder={I18n.t('File_name')}
onChangeText={name => this.setState({ file: { ...file, name } })}
underlineColorAndroid='transparent'
defaultValue={file.name}
placeholderTextColor={COLOR_TEXT_DESCRIPTION}
/>
<TextInput
style={[styles.mediaDescriptionInput, styles.input]}
placeholder={I18n.t('File_description')}
onChangeText={description => this.setState({ file: { ...file, description } })}
underlineColorAndroid='transparent'
defaultValue={file.description}
multiline
textAlignVertical='top'
placeholderTextColor={COLOR_TEXT_DESCRIPTION}
autoFocus
/>
</View>
</View>
) : null;
};
renderInput = () => {
const { value } = this.state;
return (
<TextInput
style={[styles.input, styles.textInput]}
placeholder=''
onChangeText={handleText => this.setState({ value: handleText })}
underlineColorAndroid='transparent'
defaultValue={value}
multiline
textAlignVertical='top'
placeholderTextColor={COLOR_TEXT_DESCRIPTION}
autoFocus
/>
);
}
renderError = () => {
const { room } = this.state;
return (
<View style={[styles.container, styles.centered]}>
<Text style={styles.title}>
{
isBlocked(room) ? I18n.t('This_room_is_blocked') : I18n.t('This_room_is_read_only')
}
</Text>
</View>
);
}
render() {
const { username } = this.props;
const {
name, loading, isMedia, room
} = this.state;
if (isReadOnly(room, { username }) || isBlocked(room)) {
return this.renderError();
}
return (
<View style={styles.container}>
<View style={isMedia ? styles.toContent : styles.toContentText}>
<Text style={styles.text} numberOfLines={1}>
<Text style={styles.to}>{`${ I18n.t('To') }: `}</Text>
<Text style={styles.name}>{`${ name }`}</Text>
</Text>
</View>
<View style={styles.content}>
{isMedia ? this.renderMediaContent() : this.renderInput()}
</View>
{ loading ? <Loading /> : null }
</View>
);
}
}

View File

@ -0,0 +1,116 @@
import { StyleSheet } from 'react-native';
import sharedStyles from '../Styles';
import {
COLOR_BACKGROUND_CONTAINER, COLOR_WHITE
} from '../../constants/colors';
export default StyleSheet.create({
container: {
flex: 1,
backgroundColor: COLOR_BACKGROUND_CONTAINER
},
centered: {
justifyContent: 'center',
alignItems: 'center'
},
title: {
fontSize: 18,
...sharedStyles.textBold,
...sharedStyles.textColorNormal,
...sharedStyles.textAlignCenter
},
text: {
paddingHorizontal: 16,
paddingVertical: 8,
...sharedStyles.textColorNormal,
...sharedStyles.textRegular
},
to: {
...sharedStyles.textColorDescription,
...sharedStyles.textRegular
},
toContent: {
width: '100%',
backgroundColor: COLOR_WHITE
},
toContentText: {
width: '100%',
backgroundColor: COLOR_BACKGROUND_CONTAINER,
...sharedStyles.textColorNormal,
...sharedStyles.textRegular
},
name: {
...sharedStyles.textRegular,
...sharedStyles.textColorTitle
},
content: {
flex: 1,
backgroundColor: COLOR_WHITE
},
mediaContainer: {
flex: 1,
backgroundColor: COLOR_BACKGROUND_CONTAINER
},
mediaContent: {
flexDirection: 'row',
padding: 16,
backgroundColor: COLOR_BACKGROUND_CONTAINER,
alignItems: 'center'
},
mediaImage: {
height: 64,
width: 64
},
mediaIcon: {
fontSize: 64,
...sharedStyles.textColorNormal
},
mediaIconContainer: {
alignItems: 'center',
justifyContent: 'center'
},
mediaInfo: {
marginLeft: 16,
flex: 1
},
mediaText: {
fontSize: 16,
...sharedStyles.textColorNormal,
...sharedStyles.textRegular
},
mediaInputContent: {
width: '100%',
...sharedStyles.separatorVertical,
backgroundColor: COLOR_WHITE
},
input: {
fontSize: 16,
...sharedStyles.textColorNormal,
...sharedStyles.textRegular,
backgroundColor: COLOR_WHITE
},
textInput: {
flex: 1,
paddingHorizontal: 16
},
mediaNameInput: {
marginLeft: 16,
paddingRight: 16,
paddingVertical: 8,
backgroundColor: COLOR_WHITE,
...sharedStyles.separatorBottom
},
mediaDescriptionInput: {
marginLeft: 16,
paddingRight: 16,
marginVertical: 8,
backgroundColor: COLOR_WHITE,
height: 100
},
send: {
...sharedStyles.textColorHeaderBack,
...sharedStyles.textSemibold,
fontSize: 16
}
});

View File

@ -1,7 +1,7 @@
import { StyleSheet, Platform } from 'react-native';
import {
COLOR_DANGER, COLOR_BUTTON_PRIMARY, COLOR_SEPARATOR, COLOR_TEXT, COLOR_TEXT_DESCRIPTION, COLOR_TITLE, COLOR_BACKGROUND_CONTAINER, COLOR_WHITE, COLOR_PRIMARY
COLOR_DANGER, COLOR_BUTTON_PRIMARY, COLOR_SEPARATOR, COLOR_TEXT, COLOR_TEXT_DESCRIPTION, COLOR_TITLE, COLOR_BACKGROUND_CONTAINER, COLOR_WHITE, COLOR_PRIMARY, HEADER_BACK
} from '../constants/colors';
export default StyleSheet.create({
@ -72,6 +72,9 @@ export default StyleSheet.create({
textAlignRight: {
textAlign: 'right'
},
textAlignCenter: {
textAlign: 'center'
},
opacity5: {
opacity: 0.5
},
@ -176,6 +179,9 @@ export default StyleSheet.create({
textColorDescription: {
color: COLOR_TEXT_DESCRIPTION
},
textColorHeaderBack: {
color: HEADER_BACK
},
colorPrimary: {
color: COLOR_PRIMARY
},
@ -192,5 +198,10 @@ export default StyleSheet.create({
borderBottomWidth: StyleSheet.hairlineWidth,
backgroundColor: COLOR_WHITE,
marginVertical: 10
},
notchLandscapeContainer: {
marginTop: -44,
paddingHorizontal: 30,
backgroundColor: COLOR_BACKGROUND_CONTAINER
}
});

View File

@ -0,0 +1,50 @@
import React from 'react';
import {
StyleSheet, View, Text
} from 'react-native';
import ShareExtension from 'rn-extensions-share';
import { CloseShareExtensionButton } from '../containers/HeaderButton';
import sharedStyles from './Styles';
import I18n from '../i18n';
import { COLOR_WHITE } from '../constants/colors';
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: COLOR_WHITE,
justifyContent: 'center',
alignItems: 'center'
},
title: {
fontSize: 18,
...sharedStyles.textBold,
...sharedStyles.textColorNormal
},
content: {
fontSize: 14,
...sharedStyles.textAlignCenter,
...sharedStyles.textColorNormal,
...sharedStyles.textRegular
}
});
export default class WithoutServerView extends React.Component {
static navigationOptions = () => ({
headerLeft: (
<CloseShareExtensionButton
onPress={ShareExtension.close}
testID='share-extension-close'
/>
)
})
render() {
return (
<View style={styles.container}>
<Text style={styles.title}>{I18n.t('Without_Servers')}</Text>
<Text style={styles.content}>{I18n.t('You_need_to_access_at_least_one_RocketChat_server_to_share_something')}</Text>
</View>
);
}
}

View File

@ -2,10 +2,10 @@ import 'react-native-console-time-polyfill';
import './app/ReactotronConfig';
import { AppRegistry } from 'react-native';
import App from './app/index';
import { name as appName } from './app.json';
import { name as appName, share as shareName } from './app.json';
AppRegistry.registerComponent(appName, () => App);
AppRegistry.registerComponent(appName, () => require('./app/index').default);
AppRegistry.registerComponent(shareName, () => require('./app/share').default);
// For storybook, comment everything above and uncomment below
// import './storybook';

View File

@ -52,6 +52,40 @@ target 'RocketChatRN' do
end
target 'ShareRocketChatRN' do
rn_path = '../node_modules/react-native'
pod 'React', path: rn_path, subspecs: [
'Core',
'RCTActionSheet',
'RCTAnimation',
# 'RCTGeolocation',
'RCTImage',
'RCTLinkingIOS',
'RCTNetwork',
'RCTSettings',
'RCTText',
'RCTVibration',
'RCTWebSocket'
]
pod 'RNDeviceInfo', :path => '../node_modules/react-native-device-info'
pod 'RNLocalize', :path => '../node_modules/react-native-localize'
pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
pod 'Firebase/Core', '~> 5.20.1'
pod 'Fabric', '~> 1.9.0'
pod 'Crashlytics', '~> 3.12.0'
pod 'GoogleIDFASupport', '~> 3.14.0'
pod 'Firebase/Performance', '~> 5.20.1'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == "React"

View File

@ -145,7 +145,7 @@ PODS:
- React/RCTBlob
- RNDeviceInfo (1.6.1):
- React
- RNImageCropPicker (0.21.1):
- RNImageCropPicker (0.24.1):
- QBImagePickerController
- React/Core
- RSKImageCropper
@ -356,7 +356,7 @@ SPEC CHECKSUMS:
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-webview: f3e28b48461c78db833f727feec08b13285e7b61
RNDeviceInfo: 958a1ed6f94e04557b865b8ef848cfc83db0ebba
RNImageCropPicker: e608efe182652dc8690268cb99cb5a201f2b5ea3
RNImageCropPicker: 6134b66a3d5bc13e2895a97c630a4254006902b4
RNLocalize: 62a949d2ec5bee0eb8f39a80a48f01e2f4f67080
RNScreens: 720a9e6968beb73e8196239801e887d8401f86ed
RSKImageCropper: 98296ad26b41753f796b6898d015509598f13d97
@ -374,6 +374,6 @@ SPEC CHECKSUMS:
UMTaskManagerInterface: 296793ab2a7e181fe5ebe2ba9b40ae208ab4b8fa
yoga: 92b2102c3d373d1a790db4ab761d2b0ffc634f64
PODFILE CHECKSUM: 1aa23cca853663acc12b10c4eb90f42b7b91533a
PODFILE CHECKSUM: 7875ef440f1c2fb6583ee808c642c97d1410140d
COCOAPODS: 1.6.2

View File

@ -1,6 +1,6 @@
{
"name": "RNImageCropPicker",
"version": "0.21.1",
"version": "0.24.1",
"summary": "Select single or multiple images, with cropping option",
"requires_arc": true,
"license": "MIT",

View File

@ -145,7 +145,7 @@ PODS:
- React/RCTBlob
- RNDeviceInfo (1.6.1):
- React
- RNImageCropPicker (0.21.1):
- RNImageCropPicker (0.24.1):
- QBImagePickerController
- React/Core
- RSKImageCropper
@ -356,7 +356,7 @@ SPEC CHECKSUMS:
react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865
react-native-webview: f3e28b48461c78db833f727feec08b13285e7b61
RNDeviceInfo: 958a1ed6f94e04557b865b8ef848cfc83db0ebba
RNImageCropPicker: e608efe182652dc8690268cb99cb5a201f2b5ea3
RNImageCropPicker: 6134b66a3d5bc13e2895a97c630a4254006902b4
RNLocalize: 62a949d2ec5bee0eb8f39a80a48f01e2f4f67080
RNScreens: 720a9e6968beb73e8196239801e887d8401f86ed
RSKImageCropper: 98296ad26b41753f796b6898d015509598f13d97
@ -374,6 +374,6 @@ SPEC CHECKSUMS:
UMTaskManagerInterface: 296793ab2a7e181fe5ebe2ba9b40ae208ab4b8fa
yoga: 92b2102c3d373d1a790db4ab761d2b0ffc634f64
PODFILE CHECKSUM: 1aa23cca853663acc12b10c4eb90f42b7b91533a
PODFILE CHECKSUM: 7875ef440f1c2fb6583ee808c642c97d1410140d
COCOAPODS: 1.6.2

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_Pods_ShareRocketChatRN : NSObject
@end
@implementation PodsDummy_Pods_ShareRocketChatRN
@end

View File

@ -0,0 +1,9 @@
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Crashlytics/iOS" "${PODS_ROOT}/Fabric/iOS" "${PODS_ROOT}/FirebaseABTesting/Frameworks" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/FirebasePerformance/Frameworks" "${PODS_ROOT}/FirebaseRemoteConfig/Frameworks" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/DoubleConversion" "${PODS_ROOT}/Headers/Public/EXAppLoaderProvider" "${PODS_ROOT}/Headers/Public/EXConstants" "${PODS_ROOT}/Headers/Public/EXFileSystem" "${PODS_ROOT}/Headers/Public/EXHaptics" "${PODS_ROOT}/Headers/Public/EXPermissions" "${PODS_ROOT}/Headers/Public/EXWebBrowser" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/GoogleUtilities" "${PODS_ROOT}/Headers/Public/Protobuf" "${PODS_ROOT}/Headers/Public/QBImagePickerController" "${PODS_ROOT}/Headers/Public/RNDeviceInfo" "${PODS_ROOT}/Headers/Public/RNImageCropPicker" "${PODS_ROOT}/Headers/Public/RNLocalize" "${PODS_ROOT}/Headers/Public/RNScreens" "${PODS_ROOT}/Headers/Public/RSKImageCropper" "${PODS_ROOT}/Headers/Public/React" "${PODS_ROOT}/Headers/Public/UMBarCodeScannerInterface" "${PODS_ROOT}/Headers/Public/UMCameraInterface" "${PODS_ROOT}/Headers/Public/UMConstantsInterface" "${PODS_ROOT}/Headers/Public/UMCore" "${PODS_ROOT}/Headers/Public/UMFaceDetectorInterface" "${PODS_ROOT}/Headers/Public/UMFileSystemInterface" "${PODS_ROOT}/Headers/Public/UMFontInterface" "${PODS_ROOT}/Headers/Public/UMImageLoaderInterface" "${PODS_ROOT}/Headers/Public/UMPermissionsInterface" "${PODS_ROOT}/Headers/Public/UMReactNativeAdapter" "${PODS_ROOT}/Headers/Public/UMSensorsInterface" "${PODS_ROOT}/Headers/Public/UMTaskManagerInterface" "${PODS_ROOT}/Headers/Public/glog" "${PODS_ROOT}/Headers/Public/nanopb" "${PODS_ROOT}/Headers/Public/react-native-document-picker" "${PODS_ROOT}/Headers/Public/react-native-orientation-locker" "${PODS_ROOT}/Headers/Public/react-native-splash-screen" "${PODS_ROOT}/Headers/Public/react-native-webview" "${PODS_ROOT}/Headers/Public/yoga" $(inherited) ${PODS_ROOT}/Firebase/CoreOnly/Sources
LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DoubleConversion" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstanceID" "${PODS_CONFIGURATION_BUILD_DIR}/Folly" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleToolboxForMac" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/Protobuf" "${PODS_CONFIGURATION_BUILD_DIR}/RNDeviceInfo" "${PODS_CONFIGURATION_BUILD_DIR}/RNLocalize" "${PODS_CONFIGURATION_BUILD_DIR}/React" "${PODS_CONFIGURATION_BUILD_DIR}/glog" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_CONFIGURATION_BUILD_DIR}/yoga" "${PODS_ROOT}/GoogleIDFASupport/Libraries"
OTHER_LDFLAGS = $(inherited) -ObjC -l"AdIdAccessLibrary" -l"DoubleConversion" -l"FirebaseCore" -l"FirebaseInstanceID" -l"Folly" -l"GTMSessionFetcher" -l"GoogleToolboxForMac" -l"GoogleUtilities" -l"Protobuf" -l"RNDeviceInfo" -l"RNLocalize" -l"React" -l"c++" -l"glog" -l"nanopb" -l"sqlite3" -l"stdc++" -l"yoga" -l"z" -framework "AdSupport" -framework "CoreTelephony" -framework "Crashlytics" -framework "FIRAnalyticsConnector" -framework "Fabric" -framework "FirebaseABTesting" -framework "FirebaseAnalytics" -framework "FirebaseCoreDiagnostics" -framework "FirebasePerformance" -framework "FirebaseRemoteConfig" -framework "Foundation" -framework "GoogleAppMeasurement" -framework "JavaScriptCore" -framework "QuartzCore" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods

View File

@ -0,0 +1,9 @@
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Crashlytics/iOS" "${PODS_ROOT}/Fabric/iOS" "${PODS_ROOT}/FirebaseABTesting/Frameworks" "${PODS_ROOT}/FirebaseAnalytics/Frameworks" "${PODS_ROOT}/FirebasePerformance/Frameworks" "${PODS_ROOT}/FirebaseRemoteConfig/Frameworks" "${PODS_ROOT}/GoogleAppMeasurement/Frameworks"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1 $(inherited) PB_FIELD_32BIT=1 PB_NO_PACKED_STRUCTS=1 PB_ENABLE_MALLOC=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/DoubleConversion" "${PODS_ROOT}/Headers/Public/EXAppLoaderProvider" "${PODS_ROOT}/Headers/Public/EXConstants" "${PODS_ROOT}/Headers/Public/EXFileSystem" "${PODS_ROOT}/Headers/Public/EXHaptics" "${PODS_ROOT}/Headers/Public/EXPermissions" "${PODS_ROOT}/Headers/Public/EXWebBrowser" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseCore" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/GTMSessionFetcher" "${PODS_ROOT}/Headers/Public/GoogleToolboxForMac" "${PODS_ROOT}/Headers/Public/GoogleUtilities" "${PODS_ROOT}/Headers/Public/Protobuf" "${PODS_ROOT}/Headers/Public/QBImagePickerController" "${PODS_ROOT}/Headers/Public/RNDeviceInfo" "${PODS_ROOT}/Headers/Public/RNImageCropPicker" "${PODS_ROOT}/Headers/Public/RNLocalize" "${PODS_ROOT}/Headers/Public/RNScreens" "${PODS_ROOT}/Headers/Public/RSKImageCropper" "${PODS_ROOT}/Headers/Public/React" "${PODS_ROOT}/Headers/Public/UMBarCodeScannerInterface" "${PODS_ROOT}/Headers/Public/UMCameraInterface" "${PODS_ROOT}/Headers/Public/UMConstantsInterface" "${PODS_ROOT}/Headers/Public/UMCore" "${PODS_ROOT}/Headers/Public/UMFaceDetectorInterface" "${PODS_ROOT}/Headers/Public/UMFileSystemInterface" "${PODS_ROOT}/Headers/Public/UMFontInterface" "${PODS_ROOT}/Headers/Public/UMImageLoaderInterface" "${PODS_ROOT}/Headers/Public/UMPermissionsInterface" "${PODS_ROOT}/Headers/Public/UMReactNativeAdapter" "${PODS_ROOT}/Headers/Public/UMSensorsInterface" "${PODS_ROOT}/Headers/Public/UMTaskManagerInterface" "${PODS_ROOT}/Headers/Public/glog" "${PODS_ROOT}/Headers/Public/nanopb" "${PODS_ROOT}/Headers/Public/react-native-document-picker" "${PODS_ROOT}/Headers/Public/react-native-orientation-locker" "${PODS_ROOT}/Headers/Public/react-native-splash-screen" "${PODS_ROOT}/Headers/Public/react-native-webview" "${PODS_ROOT}/Headers/Public/yoga" $(inherited) ${PODS_ROOT}/Firebase/CoreOnly/Sources
LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DoubleConversion" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore" "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstanceID" "${PODS_CONFIGURATION_BUILD_DIR}/Folly" "${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleToolboxForMac" "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities" "${PODS_CONFIGURATION_BUILD_DIR}/Protobuf" "${PODS_CONFIGURATION_BUILD_DIR}/RNDeviceInfo" "${PODS_CONFIGURATION_BUILD_DIR}/RNLocalize" "${PODS_CONFIGURATION_BUILD_DIR}/React" "${PODS_CONFIGURATION_BUILD_DIR}/glog" "${PODS_CONFIGURATION_BUILD_DIR}/nanopb" "${PODS_CONFIGURATION_BUILD_DIR}/yoga" "${PODS_ROOT}/GoogleIDFASupport/Libraries"
OTHER_LDFLAGS = $(inherited) -ObjC -l"AdIdAccessLibrary" -l"DoubleConversion" -l"FirebaseCore" -l"FirebaseInstanceID" -l"Folly" -l"GTMSessionFetcher" -l"GoogleToolboxForMac" -l"GoogleUtilities" -l"Protobuf" -l"RNDeviceInfo" -l"RNLocalize" -l"React" -l"c++" -l"glog" -l"nanopb" -l"sqlite3" -l"stdc++" -l"yoga" -l"z" -framework "AdSupport" -framework "CoreTelephony" -framework "Crashlytics" -framework "FIRAnalyticsConnector" -framework "Fabric" -framework "FirebaseABTesting" -framework "FirebaseAnalytics" -framework "FirebaseCoreDiagnostics" -framework "FirebasePerformance" -framework "FirebaseRemoteConfig" -framework "Foundation" -framework "GoogleAppMeasurement" -framework "JavaScriptCore" -framework "QuartzCore" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -framework "UIKit"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods

View File

@ -12,6 +12,7 @@
00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
0BFA93B8E2ED67D4832E0C76 /* libPods-ShareRocketChatRN.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B0B41F834F20FC0ACC547296 /* libPods-ShareRocketChatRN.a */; };
0C6E2DE448364EA896869ADF /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B37C79D9BD0742CE936B6982 /* libc++.tbd */; };
133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
@ -21,6 +22,39 @@
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
1E02221122B2F76B00001862 /* libRNUserDefaults.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E02220D22B2F76400001862 /* libRNUserDefaults.a */; };
1E25743122CBA2BE005A877F /* libReactNativeShareExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E25741F22CBA263005A877F /* libReactNativeShareExtension.a */; };
1E25743222CBA2C2005A877F /* libRNRealmPath.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E25743022CBA2AD005A877F /* libRNRealmPath.a */; };
1E25743322CBA2C7005A877F /* libRNUserDefaults.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E02220D22B2F76400001862 /* libRNUserDefaults.a */; };
1E25743422CBA2CF005A877F /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7ACD4853222860DE00442C55 /* JavaScriptCore.framework */; };
1E25743B22CBA301005A877F /* libRNFetchBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E25743A22CBA2F9005A877F /* libRNFetchBlob.a */; };
1E25743C22CBA313005A877F /* (null) in Frameworks */ = {isa = PBXBuildFile; };
1E25743D22CBA31B005A877F /* libRNNotifications.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A8DEB5220ED0BDE00C5DCE4 /* libRNNotifications.a */; };
1E25743E22CBA322005A877F /* libRNGestureHandler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AD44CF521518C610099D147 /* libRNGestureHandler.a */; };
1E25743F22CBA32B005A877F /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
1E25744022CBA333005A877F /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
1E25744122CBA33B005A877F /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
1E25744222CBA33F005A877F /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
1E25744322CBA345005A877F /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
1E25744422CBA34B005A877F /* libRCTPushNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88F58461FBF55E200B352B8 /* libRCTPushNotification.a */; };
1E25744522CBA351005A877F /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
1E25744622CBA356005A877F /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
1E25744722CBA362005A877F /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
1E25744822CBA36A005A877F /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };
1E25744922CBA36E005A877F /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
1E25744C22CBA37F005A877F /* libdouble-conversion.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 607D61111F325B7E00F639C4 /* libdouble-conversion.a */; };
1E25744D22CBA385005A877F /* libcxxreact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */; };
1E25744E22CBA38C005A877F /* libRNFirebase.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AB8E718229C6146006B474A /* libRNFirebase.a */; };
1E25744F22CBA391005A877F /* libRealmReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 607D61161F325B7E00F639C4 /* libRealmReact.a */; };
1E25745022CBA39A005A877F /* libFastImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A770EC220BECDC7001AD51A /* libFastImage.a */; };
1E25745722CBA3E1005A877F /* libSplashScreen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E25745622CBA3DB005A877F /* libSplashScreen.a */; };
1E25745822CBA3E6005A877F /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B8E79A911F3CCC6D005B464F /* libRNVectorIcons.a */; };
1E25745922CBA3F1005A877F /* libRNRealmPath.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E25743022CBA2AD005A877F /* libRNRealmPath.a */; };
1EC6ACB722CB9FC300A41C61 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1EC6ACB522CB9FC300A41C61 /* MainInterface.storyboard */; };
1EC6ACBB22CB9FC300A41C61 /* ShareRocketChatRN.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
1EC6ACF622CBA01500A41C61 /* ShareRocketChatRN.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EC6ACF522CBA01500A41C61 /* ShareRocketChatRN.m */; };
1ED59D4C22CBA77D00C54289 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1ED59D4B22CBA77D00C54289 /* GoogleService-Info.plist */; };
1ED59D5022CBA8ED00C54289 /* custom.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7A55F1C42236D541005109A0 /* custom.ttf */; };
1EDDE57A22DFAD8E0078F69D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1EDDE57922DFAD8E0078F69D /* Images.xcassets */; };
24A2AEF2383D44B586D31C01 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 06BB44DD4855498082A744AD /* libz.tbd */; };
38CEA0ED468E49CFABCD82FD /* libRNFirebase.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A36F9982B71E4662AA8DEB77 /* libRNFirebase.a */; };
50046CB6BDA69B9232CF66D9 /* libPods-RocketChatRN.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C235DC7B31A4D1578EDEF219 /* libPods-RocketChatRN.a */; };
@ -105,6 +139,41 @@
remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = RNUserDefaults;
};
1E25741E22CBA263005A877F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 1E2573F022CBA263005A877F /* ReactNativeShareExtension.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 41B5DE301D0B505800949BD5;
remoteInfo = ReactNativeShareExtension;
};
1E25742F22CBA2AD005A877F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 1E25742B22CBA2AC005A877F /* RNRealmPath.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 134814201AA4EA6300B7C361;
remoteInfo = RNRealmPath;
};
1E25743922CBA2F9005A877F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 1E25743522CBA2F8005A877F /* RNFetchBlob.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = A15C300E1CD25C330074CB35;
remoteInfo = RNFetchBlob;
};
1E25745522CBA3DB005A877F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 1E25745122CBA3DB005A877F /* SplashScreen.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3D7682761D8E76B80014119E;
remoteInfo = SplashScreen;
};
1EC6ACB922CB9FC300A41C61 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 1EC6ACAF22CB9FC300A41C61;
remoteInfo = ShareRocketChatRN;
};
3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
@ -402,6 +471,17 @@
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
1EC6ACF422CB9FC300A41C61 /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
1EC6ACBB22CB9FC300A41C61 /* ShareRocketChatRN.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
7A6EDBE020ED6E020086E097 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@ -421,6 +501,8 @@
00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = "<group>"; };
00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = "<group>"; };
00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = "<group>"; };
037C33B0D9A54FB4CB670FB7 /* Pods-ShareRocketChatRN.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareRocketChatRN.release.xcconfig"; path = "Pods/Target Support Files/Pods-ShareRocketChatRN/Pods-ShareRocketChatRN.release.xcconfig"; sourceTree = "<group>"; };
0383633C4523666C176CAA52 /* Pods-ShareRocketChatRN.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareRocketChatRN.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ShareRocketChatRN/Pods-ShareRocketChatRN.debug.xcconfig"; sourceTree = "<group>"; };
06BB44DD4855498082A744AD /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
1132AD7934954A958E143199 /* RNFirebase.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNFirebase.xcodeproj; path = "../node_modules/react-native-firebase/ios/RNFirebase.xcodeproj"; sourceTree = "<group>"; };
1142E3442BA94B19BCF52814 /* libRNAudio.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNAudio.a; sourceTree = "<group>"; };
@ -437,6 +519,18 @@
1A34D902CC074FF1BCC7DB48 /* libimageCropPicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libimageCropPicker.a; sourceTree = "<group>"; };
1D3BB00B9ABF44EA9BD71318 /* libSafariViewManager.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libSafariViewManager.a; sourceTree = "<group>"; };
1E0221D522B2F76300001862 /* RNUserDefaults.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNUserDefaults.xcodeproj; path = "../node_modules/rn-user-defaults/ios/RNUserDefaults.xcodeproj"; sourceTree = "<group>"; };
1E2573F022CBA263005A877F /* ReactNativeShareExtension.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactNativeShareExtension.xcodeproj; path = "../node_modules/rn-extensions-share/ios/ReactNativeShareExtension.xcodeproj"; sourceTree = "<group>"; };
1E25742B22CBA2AC005A877F /* RNRealmPath.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNRealmPath.xcodeproj; path = "../node_modules/react-native-realm-path/ios/RNRealmPath.xcodeproj"; sourceTree = "<group>"; };
1E25743522CBA2F8005A877F /* RNFetchBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNFetchBlob.xcodeproj; path = "../node_modules/rn-fetch-blob/ios/RNFetchBlob.xcodeproj"; sourceTree = "<group>"; };
1E25744A22CBA374005A877F /* libDoubleConversion.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libDoubleConversion.a; sourceTree = BUILT_PRODUCTS_DIR; };
1E25745122CBA3DB005A877F /* SplashScreen.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SplashScreen.xcodeproj; path = "../node_modules/react-native-splash-screen/ios/SplashScreen.xcodeproj"; sourceTree = "<group>"; };
1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ShareRocketChatRN.appex; sourceTree = BUILT_PRODUCTS_DIR; };
1EC6ACB622CB9FC300A41C61 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = "<group>"; };
1EC6ACB822CB9FC300A41C61 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
1EC6ACF522CBA01500A41C61 /* ShareRocketChatRN.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShareRocketChatRN.m; sourceTree = "<group>"; };
1EC6AD6022CBA20C00A41C61 /* ShareRocketChatRN.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ShareRocketChatRN.entitlements; sourceTree = "<group>"; };
1ED59D4B22CBA77D00C54289 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = SOURCE_ROOT; };
1EDDE57922DFAD8E0078F69D /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
20CE3E407E0D4D9E8C9885F2 /* libRCTVideo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTVideo.a; sourceTree = "<group>"; };
22A8B76C8EBA443BB97CE82D /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = "<group>"; };
3B696712EE2345A59F007A88 /* libRNImagePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNImagePicker.a; sourceTree = "<group>"; };
@ -457,6 +551,7 @@
A36F9982B71E4662AA8DEB77 /* libRNFirebase.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFirebase.a; sourceTree = "<group>"; };
ACD75701AFD1CB848CAB0CB3 /* Pods-RocketChatRN.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RocketChatRN.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RocketChatRN/Pods-RocketChatRN.debug.xcconfig"; sourceTree = "<group>"; };
AD0379F2BCE84C968538CDAF /* RCTVideo.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTVideo.xcodeproj; path = "../node_modules/react-native-video/ios/RCTVideo.xcodeproj"; sourceTree = "<group>"; };
B0B41F834F20FC0ACC547296 /* libPods-ShareRocketChatRN.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ShareRocketChatRN.a"; sourceTree = BUILT_PRODUCTS_DIR; };
B1A58A7ACB0E4453A44AEC38 /* RNGestureHandler.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNGestureHandler.xcodeproj; path = "../node_modules/react-native-gesture-handler/ios/RNGestureHandler.xcodeproj"; sourceTree = "<group>"; };
B2607FA180F14E6584301101 /* libSplashScreen.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libSplashScreen.a; sourceTree = "<group>"; };
B37C79D9BD0742CE936B6982 /* libc++.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
@ -475,6 +570,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
1E25745922CBA3F1005A877F /* libRNRealmPath.a in Frameworks */,
1E02221122B2F76B00001862 /* libRNUserDefaults.a in Frameworks */,
7ACD4897222860DE00442C55 /* JavaScriptCore.framework in Frameworks */,
7A8DEB5A20ED0BEC00C5DCE4 /* libRNNotifications.a in Frameworks */,
@ -505,6 +601,40 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
1EC6ACAD22CB9FC300A41C61 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
1E25745822CBA3E6005A877F /* libRNVectorIcons.a in Frameworks */,
1E25745722CBA3E1005A877F /* libSplashScreen.a in Frameworks */,
1E25745022CBA39A005A877F /* libFastImage.a in Frameworks */,
1E25744F22CBA391005A877F /* libRealmReact.a in Frameworks */,
1E25744E22CBA38C005A877F /* libRNFirebase.a in Frameworks */,
1E25744D22CBA385005A877F /* libcxxreact.a in Frameworks */,
1E25744C22CBA37F005A877F /* libdouble-conversion.a in Frameworks */,
1E25744922CBA36E005A877F /* libRCTActionSheet.a in Frameworks */,
1E25744822CBA36A005A877F /* libRCTAnimation.a in Frameworks */,
1E25744722CBA362005A877F /* libRCTImage.a in Frameworks */,
1E25744622CBA356005A877F /* libRCTLinking.a in Frameworks */,
1E25744522CBA351005A877F /* libRCTNetwork.a in Frameworks */,
1E25744422CBA34B005A877F /* libRCTPushNotification.a in Frameworks */,
1E25744322CBA345005A877F /* libRCTSettings.a in Frameworks */,
1E25744222CBA33F005A877F /* libRCTText.a in Frameworks */,
1E25744122CBA33B005A877F /* libRCTVibration.a in Frameworks */,
1E25744022CBA333005A877F /* libRCTWebSocket.a in Frameworks */,
1E25743F22CBA32B005A877F /* libReact.a in Frameworks */,
1E25743E22CBA322005A877F /* libRNGestureHandler.a in Frameworks */,
1E25743D22CBA31B005A877F /* libRNNotifications.a in Frameworks */,
1E25743C22CBA313005A877F /* (null) in Frameworks */,
1E25743422CBA2CF005A877F /* JavaScriptCore.framework in Frameworks */,
1E25743B22CBA301005A877F /* libRNFetchBlob.a in Frameworks */,
1E25743322CBA2C7005A877F /* libRNUserDefaults.a in Frameworks */,
1E25743222CBA2C2005A877F /* libRNRealmPath.a in Frameworks */,
1E25743122CBA2BE005A877F /* libReactNativeShareExtension.a in Frameworks */,
0BFA93B8E2ED67D4832E0C76 /* libPods-ShareRocketChatRN.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@ -616,11 +746,58 @@
name = Products;
sourceTree = "<group>";
};
1E2573F122CBA263005A877F /* Products */ = {
isa = PBXGroup;
children = (
1E25741F22CBA263005A877F /* libReactNativeShareExtension.a */,
);
name = Products;
sourceTree = "<group>";
};
1E25742C22CBA2AC005A877F /* Products */ = {
isa = PBXGroup;
children = (
1E25743022CBA2AD005A877F /* libRNRealmPath.a */,
);
name = Products;
sourceTree = "<group>";
};
1E25743622CBA2F8005A877F /* Products */ = {
isa = PBXGroup;
children = (
1E25743A22CBA2F9005A877F /* libRNFetchBlob.a */,
);
name = Products;
sourceTree = "<group>";
};
1E25745222CBA3DB005A877F /* Products */ = {
isa = PBXGroup;
children = (
1E25745622CBA3DB005A877F /* libSplashScreen.a */,
);
name = Products;
sourceTree = "<group>";
};
1EC6ACB122CB9FC300A41C61 /* ShareRocketChatRN */ = {
isa = PBXGroup;
children = (
1ED59D4B22CBA77D00C54289 /* GoogleService-Info.plist */,
1EDDE57922DFAD8E0078F69D /* Images.xcassets */,
1EC6AD6022CBA20C00A41C61 /* ShareRocketChatRN.entitlements */,
1EC6ACB522CB9FC300A41C61 /* MainInterface.storyboard */,
1EC6ACB822CB9FC300A41C61 /* Info.plist */,
1EC6ACF522CBA01500A41C61 /* ShareRocketChatRN.m */,
);
path = ShareRocketChatRN;
sourceTree = "<group>";
};
22CA7F59107E0C79C2506C7C /* Pods */ = {
isa = PBXGroup;
children = (
ACD75701AFD1CB848CAB0CB3 /* Pods-RocketChatRN.debug.xcconfig */,
66D6B1D0567051BE541450C9 /* Pods-RocketChatRN.release.xcconfig */,
0383633C4523666C176CAA52 /* Pods-ShareRocketChatRN.debug.xcconfig */,
037C33B0D9A54FB4CB670FB7 /* Pods-ShareRocketChatRN.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
@ -704,6 +881,10 @@
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup;
children = (
1E25745122CBA3DB005A877F /* SplashScreen.xcodeproj */,
1E25743522CBA2F8005A877F /* RNFetchBlob.xcodeproj */,
1E25742B22CBA2AC005A877F /* RNRealmPath.xcodeproj */,
1E2573F022CBA263005A877F /* ReactNativeShareExtension.xcodeproj */,
1E0221D522B2F76300001862 /* RNUserDefaults.xcodeproj */,
7A8DEB1B20ED0BDE00C5DCE4 /* RNNotifications.xcodeproj */,
B8971BAC202A091D0000D245 /* KeyboardTrackingView.xcodeproj */,
@ -745,6 +926,7 @@
children = (
13B07FAE1A68108700A75B9A /* RocketChatRN */,
832341AE1AAA6A7D00B99B32 /* Libraries */,
1EC6ACB122CB9FC300A41C61 /* ShareRocketChatRN */,
83CBBA001A601CBA00E9B192 /* Products */,
BB4B591B5FC44CD9986DB2A6 /* Frameworks */,
AF5E16F0398347E6A80C8CBE /* Resources */,
@ -759,6 +941,7 @@
isa = PBXGroup;
children = (
13B07F961A680F5B00A75B9A /* RocketChatRN.app */,
1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */,
);
name = Products;
sourceTree = "<group>";
@ -829,10 +1012,12 @@
BB4B591B5FC44CD9986DB2A6 /* Frameworks */ = {
isa = PBXGroup;
children = (
1E25744A22CBA374005A877F /* libDoubleConversion.a */,
7ACD4853222860DE00442C55 /* JavaScriptCore.framework */,
B37C79D9BD0742CE936B6982 /* libc++.tbd */,
06BB44DD4855498082A744AD /* libz.tbd */,
C235DC7B31A4D1578EDEF219 /* libPods-RocketChatRN.a */,
B0B41F834F20FC0ACC547296 /* libPods-ShareRocketChatRN.a */,
);
name = Frameworks;
sourceTree = "<group>";
@ -852,22 +1037,44 @@
7A6EDBE020ED6E020086E097 /* Embed Frameworks */,
FD0EBB93B02BAD0637E4F286 /* [CP] Copy Pods Resources */,
7A006EDA229C7F0A00803143 /* Run Script */,
1EC6ACF422CB9FC300A41C61 /* Embed App Extensions */,
);
buildRules = (
);
dependencies = (
1EC6ACBA22CB9FC300A41C61 /* PBXTargetDependency */,
);
name = RocketChatRN;
productName = "Hello World";
productReference = 13B07F961A680F5B00A75B9A /* RocketChatRN.app */;
productType = "com.apple.product-type.application";
};
1EC6ACAF22CB9FC300A41C61 /* ShareRocketChatRN */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1EC6ACF322CB9FC300A41C61 /* Build configuration list for PBXNativeTarget "ShareRocketChatRN" */;
buildPhases = (
A68B7A0986AFB750F727793A /* [CP] Check Pods Manifest.lock */,
1EC6ACAC22CB9FC300A41C61 /* Sources */,
1EC6ACAD22CB9FC300A41C61 /* Frameworks */,
1EC6ACAE22CB9FC300A41C61 /* Resources */,
1EFE4DC322CBF36300B766B7 /* ShellScript */,
);
buildRules = (
);
dependencies = (
);
name = ShareRocketChatRN;
productName = ShareRocketChatRN;
productReference = 1EC6ACB022CB9FC300A41C61 /* ShareRocketChatRN.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
83CBB9F71A601CBA00E9B192 /* Project object */ = {
isa = PBXProject;
attributes = {
DefaultBuildSystemTypeForWorkspace = Original;
LastUpgradeCheck = 610;
ORGANIZATIONNAME = Facebook;
TargetAttributes = {
@ -886,6 +1093,16 @@
};
};
};
1EC6ACAF22CB9FC300A41C61 = {
CreatedOnToolsVersion = 10.2.1;
DevelopmentTeam = S6UPZG7ZR3;
ProvisioningStyle = Automatic;
SystemCapabilities = {
com.apple.ApplicationGroups.iOS = {
enabled = 1;
};
};
};
};
};
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RocketChatRN" */;
@ -965,6 +1182,10 @@
ProductGroup = 146834001AC3E56700842450 /* Products */;
ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
},
{
ProductGroup = 1E2573F122CBA263005A877F /* Products */;
ProjectRef = 1E2573F022CBA263005A877F /* ReactNativeShareExtension.xcodeproj */;
},
{
ProductGroup = 607D60ED1F325B7D00F639C4 /* Products */;
ProjectRef = 5A8684E7C27E426C9206E980 /* RealmReact.xcodeproj */;
@ -973,6 +1194,10 @@
ProductGroup = A9A6C941204DD556006B7D9D /* Products */;
ProjectRef = C21010507E5B4B37BA0E4C9D /* RNAudio.xcodeproj */;
},
{
ProductGroup = 1E25743622CBA2F8005A877F /* Products */;
ProjectRef = 1E25743522CBA2F8005A877F /* RNFetchBlob.xcodeproj */;
},
{
ProductGroup = 7AB8E714229C6145006B474A /* Products */;
ProjectRef = 1132AD7934954A958E143199 /* RNFirebase.xcodeproj */;
@ -985,6 +1210,10 @@
ProductGroup = 7A8DEB1C20ED0BDE00C5DCE4 /* Products */;
ProjectRef = 7A8DEB1B20ED0BDE00C5DCE4 /* RNNotifications.xcodeproj */;
},
{
ProductGroup = 1E25742C22CBA2AC005A877F /* Products */;
ProjectRef = 1E25742B22CBA2AC005A877F /* RNRealmPath.xcodeproj */;
},
{
ProductGroup = 1E0221D622B2F76300001862 /* Products */;
ProjectRef = 1E0221D522B2F76300001862 /* RNUserDefaults.xcodeproj */;
@ -993,10 +1222,15 @@
ProductGroup = B8E79A8A1F3CCC6C005B464F /* Products */;
ProjectRef = 22A8B76C8EBA443BB97CE82D /* RNVectorIcons.xcodeproj */;
},
{
ProductGroup = 1E25745222CBA3DB005A877F /* Products */;
ProjectRef = 1E25745122CBA3DB005A877F /* SplashScreen.xcodeproj */;
},
);
projectRoot = "";
targets = (
13B07F861A680F5B00A75B9A /* RocketChatRN */,
1EC6ACAF22CB9FC300A41C61 /* ShareRocketChatRN */,
);
};
/* End PBXProject section */
@ -1065,6 +1299,34 @@
remoteRef = 1E02220C22B2F76400001862 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
1E25741F22CBA263005A877F /* libReactNativeShareExtension.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libReactNativeShareExtension.a;
remoteRef = 1E25741E22CBA263005A877F /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
1E25743022CBA2AD005A877F /* libRNRealmPath.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNRealmPath.a;
remoteRef = 1E25742F22CBA2AD005A877F /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
1E25743A22CBA2F9005A877F /* libRNFetchBlob.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNFetchBlob.a;
remoteRef = 1E25743922CBA2F9005A877F /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
1E25745622CBA3DB005A877F /* libSplashScreen.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libSplashScreen.a;
remoteRef = 1E25745522CBA3DB005A877F /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@ -1372,6 +1634,17 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
1EC6ACAE22CB9FC300A41C61 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1ED59D5022CBA8ED00C54289 /* custom.ttf in Resources */,
1EDDE57A22DFAD8E0078F69D /* Images.xcassets in Resources */,
1EC6ACB722CB9FC300A41C61 /* MainInterface.storyboard in Resources */,
1ED59D4C22CBA77D00C54289 /* GoogleService-Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
@ -1389,6 +1662,23 @@
shellPath = /bin/sh;
shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
};
1EFE4DC322CBF36300B766B7 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
};
7A006EDA229C7F0A00803143 /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -1407,6 +1697,28 @@
shellPath = /bin/sh;
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n\"${PODS_ROOT}/Fabric/run\"\n";
};
A68B7A0986AFB750F727793A /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-ShareRocketChatRN-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
FB4AC4FF76ACF097F2431C74 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -1457,8 +1769,35 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
1EC6ACAC22CB9FC300A41C61 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1EC6ACF622CBA01500A41C61 /* ShareRocketChatRN.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
1EC6ACBA22CB9FC300A41C61 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 1EC6ACAF22CB9FC300A41C61 /* ShareRocketChatRN */;
targetProxy = 1EC6ACB922CB9FC300A41C61 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
1EC6ACB522CB9FC300A41C61 /* MainInterface.storyboard */ = {
isa = PBXVariantGroup;
children = (
1EC6ACB622CB9FC300A41C61 /* Base */,
);
name = MainInterface.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
13B07F941A680F5B00A75B9A /* Debug */ = {
isa = XCBuildConfiguration;
@ -1555,6 +1894,99 @@
};
name = Release;
};
1EC6ACBC22CB9FC300A41C61 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 0383633C4523666C176CAA52 /* Pods-ShareRocketChatRN.debug.xcconfig */;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = ShareRocketChatRN/ShareRocketChatRN.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = S6UPZG7ZR3;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/rn-extensions-share/ios/**",
"$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**",
$PODS_CONFIGURATION_BUILD_DIR/Firebase,
);
INFOPLIST_FILE = ShareRocketChatRN/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.2;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.ShareRocketChatRN;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
1EC6ACBD22CB9FC300A41C61 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 037C33B0D9A54FB4CB670FB7 /* Pods-ShareRocketChatRN.release.xcconfig */;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = ShareRocketChatRN/ShareRocketChatRN.entitlements;
CODE_SIGN_IDENTITY = "iPhone Distribution";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = S6UPZG7ZR3;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/rn-extensions-share/ios/**",
"$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**",
$PODS_CONFIGURATION_BUILD_DIR/Firebase,
);
INFOPLIST_FILE = ShareRocketChatRN/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.2;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.ShareRocketChatRN;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
83CBBA201A601CBA00E9B192 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -1643,6 +2075,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
1EC6ACF322CB9FC300A41C61 /* Build configuration list for PBXNativeTarget "ShareRocketChatRN" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1EC6ACBC22CB9FC300A41C61 /* Debug */,
1EC6ACBD22CB9FC300A41C61 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RocketChatRN" */ = {
isa = XCConfigurationList;
buildConfigurations = (

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1020"
wasCreatedForAppExtension = "YES"
version = "2.0">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1EC6ACAF22CB9FC300A41C61"
BuildableName = "ShareRocketChatRN.appex"
BlueprintName = "ShareRocketChatRN"
ReferencedContainer = "container:RocketChatRN.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "RocketChatRN.app"
BlueprintName = "RocketChatRN"
ReferencedContainer = "container:RocketChatRN.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1EC6ACAF22CB9FC300A41C61"
BuildableName = "ShareRocketChatRN.appex"
BlueprintName = "ShareRocketChatRN"
ReferencedContainer = "container:RocketChatRN.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = ""
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"
launchAutomaticallySubstyle = "2">
<RemoteRunnable
runnableDebuggingMode = "1"
BundleIdentifier = "com.apple.mobileslideshow"
RemotePath = "/Applications/MobileSlideShow.app">
</RemoteRunnable>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "RocketChatRN.app"
BlueprintName = "RocketChatRN"
ReferencedContainer = "container:RocketChatRN.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
launchAutomaticallySubstyle = "2">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "RocketChatRN.app"
BlueprintName = "RocketChatRN"
ReferencedContainer = "container:RocketChatRN.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="j1y-V4-xli">
<device id="retina6_1" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Share Rocket ChatRN-->
<scene sceneID="ceB-am-kn3">
<objects>
<viewController id="j1y-V4-xli" customClass="ShareRocketChatRN" sceneMemberID="viewController">
<view key="view" opaque="NO" contentMode="scaleToFill" id="wbc-yd-nQP">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="1Xd-am-t49"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="CEy-Cv-SGf" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

View File

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "hashtag.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "hashtag@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "hashtag@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

View File

@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "lock.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "lock@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "lock@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 949 B

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Rocket.Chat Experimental</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionActivationSupportsAttachmentsWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActionWantsFullScreenPresentation</key>
<false/>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationDictionaryVersion</key>
<integer>2</integer>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
<key>UIAppFonts</key>
<array>
<string>custom.ttf</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.ios.chat.rocket</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,44 @@
//
// ShareRocketChatRN.m
// ShareRocketChatRN
//
// Created by Djorkaeff Alexandre Vilela Pereira on 16/05/19.
// Copyright © 2019 Facebook. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "ReactNativeShareExtension.h"
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <React/RCTLog.h>
#import <Firebase.h>
@interface ShareRocketChatRN : ReactNativeShareExtension
@end
@implementation ShareRocketChatRN
RCT_EXPORT_MODULE();
- (UIView*) shareView {
NSURL *jsCodeLocation;
if(![FIRApp defaultApp]){
[FIRApp configure];
}
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"ShareRocketChatRN"
initialProperties:nil
launchOptions:nil];
rootView.backgroundColor = nil;
// Uncomment for console output in Xcode console for release mode on device:
// RCTSetLogThreshold(RCTLogLevelInfo - 1);
return rootView;
}
@end

View File

@ -53,12 +53,14 @@
"react-native-keyboard-tracking-view": "^5.5.0",
"react-native-localize": "^1.1.4",
"react-native-markdown-renderer": "^3.2.8",
"react-native-mime-types": "^2.2.1",
"react-native-modal": "10.0.0",
"react-native-notifications": "1.2.6",
"react-native-optimized-flatlist": "^1.0.4",
"react-native-orientation-locker": "^1.1.5",
"react-native-picker-select": "^5.2.3",
"react-native-platform-touchable": "^1.1.1",
"react-native-realm-path": "^1.2.10",
"react-native-responsive-ui": "^1.1.1",
"react-native-screens": "^1.0.0-alpha.22",
"react-native-scrollable-tab-view": "0.10.0",
@ -80,6 +82,8 @@
"redux-immutable-state-invariant": "^2.1.0",
"redux-saga": "^0.16.2",
"remove-markdown": "^0.3.0",
"rn-extensions-share": "^2.3.7",
"rn-fetch-blob": "^0.10.15",
"rn-user-defaults": "^1.3.4",
"semver": "6.0.0",
"snyk": "^1.156.0",

View File

@ -3509,6 +3509,11 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
base-64@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
integrity sha1-eAqZyE59YAJgNhURxId2E78k9rs=
base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.2.3:
version "1.3.0"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
@ -6553,6 +6558,18 @@ glob-to-regexp@^0.3.0:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
glob@7.0.6:
version "7.0.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.2"
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
@ -9631,6 +9648,11 @@ mime-db@~1.23.0:
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659"
integrity sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=
mime-db@~1.25.0:
version "1.25.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392"
integrity sha1-wY29fHOl2/b0SgJNwNFloeexw5I=
mime-types@2.1.11:
version "2.1.11"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c"
@ -9682,7 +9704,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4:
"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@ -11609,6 +11631,13 @@ react-native-markdown-renderer@^3.2.8:
prop-types "^15.5.10"
react-native-fit-image "^1.5.2"
react-native-mime-types@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/react-native-mime-types/-/react-native-mime-types-2.2.1.tgz#a9760e9916e4e7df03512c60516668f23543f2c0"
integrity sha512-2H0jjW5l2driXiiKx9PZsJDCFgS8LeMaVLVZPy3iRkBrNcstpQosEr6+YJfihLbW3WvFtmS2qcyFKB7mYw/iJg==
dependencies:
mime-db "~1.25.0"
react-native-modal@10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/react-native-modal/-/react-native-modal-10.0.0.tgz#1b0b15cc6cda9584f122cced106a9f9f37befc08"
@ -11657,6 +11686,11 @@ react-native-platform-touchable@^1.1.1:
resolved "https://registry.yarnpkg.com/react-native-platform-touchable/-/react-native-platform-touchable-1.1.1.tgz#fde4acc65eea585d28b164d0c3716a42129a68e4"
integrity sha1-/eSsxl7qWF0osWTQw3FqQhKaaOQ=
react-native-realm-path@^1.2.10:
version "1.2.10"
resolved "https://registry.yarnpkg.com/react-native-realm-path/-/react-native-realm-path-1.2.10.tgz#886493e334c62279bee631789172cfa7cfd6dc8d"
integrity sha512-+FFjA+8fH2ubmAOeF+++4t+QG9qUEg4u3nvVN21zIMpkqj8TIuA0NZ5cdW5YZOx3hjFrYSxyCkq24Zu5QHv2Jw==
react-native-responsive-ui@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/react-native-responsive-ui/-/react-native-responsive-ui-1.1.1.tgz#eb41839d4f3951ff025660185c36a9a9ce33759f"
@ -12595,6 +12629,19 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
rn-extensions-share@^2.3.7:
version "2.3.7"
resolved "https://registry.yarnpkg.com/rn-extensions-share/-/rn-extensions-share-2.3.7.tgz#9f1387af25124c21e92854570cd088ed788b60ac"
integrity sha512-8SP3HTKf9g+/4hm/ER+IcbpImaqsTny7WUNOC18Vvq5Js+2O9MAKaQB+gHSP7IC6JYsbOzh+cc2jNRfc0zJpOA==
rn-fetch-blob@^0.10.15:
version "0.10.15"
resolved "https://registry.yarnpkg.com/rn-fetch-blob/-/rn-fetch-blob-0.10.15.tgz#3526860c1c57e0bf4c09bdbe409c919264afffba"
integrity sha512-/m/gurTaPAvR3J843uehHhznj5k89x7XClyO5ejmbspNLNQ4ByF+kZs80wiiKGWntj+Wqo0jJu1goArXEfc0kA==
dependencies:
base-64 "0.1.0"
glob "7.0.6"
rn-user-defaults@^1.3.4:
version "1.3.4"
resolved "https://registry.yarnpkg.com/rn-user-defaults/-/rn-user-defaults-1.3.4.tgz#1fbdd1bf29d9f853918dca5219e45db54d19fe37"