Compare commits

...

17 Commits

Author SHA1 Message Date
Mattermost Build
cbee2449e2 Bump app build number to 418 (#6564) (#6565)
(cherry picked from commit 6119ac46e1)

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2022-08-11 09:06:35 -04:00
Mattermost Build
5bbf11ce33 [MM-38103] initialize select fields with the value (#5640) (#6548) 2022-08-04 16:59:35 -04:00
Mattermost Build
8e26b4b2b5 [MM-41749] Fixed SettingsSidebar component added back to navigation stack (#6503) (#6545)
Co-authored-by: Jean-Paul Manuel <jean-paulm@yoyowallet.com>
(cherry picked from commit 8cbf57781b)

Co-authored-by: Jean-Paul Manuel <jpmastermind@gmail.com>
2022-08-04 09:41:32 -04:00
Mattermost Build
19be35c343 Bump version to 1.55.0 and build to 416 (#6538) (#6539)
* Bump app version number to  1.55.0

* Bump app build number to  416

(cherry picked from commit c4620963fa)

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2022-08-03 13:59:43 -04:00
Mattermost Build
5c79b5152e Accept text shared with image on Android (#6324) (#6533)
(cherry picked from commit cd4dc9528b)

Co-authored-by: t0mm0 <dev@onairsoftware.co.uk>
2022-08-02 10:38:52 -04:00
Zef Hemel
8e4f19f3ea Update README to point to gekidou (#6509)
* Update README to point to gekidou

Few people realize that active development moved to that branch, so let's but a giant notice at the top of the readme.

* Update README.md

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2022-07-26 08:53:27 -04:00
Pierre JENICOT
7ccae88e6f Translated using Weblate (French)
Currently translated at 100.0% (791 of 791 strings)

Translation: mattermost-languages-shipped/mattermost-mobile
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/fr/
2022-07-26 15:53:15 +03:00
Tom De Moor
2234988b72 Deleted translation using Weblate (Vietnamese) 2022-07-26 15:53:15 +03:00
Weblate
94cfd0a74b Added translation using Weblate (Vietnamese) 2022-07-26 15:53:15 +03:00
Claudio Costa
9c2b5133ab [MM-43838] Calls: WebSocket reconnection support (#6497)
* WebSocket reconnection support

* Simplify

* Reposition code

* Return early if already closed
2022-07-25 18:19:55 +02:00
Christopher Poile
c1ce9260b7 handle peer destroyed error gracefully (#6479) 2022-07-21 10:49:10 -04:00
Zef Hemel
b0f6968d5c Merge pull request #6467 from weblate/weblate-mattermost-mattermost-mobile_master
Translations update from Mattermost Weblate
2022-07-12 11:41:43 +02:00
Tóth Csaba // Online ERP Hungary Kft
64a1a6838e Translated using Weblate (Hungarian)
Currently translated at 100.0% (791 of 791 strings)

Translation: mattermost-languages-shipped/mattermost-mobile
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/hu/
2022-07-11 12:03:16 +02:00
Ji-Hyeon Gim
a917d116b5 Translated using Weblate (Korean)
Currently translated at 100.0% (791 of 791 strings)

Translation: mattermost-languages-shipped/mattermost-mobile
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile_master/ko/
2022-07-11 13:03:12 +03:00
dependabot[bot]
4deaf8cb21 Bump shell-quote from 1.7.2 to 1.7.3 in /detox (#6445)
Bumps [shell-quote](https://github.com/substack/node-shell-quote) from 1.7.2 to 1.7.3.
- [Release notes](https://github.com/substack/node-shell-quote/releases)
- [Changelog](https://github.com/substack/node-shell-quote/blob/master/CHANGELOG.md)
- [Commits](https://github.com/substack/node-shell-quote/compare/v1.7.2...1.7.3)

---
updated-dependencies:
- dependency-name: shell-quote
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-06-30 09:15:00 -04:00
Elias Nahum
580c653704 Bump app version to 1.54.0 build 410 (#6444)
* Bump app version number to  1.54.0

* Bump app build number to  410
2022-06-30 09:06:20 -04:00
Claudio Costa
ed6daffa0c [MM-45001] Add support for generating short-lived TURN credentials (#6404)
* Generate TURN credentials if needed

* Reduce calls to getState
2022-06-30 10:06:21 +02:00
23 changed files with 601 additions and 453 deletions

View File

@@ -1,3 +1,6 @@
# Note: development on this repository has primarily moved to the `gekidou` branch
This `master` branch is mostly in maintenance mode while we're working to getting our "v2" (code named "gekidou") to the GA stage. To contribute check out the [gekidou](https://github.com/mattermost/mattermost-mobile/tree/gekidou) branch in this repository.
# Mattermost Mobile App
[![Mattermost](https://user-images.githubusercontent.com/7205829/136108314-75cd2e1f-4147-4cfa-a16c-9b3b0313ea25.png)](https://mattermost.com)

View File

@@ -131,8 +131,8 @@ android {
applicationId "com.mattermost.rnbeta"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 404
versionName "1.53.0"
versionCode 418
versionName "1.55.0"
multiDexEnabled = true
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'

View File

@@ -167,6 +167,11 @@ public class ShareModule extends ReactContextBaseJavaModule {
map.putString("type", type);
map.putBoolean("isString", false);
items.pushMap(map);
map = Arguments.createMap();
map.putString("value", extra);
map.putBoolean("isString", true);
items.pushMap(map);
}
} else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) {
ArrayList<Uri> uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);

View File

@@ -140,18 +140,16 @@ export function componentDidDisappearListener({componentId}) {
if (componentId === 'MainSidebar') {
EventEmitter.emit(NavigationTypes.MAIN_SIDEBAR_DID_CLOSE);
}
if (componentId === THREAD) {
if (EphemeralStore.hasModalsOpened()) {
for (const modal of EphemeralStore.navigationModalStack) {
const enableSwipe = {
modal: {
swipeToDismiss: true,
},
};
Navigation.mergeOptions(modal, enableSwipe);
}
} else if (componentId === 'SettingsSidebar') {
EventEmitter.emit(NavigationTypes.CLOSE_SETTINGS_SIDEBAR);
} else if (componentId === THREAD && EphemeralStore.hasModalsOpened()) {
for (const modal of EphemeralStore.navigationModalStack) {
const enableSwipe = {
modal: {
swipeToDismiss: true,
},
};
Navigation.mergeOptions(modal, enableSwipe);
}
}
}

View File

@@ -59,6 +59,13 @@ const ClientCalls = (superclass: any) => class extends superclass {
{method: 'post'},
);
};
genTURNCredentials = async () => {
return this.doFetch(
`${this.getCallsRoute()}/turn-credentials`,
{method: 'get'},
);
};
};
export default ClientCalls;

View File

@@ -17,7 +17,7 @@ import {WebsocketEvents} from '@constants';
import {ICEServersConfigs} from '@mmproducts/calls/store/types/calls';
import Peer from './simple-peer';
import WebSocketClient from './websocket';
import {WebSocketClient, wsReconnectionTimeoutErr} from './websocket';
export let client: any = null;
@@ -47,10 +47,14 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs
const ws = new WebSocketClient(Client4.getWebSocketUrl(), Client4.getToken());
const disconnect = () => {
if (!isClosed) {
ws.close();
if (isClosed) {
return;
}
isClosed = true;
ws.send('leave');
ws.close();
if (onCallEnd) {
onCallEnd.remove();
onCallEnd = null;
@@ -81,12 +85,19 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs
});
const mute = () => {
if (!peer) {
if (!peer || peer.destroyed) {
return;
}
if (voiceTrackAdded && voiceTrack) {
peer.replaceTrack(voiceTrack, null, stream);
try {
if (voiceTrackAdded && voiceTrack) {
peer.replaceTrack(voiceTrack, null, stream);
}
} catch (e) {
console.log('Error from simple-peer:', e); //eslint-disable-line no-console
return;
}
if (voiceTrack) {
voiceTrack.enabled = false;
}
@@ -96,15 +107,22 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs
};
const unmute = () => {
if (!peer || !voiceTrack) {
if (!peer || !voiceTrack || peer.destroyed) {
return;
}
if (voiceTrackAdded) {
peer.replaceTrack(voiceTrack, voiceTrack, stream);
} else {
peer.addStream(stream);
voiceTrackAdded = true;
try {
if (voiceTrackAdded) {
peer.replaceTrack(voiceTrack, voiceTrack, stream);
} else {
peer.addStream(stream);
voiceTrackAdded = true;
}
} catch (e) {
console.log('Error from simple-peer:', e); //eslint-disable-line no-console
return;
}
voiceTrack.enabled = true;
if (ws) {
ws.send('unmute');
@@ -124,13 +142,14 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs
};
ws.on('error', (err) => {
console.log('WS (CALLS) ERROR', err); // eslint-disable-line no-console
ws.close();
console.log('calls: ws error', err); // eslint-disable-line no-console
if (err === wsReconnectionTimeoutErr) {
disconnect();
}
});
ws.on('close', () => {
isClosed = true;
disconnect();
console.log('calls: ws close'); // eslint-disable-line no-console
});
ws.on('join', async () => {
@@ -156,14 +175,30 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs
});
peer.on('error', (err: any) => {
console.log('PEER ERROR', err); // eslint-disable-line no-console
console.log('calls: peer error', err); // eslint-disable-line no-console
});
peer.on('close', () => {
console.log('calls: peer closed'); // eslint-disable-line no-console
if (!isClosed) {
disconnect();
}
});
});
ws.on('open', async () => {
ws.send('join', {
channelID,
});
ws.on('open', (originalConnID: string, prevConnID: string, isReconnect: boolean) => {
if (isReconnect) {
console.log('calls: ws reconnect, sending reconnect msg'); // eslint-disable-line no-console
ws.send('reconnect', {
channelID,
originalConnID,
prevConnID,
});
} else {
ws.send('join', {
channelID,
});
}
});
ws.on('message', ({data}) => {

View File

@@ -202,7 +202,13 @@ export function joinCall(channelId: string, intl: typeof intlShape): ActionFunc
dispatch(setSpeakerphoneOn(false));
try {
ws = await newClient(channelId, getICEServersConfigs(getState()), () => {
const state = getState();
const iceConfigs = [...getICEServersConfigs(state)];
if (getConfig(state).NeedsTURNCredentials) {
iceConfigs.push(...await Client4.genTURNCredentials());
}
ws = await newClient(channelId, iceConfigs, () => {
dispatch(setSpeakerphoneOn(false));
dispatch({type: CallsTypes.RECEIVED_MYSELF_LEFT_CALL});
}, setScreenShareURL);

View File

@@ -66,6 +66,7 @@ export type ServerConfig = {
AllowEnableCalls: boolean;
DefaultEnabled: boolean;
MaxCallParticipants: number;
NeedsTURNCredentials: boolean;
sku_short_name: string;
last_retrieved_at: number;
}
@@ -76,8 +77,9 @@ export const DefaultServerConfig = {
AllowEnableCalls: false,
DefaultEnabled: false,
MaxCallParticipants: 0,
NeedsTURNCredentials: false,
sku_short_name: '',
last_retrieved_at: 0,
} as ServerConfig;
export type ICEServersConfigs = ConfigurationParamWithUrls[] | ConfigurationParamWithUrl[];
export type ICEServersConfigs = Array<ConfigurationParamWithUrls | ConfigurationParamWithUrl>;

View File

@@ -5,26 +5,55 @@ import {EventEmitter} from 'events';
import Calls from '@constants/calls';
import {encode} from '@msgpack/msgpack/dist';
export default class WebSocketClient extends EventEmitter {
private ws: WebSocket | null;
const wsMinReconnectRetryTimeMs = 1000; // 1 second
const wsReconnectionTimeout = 30000; // 30 seconds
const wsReconnectTimeIncrement = 500; // 0.5 seconds
export const wsReconnectionTimeoutErr = new Error('max disconnected time reached');
export class WebSocketClient extends EventEmitter {
private ws: WebSocket | null = null;
private wsURL: string;
private authToken: string;
private seqNo = 1;
private serverSeqNo = 0;
private connID = '';
private originalConnID = '';
private eventPrefix = `custom_${Calls.PluginId}`;
private lastDisconnect = 0;
private reconnectRetryTime = wsMinReconnectRetryTimeMs;
private closed = false;
constructor(connURL: string, authToken: string) {
constructor(wsURL: string, authToken: string) {
super();
this.wsURL = wsURL;
this.authToken = authToken;
this.init(false);
}
this.ws = new WebSocket(connURL, [], {headers: {authorization: `Bearer ${authToken}`}});
private init(isReconnect: boolean) {
if (this.closed) {
return;
}
this.ws = new WebSocket(`${this.wsURL}?connection_id=${this.connID}&sequence_number=${this.serverSeqNo}`, [], {headers: {authorization: `Bearer ${this.authToken}`}});
if (isReconnect) {
this.ws.onopen = () => {
this.lastDisconnect = 0;
this.reconnectRetryTime = wsMinReconnectRetryTimeMs;
this.emit('open', this.originalConnID, this.connID, true);
};
}
this.ws.onerror = (err) => {
this.emit('error', err);
this.ws = null;
this.close();
};
this.ws.onclose = () => {
this.ws = null;
this.close();
if (!this.closed) {
this.close();
}
};
this.ws.onmessage = ({data}) => {
@@ -35,7 +64,12 @@ export default class WebSocketClient extends EventEmitter {
try {
msg = JSON.parse(data);
} catch (err) {
console.log(err); // eslint-disable-line no-console
console.log('calls: ws msg parse error', err); // eslint-disable-line no-console
return;
}
if (msg) {
this.serverSeqNo = msg.seq + 1;
}
if (!msg || !msg.event || !msg.data) {
@@ -43,14 +77,22 @@ export default class WebSocketClient extends EventEmitter {
}
if (msg.event === 'hello') {
this.connID = msg.data.connection_id;
this.emit('open');
if (msg.data.connection_id !== this.connID) {
this.connID = msg.data.connection_id;
this.serverSeqNo = 0;
if (this.originalConnID === '') {
this.originalConnID = this.connID;
}
}
if (!isReconnect) {
this.emit('open', this.originalConnID, this.connID, false);
}
return;
} else if (!this.connID) {
return;
}
if (msg.data.connID !== this.connID) {
if (msg.data.connID !== this.connID && msg.data.connID !== this.originalConnID) {
return;
}
@@ -74,7 +116,6 @@ export default class WebSocketClient extends EventEmitter {
seq: this.seqNo++,
data,
};
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
if (binary) {
this.ws.send(encode(msg));
@@ -86,12 +127,35 @@ export default class WebSocketClient extends EventEmitter {
close() {
if (this.ws) {
this.closed = true;
this.ws.close();
this.ws = null;
this.seqNo = 1;
this.serverSeqNo = 0;
this.connID = '';
this.originalConnID = '';
} else {
this.emit('close');
const now = Date.now();
if (this.lastDisconnect === 0) {
this.lastDisconnect = now;
}
if ((now - this.lastDisconnect) >= wsReconnectionTimeout) {
this.closed = true;
this.emit('error', wsReconnectionTimeoutErr);
return;
}
setTimeout(() => {
if (!this.ws && !this.closed) {
this.init(true);
}
}, this.reconnectRetryTime);
this.reconnectRetryTime += wsReconnectTimeIncrement;
}
this.seqNo = 1;
this.connID = '';
this.emit('close');
}
state() {

View File

@@ -52,7 +52,34 @@ export default class AppsFormField extends React.PureComponent<Props, State> {
constructor(props: Props) {
super(props);
this.state = {};
let selected;
switch (props.field.type) {
case AppFieldTypes.STATIC_SELECT:
case AppFieldTypes.DYNAMIC_SELECT:
case AppFieldTypes.USER:
case AppFieldTypes.CHANNEL: {
const value = props.value as AppSelectOption[] | AppSelectOption | null;
if (value) {
if (Array.isArray(value)) {
selected = value.map((option) => {
return {
text: option.label,
value: option.value,
};
});
} else {
selected = {
text: value.label,
value: value.value,
};
}
}
}
}
this.state = {
selected,
};
}
handleAutocompleteSelect = (selected: DialogOption) => {

View File

@@ -41,7 +41,7 @@ class EphemeralStore {
addToNavigationComponentIdStack = (componentId) => {
const index = this.navigationComponentIdStack.indexOf(componentId);
if (index > 0) {
if (index >= 0) {
this.navigationComponentIdStack.slice(index, 1);
}

View File

@@ -39,6 +39,7 @@
"apps.error.parser.missing_list_end": "Marqeur de fin de liste attendu.",
"apps.error.parser.missing_quote": "Les doubles guillemets doivent être fermés avant la fin du champ de saisie.",
"apps.error.parser.missing_source": "Le formulaire n'a ni `submit` ni `source`.",
"apps.error.parser.missing_submit": "Aucun appel dans le lien ou le formulaire.",
"apps.error.parser.missing_tick": "Une marqueur de citation correspondant est attendu avant la fin du champ de saisie.",
"apps.error.parser.multiple_equal": "Les signes `=` multiples ne sont pas autorisés.",
"apps.error.parser.no_argument_pos_x": "Impossible d'identifier l'argument.",

View File

@@ -201,7 +201,7 @@
"gallery.open_file": "File megnyitása",
"gallery.unsuppored": "Az előnézet nem elérhető ennél a file típusnál",
"get_post_link_modal.title": "Link másolása",
"global_threads.allThreads": "Összes üzenetszálad",
"global_threads.allThreads": "Összes üzenetszál",
"global_threads.emptyThreads.message": "Minden olyan üzenetszál, amiben részt vettél vagy említésre kerültél fel lesz itt tüntetve azokkal együtt, amiket követsz.",
"global_threads.emptyThreads.title": "Nincsen követett üzenetszál",
"global_threads.emptyUnreads.message": "Úgy néz ki, mindent elolvastál.",

File diff suppressed because it is too large Load Diff

View File

@@ -7698,9 +7698,9 @@
}
},
"node_modules/shell-quote": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
"integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
"node_modules/signal-exit": {
@@ -14258,9 +14258,9 @@
"dev": true
},
"shell-quote": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
"integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
"signal-exit": {

View File

@@ -8,20 +8,20 @@ GEM
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.2.0)
aws-partitions (1.590.0)
aws-sdk-core (3.131.1)
aws-partitions (1.614.0)
aws-sdk-core (3.131.5)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.57.0)
aws-sdk-kms (1.58.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.114.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.5.0)
aws-sigv4 (1.5.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.1.0)
@@ -34,9 +34,9 @@ GEM
rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
dotenv (2.7.6)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.92.3)
excon (0.92.4)
faraday (1.10.0)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
@@ -56,8 +56,8 @@ GEM
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.0.3)
multipart-post (>= 1.2, < 3)
faraday-multipart (1.0.4)
multipart-post (~> 2)
faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
@@ -66,7 +66,7 @@ GEM
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.2.6)
fastlane (2.206.1)
fastlane (2.208.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -111,9 +111,9 @@ GEM
fastlane-plugin-find_replace_string (0.1.0)
fastlane-plugin-versioning_android (0.1.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.21.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-core (0.5.0)
google-apis-androidpublisher_v3 (0.25.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-core (0.7.0)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
@@ -122,27 +122,27 @@ GEM
retriable (>= 2.0, < 4.a)
rexml
webrick
google-apis-iamcredentials_v1 (0.10.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-playcustomapp_v1 (0.7.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-storage_v1 (0.14.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-iamcredentials_v1 (0.13.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-playcustomapp_v1 (0.10.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-storage_v1 (0.17.0)
google-apis-core (>= 0.7, < 2.a)
google-cloud-core (1.6.0)
google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.2.0)
google-cloud-storage (1.36.2)
google-cloud-storage (1.38.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.17.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.1.3)
googleauth (1.2.0)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
@@ -150,12 +150,12 @@ GEM
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
http-cookie (1.0.4)
http-cookie (1.0.5)
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.6.1)
json (2.6.2)
jwt (2.3.0)
jwt (2.4.1)
memoist (0.16.2)
mini_magick (4.11.0)
mini_mime (1.1.2)
@@ -164,7 +164,7 @@ GEM
multipart-post (2.0.0)
nanaimo (0.3.0)
naturally (2.2.1)
nokogiri (1.13.6)
nokogiri (1.13.8)
mini_portile2 (~> 2.8.0)
racc (~> 1.4)
optparse (0.1.1)
@@ -183,9 +183,9 @@ GEM
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
security (0.1.3)
signet (0.16.1)
signet (0.17.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.0)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
simctl (1.6.8)
@@ -203,11 +203,11 @@ GEM
uber (0.1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.8.1)
unf_ext (0.0.8.2)
unicode-display_width (1.8.0)
webrick (1.7.0)
word_wrap (1.0.0)
xcodeproj (1.21.0)
xcodeproj (1.22.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)

View File

@@ -911,7 +911,7 @@
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 404;
CURRENT_PROJECT_VERSION = 418;
DEAD_CODE_STRIPPING = NO;
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
ENABLE_BITCODE = NO;
@@ -953,7 +953,7 @@
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 404;
CURRENT_PROJECT_VERSION = 418;
DEAD_CODE_STRIPPING = NO;
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
ENABLE_BITCODE = NO;

View File

@@ -21,7 +21,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.53.0</string>
<string>1.55.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
@@ -37,7 +37,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>404</string>
<string>418</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>

View File

@@ -19,9 +19,9 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.53.0</string>
<string>1.55.0</string>
<key>CFBundleVersion</key>
<string>404</string>
<string>418</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>

View File

@@ -19,9 +19,9 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.53.0</string>
<string>1.55.0</string>
<key>CFBundleVersion</key>
<string>404</string>
<string>418</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "mattermost-mobile",
"version": "1.53.0",
"version": "1.55.0",
"lockfileVersion": 2,
"requires": true,
"packages": {

View File

@@ -1,6 +1,6 @@
{
"name": "mattermost-mobile",
"version": "1.53.0",
"version": "1.55.0",
"description": "Mattermost Mobile with React Native",
"repository": "git@github.com:mattermost/mattermost-mobile.git",
"author": "Mattermost, Inc.",

View File

@@ -168,7 +168,7 @@ declare module 'react-native-webrtc' {
}
export interface RTCPeerConnectionConfiguration {
iceServers: ConfigurationParamWithUrls[] | ConfigurationParamWithUrl[];
iceServers: Array<ConfigurationParamWithUrls | ConfigurationParamWithUrl>;
iceTransportPolicy?: 'all' | 'relay' | 'nohost' | 'none' | undefined;
bundlePolicy?: 'balanced' | 'max-compat' | 'max-bundle' | undefined;
rtcpMuxPolicy?: 'negotiate' | 'require' | undefined;