Merge branch 'develop' into single-server
# Conflicts: # android/app/build.gradle # android/app/src/debug/res/values/strings.xml # app/index.js # app/sagas/login.js # ios/RocketChatRN.xcodeproj/project.pbxproj
|
@ -190,11 +190,6 @@ jobs:
|
||||||
name: Restore NPM cache
|
name: Restore NPM cache
|
||||||
key: node-modules-{{ checksum "yarn.lock" }}
|
key: node-modules-{{ checksum "yarn.lock" }}
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Install React Native CLI
|
|
||||||
command: |
|
|
||||||
npm i -g react-native-cli
|
|
||||||
|
|
||||||
- run:
|
- run:
|
||||||
name: Install NPM modules
|
name: Install NPM modules
|
||||||
command: |
|
command: |
|
||||||
|
@ -308,7 +303,6 @@ jobs:
|
||||||
- run:
|
- run:
|
||||||
name: Install NPM modules
|
name: Install NPM modules
|
||||||
command: |
|
command: |
|
||||||
yarn global add react-native react-native-cli
|
|
||||||
yarn
|
yarn
|
||||||
|
|
||||||
- run:
|
- run:
|
||||||
|
|
|
@ -56,16 +56,15 @@ Follow the [React Native Getting Started Guide](https://facebook.github.io/react
|
||||||
```bash
|
```bash
|
||||||
$ git clone git@github.com:RocketChat/Rocket.Chat.ReactNative.git
|
$ git clone git@github.com:RocketChat/Rocket.Chat.ReactNative.git
|
||||||
$ cd Rocket.Chat.ReactNative
|
$ cd Rocket.Chat.ReactNative
|
||||||
$ yarn global add react-native-cli
|
|
||||||
$ yarn
|
$ yarn
|
||||||
```
|
```
|
||||||
|
|
||||||
- Run application
|
- Run application
|
||||||
```bash
|
```bash
|
||||||
$ react-native run-ios
|
$ npx react-native run-ios
|
||||||
```
|
```
|
||||||
```bash
|
```bash
|
||||||
$ react-native run-android
|
$ npx react-native run-android
|
||||||
```
|
```
|
||||||
|
|
||||||
### Running single server
|
### Running single server
|
||||||
|
@ -81,7 +80,7 @@ Readme will guide you on how to config.
|
||||||
|--------------------------------------------------------------- |-------- |
|
|--------------------------------------------------------------- |-------- |
|
||||||
| Jitsi Integration | ✅ |
|
| Jitsi Integration | ✅ |
|
||||||
| Federation (Directory) | ✅ |
|
| Federation (Directory) | ✅ |
|
||||||
| Discussions | ❌ |
|
| Discussions | ✅ |
|
||||||
| Omnichannel | ❌ |
|
| Omnichannel | ❌ |
|
||||||
| Threads | ✅ |
|
| Threads | ✅ |
|
||||||
| Record Audio | ✅ |
|
| Record Audio | ✅ |
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
export class Rocketchat {}
|
||||||
|
export const settings = {};
|
After Width: | Height: | Size: 62 KiB |
|
@ -237,12 +237,19 @@ public class CustomPushNotification extends PushNotification {
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
|
||||||
messageStyle.addMessage(m, timestamp, username);
|
messageStyle.addMessage(m, timestamp, username);
|
||||||
} else {
|
} else {
|
||||||
Person sender = new Person.Builder()
|
Bitmap avatar = getAvatar(avatarUri);
|
||||||
|
|
||||||
|
Person.Builder sender = new Person.Builder()
|
||||||
.setKey(senderId)
|
.setKey(senderId)
|
||||||
.setName(username)
|
.setName(username);
|
||||||
.setIcon(Icon.createWithBitmap(getAvatar(avatarUri)))
|
|
||||||
.build();
|
if (avatar != null) {
|
||||||
messageStyle.addMessage(m, timestamp, sender);
|
sender.setIcon(Icon.createWithBitmap(avatar));
|
||||||
|
}
|
||||||
|
|
||||||
|
Person person = sender.build();
|
||||||
|
|
||||||
|
messageStyle.addMessage(m, timestamp, person);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ public class MainActivity extends ReactFragmentActivity {
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
RNBootSplash.show(R.drawable.launch_screen, MainActivity.this);
|
RNBootSplash.init(R.drawable.launch_screen, MainActivity.this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 987 B |
|
@ -0,0 +1,21 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="512"
|
||||||
|
android:viewportHeight="512">
|
||||||
|
<path
|
||||||
|
android:pathData="M0,0h512v512h-512z">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:startY="0"
|
||||||
|
android:startX="256"
|
||||||
|
android:endY="512"
|
||||||
|
android:endX="256"
|
||||||
|
android:type="linear">
|
||||||
|
<item android:offset="0" android:color="#FF1C82FF"/>
|
||||||
|
<item android:offset="1" android:color="#FF0066E3"/>
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
</vector>
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 111 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 73 KiB |
Before Width: | Height: | Size: 177 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 246 KiB |
Before Width: | Height: | Size: 4.5 KiB |
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.9 KiB |
After Width: | Height: | Size: 8.5 KiB |
After Width: | Height: | Size: 8.4 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 8.7 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 22 KiB |
|
@ -1,5 +1,4 @@
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Rocket.Chat Experimental</string>
|
<string name="app_name">Rocket.Chat Experimental</string>
|
||||||
<string name="share_extension_name">Rocket.Chat Experimental</string>
|
<string name="share_extension_name">Rocket.Chat Experimental</string>
|
||||||
<string name="no_browser_found">No Browser Found</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -31,10 +31,11 @@ export const ROOMS = createRequestTypes('ROOMS', [
|
||||||
'OPEN_SEARCH_HEADER',
|
'OPEN_SEARCH_HEADER',
|
||||||
'CLOSE_SEARCH_HEADER'
|
'CLOSE_SEARCH_HEADER'
|
||||||
]);
|
]);
|
||||||
export const ROOM = createRequestTypes('ROOM', ['LEAVE', 'DELETE_INIT', 'DELETE_FINISH', 'USER_TYPING']);
|
export const ROOM = createRequestTypes('ROOM', ['LEAVE', 'DELETE', 'REMOVED', 'USER_TYPING']);
|
||||||
export const APP = createRequestTypes('APP', ['START', 'READY', 'INIT', 'INIT_LOCAL_SETTINGS']);
|
export const APP = createRequestTypes('APP', ['START', 'READY', 'INIT', 'INIT_LOCAL_SETTINGS']);
|
||||||
export const MESSAGES = createRequestTypes('MESSAGES', ['REPLY_BROADCAST']);
|
export const MESSAGES = createRequestTypes('MESSAGES', ['REPLY_BROADCAST']);
|
||||||
export const CREATE_CHANNEL = createRequestTypes('CREATE_CHANNEL', [...defaultTypes]);
|
export const CREATE_CHANNEL = createRequestTypes('CREATE_CHANNEL', [...defaultTypes]);
|
||||||
|
export const CREATE_DISCUSSION = createRequestTypes('CREATE_DISCUSSION', [...defaultTypes]);
|
||||||
export const SELECTED_USERS = createRequestTypes('SELECTED_USERS', ['ADD_USER', 'REMOVE_USER', 'RESET', 'SET_LOADING']);
|
export const SELECTED_USERS = createRequestTypes('SELECTED_USERS', ['ADD_USER', 'REMOVE_USER', 'RESET', 'SET_LOADING']);
|
||||||
export const SERVER = createRequestTypes('SERVER', [
|
export const SERVER = createRequestTypes('SERVER', [
|
||||||
...defaultTypes,
|
...defaultTypes,
|
||||||
|
@ -62,3 +63,4 @@ export const INVITE_LINKS = createRequestTypes('INVITE_LINKS', [
|
||||||
'CLEAR',
|
'CLEAR',
|
||||||
...defaultTypes
|
...defaultTypes
|
||||||
]);
|
]);
|
||||||
|
export const SETTINGS = createRequestTypes('SETTINGS', ['CLEAR', 'ADD']);
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
import * as types from './actionsTypes';
|
||||||
|
|
||||||
|
export function createDiscussionRequest(data) {
|
||||||
|
return {
|
||||||
|
type: types.CREATE_DISCUSSION.REQUEST,
|
||||||
|
data
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createDiscussionSuccess(data) {
|
||||||
|
return {
|
||||||
|
type: types.CREATE_DISCUSSION.SUCCESS,
|
||||||
|
data
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createDiscussionFailure(err) {
|
||||||
|
return {
|
||||||
|
type: types.CREATE_DISCUSSION.FAILURE,
|
||||||
|
err
|
||||||
|
};
|
||||||
|
}
|
|
@ -34,13 +34,6 @@ export function setCurrentServer(server) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function addSettings(settings) {
|
|
||||||
return {
|
|
||||||
type: types.ADD_SETTINGS,
|
|
||||||
payload: settings
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export function login() {
|
export function login() {
|
||||||
return {
|
return {
|
||||||
type: 'LOGIN'
|
type: 'LOGIN'
|
||||||
|
|
|
@ -8,17 +8,17 @@ export function leaveRoom(rid, t) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function deleteRoomInit(rid, t) {
|
export function deleteRoom(rid, t) {
|
||||||
return {
|
return {
|
||||||
type: types.ROOM.DELETE_INIT,
|
type: types.ROOM.DELETE,
|
||||||
rid,
|
rid,
|
||||||
t
|
t
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function deleteRoomFinish() {
|
export function removedRoom() {
|
||||||
return {
|
return {
|
||||||
type: types.ROOM.DELETE_FINISH
|
type: types.ROOM.REMOVED
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
import { SETTINGS } from './actionsTypes';
|
||||||
|
|
||||||
|
export function addSettings(settings) {
|
||||||
|
return {
|
||||||
|
type: SETTINGS.ADD,
|
||||||
|
payload: settings
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function clearSettings() {
|
||||||
|
return {
|
||||||
|
type: SETTINGS.CLEAR
|
||||||
|
};
|
||||||
|
}
|
|
@ -14,6 +14,9 @@ export default {
|
||||||
Accounts_AllowUserProfileChange: {
|
Accounts_AllowUserProfileChange: {
|
||||||
type: 'valueAsBoolean'
|
type: 'valueAsBoolean'
|
||||||
},
|
},
|
||||||
|
Accounts_AllowUserStatusMessageChange: {
|
||||||
|
type: 'valueAsBoolean'
|
||||||
|
},
|
||||||
Accounts_AllowUsernameChange: {
|
Accounts_AllowUsernameChange: {
|
||||||
type: 'valueAsBoolean'
|
type: 'valueAsBoolean'
|
||||||
},
|
},
|
||||||
|
@ -44,9 +47,18 @@ export default {
|
||||||
Accounts_ShowFormLogin: {
|
Accounts_ShowFormLogin: {
|
||||||
type: 'valueAsBoolean'
|
type: 'valueAsBoolean'
|
||||||
},
|
},
|
||||||
|
Accounts_ManuallyApproveNewUsers: {
|
||||||
|
type: 'valueAsBoolean'
|
||||||
|
},
|
||||||
CROWD_Enable: {
|
CROWD_Enable: {
|
||||||
type: 'valueAsBoolean'
|
type: 'valueAsBoolean'
|
||||||
},
|
},
|
||||||
|
DirectMesssage_maxUsers: {
|
||||||
|
type: 'valueAsNumber'
|
||||||
|
},
|
||||||
|
Accounts_Directory_DefaultView: {
|
||||||
|
type: 'valueAsString'
|
||||||
|
},
|
||||||
FEDERATION_Enabled: {
|
FEDERATION_Enabled: {
|
||||||
type: 'valueAsBoolean'
|
type: 'valueAsBoolean'
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
export const MAX_SIDEBAR_WIDTH = 321;
|
export const MAX_SIDEBAR_WIDTH = 321;
|
||||||
export const MAX_CONTENT_WIDTH = '90%';
|
export const MAX_CONTENT_WIDTH = '90%';
|
||||||
export const MAX_SCREEN_CONTENT_WIDTH = '45%';
|
export const MAX_SCREEN_CONTENT_WIDTH = '50%';
|
||||||
export const MIN_WIDTH_SPLIT_LAYOUT = 700;
|
export const MIN_WIDTH_SPLIT_LAYOUT = 700;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
export const SET_CURRENT_SERVER = 'SET_CURRENT_SERVER';
|
export const SET_CURRENT_SERVER = 'SET_CURRENT_SERVER';
|
||||||
export const SET_CUSTOM_EMOJIS = 'SET_CUSTOM_EMOJIS';
|
export const SET_CUSTOM_EMOJIS = 'SET_CUSTOM_EMOJIS';
|
||||||
export const ADD_SETTINGS = 'ADD_SETTINGS';
|
export const ADD_SETTINGS = 'ADD_SETTINGS';
|
||||||
|
export const CLEAR_SETTINGS = 'CLEAR_SETTINGS';
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { StyleSheet, View, Text } from 'react-native';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
import { themes } from '../constants/colors';
|
||||||
|
import sharedStyles from '../views/Styles';
|
||||||
|
import { getReadableVersion } from '../utils/deviceInfo';
|
||||||
|
import I18n from '../i18n';
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'flex-end'
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
...sharedStyles.textRegular,
|
||||||
|
fontSize: 13
|
||||||
|
},
|
||||||
|
bold: {
|
||||||
|
...sharedStyles.textSemibold
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const AppVersion = React.memo(({ theme }) => (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<Text style={[styles.text, { color: themes[theme].auxiliaryText }]}>{I18n.t('Version_no', { version: '' })}<Text style={styles.bold}>{getReadableVersion}</Text></Text>
|
||||||
|
</View>
|
||||||
|
));
|
||||||
|
|
||||||
|
AppVersion.propTypes = {
|
||||||
|
theme: PropTypes.string
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AppVersion;
|
|
@ -4,10 +4,7 @@ import { View } from 'react-native';
|
||||||
import FastImage from 'react-native-fast-image';
|
import FastImage from 'react-native-fast-image';
|
||||||
import { settings as RocketChatSettings } from '@rocket.chat/sdk';
|
import { settings as RocketChatSettings } from '@rocket.chat/sdk';
|
||||||
import Touch from '../utils/touch';
|
import Touch from '../utils/touch';
|
||||||
|
import { avatarURL } from '../utils/avatar';
|
||||||
const formatUrl = (url, baseUrl, uriSize, avatarAuthURLFragment) => (
|
|
||||||
`${ baseUrl }${ url }?format=png&width=${ uriSize }&height=${ uriSize }${ avatarAuthURLFragment }`
|
|
||||||
);
|
|
||||||
|
|
||||||
const Avatar = React.memo(({
|
const Avatar = React.memo(({
|
||||||
text, size, baseUrl, borderRadius, style, avatar, type, children, userId, token, onPress, theme
|
text, size, baseUrl, borderRadius, style, avatar, type, children, userId, token, onPress, theme
|
||||||
|
@ -22,24 +19,9 @@ const Avatar = React.memo(({
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const room = type === 'd' ? text : `@${ text }`;
|
const uri = avatarURL({
|
||||||
|
type, text, size, userId, token, avatar, baseUrl
|
||||||
// Avoid requesting several sizes by having only two sizes on cache
|
});
|
||||||
const uriSize = size === 100 ? 100 : 50;
|
|
||||||
|
|
||||||
let avatarAuthURLFragment = '';
|
|
||||||
if (userId && token) {
|
|
||||||
avatarAuthURLFragment = `&rc_token=${ token }&rc_uid=${ userId }`;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
let uri;
|
|
||||||
if (avatar) {
|
|
||||||
uri = avatar.includes('http') ? avatar : formatUrl(avatar, baseUrl, uriSize, avatarAuthURLFragment);
|
|
||||||
} else {
|
|
||||||
uri = formatUrl(`/avatar/${ room }`, baseUrl, uriSize, avatarAuthURLFragment);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
let image = (
|
let image = (
|
||||||
<FastImage
|
<FastImage
|
||||||
|
|
|
@ -9,15 +9,19 @@ import ActivityIndicator from '../ActivityIndicator';
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
container: {
|
container: {
|
||||||
paddingHorizontal: 15,
|
paddingHorizontal: 14,
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
height: 48,
|
height: 48,
|
||||||
borderRadius: 2,
|
borderRadius: 2,
|
||||||
marginBottom: 10
|
marginBottom: 12
|
||||||
},
|
},
|
||||||
text: {
|
text: {
|
||||||
fontSize: 18,
|
fontSize: 16,
|
||||||
textAlign: 'center'
|
textAlign: 'center',
|
||||||
|
...sharedStyles.textMedium
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
opacity: 0.3
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -30,6 +34,8 @@ export default class Button extends React.PureComponent {
|
||||||
backgroundColor: PropTypes.string,
|
backgroundColor: PropTypes.string,
|
||||||
loading: PropTypes.bool,
|
loading: PropTypes.bool,
|
||||||
theme: PropTypes.string,
|
theme: PropTypes.string,
|
||||||
|
color: PropTypes.string,
|
||||||
|
fontSize: PropTypes.string,
|
||||||
style: PropTypes.any
|
style: PropTypes.any
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,9 +49,15 @@ export default class Button extends React.PureComponent {
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
title, type, onPress, disabled, backgroundColor, loading, style, theme, ...otherProps
|
title, type, onPress, disabled, backgroundColor, color, loading, style, theme, fontSize, ...otherProps
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const isPrimary = type === 'primary';
|
const isPrimary = type === 'primary';
|
||||||
|
|
||||||
|
let textColor = isPrimary ? themes[theme].buttonText : themes[theme].bodyText;
|
||||||
|
if (color) {
|
||||||
|
textColor = color;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Touchable
|
<Touchable
|
||||||
onPress={onPress}
|
onPress={onPress}
|
||||||
|
@ -55,20 +67,20 @@ export default class Button extends React.PureComponent {
|
||||||
backgroundColor
|
backgroundColor
|
||||||
? { backgroundColor }
|
? { backgroundColor }
|
||||||
: { backgroundColor: isPrimary ? themes[theme].actionTintColor : themes[theme].backgroundColor },
|
: { backgroundColor: isPrimary ? themes[theme].actionTintColor : themes[theme].backgroundColor },
|
||||||
disabled && { backgroundColor: themes[theme].borderColor },
|
disabled && styles.disabled,
|
||||||
style
|
style
|
||||||
]}
|
]}
|
||||||
{...otherProps}
|
{...otherProps}
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
loading
|
loading
|
||||||
? <ActivityIndicator color={isPrimary ? themes[theme].buttonText : themes[theme].actionTintColor} />
|
? <ActivityIndicator color={textColor} />
|
||||||
: (
|
: (
|
||||||
<Text
|
<Text
|
||||||
style={[
|
style={[
|
||||||
styles.text,
|
styles.text,
|
||||||
isPrimary ? sharedStyles.textMedium : sharedStyles.textBold,
|
{ color: textColor },
|
||||||
{ color: isPrimary ? themes[theme].buttonText : themes[theme].actionTintColor }
|
fontSize && { fontSize }
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
{title}
|
{title}
|
||||||
|
|
|
@ -13,9 +13,10 @@ const styles = StyleSheet.create({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const Check = React.memo(({ theme }) => <CustomIcon style={styles.icon} color={themes[theme].tintColor} size={22} name='check' />);
|
const Check = React.memo(({ theme, style }) => <CustomIcon style={[styles.icon, style]} color={themes[theme].tintColor} size={22} name='check' />);
|
||||||
|
|
||||||
Check.propTypes = {
|
Check.propTypes = {
|
||||||
|
style: PropTypes.object,
|
||||||
theme: PropTypes.string
|
theme: PropTypes.string
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,8 @@ export default StyleSheet.create({
|
||||||
},
|
},
|
||||||
categoryEmoji: {
|
categoryEmoji: {
|
||||||
backgroundColor: 'transparent',
|
backgroundColor: 'transparent',
|
||||||
textAlign: 'center'
|
textAlign: 'center',
|
||||||
|
color: '#ffffff'
|
||||||
},
|
},
|
||||||
customCategoryEmoji: {
|
customCategoryEmoji: {
|
||||||
margin: 8
|
margin: 8
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { ScrollView, StyleSheet, View } from 'react-native';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { SafeAreaView } from 'react-navigation';
|
||||||
|
|
||||||
|
import { themes } from '../constants/colors';
|
||||||
|
import sharedStyles from '../views/Styles';
|
||||||
|
import scrollPersistTaps from '../utils/scrollPersistTaps';
|
||||||
|
import KeyboardView from '../presentation/KeyboardView';
|
||||||
|
import StatusBar from './StatusBar';
|
||||||
|
import AppVersion from './AppVersion';
|
||||||
|
import { isTablet } from '../utils/deviceInfo';
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
scrollView: {
|
||||||
|
minHeight: '100%'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export const FormContainerInner = ({ children }) => (
|
||||||
|
<View style={[sharedStyles.container, isTablet && sharedStyles.tabletScreenContent]}>
|
||||||
|
{children}
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
|
||||||
|
const FormContainer = ({ children, theme }) => (
|
||||||
|
<KeyboardView
|
||||||
|
style={{ backgroundColor: themes[theme].backgroundColor }}
|
||||||
|
contentContainerStyle={sharedStyles.container}
|
||||||
|
keyboardVerticalOffset={128}
|
||||||
|
>
|
||||||
|
<StatusBar theme={theme} />
|
||||||
|
<ScrollView {...scrollPersistTaps} style={sharedStyles.container} contentContainerStyle={[sharedStyles.containerScrollView, styles.scrollView]}>
|
||||||
|
<SafeAreaView style={sharedStyles.container} forceInset={{ top: 'never' }}>
|
||||||
|
{children}
|
||||||
|
<AppVersion theme={theme} />
|
||||||
|
</SafeAreaView>
|
||||||
|
</ScrollView>
|
||||||
|
</KeyboardView>
|
||||||
|
);
|
||||||
|
|
||||||
|
FormContainer.propTypes = {
|
||||||
|
theme: PropTypes.string,
|
||||||
|
children: PropTypes.element
|
||||||
|
};
|
||||||
|
|
||||||
|
FormContainerInner.propTypes = {
|
||||||
|
children: PropTypes.element
|
||||||
|
};
|
||||||
|
|
||||||
|
export default FormContainer;
|
|
@ -36,13 +36,13 @@ export const DrawerButton = React.memo(({ navigation, testID, ...otherProps }) =
|
||||||
</CustomHeaderButtons>
|
</CustomHeaderButtons>
|
||||||
));
|
));
|
||||||
|
|
||||||
export const CloseModalButton = React.memo(({ navigation, testID }) => (
|
export const CloseModalButton = React.memo(({ navigation, testID, onPress = () => navigation.pop() }) => (
|
||||||
<CustomHeaderButtons left>
|
<CustomHeaderButtons left>
|
||||||
<Item title='close' iconName='cross' onPress={() => navigation.pop()} testID={testID} />
|
<Item title='close' iconName='cross' onPress={onPress} testID={testID} />
|
||||||
</CustomHeaderButtons>
|
</CustomHeaderButtons>
|
||||||
));
|
));
|
||||||
|
|
||||||
export const CloseShareExtensionButton = React.memo(({ onPress, testID }) => (
|
export const CancelModalButton = React.memo(({ onPress, testID }) => (
|
||||||
<CustomHeaderButtons left>
|
<CustomHeaderButtons left>
|
||||||
{isIOS
|
{isIOS
|
||||||
? <Item title={I18n.t('Cancel')} onPress={onPress} testID={testID} />
|
? <Item title={I18n.t('Cancel')} onPress={onPress} testID={testID} />
|
||||||
|
@ -76,9 +76,10 @@ DrawerButton.propTypes = {
|
||||||
};
|
};
|
||||||
CloseModalButton.propTypes = {
|
CloseModalButton.propTypes = {
|
||||||
navigation: PropTypes.object.isRequired,
|
navigation: PropTypes.object.isRequired,
|
||||||
testID: PropTypes.string.isRequired
|
testID: PropTypes.string.isRequired,
|
||||||
|
onPress: PropTypes.func
|
||||||
};
|
};
|
||||||
CloseShareExtensionButton.propTypes = {
|
CancelModalButton.propTypes = {
|
||||||
onPress: PropTypes.func.isRequired,
|
onPress: PropTypes.func.isRequired,
|
||||||
testID: PropTypes.string.isRequired
|
testID: PropTypes.string.isRequired
|
||||||
};
|
};
|
||||||
|
|
|
@ -33,9 +33,10 @@ const styles = StyleSheet.create({
|
||||||
});
|
});
|
||||||
|
|
||||||
const Content = React.memo(({
|
const Content = React.memo(({
|
||||||
title, subtitle, disabled, testID, right, color, theme
|
title, subtitle, disabled, testID, left, right, color, theme
|
||||||
}) => (
|
}) => (
|
||||||
<View style={[styles.container, disabled && styles.disabled]} testID={testID}>
|
<View style={[styles.container, disabled && styles.disabled]} testID={testID}>
|
||||||
|
{left ? left() : null}
|
||||||
<View style={styles.textContainer}>
|
<View style={styles.textContainer}>
|
||||||
<Text style={[styles.title, { color: color || themes[theme].titleText }]}>{title}</Text>
|
<Text style={[styles.title, { color: color || themes[theme].titleText }]}>{title}</Text>
|
||||||
{subtitle
|
{subtitle
|
||||||
|
@ -51,7 +52,7 @@ const Button = React.memo(({
|
||||||
onPress, ...props
|
onPress, ...props
|
||||||
}) => (
|
}) => (
|
||||||
<Touch
|
<Touch
|
||||||
onPress={onPress}
|
onPress={() => onPress(props.title)}
|
||||||
style={{ backgroundColor: themes[props.theme].backgroundColor }}
|
style={{ backgroundColor: themes[props.theme].backgroundColor }}
|
||||||
enabled={!props.disabled}
|
enabled={!props.disabled}
|
||||||
theme={props.theme}
|
theme={props.theme}
|
||||||
|
@ -79,6 +80,7 @@ Item.propTypes = {
|
||||||
Content.propTypes = {
|
Content.propTypes = {
|
||||||
title: PropTypes.string.isRequired,
|
title: PropTypes.string.isRequired,
|
||||||
subtitle: PropTypes.string,
|
subtitle: PropTypes.string,
|
||||||
|
left: PropTypes.func,
|
||||||
right: PropTypes.func,
|
right: PropTypes.func,
|
||||||
disabled: PropTypes.bool,
|
disabled: PropTypes.bool,
|
||||||
testID: PropTypes.string,
|
testID: PropTypes.string,
|
||||||
|
@ -87,6 +89,7 @@ Content.propTypes = {
|
||||||
};
|
};
|
||||||
|
|
||||||
Button.propTypes = {
|
Button.propTypes = {
|
||||||
|
title: PropTypes.string,
|
||||||
onPress: PropTypes.func,
|
onPress: PropTypes.func,
|
||||||
disabled: PropTypes.bool,
|
disabled: PropTypes.bool,
|
||||||
theme: PropTypes.string
|
theme: PropTypes.string
|
||||||
|
|
|
@ -1,42 +1,32 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import {
|
import {
|
||||||
Text, View, ScrollView, Image, StyleSheet, Animated, Easing
|
View, StyleSheet, Text, Animated, Easing, Image
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { Base64 } from 'js-base64';
|
import { Base64 } from 'js-base64';
|
||||||
import { SafeAreaView } from 'react-navigation';
|
import { withNavigation } from 'react-navigation';
|
||||||
import { BorderlessButton } from 'react-native-gesture-handler';
|
|
||||||
import equal from 'deep-equal';
|
|
||||||
|
|
||||||
import Touch from '../utils/touch';
|
|
||||||
import sharedStyles from './Styles';
|
|
||||||
import scrollPersistTaps from '../utils/scrollPersistTaps';
|
|
||||||
import random from '../utils/random';
|
|
||||||
import Button from '../containers/Button';
|
|
||||||
import I18n from '../i18n';
|
|
||||||
import { LegalButton } from '../containers/HeaderButton';
|
|
||||||
import StatusBar from '../containers/StatusBar';
|
|
||||||
import { themes } from '../constants/colors';
|
|
||||||
import { withTheme } from '../theme';
|
import { withTheme } from '../theme';
|
||||||
import { themedHeader } from '../utils/navigation';
|
import sharedStyles from '../views/Styles';
|
||||||
import { isTablet } from '../utils/deviceInfo';
|
import { themes } from '../constants/colors';
|
||||||
|
import { loginRequest as loginRequestAction } from '../actions/login';
|
||||||
|
import Button from './Button';
|
||||||
|
import OnboardingSeparator from './OnboardingSeparator';
|
||||||
|
import Touch from '../utils/touch';
|
||||||
|
import I18n from '../i18n';
|
||||||
|
import random from '../utils/random';
|
||||||
|
|
||||||
|
const SERVICE_HEIGHT = 58;
|
||||||
|
const SERVICES_COLLAPSED_HEIGHT = 174;
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
container: {
|
|
||||||
paddingVertical: 30
|
|
||||||
},
|
|
||||||
safeArea: {
|
|
||||||
paddingBottom: 30,
|
|
||||||
flex: 1
|
|
||||||
},
|
|
||||||
serviceButton: {
|
serviceButton: {
|
||||||
borderRadius: 2,
|
borderRadius: 2,
|
||||||
marginBottom: 10
|
marginBottom: 10
|
||||||
},
|
},
|
||||||
serviceButtonContainer: {
|
serviceButtonContainer: {
|
||||||
borderRadius: 2,
|
borderRadius: 2,
|
||||||
borderWidth: 1,
|
|
||||||
width: '100%',
|
width: '100%',
|
||||||
height: 48,
|
height: 48,
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
|
@ -56,124 +46,32 @@ const styles = StyleSheet.create({
|
||||||
fontSize: 16
|
fontSize: 16
|
||||||
},
|
},
|
||||||
serviceName: {
|
serviceName: {
|
||||||
...sharedStyles.textBold
|
...sharedStyles.textSemibold
|
||||||
},
|
},
|
||||||
registerDisabled: {
|
options: {
|
||||||
...sharedStyles.textRegular,
|
marginBottom: 0
|
||||||
...sharedStyles.textAlignCenter,
|
|
||||||
fontSize: 16
|
|
||||||
},
|
|
||||||
servicesTogglerContainer: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
alignItems: 'center',
|
|
||||||
marginTop: 5,
|
|
||||||
marginBottom: 30
|
|
||||||
},
|
|
||||||
servicesToggler: {
|
|
||||||
width: 32,
|
|
||||||
height: 31
|
|
||||||
},
|
|
||||||
separatorContainer: {
|
|
||||||
marginTop: 5,
|
|
||||||
marginBottom: 15
|
|
||||||
},
|
|
||||||
separatorLine: {
|
|
||||||
flex: 1,
|
|
||||||
height: 1
|
|
||||||
},
|
|
||||||
separatorLineLeft: {
|
|
||||||
marginRight: 15
|
|
||||||
},
|
|
||||||
separatorLineRight: {
|
|
||||||
marginLeft: 15
|
|
||||||
},
|
|
||||||
inverted: {
|
|
||||||
transform: [{ scaleY: -1 }]
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const SERVICE_HEIGHT = 58;
|
class LoginServices extends React.PureComponent {
|
||||||
const SERVICES_COLLAPSED_HEIGHT = 174;
|
|
||||||
|
|
||||||
class LoginSignupView extends React.Component {
|
|
||||||
static navigationOptions = ({ navigation, screenProps }) => {
|
|
||||||
const title = navigation.getParam('title', 'Rocket.Chat');
|
|
||||||
return {
|
|
||||||
...themedHeader(screenProps.theme),
|
|
||||||
title,
|
|
||||||
headerRight: <LegalButton testID='welcome-view-more' navigation={navigation} />
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
navigation: PropTypes.object,
|
navigation: PropTypes.object,
|
||||||
server: PropTypes.string,
|
server: PropTypes.string,
|
||||||
services: PropTypes.object,
|
services: PropTypes.object,
|
||||||
Site_Name: PropTypes.string,
|
|
||||||
Gitlab_URL: PropTypes.string,
|
Gitlab_URL: PropTypes.string,
|
||||||
CAS_enabled: PropTypes.bool,
|
CAS_enabled: PropTypes.bool,
|
||||||
CAS_login_url: PropTypes.string,
|
CAS_login_url: PropTypes.string,
|
||||||
Accounts_ShowFormLogin: PropTypes.bool,
|
separator: PropTypes.bool,
|
||||||
Accounts_RegistrationForm: PropTypes.string,
|
|
||||||
Accounts_RegistrationForm_LinkReplacementText: PropTypes.string,
|
|
||||||
theme: PropTypes.string
|
theme: PropTypes.string
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(props) {
|
static defaultProps = {
|
||||||
super(props);
|
separator: true
|
||||||
this.state = {
|
}
|
||||||
|
|
||||||
|
state = {
|
||||||
collapsed: true,
|
collapsed: true,
|
||||||
servicesHeight: new Animated.Value(SERVICES_COLLAPSED_HEIGHT)
|
servicesHeight: new Animated.Value(SERVICES_COLLAPSED_HEIGHT)
|
||||||
};
|
|
||||||
const { Site_Name } = this.props;
|
|
||||||
this.setTitle(Site_Name);
|
|
||||||
}
|
|
||||||
|
|
||||||
shouldComponentUpdate(nextProps, nextState) {
|
|
||||||
const { collapsed, servicesHeight } = this.state;
|
|
||||||
const {
|
|
||||||
server, Site_Name, services, Accounts_ShowFormLogin, Accounts_RegistrationForm, Accounts_RegistrationForm_LinkReplacementText, theme
|
|
||||||
} = this.props;
|
|
||||||
if (nextState.collapsed !== collapsed) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (nextState.servicesHeight !== servicesHeight) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (nextProps.server !== server) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (nextProps.Site_Name !== Site_Name) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (nextProps.theme !== theme) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (nextProps.Accounts_ShowFormLogin !== Accounts_ShowFormLogin) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (nextProps.Accounts_RegistrationForm !== Accounts_RegistrationForm) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (nextProps.Accounts_RegistrationForm_LinkReplacementText !== Accounts_RegistrationForm_LinkReplacementText) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!equal(nextProps.services, services)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidUpdate(prevProps) {
|
|
||||||
const { Site_Name } = this.props;
|
|
||||||
if (Site_Name && prevProps.Site_Name !== Site_Name) {
|
|
||||||
this.setTitle(Site_Name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setTitle = (title) => {
|
|
||||||
const { navigation } = this.props;
|
|
||||||
navigation.setParams({ title });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onPressFacebook = () => {
|
onPressFacebook = () => {
|
||||||
|
@ -224,9 +122,9 @@ class LoginSignupView extends React.Component {
|
||||||
onPressLinkedin = () => {
|
onPressLinkedin = () => {
|
||||||
const { services, server } = this.props;
|
const { services, server } = this.props;
|
||||||
const { clientId } = services.linkedin;
|
const { clientId } = services.linkedin;
|
||||||
const endpoint = 'https://www.linkedin.com/uas/oauth2/authorization';
|
const endpoint = 'https://www.linkedin.com/oauth/v2/authorization';
|
||||||
const redirect_uri = `${ server }/_oauth/linkedin?close`;
|
const redirect_uri = `${ server }/_oauth/linkedin?close`;
|
||||||
const scope = 'r_emailaddress';
|
const scope = 'r_liteprofile,r_emailaddress';
|
||||||
const state = this.getOAuthState();
|
const state = this.getOAuthState();
|
||||||
const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`;
|
const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`;
|
||||||
this.openOAuth({ url: `${ endpoint }${ params }` });
|
this.openOAuth({ url: `${ endpoint }${ params }` });
|
||||||
|
@ -300,16 +198,6 @@ class LoginSignupView extends React.Component {
|
||||||
navigation.navigate('AuthenticationWebView', { url, authType, ssoToken });
|
navigation.navigate('AuthenticationWebView', { url, authType, ssoToken });
|
||||||
}
|
}
|
||||||
|
|
||||||
login = () => {
|
|
||||||
const { navigation, Site_Name } = this.props;
|
|
||||||
navigation.navigate('LoginView', { title: Site_Name });
|
|
||||||
}
|
|
||||||
|
|
||||||
register = () => {
|
|
||||||
const { navigation, Site_Name } = this.props;
|
|
||||||
navigation.navigate('RegisterView', { title: Site_Name });
|
|
||||||
}
|
|
||||||
|
|
||||||
transitionServicesTo = (height) => {
|
transitionServicesTo = (height) => {
|
||||||
const { servicesHeight } = this.state;
|
const { servicesHeight } = this.state;
|
||||||
if (this._animation) {
|
if (this._animation) {
|
||||||
|
@ -350,27 +238,28 @@ class LoginSignupView extends React.Component {
|
||||||
|
|
||||||
renderServicesSeparator = () => {
|
renderServicesSeparator = () => {
|
||||||
const { collapsed } = this.state;
|
const { collapsed } = this.state;
|
||||||
const {
|
const { services, separator, theme } = this.props;
|
||||||
services, theme, Accounts_ShowFormLogin, Accounts_RegistrationForm
|
|
||||||
} = this.props;
|
|
||||||
const { length } = Object.values(services);
|
const { length } = Object.values(services);
|
||||||
|
|
||||||
if (length > 3 && Accounts_ShowFormLogin && Accounts_RegistrationForm) {
|
if (length > 3 && separator) {
|
||||||
return (
|
return (
|
||||||
<View style={styles.servicesTogglerContainer}>
|
<>
|
||||||
<View style={[styles.separatorLine, styles.separatorLineLeft, { backgroundColor: themes[theme].auxiliaryText }]} />
|
<Button
|
||||||
<BorderlessButton onPress={this.toggleServices}>
|
title={collapsed ? I18n.t('Onboarding_more_options') : I18n.t('Onboarding_less_options')}
|
||||||
<Image source={{ uri: 'options' }} style={[styles.servicesToggler, !collapsed && styles.inverted]} />
|
type='secondary'
|
||||||
</BorderlessButton>
|
onPress={this.toggleServices}
|
||||||
<View style={[styles.separatorLine, styles.separatorLineRight, { backgroundColor: themes[theme].auxiliaryText }]} />
|
theme={theme}
|
||||||
</View>
|
style={styles.options}
|
||||||
|
color={themes[theme].actionTintColor}
|
||||||
|
/>
|
||||||
|
<OnboardingSeparator theme={theme} />
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return (
|
if (length > 0 && separator) {
|
||||||
<View style={styles.separatorContainer}>
|
return <OnboardingSeparator theme={theme} />;
|
||||||
<View style={styles.separatorLine} />
|
}
|
||||||
</View>
|
return null;
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
renderItem = (service) => {
|
renderItem = (service) => {
|
||||||
|
@ -412,14 +301,19 @@ class LoginSignupView extends React.Component {
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const backgroundColor = isSaml && service.buttonColor ? service.buttonColor : themes[theme].chatComponentBackground;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Touch
|
<Touch
|
||||||
key={service.name}
|
key={service.name}
|
||||||
onPress={onPress}
|
onPress={onPress}
|
||||||
style={[styles.serviceButton, isSaml && { backgroundColor: service.buttonColor }]}
|
style={[styles.serviceButton, { backgroundColor }]}
|
||||||
theme={theme}
|
theme={theme}
|
||||||
|
activeOpacity={0.5}
|
||||||
|
underlayColor={themes[theme].buttonText}
|
||||||
>
|
>
|
||||||
<View style={[styles.serviceButtonContainer, { borderColor: themes[theme].borderColor }]}>
|
<View style={styles.serviceButtonContainer}>
|
||||||
{service.authType === 'oauth' ? <Image source={{ uri: icon }} style={styles.serviceIcon} /> : null}
|
{service.authType === 'oauth' ? <Image source={{ uri: icon }} style={styles.serviceIcon} /> : null}
|
||||||
<Text style={[styles.serviceText, { color: themes[theme].titleText }]}>{buttonText}</Text>
|
<Text style={[styles.serviceText, { color: themes[theme].titleText }]}>{buttonText}</Text>
|
||||||
</View>
|
</View>
|
||||||
|
@ -427,100 +321,44 @@ class LoginSignupView extends React.Component {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderServices = () => {
|
render() {
|
||||||
const { servicesHeight } = this.state;
|
const { servicesHeight } = this.state;
|
||||||
const { services, Accounts_ShowFormLogin, Accounts_RegistrationForm } = this.props;
|
const { services, separator } = this.props;
|
||||||
const { length } = Object.values(services);
|
const { length } = Object.values(services);
|
||||||
const style = {
|
const style = {
|
||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
height: servicesHeight
|
height: servicesHeight
|
||||||
};
|
};
|
||||||
|
|
||||||
if (length > 3 && Accounts_ShowFormLogin && Accounts_RegistrationForm) {
|
if (length > 3 && separator) {
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
<Animated.View style={style}>
|
<Animated.View style={style}>
|
||||||
{Object.values(services).map(service => this.renderItem(service))}
|
{Object.values(services).map(service => this.renderItem(service))}
|
||||||
</Animated.View>
|
</Animated.View>
|
||||||
);
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<View>
|
|
||||||
{Object.values(services).map(service => this.renderItem(service))}
|
|
||||||
</View>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
renderLogin = () => {
|
|
||||||
const { Accounts_ShowFormLogin, theme } = this.props;
|
|
||||||
if (!Accounts_ShowFormLogin) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<Button
|
|
||||||
title={<Text>{I18n.t('Login_with')} <Text style={{ ...sharedStyles.textBold }}>{I18n.t('email')}</Text></Text>}
|
|
||||||
type='primary'
|
|
||||||
onPress={() => this.login()}
|
|
||||||
theme={theme}
|
|
||||||
testID='welcome-view-login'
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
renderRegister = () => {
|
|
||||||
const { Accounts_RegistrationForm, Accounts_RegistrationForm_LinkReplacementText, theme } = this.props;
|
|
||||||
if (Accounts_RegistrationForm !== 'Public') {
|
|
||||||
return <Text style={[styles.registerDisabled, { color: themes[theme].auxiliaryText }]}>{Accounts_RegistrationForm_LinkReplacementText}</Text>;
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<Button
|
|
||||||
title={I18n.t('Create_account')}
|
|
||||||
type='secondary'
|
|
||||||
onPress={() => this.register()}
|
|
||||||
theme={theme}
|
|
||||||
testID='welcome-view-register'
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { theme } = this.props;
|
|
||||||
return (
|
|
||||||
<SafeAreaView
|
|
||||||
testID='welcome-view'
|
|
||||||
forceInset={{ vertical: 'never' }}
|
|
||||||
style={[styles.safeArea, { backgroundColor: themes[theme].backgroundColor }]}
|
|
||||||
>
|
|
||||||
<ScrollView
|
|
||||||
style={[
|
|
||||||
sharedStyles.containerScrollView,
|
|
||||||
sharedStyles.container,
|
|
||||||
styles.container,
|
|
||||||
{ backgroundColor: themes[theme].backgroundColor },
|
|
||||||
isTablet && sharedStyles.tabletScreenContent
|
|
||||||
]}
|
|
||||||
{...scrollPersistTaps}
|
|
||||||
>
|
|
||||||
<StatusBar theme={theme} />
|
|
||||||
{this.renderServices()}
|
|
||||||
{this.renderServicesSeparator()}
|
{this.renderServicesSeparator()}
|
||||||
{this.renderLogin()}
|
</>
|
||||||
{this.renderRegister()}
|
);
|
||||||
</ScrollView>
|
}
|
||||||
</SafeAreaView>
|
return (
|
||||||
|
<>
|
||||||
|
{Object.values(services).map(service => this.renderItem(service))}
|
||||||
|
{this.renderServicesSeparator()}
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapStateToProps = state => ({
|
const mapStateToProps = state => ({
|
||||||
server: state.server.server,
|
server: state.server.server,
|
||||||
Site_Name: state.settings.Site_Name,
|
|
||||||
Gitlab_URL: state.settings.API_Gitlab_URL,
|
Gitlab_URL: state.settings.API_Gitlab_URL,
|
||||||
CAS_enabled: state.settings.CAS_enabled,
|
CAS_enabled: state.settings.CAS_enabled,
|
||||||
CAS_login_url: state.settings.CAS_login_url,
|
CAS_login_url: state.settings.CAS_login_url,
|
||||||
Accounts_ShowFormLogin: state.settings.Accounts_ShowFormLogin,
|
|
||||||
Accounts_RegistrationForm: state.settings.Accounts_RegistrationForm,
|
|
||||||
Accounts_RegistrationForm_LinkReplacementText: state.settings.Accounts_RegistrationForm_LinkReplacementText,
|
|
||||||
services: state.login.services
|
services: state.login.services
|
||||||
});
|
});
|
||||||
|
|
||||||
export default connect(mapStateToProps)(withTheme(LoginSignupView));
|
const mapDispatchToProps = dispatch => ({
|
||||||
|
loginRequest: params => dispatch(loginRequestAction(params))
|
||||||
|
});
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, mapDispatchToProps)(withTheme(withNavigation(LoginServices)));
|
|
@ -63,6 +63,10 @@ class MessageActions extends React.Component {
|
||||||
this.EDIT_INDEX = this.options.length - 1;
|
this.EDIT_INDEX = this.options.length - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create Discussion
|
||||||
|
this.options.push(I18n.t('Create_Discussion'));
|
||||||
|
this.CREATE_DISCUSSION_INDEX = this.options.length - 1;
|
||||||
|
|
||||||
// Mark as unread
|
// Mark as unread
|
||||||
if (message.u && message.u._id !== user.id) {
|
if (message.u && message.u._id !== user.id) {
|
||||||
this.options.push(I18n.t('Mark_unread'));
|
this.options.push(I18n.t('Mark_unread'));
|
||||||
|
@ -294,6 +298,7 @@ class MessageActions extends React.Component {
|
||||||
const { message } = this.props;
|
const { message } = this.props;
|
||||||
try {
|
try {
|
||||||
await RocketChat.toggleStarMessage(message.id, message.starred);
|
await RocketChat.toggleStarMessage(message.id, message.starred);
|
||||||
|
EventEmitter.emit(LISTENER, { message: message.starred ? I18n.t('Message_unstarred') : I18n.t('Message_starred') });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log(e);
|
log(e);
|
||||||
}
|
}
|
||||||
|
@ -370,6 +375,11 @@ class MessageActions extends React.Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleCreateDiscussion = () => {
|
||||||
|
const { message, room: channel } = this.props;
|
||||||
|
Navigation.navigate('CreateDiscussionView', { message, channel });
|
||||||
|
}
|
||||||
|
|
||||||
handleActionPress = (actionIndex) => {
|
handleActionPress = (actionIndex) => {
|
||||||
if (actionIndex) {
|
if (actionIndex) {
|
||||||
switch (actionIndex) {
|
switch (actionIndex) {
|
||||||
|
@ -412,6 +422,9 @@ class MessageActions extends React.Component {
|
||||||
case this.READ_RECEIPT_INDEX:
|
case this.READ_RECEIPT_INDEX:
|
||||||
this.handleReadReceipt();
|
this.handleReadReceipt();
|
||||||
break;
|
break;
|
||||||
|
case this.CREATE_DISCUSSION_INDEX:
|
||||||
|
this.handleCreateDiscussion();
|
||||||
|
break;
|
||||||
case this.TOGGLE_TRANSLATION_INDEX:
|
case this.TOGGLE_TRANSLATION_INDEX:
|
||||||
this.handleToggleTranslation();
|
this.handleToggleTranslation();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { CancelEditingButton, FileButton } from './buttons';
|
import { CancelEditingButton, ActionsButton } from './buttons';
|
||||||
|
|
||||||
const LeftButtons = React.memo(({
|
const LeftButtons = React.memo(({
|
||||||
theme, showFileActions, editing, editCancel
|
theme, showMessageBoxActions, editing, editCancel
|
||||||
}) => {
|
}) => {
|
||||||
if (editing) {
|
if (editing) {
|
||||||
return <CancelEditingButton onPress={editCancel} theme={theme} />;
|
return <CancelEditingButton onPress={editCancel} theme={theme} />;
|
||||||
}
|
}
|
||||||
return <FileButton onPress={showFileActions} theme={theme} />;
|
return <ActionsButton onPress={showMessageBoxActions} theme={theme} />;
|
||||||
});
|
});
|
||||||
|
|
||||||
LeftButtons.propTypes = {
|
LeftButtons.propTypes = {
|
||||||
theme: PropTypes.string,
|
theme: PropTypes.string,
|
||||||
showFileActions: PropTypes.func.isRequired,
|
showMessageBoxActions: PropTypes.func.isRequired,
|
||||||
editing: PropTypes.bool,
|
editing: PropTypes.bool,
|
||||||
editCancel: PropTypes.func.isRequired
|
editCancel: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { SendButton, AudioButton, FileButton } from './buttons';
|
import { SendButton, AudioButton, ActionsButton } from './buttons';
|
||||||
|
|
||||||
const RightButtons = React.memo(({
|
const RightButtons = React.memo(({
|
||||||
theme, showSend, submit, recordAudioMessage, recordAudioMessageEnabled, showFileActions
|
theme, showSend, submit, recordAudioMessage, recordAudioMessageEnabled, showMessageBoxActions
|
||||||
}) => {
|
}) => {
|
||||||
if (showSend) {
|
if (showSend) {
|
||||||
return <SendButton onPress={submit} theme={theme} />;
|
return <SendButton onPress={submit} theme={theme} />;
|
||||||
|
@ -13,11 +13,11 @@ const RightButtons = React.memo(({
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<AudioButton onPress={recordAudioMessage} theme={theme} />
|
<AudioButton onPress={recordAudioMessage} theme={theme} />
|
||||||
<FileButton onPress={showFileActions} theme={theme} />
|
<ActionsButton onPress={showMessageBoxActions} theme={theme} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return <FileButton onPress={showFileActions} theme={theme} />;
|
return <ActionsButton onPress={showMessageBoxActions} theme={theme} />;
|
||||||
});
|
});
|
||||||
|
|
||||||
RightButtons.propTypes = {
|
RightButtons.propTypes = {
|
||||||
|
@ -26,7 +26,7 @@ RightButtons.propTypes = {
|
||||||
submit: PropTypes.func.isRequired,
|
submit: PropTypes.func.isRequired,
|
||||||
recordAudioMessage: PropTypes.func.isRequired,
|
recordAudioMessage: PropTypes.func.isRequired,
|
||||||
recordAudioMessageEnabled: PropTypes.bool,
|
recordAudioMessageEnabled: PropTypes.bool,
|
||||||
showFileActions: PropTypes.func.isRequired
|
showMessageBoxActions: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
export default RightButtons;
|
export default RightButtons;
|
||||||
|
|
|
@ -225,7 +225,7 @@ class UploadModal extends Component {
|
||||||
hideModalContentWhileAnimating
|
hideModalContentWhileAnimating
|
||||||
avoidKeyboard
|
avoidKeyboard
|
||||||
>
|
>
|
||||||
<View style={[styles.container, { width: width - 32, backgroundColor: themes[theme].chatComponentBackground }, split && sharedStyles.modal]}>
|
<View style={[styles.container, { width: width - 32, backgroundColor: themes[theme].chatComponentBackground }, split && [sharedStyles.modal, sharedStyles.modalFormSheet]]}>
|
||||||
<View style={styles.titleContainer}>
|
<View style={styles.titleContainer}>
|
||||||
<Text style={[styles.title, { color: themes[theme].titleText }]}>{I18n.t('Upload_file_question_mark')}</Text>
|
<Text style={[styles.title, { color: themes[theme].titleText }]}>{I18n.t('Upload_file_question_mark')}</Text>
|
||||||
</View>
|
</View>
|
||||||
|
|
|
@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import BaseButton from './BaseButton';
|
import BaseButton from './BaseButton';
|
||||||
|
|
||||||
const FileButton = React.memo(({ theme, onPress }) => (
|
const ActionsButton = React.memo(({ theme, onPress }) => (
|
||||||
<BaseButton
|
<BaseButton
|
||||||
onPress={onPress}
|
onPress={onPress}
|
||||||
testID='messagebox-actions'
|
testID='messagebox-actions'
|
||||||
|
@ -13,9 +13,9 @@ const FileButton = React.memo(({ theme, onPress }) => (
|
||||||
/>
|
/>
|
||||||
));
|
));
|
||||||
|
|
||||||
FileButton.propTypes = {
|
ActionsButton.propTypes = {
|
||||||
theme: PropTypes.string,
|
theme: PropTypes.string,
|
||||||
onPress: PropTypes.func.isRequired
|
onPress: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|
||||||
export default FileButton;
|
export default ActionsButton;
|
|
@ -2,12 +2,12 @@ import CancelEditingButton from './CancelEditingButton';
|
||||||
import ToggleEmojiButton from './ToggleEmojiButton';
|
import ToggleEmojiButton from './ToggleEmojiButton';
|
||||||
import SendButton from './SendButton';
|
import SendButton from './SendButton';
|
||||||
import AudioButton from './AudioButton';
|
import AudioButton from './AudioButton';
|
||||||
import FileButton from './FileButton';
|
import ActionsButton from './ActionsButton';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
CancelEditingButton,
|
CancelEditingButton,
|
||||||
ToggleEmojiButton,
|
ToggleEmojiButton,
|
||||||
SendButton,
|
SendButton,
|
||||||
AudioButton,
|
AudioButton,
|
||||||
FileButton
|
ActionsButton
|
||||||
};
|
};
|
||||||
|
|
|
@ -45,6 +45,7 @@ import {
|
||||||
import CommandsPreview from './CommandsPreview';
|
import CommandsPreview from './CommandsPreview';
|
||||||
import { Review } from '../../utils/review';
|
import { Review } from '../../utils/review';
|
||||||
import { getUserSelector } from '../../selectors/login';
|
import { getUserSelector } from '../../selectors/login';
|
||||||
|
import Navigation from '../../lib/Navigation';
|
||||||
|
|
||||||
const imagePickerConfig = {
|
const imagePickerConfig = {
|
||||||
cropping: true,
|
cropping: true,
|
||||||
|
@ -65,6 +66,7 @@ const FILE_PHOTO_INDEX = 1;
|
||||||
const FILE_VIDEO_INDEX = 2;
|
const FILE_VIDEO_INDEX = 2;
|
||||||
const FILE_LIBRARY_INDEX = 3;
|
const FILE_LIBRARY_INDEX = 3;
|
||||||
const FILE_DOCUMENT_INDEX = 4;
|
const FILE_DOCUMENT_INDEX = 4;
|
||||||
|
const CREATE_DISCUSSION_INDEX = 5;
|
||||||
|
|
||||||
class MessageBox extends Component {
|
class MessageBox extends Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
|
@ -113,12 +115,13 @@ class MessageBox extends Component {
|
||||||
};
|
};
|
||||||
this.text = '';
|
this.text = '';
|
||||||
this.focused = false;
|
this.focused = false;
|
||||||
this.fileOptions = [
|
this.messageBoxActions = [
|
||||||
I18n.t('Cancel'),
|
I18n.t('Cancel'),
|
||||||
I18n.t('Take_a_photo'),
|
I18n.t('Take_a_photo'),
|
||||||
I18n.t('Take_a_video'),
|
I18n.t('Take_a_video'),
|
||||||
I18n.t('Choose_from_library'),
|
I18n.t('Choose_from_library'),
|
||||||
I18n.t('Choose_file')
|
I18n.t('Choose_file'),
|
||||||
|
I18n.t('Create_Discussion')
|
||||||
];
|
];
|
||||||
const libPickerLabels = {
|
const libPickerLabels = {
|
||||||
cropperChooseText: I18n.t('Choose'),
|
cropperChooseText: I18n.t('Choose'),
|
||||||
|
@ -157,8 +160,8 @@ class MessageBox extends Component {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
const room = await subsCollection.find(rid);
|
this.room = await subsCollection.find(rid);
|
||||||
msg = room.draftMessage;
|
msg = this.room.draftMessage;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log('Messagebox.didMount: Room not found');
|
console.log('Messagebox.didMount: Room not found');
|
||||||
}
|
}
|
||||||
|
@ -588,20 +591,24 @@ class MessageBox extends Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createDiscussion = () => {
|
||||||
|
Navigation.navigate('CreateDiscussionView', { channel: this.room });
|
||||||
|
}
|
||||||
|
|
||||||
showUploadModal = (file) => {
|
showUploadModal = (file) => {
|
||||||
this.setState({ file: { ...file, isVisible: true } });
|
this.setState({ file: { ...file, isVisible: true } });
|
||||||
}
|
}
|
||||||
|
|
||||||
showFileActions = () => {
|
showMessageBoxActions = () => {
|
||||||
ActionSheet.showActionSheetWithOptions({
|
ActionSheet.showActionSheetWithOptions({
|
||||||
options: this.fileOptions,
|
options: this.messageBoxActions,
|
||||||
cancelButtonIndex: FILE_CANCEL_INDEX
|
cancelButtonIndex: FILE_CANCEL_INDEX
|
||||||
}, (actionIndex) => {
|
}, (actionIndex) => {
|
||||||
this.handleFileActionPress(actionIndex);
|
this.handleMessageBoxActions(actionIndex);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
handleFileActionPress = (actionIndex) => {
|
handleMessageBoxActions = (actionIndex) => {
|
||||||
switch (actionIndex) {
|
switch (actionIndex) {
|
||||||
case FILE_PHOTO_INDEX:
|
case FILE_PHOTO_INDEX:
|
||||||
this.takePhoto();
|
this.takePhoto();
|
||||||
|
@ -615,6 +622,9 @@ class MessageBox extends Component {
|
||||||
case FILE_DOCUMENT_INDEX:
|
case FILE_DOCUMENT_INDEX:
|
||||||
this.chooseFile();
|
this.chooseFile();
|
||||||
break;
|
break;
|
||||||
|
case CREATE_DISCUSSION_INDEX:
|
||||||
|
this.createDiscussion();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -783,7 +793,7 @@ class MessageBox extends Component {
|
||||||
} else if (handleCommandSubmit(event)) {
|
} else if (handleCommandSubmit(event)) {
|
||||||
this.submit();
|
this.submit();
|
||||||
} else if (handleCommandShowUpload(event)) {
|
} else if (handleCommandShowUpload(event)) {
|
||||||
this.showFileActions();
|
this.showMessageBoxActions();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -828,7 +838,7 @@ class MessageBox extends Component {
|
||||||
theme={theme}
|
theme={theme}
|
||||||
showEmojiKeyboard={showEmojiKeyboard}
|
showEmojiKeyboard={showEmojiKeyboard}
|
||||||
editing={editing}
|
editing={editing}
|
||||||
showFileActions={this.showFileActions}
|
showMessageBoxActions={this.showMessageBoxActions}
|
||||||
editCancel={this.editCancel}
|
editCancel={this.editCancel}
|
||||||
openEmoji={this.openEmoji}
|
openEmoji={this.openEmoji}
|
||||||
closeEmoji={this.closeEmoji}
|
closeEmoji={this.closeEmoji}
|
||||||
|
@ -854,7 +864,7 @@ class MessageBox extends Component {
|
||||||
submit={this.submit}
|
submit={this.submit}
|
||||||
recordAudioMessage={this.recordAudioMessage}
|
recordAudioMessage={this.recordAudioMessage}
|
||||||
recordAudioMessageEnabled={Message_AudioRecorderEnabled}
|
recordAudioMessageEnabled={Message_AudioRecorderEnabled}
|
||||||
showFileActions={this.showFileActions}
|
showMessageBoxActions={this.showMessageBoxActions}
|
||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
</View>
|
</View>
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { View, StyleSheet, Text } from 'react-native';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
import I18n from '../i18n';
|
||||||
|
import sharedStyles from '../views/Styles';
|
||||||
|
import { themes } from '../constants/colors';
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
marginVertical: 24
|
||||||
|
},
|
||||||
|
line: {
|
||||||
|
height: 1,
|
||||||
|
flex: 1
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
fontSize: 14,
|
||||||
|
marginLeft: 14,
|
||||||
|
marginRight: 14,
|
||||||
|
...sharedStyles.textMedium
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const DateSeparator = React.memo(({ theme }) => {
|
||||||
|
const line = { backgroundColor: themes[theme].borderColor };
|
||||||
|
const text = { color: themes[theme].auxiliaryText };
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<View style={[styles.line, line]} />
|
||||||
|
<Text style={[styles.text, styles.marginRight, styles.marginLeft, text]}>{I18n.t('OR')}</Text>
|
||||||
|
<View style={[styles.line, line]} />
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
DateSeparator.propTypes = {
|
||||||
|
theme: PropTypes.string
|
||||||
|
};
|
||||||
|
|
||||||
|
export default DateSeparator;
|
|
@ -15,7 +15,7 @@ const styles = StyleSheet.create({
|
||||||
});
|
});
|
||||||
|
|
||||||
const RoomTypeIcon = React.memo(({
|
const RoomTypeIcon = React.memo(({
|
||||||
type, size, style, theme
|
type, size, isGroupChat, style, theme
|
||||||
}) => {
|
}) => {
|
||||||
if (!type) {
|
if (!type) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -31,6 +31,9 @@ const RoomTypeIcon = React.memo(({
|
||||||
if (type === 'c') {
|
if (type === 'c') {
|
||||||
return <Image source={{ uri: 'hashtag' }} style={[styles.style, style, { width: size, height: size, tintColor: color }]} />;
|
return <Image source={{ uri: 'hashtag' }} style={[styles.style, style, { width: size, height: size, tintColor: color }]} />;
|
||||||
} if (type === 'd') {
|
} if (type === 'd') {
|
||||||
|
if (isGroupChat) {
|
||||||
|
return <CustomIcon name='team' size={13} style={[styles.style, styles.discussion, { color }]} />;
|
||||||
|
}
|
||||||
return <CustomIcon name='at' size={13} style={[styles.style, styles.discussion, { color }]} />;
|
return <CustomIcon name='at' size={13} style={[styles.style, styles.discussion, { color }]} />;
|
||||||
} if (type === 'l') {
|
} if (type === 'l') {
|
||||||
return <CustomIcon name='livechat' size={13} style={[styles.style, styles.discussion, { color }]} />;
|
return <CustomIcon name='livechat' size={13} style={[styles.style, styles.discussion, { color }]} />;
|
||||||
|
@ -41,6 +44,7 @@ const RoomTypeIcon = React.memo(({
|
||||||
RoomTypeIcon.propTypes = {
|
RoomTypeIcon.propTypes = {
|
||||||
theme: PropTypes.string,
|
theme: PropTypes.string,
|
||||||
type: PropTypes.string,
|
type: PropTypes.string,
|
||||||
|
isGroupChat: PropTypes.bool,
|
||||||
size: PropTypes.number,
|
size: PropTypes.number,
|
||||||
style: PropTypes.object
|
style: PropTypes.object
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { View } from 'react-native';
|
||||||
import { STATUS_COLORS, themes } from '../../constants/colors';
|
import { STATUS_COLORS, themes } from '../../constants/colors';
|
||||||
|
|
||||||
const Status = React.memo(({
|
const Status = React.memo(({
|
||||||
status, size, style, theme
|
status, size, style, theme, ...props
|
||||||
}) => (
|
}) => (
|
||||||
<View
|
<View
|
||||||
style={
|
style={
|
||||||
|
@ -18,6 +18,7 @@ const Status = React.memo(({
|
||||||
borderColor: themes[theme].backgroundColor
|
borderColor: themes[theme].backgroundColor
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
|
{...props}
|
||||||
/>
|
/>
|
||||||
));
|
));
|
||||||
Status.propTypes = {
|
Status.propTypes = {
|
||||||
|
|
|
@ -26,7 +26,7 @@ class StatusContainer extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapStateToProps = (state, ownProps) => ({
|
const mapStateToProps = (state, ownProps) => ({
|
||||||
status: state.meteor.connected ? state.activeUsers[ownProps.id] : 'offline'
|
status: state.meteor.connected ? (state.activeUsers[ownProps.id] && state.activeUsers[ownProps.id].status) : 'offline'
|
||||||
});
|
});
|
||||||
|
|
||||||
export default connect(mapStateToProps)(withTheme(StatusContainer));
|
export default connect(mapStateToProps)(withTheme(StatusContainer));
|
||||||
|
|
|
@ -65,6 +65,7 @@ export default class RCTextInput extends React.PureComponent {
|
||||||
testID: PropTypes.string,
|
testID: PropTypes.string,
|
||||||
iconLeft: PropTypes.string,
|
iconLeft: PropTypes.string,
|
||||||
placeholder: PropTypes.string,
|
placeholder: PropTypes.string,
|
||||||
|
left: PropTypes.element,
|
||||||
theme: PropTypes.string
|
theme: PropTypes.string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,7 +117,7 @@ export default class RCTextInput extends React.PureComponent {
|
||||||
render() {
|
render() {
|
||||||
const { showPassword } = this.state;
|
const { showPassword } = this.state;
|
||||||
const {
|
const {
|
||||||
label, error, loading, secureTextEntry, containerStyle, inputRef, iconLeft, inputStyle, testID, placeholder, theme, ...inputProps
|
label, left, error, loading, secureTextEntry, containerStyle, inputRef, iconLeft, inputStyle, testID, placeholder, theme, ...inputProps
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const { dangerColor } = themes[theme];
|
const { dangerColor } = themes[theme];
|
||||||
return (
|
return (
|
||||||
|
@ -166,6 +167,7 @@ export default class RCTextInput extends React.PureComponent {
|
||||||
{iconLeft ? this.iconLeft : null}
|
{iconLeft ? this.iconLeft : null}
|
||||||
{secureTextEntry ? this.iconPassword : null}
|
{secureTextEntry ? this.iconPassword : null}
|
||||||
{loading ? this.loading : null}
|
{loading ? this.loading : null}
|
||||||
|
{left}
|
||||||
</View>
|
</View>
|
||||||
{error && error.reason ? <Text style={[styles.error, { color: dangerColor }]}>{error.reason}</Text> : null}
|
{error && error.reason ? <Text style={[styles.error, { color: dangerColor }]}>{error.reason}</Text> : null}
|
||||||
</View>
|
</View>
|
||||||
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
import React, { useEffect, useState } from 'react';
|
||||||
|
import { View, Text } from 'react-native';
|
||||||
|
import _ from 'lodash';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { sha256 } from 'js-sha256';
|
||||||
|
import Modal from 'react-native-modal';
|
||||||
|
import useDeepCompareEffect from 'use-deep-compare-effect';
|
||||||
|
|
||||||
|
import TextInput from '../TextInput';
|
||||||
|
import I18n from '../../i18n';
|
||||||
|
import EventEmitter from '../../utils/events';
|
||||||
|
import { withTheme } from '../../theme';
|
||||||
|
import { withSplit } from '../../split';
|
||||||
|
import { themes } from '../../constants/colors';
|
||||||
|
import Button from '../Button';
|
||||||
|
import sharedStyles from '../../views/Styles';
|
||||||
|
import RocketChat from '../../lib/rocketchat';
|
||||||
|
import styles from './styles';
|
||||||
|
|
||||||
|
export const TWO_FACTOR = 'TWO_FACTOR';
|
||||||
|
|
||||||
|
const methods = {
|
||||||
|
totp: {
|
||||||
|
text: 'Open_your_authentication_app_and_enter_the_code',
|
||||||
|
keyboardType: 'numeric'
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
text: 'Verify_your_email_for_the_code_we_sent',
|
||||||
|
keyboardType: 'numeric'
|
||||||
|
},
|
||||||
|
password: {
|
||||||
|
title: 'Please_enter_your_password',
|
||||||
|
text: 'For_your_security_you_must_enter_your_current_password_to_continue',
|
||||||
|
secureTextEntry: true,
|
||||||
|
keyboardType: 'default'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const TwoFactor = React.memo(({ theme, split }) => {
|
||||||
|
const [visible, setVisible] = useState(false);
|
||||||
|
const [data, setData] = useState({});
|
||||||
|
const [code, setCode] = useState('');
|
||||||
|
|
||||||
|
const method = methods[data.method];
|
||||||
|
const isEmail = data.method === 'email';
|
||||||
|
|
||||||
|
const sendEmail = () => RocketChat.sendEmailCode();
|
||||||
|
|
||||||
|
useDeepCompareEffect(() => {
|
||||||
|
if (!_.isEmpty(data)) {
|
||||||
|
setVisible(true);
|
||||||
|
} else {
|
||||||
|
setVisible(false);
|
||||||
|
}
|
||||||
|
}, [data]);
|
||||||
|
|
||||||
|
const showTwoFactor = args => setData(args);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
EventEmitter.addEventListener(TWO_FACTOR, showTwoFactor);
|
||||||
|
|
||||||
|
return () => EventEmitter.removeListener(TWO_FACTOR);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const onCancel = () => {
|
||||||
|
const { cancel } = data;
|
||||||
|
if (cancel) {
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
setData({});
|
||||||
|
};
|
||||||
|
|
||||||
|
const onSubmit = () => {
|
||||||
|
const { submit } = data;
|
||||||
|
if (submit) {
|
||||||
|
if (data.method === 'password') {
|
||||||
|
submit(sha256(code));
|
||||||
|
} else {
|
||||||
|
submit(code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setData({});
|
||||||
|
};
|
||||||
|
|
||||||
|
const color = themes[theme].titleText;
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
transparent
|
||||||
|
avoidKeyboard
|
||||||
|
useNativeDriver
|
||||||
|
isVisible={visible}
|
||||||
|
hideModalContentWhileAnimating
|
||||||
|
>
|
||||||
|
<View style={styles.container}>
|
||||||
|
<View style={[styles.content, split && [sharedStyles.modal, sharedStyles.modalFormSheet], { backgroundColor: themes[theme].backgroundColor }]}>
|
||||||
|
<Text style={[styles.title, { color }]}>{I18n.t(method?.title || 'Two_Factor_Authentication')}</Text>
|
||||||
|
<Text style={[styles.subtitle, { color }]}>{I18n.t(method?.text)}</Text>
|
||||||
|
<TextInput
|
||||||
|
value={code}
|
||||||
|
theme={theme}
|
||||||
|
returnKeyType='send'
|
||||||
|
autoCapitalize='none'
|
||||||
|
onChangeText={setCode}
|
||||||
|
onSubmitEditing={onSubmit}
|
||||||
|
keyboardType={method?.keyboardType}
|
||||||
|
secureTextEntry={method?.secureTextEntry}
|
||||||
|
error={data.invalid && { error: 'totp-invalid', reason: I18n.t('Code_or_password_invalid') }}
|
||||||
|
/>
|
||||||
|
{isEmail && <Text style={[styles.sendEmail, { color }]} onPress={sendEmail}>{I18n.t('Send_me_the_code_again')}</Text>}
|
||||||
|
<View style={styles.buttonContainer}>
|
||||||
|
<Button
|
||||||
|
title={I18n.t('Cancel')}
|
||||||
|
type='secondary'
|
||||||
|
backgroundColor={themes[theme].chatComponentBackground}
|
||||||
|
style={styles.button}
|
||||||
|
onPress={onCancel}
|
||||||
|
theme={theme}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
title={I18n.t('Send')}
|
||||||
|
type='primary'
|
||||||
|
style={styles.button}
|
||||||
|
onPress={onSubmit}
|
||||||
|
theme={theme}
|
||||||
|
/>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
TwoFactor.propTypes = {
|
||||||
|
theme: PropTypes.string,
|
||||||
|
split: PropTypes.bool
|
||||||
|
};
|
||||||
|
|
||||||
|
export default withSplit(withTheme(TwoFactor));
|
|
@ -0,0 +1,40 @@
|
||||||
|
import { StyleSheet } from 'react-native';
|
||||||
|
|
||||||
|
import sharedStyles from '../../views/Styles';
|
||||||
|
|
||||||
|
export default StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center'
|
||||||
|
},
|
||||||
|
content: {
|
||||||
|
padding: 16,
|
||||||
|
width: '100%',
|
||||||
|
borderRadius: 4
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
fontSize: 14,
|
||||||
|
...sharedStyles.textBold
|
||||||
|
},
|
||||||
|
subtitle: {
|
||||||
|
fontSize: 14,
|
||||||
|
paddingVertical: 8,
|
||||||
|
...sharedStyles.textRegular,
|
||||||
|
...sharedStyles.textAlignCenter
|
||||||
|
},
|
||||||
|
sendEmail: {
|
||||||
|
fontSize: 14,
|
||||||
|
paddingBottom: 24,
|
||||||
|
paddingTop: 8,
|
||||||
|
alignSelf: 'center',
|
||||||
|
...sharedStyles.textRegular
|
||||||
|
},
|
||||||
|
button: {
|
||||||
|
marginBottom: 0
|
||||||
|
},
|
||||||
|
buttonContainer: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
justifyContent: 'space-between'
|
||||||
|
}
|
||||||
|
});
|
|
@ -1,7 +1,8 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Text, View, Image } from 'react-native';
|
import { Text, View } from 'react-native';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import Touchable from 'react-native-platform-touchable';
|
import Touchable from 'react-native-platform-touchable';
|
||||||
|
import FastImage from 'react-native-fast-image';
|
||||||
|
|
||||||
import { themes } from '../../../constants/colors';
|
import { themes } from '../../../constants/colors';
|
||||||
import { textParser } from '../utils';
|
import { textParser } from '../utils';
|
||||||
|
@ -19,7 +20,7 @@ const Chip = ({ item, onSelect, theme }) => (
|
||||||
background={Touchable.Ripple(themes[theme].bannerBackground)}
|
background={Touchable.Ripple(themes[theme].bannerBackground)}
|
||||||
>
|
>
|
||||||
<>
|
<>
|
||||||
{item.imageUrl ? <Image style={styles.chipImage} source={{ uri: item.imageUrl }} /> : null}
|
{item.imageUrl ? <FastImage style={styles.chipImage} source={{ uri: item.imageUrl }} /> : null}
|
||||||
<Text numberOfLines={1} style={[styles.chipText, { color: themes[theme].titleText }]}>{textParser([item.text])}</Text>
|
<Text numberOfLines={1} style={[styles.chipText, { color: themes[theme].titleText }]}>{textParser([item.text])}</Text>
|
||||||
<CustomIcon name='cross' size={16} color={themes[theme].auxiliaryText} />
|
<CustomIcon name='cross' size={16} color={themes[theme].auxiliaryText} />
|
||||||
</>
|
</>
|
||||||
|
|
|
@ -9,12 +9,13 @@ import ActivityIndicator from '../../ActivityIndicator';
|
||||||
import styles from './styles';
|
import styles from './styles';
|
||||||
|
|
||||||
const Input = ({
|
const Input = ({
|
||||||
children, open, theme, loading
|
children, open, theme, loading, inputStyle, disabled
|
||||||
}) => (
|
}) => (
|
||||||
<Touchable
|
<Touchable
|
||||||
onPress={() => open(true)}
|
onPress={() => open(true)}
|
||||||
style={{ backgroundColor: themes[theme].backgroundColor }}
|
style={[{ backgroundColor: themes[theme].backgroundColor }, inputStyle]}
|
||||||
background={Touchable.Ripple(themes[theme].bannerBackground)}
|
background={Touchable.Ripple(themes[theme].bannerBackground)}
|
||||||
|
disabled={disabled}
|
||||||
>
|
>
|
||||||
<View style={[styles.input, { borderColor: themes[theme].separatorColor }]}>
|
<View style={[styles.input, { borderColor: themes[theme].separatorColor }]}>
|
||||||
{children}
|
{children}
|
||||||
|
@ -30,6 +31,8 @@ Input.propTypes = {
|
||||||
children: PropTypes.node,
|
children: PropTypes.node,
|
||||||
open: PropTypes.func,
|
open: PropTypes.func,
|
||||||
theme: PropTypes.string,
|
theme: PropTypes.string,
|
||||||
|
inputStyle: PropTypes.object,
|
||||||
|
disabled: PropTypes.bool,
|
||||||
loading: PropTypes.bool
|
loading: PropTypes.bool
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ import React from 'react';
|
||||||
import { Text, FlatList } from 'react-native';
|
import { Text, FlatList } from 'react-native';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import Touchable from 'react-native-platform-touchable';
|
import Touchable from 'react-native-platform-touchable';
|
||||||
|
import FastImage from 'react-native-fast-image';
|
||||||
|
|
||||||
import Separator from '../../Separator';
|
import Separator from '../../Separator';
|
||||||
import Check from '../../Check';
|
import Check from '../../Check';
|
||||||
|
@ -26,6 +27,7 @@ const Item = ({
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<>
|
<>
|
||||||
|
{item.imageUrl ? <FastImage style={styles.itemImage} source={{ uri: item.imageUrl }} /> : null}
|
||||||
<Text style={{ color: themes[theme].titleText }}>{textParser([item.text])}</Text>
|
<Text style={{ color: themes[theme].titleText }}>{textParser([item.text])}</Text>
|
||||||
{selected ? <Check theme={theme} /> : null}
|
{selected ? <Check theme={theme} /> : null}
|
||||||
</>
|
</>
|
||||||
|
|
|
@ -10,6 +10,8 @@ import TextInput from '../../TextInput';
|
||||||
|
|
||||||
import { textParser } from '../utils';
|
import { textParser } from '../utils';
|
||||||
import { themes } from '../../../constants/colors';
|
import { themes } from '../../../constants/colors';
|
||||||
|
import I18n from '../../../i18n';
|
||||||
|
import { isIOS } from '../../../utils/deviceInfo';
|
||||||
|
|
||||||
import Chips from './Chips';
|
import Chips from './Chips';
|
||||||
import Items from './Items';
|
import Items from './Items';
|
||||||
|
@ -25,6 +27,8 @@ const ANIMATION_PROPS = {
|
||||||
};
|
};
|
||||||
const animatedValue = new Animated.Value(0);
|
const animatedValue = new Animated.Value(0);
|
||||||
|
|
||||||
|
const behavior = isIOS ? 'padding' : null;
|
||||||
|
|
||||||
export const MultiSelect = React.memo(({
|
export const MultiSelect = React.memo(({
|
||||||
options = [],
|
options = [],
|
||||||
onChange,
|
onChange,
|
||||||
|
@ -33,6 +37,10 @@ export const MultiSelect = React.memo(({
|
||||||
loading,
|
loading,
|
||||||
value: values,
|
value: values,
|
||||||
multiselect = false,
|
multiselect = false,
|
||||||
|
onSearch,
|
||||||
|
onClose,
|
||||||
|
disabled,
|
||||||
|
inputStyle,
|
||||||
theme
|
theme
|
||||||
}) => {
|
}) => {
|
||||||
const [selected, select] = useState(values || []);
|
const [selected, select] = useState(values || []);
|
||||||
|
@ -51,6 +59,12 @@ export const MultiSelect = React.memo(({
|
||||||
setOpen(showContent);
|
setOpen(showContent);
|
||||||
}, [showContent]);
|
}, [showContent]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (values && values.length && !multiselect) {
|
||||||
|
setCurrentValue(values[0].text);
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
const onShow = () => {
|
const onShow = () => {
|
||||||
Animated.timing(
|
Animated.timing(
|
||||||
animatedValue,
|
animatedValue,
|
||||||
|
@ -63,6 +77,7 @@ export const MultiSelect = React.memo(({
|
||||||
};
|
};
|
||||||
|
|
||||||
const onHide = () => {
|
const onHide = () => {
|
||||||
|
onClose();
|
||||||
Animated.timing(
|
Animated.timing(
|
||||||
animatedValue,
|
animatedValue,
|
||||||
{
|
{
|
||||||
|
@ -73,7 +88,7 @@ export const MultiSelect = React.memo(({
|
||||||
};
|
};
|
||||||
|
|
||||||
const onSelect = (item) => {
|
const onSelect = (item) => {
|
||||||
const { value } = item;
|
const { value, text: { text } } = item;
|
||||||
if (multiselect) {
|
if (multiselect) {
|
||||||
let newSelect = [];
|
let newSelect = [];
|
||||||
if (!selected.includes(value)) {
|
if (!selected.includes(value)) {
|
||||||
|
@ -85,20 +100,20 @@ export const MultiSelect = React.memo(({
|
||||||
onChange({ value: newSelect });
|
onChange({ value: newSelect });
|
||||||
} else {
|
} else {
|
||||||
onChange({ value });
|
onChange({ value });
|
||||||
setCurrentValue(value);
|
setCurrentValue(text);
|
||||||
setOpen(false);
|
onHide();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderContent = () => {
|
const renderContent = () => {
|
||||||
const items = options.filter(option => textParser([option.text]).toLowerCase().includes(search.toLowerCase()));
|
const items = onSearch ? options : options.filter(option => textParser([option.text]).toLowerCase().includes(search.toLowerCase()));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={[styles.modal, { backgroundColor: themes[theme].backgroundColor }]}>
|
<View style={[styles.modal, { backgroundColor: themes[theme].backgroundColor }]}>
|
||||||
<View style={[styles.content, { backgroundColor: themes[theme].backgroundColor }]}>
|
<View style={[styles.content, { backgroundColor: themes[theme].backgroundColor }]}>
|
||||||
<TextInput
|
<TextInput
|
||||||
onChangeText={onSearchChange}
|
onChangeText={onSearch || onSearchChange}
|
||||||
placeholder={placeholder.text}
|
placeholder={I18n.t('Search')}
|
||||||
theme={theme}
|
theme={theme}
|
||||||
/>
|
/>
|
||||||
<Items items={items} selected={selected} onSelect={onSelect} theme={theme} />
|
<Items items={items} selected={selected} onSelect={onSelect} theme={theme} />
|
||||||
|
@ -124,19 +139,24 @@ export const MultiSelect = React.memo(({
|
||||||
open={onShow}
|
open={onShow}
|
||||||
theme={theme}
|
theme={theme}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
|
disabled={disabled}
|
||||||
|
inputStyle={inputStyle}
|
||||||
>
|
>
|
||||||
<Text style={[styles.pickerText, { color: themes[theme].auxiliaryText }]}>{currentValue}</Text>
|
<Text style={[styles.pickerText, { color: currentValue ? themes[theme].titleText : themes[theme].auxiliaryText }]}>{currentValue || placeholder.text}</Text>
|
||||||
</Input>
|
</Input>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (context === BLOCK_CONTEXT.FORM) {
|
if (context === BLOCK_CONTEXT.FORM) {
|
||||||
|
const items = options.filter(option => selected.includes(option.value));
|
||||||
button = (
|
button = (
|
||||||
<Input
|
<Input
|
||||||
open={onShow}
|
open={onShow}
|
||||||
theme={theme}
|
theme={theme}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
|
disabled={disabled}
|
||||||
|
inputStyle={inputStyle}
|
||||||
>
|
>
|
||||||
<Chips items={options.filter(option => selected.includes(option.value))} onSelect={onSelect} theme={theme} />
|
{items.length ? <Chips items={items} onSelect={onSelect} theme={theme} /> : <Text style={[styles.pickerText, { color: themes[theme].auxiliaryText }]}>{placeholder.text}</Text>}
|
||||||
</Input>
|
</Input>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -153,7 +173,7 @@ export const MultiSelect = React.memo(({
|
||||||
<TouchableWithoutFeedback onPress={onHide}>
|
<TouchableWithoutFeedback onPress={onHide}>
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
<View style={[styles.backdrop, { backgroundColor: themes[theme].backdropColor }]} />
|
<View style={[styles.backdrop, { backgroundColor: themes[theme].backdropColor }]} />
|
||||||
<KeyboardAvoidingView style={styles.keyboardView} behavior='padding'>
|
<KeyboardAvoidingView style={styles.keyboardView} behavior={behavior}>
|
||||||
<Animated.View style={[styles.animatedContent, { transform: [{ translateY }] }]}>
|
<Animated.View style={[styles.animatedContent, { transform: [{ translateY }] }]}>
|
||||||
{showContent ? renderContent() : null}
|
{showContent ? renderContent() : null}
|
||||||
</Animated.View>
|
</Animated.View>
|
||||||
|
@ -172,6 +192,13 @@ MultiSelect.propTypes = {
|
||||||
context: PropTypes.number,
|
context: PropTypes.number,
|
||||||
loading: PropTypes.bool,
|
loading: PropTypes.bool,
|
||||||
multiselect: PropTypes.bool,
|
multiselect: PropTypes.bool,
|
||||||
|
onSearch: PropTypes.func,
|
||||||
|
onClose: PropTypes.func,
|
||||||
|
inputStyle: PropTypes.object,
|
||||||
value: PropTypes.array,
|
value: PropTypes.array,
|
||||||
|
disabled: PropTypes.bool,
|
||||||
theme: PropTypes.string
|
theme: PropTypes.string
|
||||||
};
|
};
|
||||||
|
MultiSelect.defaultProps = {
|
||||||
|
onClose: () => {}
|
||||||
|
};
|
||||||
|
|
|
@ -30,6 +30,7 @@ export default StyleSheet.create({
|
||||||
},
|
},
|
||||||
pickerText: {
|
pickerText: {
|
||||||
...sharedStyles.textRegular,
|
...sharedStyles.textRegular,
|
||||||
|
paddingLeft: 6,
|
||||||
fontSize: 16
|
fontSize: 16
|
||||||
},
|
},
|
||||||
item: {
|
item: {
|
||||||
|
@ -40,7 +41,7 @@ export default StyleSheet.create({
|
||||||
},
|
},
|
||||||
input: {
|
input: {
|
||||||
minHeight: 48,
|
minHeight: 48,
|
||||||
padding: 8,
|
paddingHorizontal: 8,
|
||||||
paddingBottom: 0,
|
paddingBottom: 0,
|
||||||
borderWidth: StyleSheet.hairlineWidth,
|
borderWidth: StyleSheet.hairlineWidth,
|
||||||
borderRadius: 2,
|
borderRadius: 2,
|
||||||
|
@ -58,6 +59,7 @@ export default StyleSheet.create({
|
||||||
height: 226
|
height: 226
|
||||||
},
|
},
|
||||||
chips: {
|
chips: {
|
||||||
|
paddingTop: 8,
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
flexWrap: 'wrap',
|
flexWrap: 'wrap',
|
||||||
marginRight: 50
|
marginRight: 50
|
||||||
|
@ -82,5 +84,11 @@ export default StyleSheet.create({
|
||||||
borderRadius: 2,
|
borderRadius: 2,
|
||||||
width: 20,
|
width: 20,
|
||||||
height: 20
|
height: 20
|
||||||
|
},
|
||||||
|
itemImage: {
|
||||||
|
marginRight: 8,
|
||||||
|
borderRadius: 2,
|
||||||
|
width: 24,
|
||||||
|
height: 24
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -22,6 +22,7 @@ import MarkdownTableCell from './TableCell';
|
||||||
import mergeTextNodes from './mergeTextNodes';
|
import mergeTextNodes from './mergeTextNodes';
|
||||||
|
|
||||||
import styles from './styles';
|
import styles from './styles';
|
||||||
|
import { isValidURL } from '../../utils/url';
|
||||||
|
|
||||||
// Support <http://link|Text>
|
// Support <http://link|Text>
|
||||||
const formatText = text => text.replace(
|
const formatText = text => text.replace(
|
||||||
|
@ -278,7 +279,18 @@ class Markdown extends PureComponent {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderImage = ({ src }) => <Image style={styles.inlineImage} source={{ uri: src }} />;
|
renderImage = ({ src }) => {
|
||||||
|
if (!isValidURL(src)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Image
|
||||||
|
style={styles.inlineImage}
|
||||||
|
source={{ uri: encodeURI(src) }}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
renderEditedIndicator = () => {
|
renderEditedIndicator = () => {
|
||||||
const { theme } = this.props;
|
const { theme } = this.props;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { View, Text, StyleSheet } from 'react-native';
|
import {
|
||||||
|
View, Text, StyleSheet, TouchableOpacity
|
||||||
|
} from 'react-native';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
|
|
||||||
import { themes } from '../../constants/colors';
|
import { themes } from '../../constants/colors';
|
||||||
|
@ -33,21 +35,30 @@ const styles = StyleSheet.create({
|
||||||
});
|
});
|
||||||
|
|
||||||
const User = React.memo(({
|
const User = React.memo(({
|
||||||
isHeader, useRealName, author, alias, ts, timeFormat, hasError, theme, ...props
|
isHeader, useRealName, author, alias, ts, timeFormat, hasError, theme, navToRoomInfo, user, ...props
|
||||||
}) => {
|
}) => {
|
||||||
if (isHeader || hasError) {
|
if (isHeader || hasError) {
|
||||||
|
const navParam = {
|
||||||
|
t: 'd',
|
||||||
|
rid: author._id
|
||||||
|
};
|
||||||
const username = (useRealName && author.name) || author.username;
|
const username = (useRealName && author.name) || author.username;
|
||||||
const aliasUsername = alias ? (<Text style={[styles.alias, { color: themes[theme].auxiliaryText }]}> @{username}</Text>) : null;
|
const aliasUsername = alias ? (<Text style={[styles.alias, { color: themes[theme].auxiliaryText }]}> @{username}</Text>) : null;
|
||||||
const time = moment(ts).format(timeFormat);
|
const time = moment(ts).format(timeFormat);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
|
<TouchableOpacity
|
||||||
|
onPress={() => navToRoomInfo(navParam)}
|
||||||
|
disabled={author._id === user.id}
|
||||||
|
>
|
||||||
<View style={styles.titleContainer}>
|
<View style={styles.titleContainer}>
|
||||||
<Text style={[styles.username, { color: themes[theme].titleText }]} numberOfLines={1}>
|
<Text style={[styles.username, { color: themes[theme].titleText }]} numberOfLines={1}>
|
||||||
{alias || username}
|
{alias || username}
|
||||||
{aliasUsername}
|
{aliasUsername}
|
||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
|
</TouchableOpacity>
|
||||||
<Text style={[messageStyles.time, { color: themes[theme].auxiliaryText }]}>{time}</Text>
|
<Text style={[messageStyles.time, { color: themes[theme].auxiliaryText }]}>{time}</Text>
|
||||||
{ hasError && <MessageError hasError={hasError} theme={theme} {...props} /> }
|
{ hasError && <MessageError hasError={hasError} theme={theme} {...props} /> }
|
||||||
</View>
|
</View>
|
||||||
|
@ -64,7 +75,9 @@ User.propTypes = {
|
||||||
alias: PropTypes.string,
|
alias: PropTypes.string,
|
||||||
ts: PropTypes.instanceOf(Date),
|
ts: PropTypes.instanceOf(Date),
|
||||||
timeFormat: PropTypes.string,
|
timeFormat: PropTypes.string,
|
||||||
theme: PropTypes.string
|
theme: PropTypes.string,
|
||||||
|
user: PropTypes.obj,
|
||||||
|
navToRoomInfo: PropTypes.func
|
||||||
};
|
};
|
||||||
User.displayName = 'MessageUser';
|
User.displayName = 'MessageUser';
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,8 @@ export default StyleSheet.create({
|
||||||
},
|
},
|
||||||
reactionEmoji: {
|
reactionEmoji: {
|
||||||
fontSize: 13,
|
fontSize: 13,
|
||||||
marginLeft: 7
|
marginLeft: 7,
|
||||||
|
color: '#ffffff'
|
||||||
},
|
},
|
||||||
reactionCustomEmoji: {
|
reactionCustomEmoji: {
|
||||||
width: 19,
|
width: 19,
|
||||||
|
|
|
@ -1224,7 +1224,6 @@ export const emojisByCategory = {
|
||||||
'flag_er',
|
'flag_er',
|
||||||
'flag_ee',
|
'flag_ee',
|
||||||
'flag_et',
|
'flag_et',
|
||||||
'flag_fk',
|
|
||||||
'flag_fo',
|
'flag_fo',
|
||||||
'flag_fj',
|
'flag_fj',
|
||||||
'flag_fi',
|
'flag_fi',
|
||||||
|
@ -1264,7 +1263,6 @@ export const emojisByCategory = {
|
||||||
'flag_kz',
|
'flag_kz',
|
||||||
'flag_ke',
|
'flag_ke',
|
||||||
'flag_ki',
|
'flag_ki',
|
||||||
'flag_xk',
|
|
||||||
'flag_kw',
|
'flag_kw',
|
||||||
'flag_kg',
|
'flag_kg',
|
||||||
'flag_la',
|
'flag_la',
|
||||||
|
@ -1301,7 +1299,6 @@ export const emojisByCategory = {
|
||||||
'flag_nr',
|
'flag_nr',
|
||||||
'flag_np',
|
'flag_np',
|
||||||
'flag_nl',
|
'flag_nl',
|
||||||
'flag_nc',
|
|
||||||
'flag_nz',
|
'flag_nz',
|
||||||
'flag_ni',
|
'flag_ni',
|
||||||
'flag_ne',
|
'flag_ne',
|
||||||
|
@ -1376,50 +1373,35 @@ export const emojisByCategory = {
|
||||||
'flag_va',
|
'flag_va',
|
||||||
'flag_ve',
|
'flag_ve',
|
||||||
'flag_vn',
|
'flag_vn',
|
||||||
'flag_wf',
|
|
||||||
'flag_eh',
|
|
||||||
'flag_ye',
|
'flag_ye',
|
||||||
'flag_zm',
|
'flag_zm',
|
||||||
'flag_zw',
|
'flag_zw',
|
||||||
'flag_re',
|
|
||||||
'flag_ax',
|
'flag_ax',
|
||||||
'flag_ta',
|
'flag_ta',
|
||||||
'flag_io',
|
'flag_io',
|
||||||
'flag_bq',
|
|
||||||
'flag_cx',
|
'flag_cx',
|
||||||
'flag_cc',
|
'flag_cc',
|
||||||
'flag_gg',
|
'flag_gg',
|
||||||
'flag_im',
|
'flag_im',
|
||||||
'flag_yt',
|
|
||||||
'flag_nf',
|
'flag_nf',
|
||||||
'flag_pn',
|
'flag_pn',
|
||||||
'flag_bl',
|
|
||||||
'flag_pm',
|
|
||||||
'flag_gs',
|
|
||||||
'flag_tk',
|
'flag_tk',
|
||||||
'flag_bv',
|
'flag_bv',
|
||||||
'flag_hm',
|
'flag_hm',
|
||||||
'flag_sj',
|
'flag_sj',
|
||||||
'flag_um',
|
'flag_um',
|
||||||
'flag_ic',
|
'flag_ic',
|
||||||
'flag_ea',
|
|
||||||
'flag_cp',
|
'flag_cp',
|
||||||
'flag_dg',
|
|
||||||
'flag_as',
|
'flag_as',
|
||||||
'flag_aq',
|
'flag_aq',
|
||||||
'flag_vg',
|
'flag_vg',
|
||||||
'flag_ck',
|
'flag_ck',
|
||||||
'flag_cw',
|
'flag_cw',
|
||||||
'flag_eu',
|
'flag_eu',
|
||||||
'flag_gf',
|
|
||||||
'flag_tf',
|
|
||||||
'flag_gp',
|
|
||||||
'flag_mq',
|
|
||||||
'flag_mp',
|
'flag_mp',
|
||||||
'flag_sx',
|
'flag_sx',
|
||||||
'flag_ss',
|
'flag_ss',
|
||||||
'flag_tc',
|
'flag_tc'
|
||||||
'flag_mf'
|
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,6 @@ export default {
|
||||||
Collaborative: 'Kollaborativ',
|
Collaborative: 'Kollaborativ',
|
||||||
Confirm: 'Bestätigen',
|
Confirm: 'Bestätigen',
|
||||||
Connect: 'Verbinden',
|
Connect: 'Verbinden',
|
||||||
Connect_to_a_server: 'Verbinden Sie sich mit einem Server',
|
|
||||||
Connected: 'Verbunden',
|
Connected: 'Verbunden',
|
||||||
connecting_server: 'verbinde zum Server',
|
connecting_server: 'verbinde zum Server',
|
||||||
Connecting: 'Verbinden ...',
|
Connecting: 'Verbinden ...',
|
||||||
|
@ -198,7 +197,6 @@ export default {
|
||||||
Finish_recording: 'Beenden Sie die Aufnahme',
|
Finish_recording: 'Beenden Sie die Aufnahme',
|
||||||
Following_thread: 'Thread folgen',
|
Following_thread: 'Thread folgen',
|
||||||
For_your_security_you_must_enter_your_current_password_to_continue: 'Zu Ihrer Sicherheit müssen Sie Ihr aktuelles Passwort eingeben, um fortzufahren',
|
For_your_security_you_must_enter_your_current_password_to_continue: 'Zu Ihrer Sicherheit müssen Sie Ihr aktuelles Passwort eingeben, um fortzufahren',
|
||||||
Forgot_my_password: 'Ich habe mein Passwort vergessen',
|
|
||||||
Forgot_password_If_this_email_is_registered: 'Wenn diese E-Mail registriert ist, senden wir Anweisungen zum Zurücksetzen Ihres Passworts. Wenn Sie in Kürze keine E-Mail erhalten, kommen Sie bitte zurück und versuchen Sie es erneut.',
|
Forgot_password_If_this_email_is_registered: 'Wenn diese E-Mail registriert ist, senden wir Anweisungen zum Zurücksetzen Ihres Passworts. Wenn Sie in Kürze keine E-Mail erhalten, kommen Sie bitte zurück und versuchen Sie es erneut.',
|
||||||
Forgot_password: 'Passwort vergessen',
|
Forgot_password: 'Passwort vergessen',
|
||||||
Forgot_Password: 'Passwort vergessen',
|
Forgot_Password: 'Passwort vergessen',
|
||||||
|
@ -210,6 +208,21 @@ export default {
|
||||||
Has_joined_the_channel: 'Ist dem Kanal beigetreten',
|
Has_joined_the_channel: 'Ist dem Kanal beigetreten',
|
||||||
Has_joined_the_conversation: 'Hat sich dem Gespräch angeschlossen',
|
Has_joined_the_conversation: 'Hat sich dem Gespräch angeschlossen',
|
||||||
Has_left_the_channel: 'Hat den Kanal verlassen',
|
Has_left_the_channel: 'Hat den Kanal verlassen',
|
||||||
|
Hide_System_Messages: 'Systemnachrichten verstecken',
|
||||||
|
Hide_type_messages: 'Verstecke "{{type}}"-Nachrichten',
|
||||||
|
Message_HideType_uj: 'Nutzer beigetreten',
|
||||||
|
Message_HideType_ul: 'Nutzer verlassen',
|
||||||
|
Message_HideType_ru: 'Nutzer entfernt',
|
||||||
|
Message_HideType_au: 'Nutzer hinzugefügt',
|
||||||
|
Message_HideType_mute_unmute: 'Nutzer stummgeschaltet / freigegeben',
|
||||||
|
Message_HideType_r: 'Raumname geändert',
|
||||||
|
Message_HideType_ut: 'Nutzer ist der Unterhaltung beigetreten',
|
||||||
|
Message_HideType_wm: 'Willkommen',
|
||||||
|
Message_HideType_rm: 'Nachricht entfernt',
|
||||||
|
Message_HideType_subscription_role_added: 'Rolle wurde gesetzt',
|
||||||
|
Message_HideType_subscription_role_removed: 'Rolle nicht länger definiert',
|
||||||
|
Message_HideType_room_archived: 'Raum archiviert',
|
||||||
|
Message_HideType_room_unarchived: 'Raum nicht mehr archiviert',
|
||||||
In_app: 'In-App-Browser',
|
In_app: 'In-App-Browser',
|
||||||
IN_APP_AND_DESKTOP: 'IN-APP UND DESKTOP',
|
IN_APP_AND_DESKTOP: 'IN-APP UND DESKTOP',
|
||||||
In_App_and_Desktop_Alert_info: 'Zeigt ein Banner oben am Bildschirm, wenn die App geöffnet ist und eine Benachrichtigung auf dem Desktop.',
|
In_App_and_Desktop_Alert_info: 'Zeigt ein Banner oben am Bildschirm, wenn die App geöffnet ist und eine Benachrichtigung auf dem Desktop.',
|
||||||
|
@ -222,7 +235,6 @@ export default {
|
||||||
Invalid_server_version: 'Der Server, zu dem Sie eine Verbindung herstellen möchten, verwendet eine Version, die von der App nicht mehr unterstützt wird: {{currentVersion}}.\n\nWir benötigen Version {{MinVersion}}.',
|
Invalid_server_version: 'Der Server, zu dem Sie eine Verbindung herstellen möchten, verwendet eine Version, die von der App nicht mehr unterstützt wird: {{currentVersion}}.\n\nWir benötigen Version {{MinVersion}}.',
|
||||||
Invite_Link: 'Einladungs-Link',
|
Invite_Link: 'Einladungs-Link',
|
||||||
Invite_users: 'Benutzer einladen',
|
Invite_users: 'Benutzer einladen',
|
||||||
Join_the_community: 'Trete der Community bei',
|
|
||||||
Join: 'Beitreten',
|
Join: 'Beitreten',
|
||||||
Just_invited_people_can_access_this_channel: 'Nur eingeladene Personen können auf diesen Kanal zugreifen',
|
Just_invited_people_can_access_this_channel: 'Nur eingeladene Personen können auf diesen Kanal zugreifen',
|
||||||
Language: 'Sprache',
|
Language: 'Sprache',
|
||||||
|
@ -249,6 +261,8 @@ export default {
|
||||||
Message_actions: 'Nachrichtenaktionen',
|
Message_actions: 'Nachrichtenaktionen',
|
||||||
Message_pinned: 'Eine Nachricht wurde angeheftet',
|
Message_pinned: 'Eine Nachricht wurde angeheftet',
|
||||||
Message_removed: 'Nachricht entfernt',
|
Message_removed: 'Nachricht entfernt',
|
||||||
|
Message_starred: 'Nachricht favorisiert',
|
||||||
|
Message_unstarred: 'Nachricht nicht mehr favorisiert',
|
||||||
message: 'Nachricht',
|
message: 'Nachricht',
|
||||||
messages: 'Nachrichten',
|
messages: 'Nachrichten',
|
||||||
Message: 'Nachricht',
|
Message: 'Nachricht',
|
||||||
|
@ -275,6 +289,7 @@ export default {
|
||||||
No_results_found: 'Keine Ergebnisse gefunden',
|
No_results_found: 'Keine Ergebnisse gefunden',
|
||||||
No_starred_messages: 'Keine markierten Nachrichten',
|
No_starred_messages: 'Keine markierten Nachrichten',
|
||||||
No_thread_messages: 'Keine Threadnachrichten',
|
No_thread_messages: 'Keine Threadnachrichten',
|
||||||
|
No_label_provided: 'Kein(e) {{label}} gesetzt.',
|
||||||
No_Message: 'Keine Nachricht',
|
No_Message: 'Keine Nachricht',
|
||||||
No_messages_yet: 'Noch keine Nachrichten',
|
No_messages_yet: 'Noch keine Nachrichten',
|
||||||
No_Reactions: 'Keine Reaktionen',
|
No_Reactions: 'Keine Reaktionen',
|
||||||
|
@ -290,10 +305,12 @@ export default {
|
||||||
Notification_Preferences: 'Benachrichtigungseinstellungen',
|
Notification_Preferences: 'Benachrichtigungseinstellungen',
|
||||||
Offline: 'Offline',
|
Offline: 'Offline',
|
||||||
Oops: 'Hoppla!',
|
Oops: 'Hoppla!',
|
||||||
|
Onboarding_title: 'Willkommen bei Rocket.Chat',
|
||||||
Online: 'Online',
|
Online: 'Online',
|
||||||
Only_authorized_users_can_write_new_messages: 'Nur autorisierte Benutzer können neue Nachrichten schreiben',
|
Only_authorized_users_can_write_new_messages: 'Nur autorisierte Benutzer können neue Nachrichten schreiben',
|
||||||
Open_emoji_selector: 'Öffne die Emoji-Auswahl',
|
Open_emoji_selector: 'Öffne die Emoji-Auswahl',
|
||||||
Open_Source_Communication: 'Open-Source-Kommunikation',
|
Open_Source_Communication: 'Open-Source-Kommunikation',
|
||||||
|
Overwrites_the_server_configuration_and_use_room_config: 'Übergeht die Servereinstellungen und nutzt Einstellung für den Raum',
|
||||||
Password: 'Passwort',
|
Password: 'Passwort',
|
||||||
Permalink_copied_to_clipboard: 'Permalink in die Zwischenablage kopiert!',
|
Permalink_copied_to_clipboard: 'Permalink in die Zwischenablage kopiert!',
|
||||||
Pin: 'Anheften',
|
Pin: 'Anheften',
|
||||||
|
@ -453,6 +470,7 @@ export default {
|
||||||
Username_is_empty: 'Der Benutzername ist leer',
|
Username_is_empty: 'Der Benutzername ist leer',
|
||||||
Username: 'Benutzername',
|
Username: 'Benutzername',
|
||||||
Username_or_email: 'Benutzername oder E-Mail-Adresse',
|
Username_or_email: 'Benutzername oder E-Mail-Adresse',
|
||||||
|
Uses_server_configuration: 'Nutzt Servereinstellungen',
|
||||||
Validating: 'Validierung',
|
Validating: 'Validierung',
|
||||||
Verify_email_title: 'Registrierung erfolgreich!',
|
Verify_email_title: 'Registrierung erfolgreich!',
|
||||||
Verify_email_desc: 'Wir haben dir eine Email geschickt um deine Anmeldung zu bestätigen. Wenn du keine Email erhältst, komme bitte wieder und versuche es noch einmal.',
|
Verify_email_desc: 'Wir haben dir eine Email geschickt um deine Anmeldung zu bestätigen. Wenn du keine Email erhältst, komme bitte wieder und versuche es noch einmal.',
|
||||||
|
@ -461,7 +479,6 @@ export default {
|
||||||
Voice_call: 'Sprachanruf',
|
Voice_call: 'Sprachanruf',
|
||||||
Websocket_disabled: 'Websockets sind auf diesem Server nicht aktiviert.\n{{contact}}',
|
Websocket_disabled: 'Websockets sind auf diesem Server nicht aktiviert.\n{{contact}}',
|
||||||
Welcome: 'Herzlich willkommen',
|
Welcome: 'Herzlich willkommen',
|
||||||
Welcome_to_RocketChat: 'Willkommen bei Rocket.Chat',
|
|
||||||
Whats_your_2fa: 'Wie lautet Ihr 2FA-Code?',
|
Whats_your_2fa: 'Wie lautet Ihr 2FA-Code?',
|
||||||
Without_Servers: 'Ohne Server',
|
Without_Servers: 'Ohne Server',
|
||||||
Write_External_Permission_Message: 'Rocket.Chat benötigt Zugriff auf Ihre Galerie um Bilder speichern zu können.',
|
Write_External_Permission_Message: 'Rocket.Chat benötigt Zugriff auf Ihre Galerie um Bilder speichern zu können.',
|
||||||
|
@ -473,6 +490,7 @@ export default {
|
||||||
You_can_search_using_RegExp_eg: 'Sie können mit RegExp suchen. z.B. `/ ^ text $ / i`',
|
You_can_search_using_RegExp_eg: 'Sie können mit RegExp suchen. z.B. `/ ^ text $ / i`',
|
||||||
You_colon: 'Sie: ',
|
You_colon: 'Sie: ',
|
||||||
you_were_mentioned: 'Sie wurden erwähnt',
|
you_were_mentioned: 'Sie wurden erwähnt',
|
||||||
|
You_were_removed_from_channel: 'Sie wurden aus dem Kanal {{channel}} entfernt',
|
||||||
you: 'Sie',
|
you: 'Sie',
|
||||||
You: 'Sie',
|
You: 'Sie',
|
||||||
Logged_out_by_server: 'Du bist vom Server abgemeldet worden. Bitte melde dich wieder an.',
|
Logged_out_by_server: 'Du bist vom Server abgemeldet worden. Bitte melde dich wieder an.',
|
||||||
|
|
|
@ -10,6 +10,7 @@ export default {
|
||||||
'error-could-not-change-email': 'Could not change email',
|
'error-could-not-change-email': 'Could not change email',
|
||||||
'error-could-not-change-name': 'Could not change name',
|
'error-could-not-change-name': 'Could not change name',
|
||||||
'error-could-not-change-username': 'Could not change username',
|
'error-could-not-change-username': 'Could not change username',
|
||||||
|
'error-could-not-change-status': 'Could not change status',
|
||||||
'error-delete-protected-role': 'Cannot delete a protected role',
|
'error-delete-protected-role': 'Cannot delete a protected role',
|
||||||
'error-department-not-found': 'Department not found',
|
'error-department-not-found': 'Department not found',
|
||||||
'error-direct-message-file-upload-not-allowed': 'File sharing not allowed in direct messages',
|
'error-direct-message-file-upload-not-allowed': 'File sharing not allowed in direct messages',
|
||||||
|
@ -87,6 +88,7 @@ export default {
|
||||||
alert: 'alert',
|
alert: 'alert',
|
||||||
alerts: 'alerts',
|
alerts: 'alerts',
|
||||||
All_users_in_the_channel_can_write_new_messages: 'All users in the channel can write new messages',
|
All_users_in_the_channel_can_write_new_messages: 'All users in the channel can write new messages',
|
||||||
|
A_meaningful_name_for_the_discussion_room: 'A meaningful name for the discussion room',
|
||||||
All: 'All',
|
All: 'All',
|
||||||
All_Messages: 'All Messages',
|
All_Messages: 'All Messages',
|
||||||
Allow_Reactions: 'Allow Reactions',
|
Allow_Reactions: 'Allow Reactions',
|
||||||
|
@ -136,10 +138,10 @@ export default {
|
||||||
Choose_file: 'Choose file',
|
Choose_file: 'Choose file',
|
||||||
Choose_where_you_want_links_be_opened: 'Choose where you want links be opened',
|
Choose_where_you_want_links_be_opened: 'Choose where you want links be opened',
|
||||||
Code: 'Code',
|
Code: 'Code',
|
||||||
|
Code_or_password_invalid: 'Code or password invalid',
|
||||||
Collaborative: 'Collaborative',
|
Collaborative: 'Collaborative',
|
||||||
Confirm: 'Confirm',
|
Confirm: 'Confirm',
|
||||||
Connect: 'Connect',
|
Connect: 'Connect',
|
||||||
Connect_to_a_server: 'Connect to a server',
|
|
||||||
Connected: 'Connected',
|
Connected: 'Connected',
|
||||||
connecting_server: 'connecting to server',
|
connecting_server: 'connecting to server',
|
||||||
Connecting: 'Connecting...',
|
Connecting: 'Connecting...',
|
||||||
|
@ -155,9 +157,12 @@ export default {
|
||||||
Whats_the_password_for_your_certificate: 'What\'s the password for your certificate?',
|
Whats_the_password_for_your_certificate: 'What\'s the password for your certificate?',
|
||||||
Create_account: 'Create an account',
|
Create_account: 'Create an account',
|
||||||
Create_Channel: 'Create Channel',
|
Create_Channel: 'Create Channel',
|
||||||
|
Create_Direct_Messages: 'Create Direct Messages',
|
||||||
|
Create_Discussion: 'Create Discussion',
|
||||||
Created_snippet: 'Created a snippet',
|
Created_snippet: 'Created a snippet',
|
||||||
Create_a_new_workspace: 'Create a new workspace',
|
Create_a_new_workspace: 'Create a new workspace',
|
||||||
Create: 'Create',
|
Create: 'Create',
|
||||||
|
Custom_Status: 'Custom Status',
|
||||||
Dark: 'Dark',
|
Dark: 'Dark',
|
||||||
Dark_level: 'Dark Level',
|
Dark_level: 'Dark Level',
|
||||||
Default: 'Default',
|
Default: 'Default',
|
||||||
|
@ -174,12 +179,17 @@ export default {
|
||||||
Direct_Messages: 'Direct Messages',
|
Direct_Messages: 'Direct Messages',
|
||||||
Disable_notifications: 'Disable notifications',
|
Disable_notifications: 'Disable notifications',
|
||||||
Discussions: 'Discussions',
|
Discussions: 'Discussions',
|
||||||
Dont_Have_An_Account: 'Don\'t have an account?',
|
Discussion_Desc: 'Help keeping an overview about what\'s going on! By creating a discussion, a sub-channel of the one you selected is created and both are linked.',
|
||||||
|
Discussion_name: 'Discussion name',
|
||||||
|
Done: 'Done',
|
||||||
|
Dont_Have_An_Account: 'Don\'t you have an account?',
|
||||||
|
Do_you_have_an_account: 'Do you have an account?',
|
||||||
Do_you_have_a_certificate: 'Do you have a certificate?',
|
Do_you_have_a_certificate: 'Do you have a certificate?',
|
||||||
Do_you_really_want_to_key_this_room_question_mark: 'Do you really want to {{key}} this room?',
|
Do_you_really_want_to_key_this_room_question_mark: 'Do you really want to {{key}} this room?',
|
||||||
edit: 'edit',
|
edit: 'edit',
|
||||||
edited: 'edited',
|
edited: 'edited',
|
||||||
Edit: 'Edit',
|
Edit: 'Edit',
|
||||||
|
Edit_Status: 'Edit Status',
|
||||||
Edit_Invite: 'Edit Invite',
|
Edit_Invite: 'Edit Invite',
|
||||||
Email_or_password_field_is_empty: 'Email or password field is empty',
|
Email_or_password_field_is_empty: 'Email or password field is empty',
|
||||||
Email: 'Email',
|
Email: 'Email',
|
||||||
|
@ -198,9 +208,8 @@ export default {
|
||||||
Finish_recording: 'Finish recording',
|
Finish_recording: 'Finish recording',
|
||||||
Following_thread: 'Following thread',
|
Following_thread: 'Following thread',
|
||||||
For_your_security_you_must_enter_your_current_password_to_continue: 'For your security, you must enter your current password to continue',
|
For_your_security_you_must_enter_your_current_password_to_continue: 'For your security, you must enter your current password to continue',
|
||||||
Forgot_my_password: 'Forgot my password',
|
|
||||||
Forgot_password_If_this_email_is_registered: 'If this email is registered, we\'ll send instructions on how to reset your password. If you do not receive an email shortly, please come back and try again.',
|
Forgot_password_If_this_email_is_registered: 'If this email is registered, we\'ll send instructions on how to reset your password. If you do not receive an email shortly, please come back and try again.',
|
||||||
Forgot_password: 'Forgot password',
|
Forgot_password: 'Forgot your password?',
|
||||||
Forgot_Password: 'Forgot Password',
|
Forgot_Password: 'Forgot Password',
|
||||||
Full_table: 'Click to see full table',
|
Full_table: 'Click to see full table',
|
||||||
Generate_New_Link: 'Generate New Link',
|
Generate_New_Link: 'Generate New Link',
|
||||||
|
@ -237,8 +246,9 @@ export default {
|
||||||
Invalid_server_version: 'The server you\'re trying to connect is using a version that\'s not supported by the app anymore: {{currentVersion}}.\n\nWe require version {{minVersion}}',
|
Invalid_server_version: 'The server you\'re trying to connect is using a version that\'s not supported by the app anymore: {{currentVersion}}.\n\nWe require version {{minVersion}}',
|
||||||
Invite_Link: 'Invite Link',
|
Invite_Link: 'Invite Link',
|
||||||
Invite_users: 'Invite users',
|
Invite_users: 'Invite users',
|
||||||
Join_the_community: 'Join the community',
|
|
||||||
Join: 'Join',
|
Join: 'Join',
|
||||||
|
Join_our_open_workspace: 'Join our open workspace',
|
||||||
|
Join_your_workspace: 'Join your workspace',
|
||||||
Just_invited_people_can_access_this_channel: 'Just invited people can access this channel',
|
Just_invited_people_can_access_this_channel: 'Just invited people can access this channel',
|
||||||
Language: 'Language',
|
Language: 'Language',
|
||||||
last_message: 'last message',
|
last_message: 'last message',
|
||||||
|
@ -255,6 +265,7 @@ export default {
|
||||||
Logging_out: 'Logging out.',
|
Logging_out: 'Logging out.',
|
||||||
Logout: 'Logout',
|
Logout: 'Logout',
|
||||||
Max_number_of_uses: 'Max number of uses',
|
Max_number_of_uses: 'Max number of uses',
|
||||||
|
Max_number_of_users_allowed_is_number: 'Max number of users allowed is {{maxUsers}}',
|
||||||
members: 'members',
|
members: 'members',
|
||||||
Members: 'Members',
|
Members: 'Members',
|
||||||
Mentioned_Messages: 'Mentioned Messages',
|
Mentioned_Messages: 'Mentioned Messages',
|
||||||
|
@ -264,6 +275,8 @@ export default {
|
||||||
Message_actions: 'Message actions',
|
Message_actions: 'Message actions',
|
||||||
Message_pinned: 'Message pinned',
|
Message_pinned: 'Message pinned',
|
||||||
Message_removed: 'Message removed',
|
Message_removed: 'Message removed',
|
||||||
|
Message_starred: 'Message starred',
|
||||||
|
Message_unstarred: 'Message unstarred',
|
||||||
message: 'message',
|
message: 'message',
|
||||||
messages: 'messages',
|
messages: 'messages',
|
||||||
Message: 'Message',
|
Message: 'Message',
|
||||||
|
@ -306,12 +319,23 @@ export default {
|
||||||
Notification_Preferences: 'Notification Preferences',
|
Notification_Preferences: 'Notification Preferences',
|
||||||
Offline: 'Offline',
|
Offline: 'Offline',
|
||||||
Oops: 'Oops!',
|
Oops: 'Oops!',
|
||||||
|
Onboarding_description: 'A workspace is your team or organization’s space to collaborate. Ask the workspace admin for address to join or create one for your team.',
|
||||||
|
Onboarding_join_workspace: 'Join a workspace',
|
||||||
|
Onboarding_subtitle: 'Beyond Team Collaboration',
|
||||||
|
Onboarding_title: 'Welcome to Rocket.Chat',
|
||||||
|
Onboarding_join_open_description: 'Join our open workspace to chat with the Rocket.Chat team and community.',
|
||||||
|
Onboarding_agree_terms: 'By continuing, you agree to Rocket.Chat',
|
||||||
|
Onboarding_less_options: 'Less options',
|
||||||
|
Onboarding_more_options: 'More options',
|
||||||
Online: 'Online',
|
Online: 'Online',
|
||||||
Only_authorized_users_can_write_new_messages: 'Only authorized users can write new messages',
|
Only_authorized_users_can_write_new_messages: 'Only authorized users can write new messages',
|
||||||
Open_emoji_selector: 'Open emoji selector',
|
Open_emoji_selector: 'Open emoji selector',
|
||||||
Open_Source_Communication: 'Open Source Communication',
|
Open_Source_Communication: 'Open Source Communication',
|
||||||
|
Open_your_authentication_app_and_enter_the_code: 'Open your authentication app and enter the code.',
|
||||||
|
OR: 'OR',
|
||||||
Overwrites_the_server_configuration_and_use_room_config: 'Overwrites the server configuration and use room config',
|
Overwrites_the_server_configuration_and_use_room_config: 'Overwrites the server configuration and use room config',
|
||||||
Password: 'Password',
|
Password: 'Password',
|
||||||
|
Parent_channel_or_group: 'Parent channel or group',
|
||||||
Permalink_copied_to_clipboard: 'Permalink copied to clipboard!',
|
Permalink_copied_to_clipboard: 'Permalink copied to clipboard!',
|
||||||
Pin: 'Pin',
|
Pin: 'Pin',
|
||||||
Pinned_Messages: 'Pinned Messages',
|
Pinned_Messages: 'Pinned Messages',
|
||||||
|
@ -389,16 +413,22 @@ export default {
|
||||||
Select_Avatar: 'Select Avatar',
|
Select_Avatar: 'Select Avatar',
|
||||||
Select_Server: 'Select Server',
|
Select_Server: 'Select Server',
|
||||||
Select_Users: 'Select Users',
|
Select_Users: 'Select Users',
|
||||||
|
Select_a_Channel: 'Select a Channel',
|
||||||
|
Select_an_option: 'Select an option',
|
||||||
Send: 'Send',
|
Send: 'Send',
|
||||||
Send_audio_message: 'Send audio message',
|
Send_audio_message: 'Send audio message',
|
||||||
Send_crash_report: 'Send crash report',
|
Send_crash_report: 'Send crash report',
|
||||||
Send_message: 'Send message',
|
Send_message: 'Send message',
|
||||||
|
Send_me_the_code_again: 'Send me the code again',
|
||||||
Send_to: 'Send to...',
|
Send_to: 'Send to...',
|
||||||
Sent_an_attachment: 'Sent an attachment',
|
Sent_an_attachment: 'Sent an attachment',
|
||||||
Server: 'Server',
|
Server: 'Server',
|
||||||
Servers: 'Servers',
|
Servers: 'Servers',
|
||||||
Server_version: 'Server version: {{version}}',
|
Server_version: 'Server version: {{version}}',
|
||||||
Set_username_subtitle: 'The username is used to allow others to mention you in messages',
|
Set_username_subtitle: 'The username is used to allow others to mention you in messages',
|
||||||
|
Set_custom_status: 'Set custom status',
|
||||||
|
Set_status: 'Set status',
|
||||||
|
Status_saved_successfully: 'Status saved successfully!',
|
||||||
Settings: 'Settings',
|
Settings: 'Settings',
|
||||||
Settings_succesfully_changed: 'Settings succesfully changed!',
|
Settings_succesfully_changed: 'Settings succesfully changed!',
|
||||||
Share: 'Share',
|
Share: 'Share',
|
||||||
|
@ -471,17 +501,22 @@ export default {
|
||||||
Username: 'Username',
|
Username: 'Username',
|
||||||
Username_or_email: 'Username or email',
|
Username_or_email: 'Username or email',
|
||||||
Uses_server_configuration: 'Uses server configuration',
|
Uses_server_configuration: 'Uses server configuration',
|
||||||
|
Usually_a_discussion_starts_with_a_question_like_How_do_I_upload_a_picture: 'Usually, a discussion starts with a question, like "How do I upload a picture?"',
|
||||||
Validating: 'Validating',
|
Validating: 'Validating',
|
||||||
|
Registration_Succeeded: 'Registration Succeeded!',
|
||||||
|
Verify: 'Verify',
|
||||||
Verify_email_title: 'Registration Succeeded!',
|
Verify_email_title: 'Registration Succeeded!',
|
||||||
Verify_email_desc: 'We have sent you an email to confirm your registration. If you do not receive an email shortly, please come back and try again.',
|
Verify_email_desc: 'We have sent you an email to confirm your registration. If you do not receive an email shortly, please come back and try again.',
|
||||||
|
Verify_your_email_for_the_code_we_sent: 'Verify your email for the code we sent',
|
||||||
Video_call: 'Video call',
|
Video_call: 'Video call',
|
||||||
View_Original: 'View Original',
|
View_Original: 'View Original',
|
||||||
Voice_call: 'Voice call',
|
Voice_call: 'Voice call',
|
||||||
Websocket_disabled: 'Websocket is disabled for this server.\n{{contact}}',
|
Websocket_disabled: 'Websocket is disabled for this server.\n{{contact}}',
|
||||||
Welcome: 'Welcome',
|
Welcome: 'Welcome',
|
||||||
Welcome_to_RocketChat: 'Welcome to Rocket.Chat',
|
What_are_you_doing_right_now: 'What are you doing right now?',
|
||||||
Whats_your_2fa: 'What\'s your 2FA code?',
|
Whats_your_2fa: 'What\'s your 2FA code?',
|
||||||
Without_Servers: 'Without Servers',
|
Without_Servers: 'Without Servers',
|
||||||
|
Workspaces: 'Workspaces',
|
||||||
Write_External_Permission_Message: 'Rocket Chat needs access to your gallery so you can save images.',
|
Write_External_Permission_Message: 'Rocket Chat needs access to your gallery so you can save images.',
|
||||||
Write_External_Permission: 'Gallery Permission',
|
Write_External_Permission: 'Gallery Permission',
|
||||||
Yes_action_it: 'Yes, {{action}} it!',
|
Yes_action_it: 'Yes, {{action}} it!',
|
||||||
|
@ -497,10 +532,12 @@ export default {
|
||||||
Logged_out_by_server: 'You\'ve been logged out by the server. Please log in again.',
|
Logged_out_by_server: 'You\'ve been logged out by the server. Please log in again.',
|
||||||
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.',
|
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.',
|
||||||
Your_certificate: 'Your Certificate',
|
Your_certificate: 'Your Certificate',
|
||||||
|
Your_message: 'Your message',
|
||||||
Your_invite_link_will_expire_after__usesLeft__uses: 'Your invite link will expire after {{usesLeft}} uses.',
|
Your_invite_link_will_expire_after__usesLeft__uses: 'Your invite link will expire after {{usesLeft}} uses.',
|
||||||
Your_invite_link_will_expire_on__date__or_after__usesLeft__uses: 'Your invite link will expire on {{date}} or after {{usesLeft}} uses.',
|
Your_invite_link_will_expire_on__date__or_after__usesLeft__uses: 'Your invite link will expire on {{date}} or after {{usesLeft}} uses.',
|
||||||
Your_invite_link_will_expire_on__date__: 'Your invite link will expire on {{date}}.',
|
Your_invite_link_will_expire_on__date__: 'Your invite link will expire on {{date}}.',
|
||||||
Your_invite_link_will_never_expire: 'Your invite link will never expire.',
|
Your_invite_link_will_never_expire: 'Your invite link will never expire.',
|
||||||
|
Your_workspace: 'Your workspace',
|
||||||
Version_no: 'Version: {{version}}',
|
Version_no: 'Version: {{version}}',
|
||||||
You_will_not_be_able_to_recover_this_message: 'You will not be able to recover this message!',
|
You_will_not_be_able_to_recover_this_message: 'You will not be able to recover this message!',
|
||||||
Change_Language: 'Change Language',
|
Change_Language: 'Change Language',
|
||||||
|
@ -522,5 +559,6 @@ export default {
|
||||||
You_will_be_logged_out_of_this_application: 'You will be logged out of this application.',
|
You_will_be_logged_out_of_this_application: 'You will be logged out of this application.',
|
||||||
Clear: 'Clear',
|
Clear: 'Clear',
|
||||||
This_will_clear_all_your_offline_data: 'This will clear all your offline data.',
|
This_will_clear_all_your_offline_data: 'This will clear all your offline data.',
|
||||||
Mark_unread: 'Mark Unread'
|
Mark_unread: 'Mark Unread',
|
||||||
|
Wait_activation_warning: 'Before you can login, your account must be manually activated by an administrator.'
|
||||||
};
|
};
|
||||||
|
|
|
@ -134,7 +134,6 @@ export default {
|
||||||
Collaborative: 'Colaborativo',
|
Collaborative: 'Colaborativo',
|
||||||
Confirm: 'Confirmar',
|
Confirm: 'Confirmar',
|
||||||
Connect: 'Conectar',
|
Connect: 'Conectar',
|
||||||
Connect_to_a_server: 'Conectar a servidor',
|
|
||||||
Connected: 'Conectado',
|
Connected: 'Conectado',
|
||||||
connecting_server: 'conectando a servidor',
|
connecting_server: 'conectando a servidor',
|
||||||
Connecting: 'Conectando...',
|
Connecting: 'Conectando...',
|
||||||
|
@ -188,7 +187,6 @@ export default {
|
||||||
Finish_recording: 'Finalizar grabación',
|
Finish_recording: 'Finalizar grabación',
|
||||||
Following_thread: 'Siguiendo hilo',
|
Following_thread: 'Siguiendo hilo',
|
||||||
For_your_security_you_must_enter_your_current_password_to_continue: 'Por seguridad, debes introducir tu contraseña para continuar',
|
For_your_security_you_must_enter_your_current_password_to_continue: 'Por seguridad, debes introducir tu contraseña para continuar',
|
||||||
Forgot_my_password: 'He olvidado mi contraseña',
|
|
||||||
Forgot_password_If_this_email_is_registered: 'Si este email está registrado, te enviaremos las instrucciones para resetear tu contraseña.Si no recibes un email en un rato, vuelve aquí e inténtalo de nuevo.',
|
Forgot_password_If_this_email_is_registered: 'Si este email está registrado, te enviaremos las instrucciones para resetear tu contraseña.Si no recibes un email en un rato, vuelve aquí e inténtalo de nuevo.',
|
||||||
Forgot_password: 'Restablecer mi contraseña',
|
Forgot_password: 'Restablecer mi contraseña',
|
||||||
Forgot_Password: 'Restabler mi Contraseña',
|
Forgot_Password: 'Restabler mi Contraseña',
|
||||||
|
@ -207,7 +205,6 @@ export default {
|
||||||
is_not_a_valid_RocketChat_instance: 'no es una instancia válida Rocket.Chat',
|
is_not_a_valid_RocketChat_instance: 'no es una instancia válida Rocket.Chat',
|
||||||
is_typing: 'escribiendo',
|
is_typing: 'escribiendo',
|
||||||
Invalid_server_version: 'El servidor que intentas conectar está usando una versión que ya no es soportada por la aplicación : {{currentVersion}}. Requerimos una versión {{minVersion}}.',
|
Invalid_server_version: 'El servidor que intentas conectar está usando una versión que ya no es soportada por la aplicación : {{currentVersion}}. Requerimos una versión {{minVersion}}.',
|
||||||
Join_the_community: 'Conectar con la comunidad',
|
|
||||||
Join: 'Conectar',
|
Join: 'Conectar',
|
||||||
Just_invited_people_can_access_this_channel: 'Sólo gente invitada puede acceder a este canal.',
|
Just_invited_people_can_access_this_channel: 'Sólo gente invitada puede acceder a este canal.',
|
||||||
Language: 'Idioma',
|
Language: 'Idioma',
|
||||||
|
@ -270,6 +267,7 @@ export default {
|
||||||
Notification_Preferences: 'Configuración de notificaciones',
|
Notification_Preferences: 'Configuración de notificaciones',
|
||||||
Offline: 'Sin conexión',
|
Offline: 'Sin conexión',
|
||||||
Oops: 'Oops!',
|
Oops: 'Oops!',
|
||||||
|
Onboarding_title: 'Bienvenido a Rocket.Chat',
|
||||||
Online: 'Conectado',
|
Online: 'Conectado',
|
||||||
Only_authorized_users_can_write_new_messages: 'Sólo pueden escribir mensajes usuarios autorizados',
|
Only_authorized_users_can_write_new_messages: 'Sólo pueden escribir mensajes usuarios autorizados',
|
||||||
Open_emoji_selector: 'Abrir selector de emojis',
|
Open_emoji_selector: 'Abrir selector de emojis',
|
||||||
|
@ -427,7 +425,6 @@ export default {
|
||||||
Voice_call: 'Llamada de voz',
|
Voice_call: 'Llamada de voz',
|
||||||
Websocket_disabled: 'Websocket está deshabilitado para este servidor.\n{{contact}}',
|
Websocket_disabled: 'Websocket está deshabilitado para este servidor.\n{{contact}}',
|
||||||
Welcome: 'Bienvenido',
|
Welcome: 'Bienvenido',
|
||||||
Welcome_to_RocketChat: 'Bienvenido a Rocket.Chat',
|
|
||||||
Whats_your_2fa: '¿Cuál es tu código 2FA?',
|
Whats_your_2fa: '¿Cuál es tu código 2FA?',
|
||||||
Without_Servers: 'Sin servidores',
|
Without_Servers: 'Sin servidores',
|
||||||
Yes_action_it: 'Sí, {{action}}!',
|
Yes_action_it: 'Sí, {{action}}!',
|
||||||
|
|
|
@ -122,7 +122,6 @@ export default {
|
||||||
Collaborative: 'Collaborative',
|
Collaborative: 'Collaborative',
|
||||||
Confirm: 'Confirmer',
|
Confirm: 'Confirmer',
|
||||||
Connect: 'Se connecter',
|
Connect: 'Se connecter',
|
||||||
Connect_to_a_server: 'Se connecter à un serveur',
|
|
||||||
Connected: 'Connecté',
|
Connected: 'Connecté',
|
||||||
Connecting: 'Connexion ...',
|
Connecting: 'Connexion ...',
|
||||||
Continue_with: 'Continuer avec',
|
Continue_with: 'Continuer avec',
|
||||||
|
@ -159,7 +158,6 @@ export default {
|
||||||
File_name: 'Nom de fichier',
|
File_name: 'Nom de fichier',
|
||||||
Finish_recording: 'Terminer l\'enregistrement',
|
Finish_recording: 'Terminer l\'enregistrement',
|
||||||
For_your_security_you_must_enter_your_current_password_to_continue: 'Pour votre sécurité, vous devez entrer votre mot de passe actuel pour continuer.',
|
For_your_security_you_must_enter_your_current_password_to_continue: 'Pour votre sécurité, vous devez entrer votre mot de passe actuel pour continuer.',
|
||||||
Forgot_my_password: 'J\'ai oublié mon mot de passe',
|
|
||||||
Forgot_password_If_this_email_is_registered: 'Si cet e-mail est enregistré, nous vous enverrons des instructions pour réinitialiser votre mot de passe. Si vous ne recevez pas d\'e-mail sous peu, veuillez revenir et réessayer.',
|
Forgot_password_If_this_email_is_registered: 'Si cet e-mail est enregistré, nous vous enverrons des instructions pour réinitialiser votre mot de passe. Si vous ne recevez pas d\'e-mail sous peu, veuillez revenir et réessayer.',
|
||||||
Forgot_password: 'Mot de passe oublié',
|
Forgot_password: 'Mot de passe oublié',
|
||||||
Forgot_Password: 'Mot de passe oublié',
|
Forgot_Password: 'Mot de passe oublié',
|
||||||
|
@ -173,7 +171,6 @@ export default {
|
||||||
is_not_a_valid_RocketChat_instance: 'n\'est pas une instance valide de Rocket.Chat',
|
is_not_a_valid_RocketChat_instance: 'n\'est pas une instance valide de Rocket.Chat',
|
||||||
is_typing: 'est en train d\'écrire',
|
is_typing: 'est en train d\'écrire',
|
||||||
Invalid_server_version: 'Le serveur que vous essayez de connecter utilise une version qui n\'est plus prise en charge par l\'application: {{currentVersion}}.\n\nNous exigeons la version {{minVersion}}',
|
Invalid_server_version: 'Le serveur que vous essayez de connecter utilise une version qui n\'est plus prise en charge par l\'application: {{currentVersion}}.\n\nNous exigeons la version {{minVersion}}',
|
||||||
Join_the_community: 'Rejoindre la communauté',
|
|
||||||
Join: 'Rejoindre',
|
Join: 'Rejoindre',
|
||||||
Just_invited_people_can_access_this_channel: 'Seuls les invités peuvent accéder à ce canal',
|
Just_invited_people_can_access_this_channel: 'Seuls les invités peuvent accéder à ce canal',
|
||||||
Language: 'Langue',
|
Language: 'Langue',
|
||||||
|
@ -223,6 +220,7 @@ export default {
|
||||||
Notify_all_in_this_room: 'Notifier tous dans cette salle',
|
Notify_all_in_this_room: 'Notifier tous dans cette salle',
|
||||||
Offline: 'Hors ligne',
|
Offline: 'Hors ligne',
|
||||||
Oops: 'Oops!',
|
Oops: 'Oops!',
|
||||||
|
Onboarding_title: 'Bienvenue sur Rocket.Chat',
|
||||||
Online: 'En ligne',
|
Online: 'En ligne',
|
||||||
Only_authorized_users_can_write_new_messages: 'Seuls les utilisateurs autorisés peuvent écrire de nouveaux messages.',
|
Only_authorized_users_can_write_new_messages: 'Seuls les utilisateurs autorisés peuvent écrire de nouveaux messages.',
|
||||||
Open_emoji_selector: 'Ouvrir sélecteur emoji',
|
Open_emoji_selector: 'Ouvrir sélecteur emoji',
|
||||||
|
@ -338,7 +336,6 @@ export default {
|
||||||
Video_call: 'Appel vidéo',
|
Video_call: 'Appel vidéo',
|
||||||
Voice_call: 'Appel vocal',
|
Voice_call: 'Appel vocal',
|
||||||
Welcome: 'Bienvenue',
|
Welcome: 'Bienvenue',
|
||||||
Welcome_to_RocketChat: 'Bienvenue sur Rocket.Chat',
|
|
||||||
Whats_your_2fa: 'Quel est votre code 2FA?',
|
Whats_your_2fa: 'Quel est votre code 2FA?',
|
||||||
Yes_action_it: 'Oui, {{action}} le!',
|
Yes_action_it: 'Oui, {{action}} le!',
|
||||||
Yesterday: 'Hier',
|
Yesterday: 'Hier',
|
||||||
|
|
|
@ -136,7 +136,6 @@ export default {
|
||||||
Collaborative: 'Collaborativo',
|
Collaborative: 'Collaborativo',
|
||||||
Confirm: 'Conferma',
|
Confirm: 'Conferma',
|
||||||
Connect: 'Connetti',
|
Connect: 'Connetti',
|
||||||
Connect_to_a_server: 'Connetti ad un server',
|
|
||||||
Connected: 'Connesso',
|
Connected: 'Connesso',
|
||||||
connecting_server: 'connessione al server',
|
connecting_server: 'connessione al server',
|
||||||
Connecting: 'Connessione...',
|
Connecting: 'Connessione...',
|
||||||
|
@ -192,7 +191,6 @@ export default {
|
||||||
Finish_recording: 'Termina registrazione',
|
Finish_recording: 'Termina registrazione',
|
||||||
Following_thread: 'Thread seguito',
|
Following_thread: 'Thread seguito',
|
||||||
For_your_security_you_must_enter_your_current_password_to_continue: 'Per garantire la sicurezza del tuo account, inserisci la password per continuare.',
|
For_your_security_you_must_enter_your_current_password_to_continue: 'Per garantire la sicurezza del tuo account, inserisci la password per continuare.',
|
||||||
Forgot_my_password: 'Ho dimenticato la password',
|
|
||||||
Forgot_password_If_this_email_is_registered: 'Se questa e-mail è registrata, manderemo istruzioni su come resettare la tua password. Se non ricevi nulla, torna qui e riprova di nuovo.',
|
Forgot_password_If_this_email_is_registered: 'Se questa e-mail è registrata, manderemo istruzioni su come resettare la tua password. Se non ricevi nulla, torna qui e riprova di nuovo.',
|
||||||
Forgot_password: 'Password dimenticata',
|
Forgot_password: 'Password dimenticata',
|
||||||
Forgot_Password: 'Password dimenticata',
|
Forgot_Password: 'Password dimenticata',
|
||||||
|
@ -215,7 +213,6 @@ export default {
|
||||||
Invalid_server_version: 'Il server a cui stai cercando di connetterti sta utilizzando una versione non più supportata dall\'app: {{currentVersion}}.\n\nVersione minima richiesta: {{minVersion}}',
|
Invalid_server_version: 'Il server a cui stai cercando di connetterti sta utilizzando una versione non più supportata dall\'app: {{currentVersion}}.\n\nVersione minima richiesta: {{minVersion}}',
|
||||||
Invite_Link: 'Link di invito',
|
Invite_Link: 'Link di invito',
|
||||||
Invite_users: 'Invita utenti',
|
Invite_users: 'Invita utenti',
|
||||||
Join_the_community: 'Unisciti alla community',
|
|
||||||
Join: 'Entra',
|
Join: 'Entra',
|
||||||
Just_invited_people_can_access_this_channel: 'Solo le persone invitate possono accedere a questo canale',
|
Just_invited_people_can_access_this_channel: 'Solo le persone invitate possono accedere a questo canale',
|
||||||
Language: 'Lingua',
|
Language: 'Lingua',
|
||||||
|
@ -281,6 +278,7 @@ export default {
|
||||||
Notification_Preferences: 'Impostazioni notifiche',
|
Notification_Preferences: 'Impostazioni notifiche',
|
||||||
Offline: 'Offline',
|
Offline: 'Offline',
|
||||||
Oops: 'Oops!',
|
Oops: 'Oops!',
|
||||||
|
Onboarding_title: 'Benvenuto in Rocket.Chat',
|
||||||
Online: 'Online',
|
Online: 'Online',
|
||||||
Only_authorized_users_can_write_new_messages: 'Solo gli utenti autorizzati possono scrivere nuovi messaggi',
|
Only_authorized_users_can_write_new_messages: 'Solo gli utenti autorizzati possono scrivere nuovi messaggi',
|
||||||
Open_emoji_selector: 'Apri selettore emoji',
|
Open_emoji_selector: 'Apri selettore emoji',
|
||||||
|
@ -441,7 +439,6 @@ export default {
|
||||||
Voice_call: 'Chiamata vocale',
|
Voice_call: 'Chiamata vocale',
|
||||||
Websocket_disabled: 'Websocket è disabilitato per questo server.\n{{contact}}',
|
Websocket_disabled: 'Websocket è disabilitato per questo server.\n{{contact}}',
|
||||||
Welcome: 'Benvenuto',
|
Welcome: 'Benvenuto',
|
||||||
Welcome_to_RocketChat: 'Benvenuto in Rocket.Chat',
|
|
||||||
Whats_your_2fa: 'Qual\'è il tuo codice 2FA?',
|
Whats_your_2fa: 'Qual\'è il tuo codice 2FA?',
|
||||||
Without_Servers: 'Senza server',
|
Without_Servers: 'Senza server',
|
||||||
Write_External_Permission_Message: 'Rocket.Chat ha bisogno dell\'accesso alla galleria per salvare le immagini.',
|
Write_External_Permission_Message: 'Rocket.Chat ha bisogno dell\'accesso alla galleria per salvare le immagini.',
|
||||||
|
|
|
@ -153,7 +153,6 @@ export default {
|
||||||
Collaborative: 'コラボ',
|
Collaborative: 'コラボ',
|
||||||
Confirm: '承認',
|
Confirm: '承認',
|
||||||
Connect: '接続',
|
Connect: '接続',
|
||||||
Connect_to_a_server: 'サーバーに接続',
|
|
||||||
Connected: '接続しました',
|
Connected: '接続しました',
|
||||||
connecting_server: 'サーバーに接続中',
|
connecting_server: 'サーバーに接続中',
|
||||||
Connecting: '接続中...',
|
Connecting: '接続中...',
|
||||||
|
@ -216,7 +215,6 @@ export default {
|
||||||
Following_thread: 'スレッド更新時に通知',
|
Following_thread: 'スレッド更新時に通知',
|
||||||
For_your_security_you_must_enter_your_current_password_to_continue:
|
For_your_security_you_must_enter_your_current_password_to_continue:
|
||||||
'セキュリティのため、続けるには現在のパスワードを入力してください。',
|
'セキュリティのため、続けるには現在のパスワードを入力してください。',
|
||||||
Forgot_my_password: 'パスワードを忘れた',
|
|
||||||
Forgot_password_If_this_email_is_registered:
|
Forgot_password_If_this_email_is_registered:
|
||||||
'送信したメールアドレスが登録されていれば、パスワードのリセット方法を送信しました。メールアドレスがすぐに来ない場合はやり直してください。',
|
'送信したメールアドレスが登録されていれば、パスワードのリセット方法を送信しました。メールアドレスがすぐに来ない場合はやり直してください。',
|
||||||
Forgot_password: 'パスワードを忘れた',
|
Forgot_password: 'パスワードを忘れた',
|
||||||
|
@ -242,7 +240,6 @@ export default {
|
||||||
'接続しようとしているサーバーのバージョン({{currentVersion}})はサポートされていません。\n\nサポートする最低バージョンは {{minVersion}} です',
|
'接続しようとしているサーバーのバージョン({{currentVersion}})はサポートされていません。\n\nサポートする最低バージョンは {{minVersion}} です',
|
||||||
Invite_Link: '招待リンク',
|
Invite_Link: '招待リンク',
|
||||||
Invite_users: 'ユーザーを招待',
|
Invite_users: 'ユーザーを招待',
|
||||||
Join_the_community: 'コミュニティに参加',
|
|
||||||
Join: '参加',
|
Join: '参加',
|
||||||
Just_invited_people_can_access_this_channel:
|
Just_invited_people_can_access_this_channel:
|
||||||
'招待されたユーザーだけがこのチャンネルに参加できます',
|
'招待されたユーザーだけがこのチャンネルに参加できます',
|
||||||
|
@ -311,6 +308,7 @@ export default {
|
||||||
Notification_Preferences: '通知設定',
|
Notification_Preferences: '通知設定',
|
||||||
Offline: 'オフライン',
|
Offline: 'オフライン',
|
||||||
Oops: 'おっと!',
|
Oops: 'おっと!',
|
||||||
|
Onboarding_title: 'Rocket.Chatへようこそ',
|
||||||
Online: 'オンライン',
|
Online: 'オンライン',
|
||||||
Only_authorized_users_can_write_new_messages:
|
Only_authorized_users_can_write_new_messages:
|
||||||
'承認されたユーザーだけが新しいメッセージを書き込めます',
|
'承認されたユーザーだけが新しいメッセージを書き込めます',
|
||||||
|
@ -487,7 +485,6 @@ export default {
|
||||||
Voice_call: '音声通話',
|
Voice_call: '音声通話',
|
||||||
Websocket_disabled: 'Websocketはこのサーバーでは無効化されています。\n{{contact}}',
|
Websocket_disabled: 'Websocketはこのサーバーでは無効化されています。\n{{contact}}',
|
||||||
Welcome: 'ようこそ',
|
Welcome: 'ようこそ',
|
||||||
Welcome_to_RocketChat: 'Rocket.Chatへようこそ',
|
|
||||||
Whats_your_2fa: '2段階認証のコードを入力してください',
|
Whats_your_2fa: '2段階認証のコードを入力してください',
|
||||||
Without_Servers: 'サーバーを除く',
|
Without_Servers: 'サーバーを除く',
|
||||||
Write_External_Permission_Message:
|
Write_External_Permission_Message:
|
||||||
|
|
|
@ -136,7 +136,6 @@ export default {
|
||||||
Collaborative: 'Samenwerkend',
|
Collaborative: 'Samenwerkend',
|
||||||
Confirm: 'Bevestig',
|
Confirm: 'Bevestig',
|
||||||
Connect: 'Verbind',
|
Connect: 'Verbind',
|
||||||
Connect_to_a_server: 'Verbind met een server',
|
|
||||||
Connected: 'Verbonden',
|
Connected: 'Verbonden',
|
||||||
connecting_server: 'Verbonden met een server',
|
connecting_server: 'Verbonden met een server',
|
||||||
Connecting: 'Aan het verbinden...',
|
Connecting: 'Aan het verbinden...',
|
||||||
|
@ -192,7 +191,6 @@ export default {
|
||||||
Finish_recording: 'Beëindig opname',
|
Finish_recording: 'Beëindig opname',
|
||||||
Following_thread: 'Volg thread',
|
Following_thread: 'Volg thread',
|
||||||
For_your_security_you_must_enter_your_current_password_to_continue: 'Voor je veiligheid moet je je wachtwoord invullen om door te gaan',
|
For_your_security_you_must_enter_your_current_password_to_continue: 'Voor je veiligheid moet je je wachtwoord invullen om door te gaan',
|
||||||
Forgot_my_password: 'Wachtwoord vergeten',
|
|
||||||
Forgot_password_If_this_email_is_registered: 'Als dit email adres bij ons bekend is, sturen we je instructies op om je wachtwoord te resetten. Als je geen email krijgt, probeer het dan nogmaals.',
|
Forgot_password_If_this_email_is_registered: 'Als dit email adres bij ons bekend is, sturen we je instructies op om je wachtwoord te resetten. Als je geen email krijgt, probeer het dan nogmaals.',
|
||||||
Forgot_password: 'Wachtwoord vergeten',
|
Forgot_password: 'Wachtwoord vergeten',
|
||||||
Forgot_Password: 'Wachtwoord Vergeten',
|
Forgot_Password: 'Wachtwoord Vergeten',
|
||||||
|
@ -215,7 +213,6 @@ export default {
|
||||||
Invalid_server_version: 'De server die je probeert te bereiken gebruikt een versie die niet meer door de app ondersteunt wordt: {{currentVersion}}.\n\nMinimale versienummer {{minVersion}}',
|
Invalid_server_version: 'De server die je probeert te bereiken gebruikt een versie die niet meer door de app ondersteunt wordt: {{currentVersion}}.\n\nMinimale versienummer {{minVersion}}',
|
||||||
Invite_Link: 'Uitnodigingslink',
|
Invite_Link: 'Uitnodigingslink',
|
||||||
Invite_users: 'Nodig gebruikers uit',
|
Invite_users: 'Nodig gebruikers uit',
|
||||||
Join_the_community: 'Word lid van de community',
|
|
||||||
Join: 'Word lid',
|
Join: 'Word lid',
|
||||||
Just_invited_people_can_access_this_channel: 'Alleen genodigden kunnen bij dit kanaal',
|
Just_invited_people_can_access_this_channel: 'Alleen genodigden kunnen bij dit kanaal',
|
||||||
Language: 'Taal',
|
Language: 'Taal',
|
||||||
|
@ -281,6 +278,7 @@ export default {
|
||||||
Notification_Preferences: 'Notificatievoorkeuren',
|
Notification_Preferences: 'Notificatievoorkeuren',
|
||||||
Offline: 'Offline',
|
Offline: 'Offline',
|
||||||
Oops: 'Oeps!',
|
Oops: 'Oeps!',
|
||||||
|
Onboarding_title: 'Welkom bij Rocket.Chat',
|
||||||
Online: 'Online',
|
Online: 'Online',
|
||||||
Only_authorized_users_can_write_new_messages: 'Alleen gebruikers met toestemming mogen nieuwe berichten maken',
|
Only_authorized_users_can_write_new_messages: 'Alleen gebruikers met toestemming mogen nieuwe berichten maken',
|
||||||
Open_emoji_selector: 'Open de emoji selector',
|
Open_emoji_selector: 'Open de emoji selector',
|
||||||
|
@ -448,7 +446,6 @@ export default {
|
||||||
Voice_call: 'Audiogesprek',
|
Voice_call: 'Audiogesprek',
|
||||||
Websocket_disabled: 'Websocket staat uit voor deze server.\n{{contact}}',
|
Websocket_disabled: 'Websocket staat uit voor deze server.\n{{contact}}',
|
||||||
Welcome: 'Welkom',
|
Welcome: 'Welkom',
|
||||||
Welcome_to_RocketChat: 'Welkom bij Rocket.Chat',
|
|
||||||
Whats_your_2fa: 'Wat is je 2FA code?',
|
Whats_your_2fa: 'Wat is je 2FA code?',
|
||||||
Without_Servers: 'Zonder Servers',
|
Without_Servers: 'Zonder Servers',
|
||||||
Write_External_Permission_Message: 'Rocket Chat moet bij je galerij kunnen om afbeeldingen op te slaan.',
|
Write_External_Permission_Message: 'Rocket Chat moet bij je galerij kunnen om afbeeldingen op te slaan.',
|
||||||
|
|
|
@ -93,6 +93,7 @@ export default {
|
||||||
alert: 'alerta',
|
alert: 'alerta',
|
||||||
alerts: 'alertas',
|
alerts: 'alertas',
|
||||||
All_users_in_the_channel_can_write_new_messages: 'Todos usuários no canal podem enviar mensagens novas',
|
All_users_in_the_channel_can_write_new_messages: 'Todos usuários no canal podem enviar mensagens novas',
|
||||||
|
A_meaningful_name_for_the_discussion_room: 'Um nome significativo para o canal de discussão',
|
||||||
All: 'Todos',
|
All: 'Todos',
|
||||||
Allow_Reactions: 'Permitir reagir',
|
Allow_Reactions: 'Permitir reagir',
|
||||||
Alphabetical: 'Alfabético',
|
Alphabetical: 'Alfabético',
|
||||||
|
@ -139,10 +140,10 @@ export default {
|
||||||
Choose_file: 'Enviar arquivo',
|
Choose_file: 'Enviar arquivo',
|
||||||
Choose_where_you_want_links_be_opened: 'Escolha onde deseja que os links sejam abertos',
|
Choose_where_you_want_links_be_opened: 'Escolha onde deseja que os links sejam abertos',
|
||||||
Code: 'Código',
|
Code: 'Código',
|
||||||
|
Code_or_password_invalid: 'Código ou senha inválido',
|
||||||
Collaborative: 'Colaborativo',
|
Collaborative: 'Colaborativo',
|
||||||
Confirm: 'Confirmar',
|
Confirm: 'Confirmar',
|
||||||
Connect: 'Conectar',
|
Connect: 'Conectar',
|
||||||
Connect_to_a_server: 'Conectar a um servidor',
|
|
||||||
Connected: 'Conectado',
|
Connected: 'Conectado',
|
||||||
connecting_server: 'conectando no servidor',
|
connecting_server: 'conectando no servidor',
|
||||||
Connecting: 'Conectando...',
|
Connecting: 'Conectando...',
|
||||||
|
@ -153,6 +154,8 @@ export default {
|
||||||
Permalink: 'Link-Permanente',
|
Permalink: 'Link-Permanente',
|
||||||
Create_account: 'Criar conta',
|
Create_account: 'Criar conta',
|
||||||
Create_Channel: 'Criar Canal',
|
Create_Channel: 'Criar Canal',
|
||||||
|
Create_Direct_Messages: 'Criar Mensagens Diretas',
|
||||||
|
Create_Discussion: 'Criar Discussão',
|
||||||
Created_snippet: 'Criou um snippet',
|
Created_snippet: 'Criou um snippet',
|
||||||
Create_a_new_workspace: 'Criar nova área de trabalho',
|
Create_a_new_workspace: 'Criar nova área de trabalho',
|
||||||
Create: 'Criar',
|
Create: 'Criar',
|
||||||
|
@ -170,12 +173,17 @@ export default {
|
||||||
Description: 'Descrição',
|
Description: 'Descrição',
|
||||||
Disable_notifications: 'Desabilitar notificações',
|
Disable_notifications: 'Desabilitar notificações',
|
||||||
Discussions: 'Discussões',
|
Discussions: 'Discussões',
|
||||||
|
Discussion_Desc: 'Ajude a manter uma visão geral sobre o que está acontecendo! Ao criar uma discussão, um sub-canal do que você selecionou é criado e os dois são vinculados.',
|
||||||
|
Discussion_name: 'Nome da discussão',
|
||||||
|
Done: 'Pronto',
|
||||||
Dont_Have_An_Account: 'Não tem uma conta?',
|
Dont_Have_An_Account: 'Não tem uma conta?',
|
||||||
|
Do_you_have_an_account: 'Você tem uma conta?',
|
||||||
Do_you_really_want_to_key_this_room_question_mark: 'Você quer realmente {{key}} esta sala?',
|
Do_you_really_want_to_key_this_room_question_mark: 'Você quer realmente {{key}} esta sala?',
|
||||||
edit: 'editar',
|
edit: 'editar',
|
||||||
edited: 'editado',
|
edited: 'editado',
|
||||||
Edit: 'Editar',
|
Edit: 'Editar',
|
||||||
Edit_Invite: 'Editar convite',
|
Edit_Invite: 'Editar convite',
|
||||||
|
Edit_Status: 'Editar Status',
|
||||||
Email_or_password_field_is_empty: 'Email ou senha estão vazios',
|
Email_or_password_field_is_empty: 'Email ou senha estão vazios',
|
||||||
Email: 'Email',
|
Email: 'Email',
|
||||||
email: 'e-mail',
|
email: 'e-mail',
|
||||||
|
@ -190,9 +198,8 @@ export default {
|
||||||
Finish_recording: 'Encerrar gravação',
|
Finish_recording: 'Encerrar gravação',
|
||||||
Following_thread: 'Começou a seguir tópico',
|
Following_thread: 'Começou a seguir tópico',
|
||||||
For_your_security_you_must_enter_your_current_password_to_continue: 'Para sua segurança, você precisa digitar sua senha',
|
For_your_security_you_must_enter_your_current_password_to_continue: 'Para sua segurança, você precisa digitar sua senha',
|
||||||
Forgot_my_password: 'Esqueci minha senha',
|
|
||||||
Forgot_password_If_this_email_is_registered: 'Se este e-mail estiver cadastrado, enviaremos instruções sobre como redefinir sua senha. Se você não receber um e-mail em breve, volte e tente novamente.',
|
Forgot_password_If_this_email_is_registered: 'Se este e-mail estiver cadastrado, enviaremos instruções sobre como redefinir sua senha. Se você não receber um e-mail em breve, volte e tente novamente.',
|
||||||
Forgot_password: 'Esqueci minha senha',
|
Forgot_password: 'Esqueceu sua senha?',
|
||||||
Forgot_Password: 'Esqueci minha senha',
|
Forgot_Password: 'Esqueci minha senha',
|
||||||
Full_table: 'Clique para ver a tabela completa',
|
Full_table: 'Clique para ver a tabela completa',
|
||||||
Generate_New_Link: 'Gerar novo convite',
|
Generate_New_Link: 'Gerar novo convite',
|
||||||
|
@ -224,8 +231,9 @@ export default {
|
||||||
Invalid_server_version: 'O servidor que você está conectando não é suportado mais por esta versão do aplicativo: {{currentVersion}}.\n\nEsta versão do aplicativo requer a versão {{minVersion}} do servidor para funcionar corretamente.',
|
Invalid_server_version: 'O servidor que você está conectando não é suportado mais por esta versão do aplicativo: {{currentVersion}}.\n\nEsta versão do aplicativo requer a versão {{minVersion}} do servidor para funcionar corretamente.',
|
||||||
Invite_Link: 'Link de Convite',
|
Invite_Link: 'Link de Convite',
|
||||||
Invite_users: 'Convidar usuários',
|
Invite_users: 'Convidar usuários',
|
||||||
Join_the_community: 'Junte-se à comunidade',
|
|
||||||
Join: 'Entrar',
|
Join: 'Entrar',
|
||||||
|
Join_our_open_workspace: 'Entra na nossa workspace pública',
|
||||||
|
Join_your_workspace: 'Entre na sua workspace',
|
||||||
Just_invited_people_can_access_this_channel: 'Apenas as pessoas convidadas podem acessar este canal',
|
Just_invited_people_can_access_this_channel: 'Apenas as pessoas convidadas podem acessar este canal',
|
||||||
Language: 'Idioma',
|
Language: 'Idioma',
|
||||||
last_message: 'última mensagem',
|
last_message: 'última mensagem',
|
||||||
|
@ -241,6 +249,7 @@ export default {
|
||||||
Logout: 'Sair',
|
Logout: 'Sair',
|
||||||
Logging_out: 'Saindo.',
|
Logging_out: 'Saindo.',
|
||||||
Max_number_of_uses: 'Número máximo de usos',
|
Max_number_of_uses: 'Número máximo de usos',
|
||||||
|
Max_number_of_users_allowed_is_number: 'Número máximo de usuários é {{maxUsers}}',
|
||||||
Members: 'Membros',
|
Members: 'Membros',
|
||||||
Mentioned_Messages: 'Mensagens mencionadas',
|
Mentioned_Messages: 'Mensagens mencionadas',
|
||||||
mentioned: 'mencionado',
|
mentioned: 'mencionado',
|
||||||
|
@ -282,12 +291,23 @@ export default {
|
||||||
Not_RC_Server: 'Este não é um servidor Rocket.Chat.\n{{contact}}',
|
Not_RC_Server: 'Este não é um servidor Rocket.Chat.\n{{contact}}',
|
||||||
Offline: 'Offline',
|
Offline: 'Offline',
|
||||||
Oops: 'Ops!',
|
Oops: 'Ops!',
|
||||||
|
Onboarding_description: 'Workspace é o espaço de colaboração do seu time ou organização. Peça um convite ou o endereço ao seu administrador ou crie uma workspace para o seu time.',
|
||||||
|
Onboarding_join_workspace: 'Entre numa workspace',
|
||||||
|
Onboarding_subtitle: 'Além da colaboração em equipe',
|
||||||
|
Onboarding_title: 'Bem vindo ao Rocket.Chat',
|
||||||
|
Onboarding_join_open_description: 'Entre na nossa workspace pública para conversar com o time da Rocket.Chat e nossa comunidade.',
|
||||||
|
Onboarding_agree_terms: 'Ao continuar, você aceita nossos ',
|
||||||
|
Onboarding_less_options: 'Menos opções',
|
||||||
|
Onboarding_more_options: 'Mais opções',
|
||||||
Online: 'Online',
|
Online: 'Online',
|
||||||
Only_authorized_users_can_write_new_messages: 'Somente usuários autorizados podem escrever novas mensagens',
|
Only_authorized_users_can_write_new_messages: 'Somente usuários autorizados podem escrever novas mensagens',
|
||||||
Open_emoji_selector: 'Abrir seletor de emoji',
|
Open_emoji_selector: 'Abrir seletor de emoji',
|
||||||
Open_Source_Communication: 'Comunicação Open Source',
|
Open_Source_Communication: 'Comunicação Open Source',
|
||||||
|
Open_your_authentication_app_and_enter_the_code: 'Abra seu aplicativo de autenticação e digite o código.',
|
||||||
|
OR: 'OU',
|
||||||
Overwrites_the_server_configuration_and_use_room_config: 'Substituir a configuração do servidor e usar a configuração da sala',
|
Overwrites_the_server_configuration_and_use_room_config: 'Substituir a configuração do servidor e usar a configuração da sala',
|
||||||
Password: 'Senha',
|
Password: 'Senha',
|
||||||
|
Parent_channel_or_group: 'Canal ou grupo pai',
|
||||||
Permalink_copied_to_clipboard: 'Link-permanente copiado para a área de transferência!',
|
Permalink_copied_to_clipboard: 'Link-permanente copiado para a área de transferência!',
|
||||||
Pin: 'Fixar',
|
Pin: 'Fixar',
|
||||||
Pinned_Messages: 'Mensagens Fixadas',
|
Pinned_Messages: 'Mensagens Fixadas',
|
||||||
|
@ -356,9 +376,12 @@ export default {
|
||||||
Select_Avatar: 'Selecionar Avatar',
|
Select_Avatar: 'Selecionar Avatar',
|
||||||
Select_Server: 'Selecionar Servidor',
|
Select_Server: 'Selecionar Servidor',
|
||||||
Select_Users: 'Selecionar Usuários',
|
Select_Users: 'Selecionar Usuários',
|
||||||
|
Select_a_Channel: 'Selecione um canal',
|
||||||
|
Select_an_option: 'Selecione uma opção',
|
||||||
Send: 'Enviar',
|
Send: 'Enviar',
|
||||||
Send_audio_message: 'Enviar mensagem de áudio',
|
Send_audio_message: 'Enviar mensagem de áudio',
|
||||||
Send_message: 'Enviar mensagem',
|
Send_message: 'Enviar mensagem',
|
||||||
|
Send_me_the_code_again: 'Envie-me o código novamente',
|
||||||
Send_to: 'Enviar para...',
|
Send_to: 'Enviar para...',
|
||||||
Sent_an_attachment: 'Enviou um anexo',
|
Sent_an_attachment: 'Enviou um anexo',
|
||||||
Server: 'Servidor',
|
Server: 'Servidor',
|
||||||
|
@ -426,20 +449,25 @@ export default {
|
||||||
Username: 'Usuário',
|
Username: 'Usuário',
|
||||||
Username_or_email: 'Usuário ou email',
|
Username_or_email: 'Usuário ou email',
|
||||||
Uses_server_configuration: 'Usar configuração do servidor',
|
Uses_server_configuration: 'Usar configuração do servidor',
|
||||||
|
Usually_a_discussion_starts_with_a_question_like_How_do_I_upload_a_picture: 'Normalmente, uma discussão começa com uma pergunta como: Como faço para enviar uma foto?',
|
||||||
|
Verify: 'Verificar',
|
||||||
Verify_email_title: 'Registrado com sucesso!',
|
Verify_email_title: 'Registrado com sucesso!',
|
||||||
Verify_email_desc: 'Nós lhe enviamos um e-mail para confirmar o seu registro. Se você não receber um e-mail em breve, por favor retorne e tente novamente.',
|
Verify_email_desc: 'Nós lhe enviamos um e-mail para confirmar o seu registro. Se você não receber um e-mail em breve, por favor retorne e tente novamente.',
|
||||||
|
Verify_your_email_for_the_code_we_sent: 'Verifique em seu e-mail o código que enviamos',
|
||||||
Video_call: 'Chamada de vídeo',
|
Video_call: 'Chamada de vídeo',
|
||||||
Voice_call: 'Chamada de voz',
|
Voice_call: 'Chamada de voz',
|
||||||
Websocket_disabled: 'Websocket está desativado para esse servidor.\n{{contact}}',
|
Websocket_disabled: 'Websocket está desativado para esse servidor.\n{{contact}}',
|
||||||
Welcome: 'Bem vindo',
|
Welcome: 'Bem vindo',
|
||||||
Welcome_to_RocketChat: 'Bem vindo ao Rocket.Chat',
|
|
||||||
Whats_your_2fa: 'Qual seu código de autenticação?',
|
Whats_your_2fa: 'Qual seu código de autenticação?',
|
||||||
|
What_are_you_doing_right_now: 'O que você está fazendo agora?',
|
||||||
Without_Servers: 'Sem Servidores',
|
Without_Servers: 'Sem Servidores',
|
||||||
|
Workspaces: 'Workspaces',
|
||||||
Yes_action_it: 'Sim, {{action}}!',
|
Yes_action_it: 'Sim, {{action}}!',
|
||||||
Yesterday: 'Ontem',
|
Yesterday: 'Ontem',
|
||||||
You_are_in_preview_mode: 'Está é uma prévia do canal',
|
You_are_in_preview_mode: 'Está é uma prévia do canal',
|
||||||
You_are_offline: 'Você está offline',
|
You_are_offline: 'Você está offline',
|
||||||
You_can_search_using_RegExp_eg: 'Você pode usar expressões regulares, por exemplo `/^text$/i`',
|
You_can_search_using_RegExp_eg: 'Você pode usar expressões regulares, por exemplo `/^text$/i`',
|
||||||
|
Your_message: 'Sua mensagem',
|
||||||
You_colon: 'Você: ',
|
You_colon: 'Você: ',
|
||||||
you_were_mentioned: 'você foi mencionado',
|
you_were_mentioned: 'você foi mencionado',
|
||||||
You_were_removed_from_channel: 'Você foi removido de {{channel}}',
|
You_were_removed_from_channel: 'Você foi removido de {{channel}}',
|
||||||
|
@ -449,6 +477,7 @@ export default {
|
||||||
Your_invite_link_will_expire_on__date__or_after__usesLeft__uses: 'Seu link de convite irá vencer em {{date}} ou depois de {{usesLeft}} usos.',
|
Your_invite_link_will_expire_on__date__or_after__usesLeft__uses: 'Seu link de convite irá vencer em {{date}} ou depois de {{usesLeft}} usos.',
|
||||||
Your_invite_link_will_expire_on__date__: 'Seu link de convite irá vencer em {{date}}.',
|
Your_invite_link_will_expire_on__date__: 'Seu link de convite irá vencer em {{date}}.',
|
||||||
Your_invite_link_will_never_expire: 'Seu link de convite nunca irá vencer.',
|
Your_invite_link_will_never_expire: 'Seu link de convite nunca irá vencer.',
|
||||||
|
Your_workspace: 'Sua workspace',
|
||||||
You_will_not_be_able_to_recover_this_message: 'Você não será capaz de recuperar essa mensagem!',
|
You_will_not_be_able_to_recover_this_message: 'Você não será capaz de recuperar essa mensagem!',
|
||||||
Write_External_Permission_Message: 'Rocket Chat precisa de acesso à sua galeria para salvar imagens',
|
Write_External_Permission_Message: 'Rocket Chat precisa de acesso à sua galeria para salvar imagens',
|
||||||
Write_External_Permission: 'Acesso à Galeria',
|
Write_External_Permission: 'Acesso à Galeria',
|
||||||
|
@ -470,5 +499,6 @@ export default {
|
||||||
You_will_be_logged_out_of_this_application: 'Você sairá deste aplicativo.',
|
You_will_be_logged_out_of_this_application: 'Você sairá deste aplicativo.',
|
||||||
Clear: 'Limpar',
|
Clear: 'Limpar',
|
||||||
This_will_clear_all_your_offline_data: 'Isto limpará todos os seus dados offline.',
|
This_will_clear_all_your_offline_data: 'Isto limpará todos os seus dados offline.',
|
||||||
Mark_unread: 'Marcar como não Lida'
|
Mark_unread: 'Marcar como não Lida',
|
||||||
|
Wait_activation_warning: 'Antes que você possa fazer o login, sua conta deve ser manualmente ativada por um administrador.'
|
||||||
};
|
};
|
||||||
|
|
|
@ -122,7 +122,6 @@ export default {
|
||||||
Collaborative: 'Colaborativa',
|
Collaborative: 'Colaborativa',
|
||||||
Confirm: 'Confirmar',
|
Confirm: 'Confirmar',
|
||||||
Connect: 'Ligar',
|
Connect: 'Ligar',
|
||||||
Connect_to_a_server: 'Ligue-se a um servidor',
|
|
||||||
Connected: 'Ligado',
|
Connected: 'Ligado',
|
||||||
Connecting: 'A ligar...',
|
Connecting: 'A ligar...',
|
||||||
Continue_with: 'Continuar com',
|
Continue_with: 'Continuar com',
|
||||||
|
@ -159,7 +158,6 @@ export default {
|
||||||
File_name: 'Nome do ficheiro',
|
File_name: 'Nome do ficheiro',
|
||||||
Finish_recording: 'Terminar a gravação',
|
Finish_recording: 'Terminar a gravação',
|
||||||
For_your_security_you_must_enter_your_current_password_to_continue: 'Para sua segurança, você deve escrever a sua palavra-passe actual para continuar',
|
For_your_security_you_must_enter_your_current_password_to_continue: 'Para sua segurança, você deve escrever a sua palavra-passe actual para continuar',
|
||||||
Forgot_my_password: 'Esqueci minha palavra-passe',
|
|
||||||
Forgot_password_If_this_email_is_registered: 'Se este e-mail estiver registado, enviaremos instruções sobre como repor a sua palavra-passe. Se você não receber um e-mail em breve, volte e tente novamente.',
|
Forgot_password_If_this_email_is_registered: 'Se este e-mail estiver registado, enviaremos instruções sobre como repor a sua palavra-passe. Se você não receber um e-mail em breve, volte e tente novamente.',
|
||||||
Forgot_password: 'Esquecer palavra-passe',
|
Forgot_password: 'Esquecer palavra-passe',
|
||||||
Forgot_Password: 'Esquecer Palavra-passe',
|
Forgot_Password: 'Esquecer Palavra-passe',
|
||||||
|
@ -174,7 +172,6 @@ export default {
|
||||||
is_not_a_valid_RocketChat_instance: 'is not a valid Rocket.Chat instance',
|
is_not_a_valid_RocketChat_instance: 'is not a valid Rocket.Chat instance',
|
||||||
is_typing: 'está a escrever',
|
is_typing: 'está a escrever',
|
||||||
Invalid_server_version: 'O servidor ao qual esta tentando ligar-se, utiliza uma versão que não é suporta pela aplicação: {{currentVersion}}.\n\nA versão mínima requerida é {{minVersion}}',
|
Invalid_server_version: 'O servidor ao qual esta tentando ligar-se, utiliza uma versão que não é suporta pela aplicação: {{currentVersion}}.\n\nA versão mínima requerida é {{minVersion}}',
|
||||||
Join_the_community: 'Junte-se à comunidade',
|
|
||||||
Join: 'Entrar',
|
Join: 'Entrar',
|
||||||
Just_invited_people_can_access_this_channel: 'Apenas utilizadores convidados podem aceder a este canal',
|
Just_invited_people_can_access_this_channel: 'Apenas utilizadores convidados podem aceder a este canal',
|
||||||
Language: 'Idioma',
|
Language: 'Idioma',
|
||||||
|
@ -224,6 +221,7 @@ export default {
|
||||||
Notify_all_in_this_room: 'Notifica todos os utilizadores nesta sala',
|
Notify_all_in_this_room: 'Notifica todos os utilizadores nesta sala',
|
||||||
Offline: 'Desligado',
|
Offline: 'Desligado',
|
||||||
Oops: 'Oops!',
|
Oops: 'Oops!',
|
||||||
|
Onboarding_title: 'Bem vindo(a) ao Rocket.Chat',
|
||||||
Online: 'Ligado',
|
Online: 'Ligado',
|
||||||
Only_authorized_users_can_write_new_messages: 'Apenas utilizadores autorizados podem escrever novas mensagens',
|
Only_authorized_users_can_write_new_messages: 'Apenas utilizadores autorizados podem escrever novas mensagens',
|
||||||
Open_emoji_selector: 'Abra o selector de emoticons',
|
Open_emoji_selector: 'Abra o selector de emoticons',
|
||||||
|
@ -341,7 +339,6 @@ export default {
|
||||||
Video_call: 'Video chamada',
|
Video_call: 'Video chamada',
|
||||||
Voice_call: 'Chamada de voz',
|
Voice_call: 'Chamada de voz',
|
||||||
Welcome: 'Bem vindo(a)',
|
Welcome: 'Bem vindo(a)',
|
||||||
Welcome_to_RocketChat: 'Bem vindo(a) ao Rocket.Chat',
|
|
||||||
Whats_your_2fa: 'Qual é o seu código 2FA?',
|
Whats_your_2fa: 'Qual é o seu código 2FA?',
|
||||||
Yes_action_it: 'Sim, {{action}}!',
|
Yes_action_it: 'Sim, {{action}}!',
|
||||||
Yesterday: 'Ontem',
|
Yesterday: 'Ontem',
|
||||||
|
|