Compare commits

..

4 Commits
v1 ... v1.53.0

Author SHA1 Message Date
Mattermost Build
4b42271960 Bump version to 1.53.0 Build 404 (#6345) (#6347)
* Bump app version number to  1.53.0

* Bump app build number to  404

(cherry picked from commit cb1773bda5)

Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2022-06-03 11:33:45 -04:00
Mattermost Build
1e4e59b537 [MM-44651] Implement MaxCallParticipants config setting (#6334) (#6339)
* Implement MaxCallParticipants config setting

* Add test

(cherry picked from commit bb655c8c60)

Co-authored-by: Claudio Costa <cstcld91@gmail.com>
2022-06-03 09:05:57 +02:00
Mattermost Build
fe29459906 [MM-44155] Handle call_end event (#6316) (#6332)
* Handle call_end event

* exit call screen on call end; /call end for mobile

* handle permissions before sending cmd to server; handle error

Co-authored-by: Christopher Poile <cpoile@gmail.com>
(cherry picked from commit 23509cbb83)

Co-authored-by: Claudio Costa <cstcld91@gmail.com>
2022-06-02 13:50:07 +02:00
Mattermost Build
8985791f40 MM-44546 -- Calls: Cloud freemium limits (#6318) (#6331)
* remove API call to config/pass iceServers; leave call on ws error

* cloud limits

* fix makeStyleSheetFromTheme

* revert podfile & package-lock diffs

* update snapshots

* edge case of cloud server on calls 0.5.3

(cherry picked from commit c74cd14713)

Co-authored-by: Christopher Poile <cpoile@gmail.com>
2022-06-01 19:32:16 -04:00
75 changed files with 1593 additions and 2266 deletions

View File

@@ -286,6 +286,14 @@ jobs:
name: Post results to Mattermost
command: go run ../security-automation-config/dependency-check/post_results.go
build-android-beta:
executor: android
steps:
- build-android
- persist
- save:
filename: "*.apk"
build-android-release:
executor: android
steps:
@@ -325,6 +333,14 @@ jobs:
- save:
filename: "*.apk"
build-ios-beta:
executor: ios
steps:
- build-ios
- persist
- save:
filename: "*.ipa"
build-ios-release:
executor: ios
steps:
@@ -400,6 +416,16 @@ jobs:
target: android
file: "*.apk"
deploy-android-beta:
executor:
name: android
resource_class: medium
steps:
- deploy-to-store:
task: "Deploy to Google Play"
target: android
file: "*.apk"
deploy-ios-release:
executor: ios
steps:
@@ -408,6 +434,14 @@ jobs:
target: ios
file: "*.ipa"
deploy-ios-beta:
executor: ios
steps:
- deploy-to-store:
task: "Deploy to TestFlight"
target: ios
file: "*.ipa"
github-release:
executor:
name: android
@@ -451,6 +485,27 @@ workflows:
- /^build-android-\d+$/
- /^build-android-release-\d+$/
- build-android-beta:
context: mattermost-mobile-android-beta
requires:
- test
filters:
branches:
only:
- /^build-\d+$/
- /^build-android-\d+$/
- /^build-android-beta-\d+$/
- deploy-android-beta:
context: mattermost-mobile-android-beta
requires:
- build-android-beta
filters:
branches:
only:
- /^build-\d+$/
- /^build-android-\d+$/
- /^build-android-beta-\d+$/
- build-ios-release:
context: mattermost-mobile-ios-release
requires:
@@ -472,6 +527,27 @@ workflows:
- /^build-ios-\d+$/
- /^build-ios-release-\d+$/
- build-ios-beta:
context: mattermost-mobile-ios-beta
requires:
- test
filters:
branches:
only:
- /^build-\d+$/
- /^build-ios-\d+$/
- /^build-ios-beta-\d+$/
- deploy-ios-beta:
context: mattermost-mobile-ios-beta
requires:
- build-ios-beta
filters:
branches:
only:
- /^build-\d+$/
- /^build-ios-\d+$/
- /^build-ios-beta-\d+$/
- build-android-pr:
context: mattermost-mobile-android-pr
requires:
@@ -514,6 +590,7 @@ workflows:
only:
- /^build-\d+$/
- /^build-ios-\d+$/
- /^build-ios-beta-\d+$/
- /^build-ios-sim-\d+$/
- github-release:
@@ -525,4 +602,4 @@ workflows:
tags:
only: /^v(\d+\.)(\d+\.)(\d+)(.*)?$/
branches:
only: unsigned
only: unsigned

View File

@@ -1,13 +0,0 @@
name: "CodeQL config"
query-filters:
- exclude:
problem.severity:
- warning
- recommendation
- exclude:
id: js/insecure-randomness
paths-ignore:
- test
- '**/*.test.*'

View File

@@ -9,13 +9,8 @@ on:
schedule:
- cron: '0 0 * * 0'
permissions:
contents: read
jobs:
analyze:
permissions:
security-events: write
name: Analyze
runs-on: ubuntu-latest
@@ -23,20 +18,26 @@ jobs:
fail-fast: false
matrix:
language: [ 'javascript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql/codeql-config.yml
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
uses: github/codeql-action/autobuild@v1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v1

11
.gitignore vendored
View File

@@ -14,7 +14,7 @@ env.d.ts
# Xcode
#
ios/build/*
build/
*.pbxuser
!default.pbxuser
*.mode1v3
@@ -42,11 +42,7 @@ ios/Pods
.gradle
local.properties
*.iml
*.hprof
.cxx/
android/app/bin
android/app/build
android/build
.settings
.project
.classpath
@@ -107,8 +103,3 @@ detox/detox_pixel_4_xl_api_30
#editor-settings
.vscode
.scannerwork
# Notice.txt generation
!build/notice-file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,3 @@
# Note: development on this repository has primarily moved to the `main` branch
This `master`(now `v1`) 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 [main](https://github.com/mattermost/mattermost-mobile/tree/main) 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 436
versionName "1.56.0"
versionCode 404
versionName "1.53.0"
multiDexEnabled = true
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'

View File

@@ -8,6 +8,6 @@
android:usesCleartextTraffic="true"
tools:targetApi="28"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false" />
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>
</manifest>

View File

@@ -33,12 +33,10 @@
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:windowSoftInputMode="adjustResize"
android:launchMode="singleTask"
android:taskAffinity=""
android:exported="true"
>
android:taskAffinity="">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
@@ -74,9 +72,7 @@
android:screenOrientation="portrait"
android:theme="@style/AppTheme"
android:taskAffinity="com.mattermost.share"
android:launchMode="singleInstance"
android:exported="true"
>
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
@@ -95,4 +91,4 @@
<data android:mimeType="*/*" />
</intent>
</queries>
</manifest>
</manifest>

View File

@@ -22,7 +22,6 @@ import java.util.List;
import java.util.Map;
import com.wix.reactnativenotifications.core.notification.PushNotification;
import com.wix.reactnativenotifications.core.NotificationIntentAdapter;
import com.wix.reactnativenotifications.core.AppLaunchHelper;
import com.wix.reactnativenotifications.core.AppLifecycleFacade;
import com.wix.reactnativenotifications.core.JsIOHelper;
@@ -247,7 +246,7 @@ public class CustomPushNotification extends PushNotification {
}
private void buildNotification(Integer notificationId, boolean createSummary) {
final PendingIntent pendingIntent = NotificationIntentAdapter.createPendingNotificationIntent(mContext, mNotificationProps);
final PendingIntent pendingIntent = super.getCTAPendingIntent();
final Notification notification = buildNotification(pendingIntent);
if (createSummary) {
final Notification summary = getNotificationSummaryBuilder(pendingIntent).build();

View File

@@ -1,6 +1,5 @@
package com.mattermost.rnbeta;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -129,20 +128,11 @@ public class CustomPushNotificationHelper {
replyIntent.putExtra(NOTIFICATION_ID, notificationId);
replyIntent.putExtra("pushNotification", bundle);
PendingIntent replyPendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
replyPendingIntent = PendingIntent.getBroadcast(
context,
notificationId,
replyIntent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
} else {
replyPendingIntent = PendingIntent.getBroadcast(
context,
notificationId,
replyIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
}
PendingIntent replyPendingIntent = PendingIntent.getBroadcast(
context,
notificationId,
replyIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
.setLabel("Reply")
@@ -391,12 +381,10 @@ public class CustomPushNotificationHelper {
private static void setNotificationDeleteIntent(Context context, NotificationCompat.Builder notification, Bundle bundle, int notificationId) {
// Let's add a delete intent when the notification is dismissed
final String PUSH_NOTIFICATION_EXTRA_NAME = "pushNotification";
Intent delIntent = new Intent(context, NotificationDismissService.class);
PushNotificationProps notificationProps = new PushNotificationProps(bundle);
delIntent.putExtra(NOTIFICATION_ID, notificationId);
delIntent.putExtra(PUSH_NOTIFICATION_EXTRA_NAME, bundle);
@SuppressLint("UnspecifiedImmutableFlag")
PendingIntent deleteIntent = PendingIntent.getService(context, (int) System.currentTimeMillis(), delIntent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
PendingIntent deleteIntent = NotificationIntentAdapter.createPendingNotificationIntent(context, delIntent, notificationProps);
notification.setDeleteIntent(deleteIntent);
}

View File

@@ -129,8 +129,9 @@ public class NotificationReplyBroadcastReceiver extends BroadcastReceiver {
}
private void recreateNotification(int notificationId, final CharSequence message) {
final Intent cta = new Intent(mContext, ProxyService.class);
final PushNotificationProps notificationProps = new PushNotificationProps(bundle);
final PendingIntent pendingIntent = NotificationIntentAdapter.createPendingNotificationIntent(mContext, notificationProps);
final PendingIntent pendingIntent = NotificationIntentAdapter.createPendingNotificationIntent(mContext, cta, notificationProps);
NotificationCompat.Builder builder = CustomPushNotificationHelper.createNotificationBuilder(mContext, pendingIntent, bundle, false);
Notification notification = builder.build();
NotificationCompat.MessagingStyle messagingStyle = NotificationCompat.MessagingStyle.extractMessagingStyleFromNotification(notification);

View File

@@ -167,11 +167,6 @@ 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

@@ -1,5 +0,0 @@
cmake_minimum_required(VERSION 3.13)
# Define the library name here.
project(rndiffapp_appmodules)
# This file includes all the necessary to let you build your application with the New Architecture.
include(${REACT_ANDROID_DIR}/cmake-utils/ReactNative-application.cmake)

View File

@@ -1,32 +0,0 @@
#include "MainApplicationModuleProvider.h"
#include <rncli.h>
#include <rncore.h>
namespace facebook {
namespace react {
std::shared_ptr<TurboModule> MainApplicationModuleProvider(
const std::string &moduleName,
const JavaTurboModule::InitParams &params) {
// Here you can provide your own module provider for TurboModules coming from
// either your application or from external libraries. The approach to follow
// is similar to the following (for a library called `samplelibrary`:
//
// auto module = samplelibrary_ModuleProvider(moduleName, params);
// if (module != nullptr) {
// return module;
// }
// return rncore_ModuleProvider(moduleName, params);
// Module providers autolinked by RN CLI
auto rncli_module = rncli_ModuleProvider(moduleName, params);
if (rncli_module != nullptr) {
return rncli_module;
}
return rncore_ModuleProvider(moduleName, params);
}
} // namespace react
} // namespace facebook

View File

@@ -1,16 +0,0 @@
#pragma once
#include <memory>
#include <string>
#include <ReactCommon/JavaTurboModule.h>
namespace facebook {
namespace react {
std::shared_ptr<TurboModule> MainApplicationModuleProvider(
const std::string &moduleName,
const JavaTurboModule::InitParams &params);
} // namespace react
} // namespace facebook

View File

@@ -1,45 +0,0 @@
#include "MainApplicationTurboModuleManagerDelegate.h"
#include "MainApplicationModuleProvider.h"
namespace facebook {
namespace react {
jni::local_ref<MainApplicationTurboModuleManagerDelegate::jhybriddata>
MainApplicationTurboModuleManagerDelegate::initHybrid(
jni::alias_ref<jhybridobject>) {
return makeCxxInstance();
}
void MainApplicationTurboModuleManagerDelegate::registerNatives() {
registerHybrid({
makeNativeMethod(
"initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid),
makeNativeMethod(
"canCreateTurboModule",
MainApplicationTurboModuleManagerDelegate::canCreateTurboModule),
});
}
std::shared_ptr<TurboModule>
MainApplicationTurboModuleManagerDelegate::getTurboModule(
const std::string &name,
const std::shared_ptr<CallInvoker> &jsInvoker) {
// Not implemented yet: provide pure-C++ NativeModules here.
return nullptr;
}
std::shared_ptr<TurboModule>
MainApplicationTurboModuleManagerDelegate::getTurboModule(
const std::string &name,
const JavaTurboModule::InitParams &params) {
return MainApplicationModuleProvider(name, params);
}
bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule(
const std::string &name) {
return getTurboModule(name, nullptr) != nullptr ||
getTurboModule(name, {.moduleName = name}) != nullptr;
}
} // namespace react
} // namespace facebook

View File

@@ -1,38 +0,0 @@
#include <memory>
#include <string>
#include <ReactCommon/TurboModuleManagerDelegate.h>
#include <fbjni/fbjni.h>
namespace facebook {
namespace react {
class MainApplicationTurboModuleManagerDelegate
: public jni::HybridClass<
MainApplicationTurboModuleManagerDelegate,
TurboModuleManagerDelegate> {
public:
// Adapt it to the package you used for your Java class.
static constexpr auto kJavaDescriptor =
"Lcom/rndiffapp/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate;";
static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject>);
static void registerNatives();
std::shared_ptr<TurboModule> getTurboModule(
const std::string &name,
const std::shared_ptr<CallInvoker> &jsInvoker) override;
std::shared_ptr<TurboModule> getTurboModule(
const std::string &name,
const JavaTurboModule::InitParams &params) override;
/**
* Test-only method. Allows user to verify whether a TurboModule can be
* created by instances of this class.
*/
bool canCreateTurboModule(const std::string &name);
};
} // namespace react
} // namespace facebook

View File

@@ -1,65 +0,0 @@
#include "MainComponentsRegistry.h"
#include <CoreComponentsRegistry.h>
#include <fbjni/fbjni.h>
#include <react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h>
#include <react/renderer/components/rncore/ComponentDescriptors.h>
#include <rncli.h>
namespace facebook {
namespace react {
MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {}
std::shared_ptr<ComponentDescriptorProviderRegistry const>
MainComponentsRegistry::sharedProviderRegistry() {
auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry();
// Autolinked providers registered by RN CLI
rncli_registerProviders(providerRegistry);
// Custom Fabric Components go here. You can register custom
// components coming from your App or from 3rd party libraries here.
//
// providerRegistry->add(concreteComponentDescriptorProvider<
// AocViewerComponentDescriptor>());
return providerRegistry;
}
jni::local_ref<MainComponentsRegistry::jhybriddata>
MainComponentsRegistry::initHybrid(
jni::alias_ref<jclass>,
ComponentFactory *delegate) {
auto instance = makeCxxInstance(delegate);
auto buildRegistryFunction =
[](EventDispatcher::Weak const &eventDispatcher,
ContextContainer::Shared const &contextContainer)
-> ComponentDescriptorRegistry::Shared {
auto registry = MainComponentsRegistry::sharedProviderRegistry()
->createComponentDescriptorRegistry(
{eventDispatcher, contextContainer});
auto mutableRegistry =
std::const_pointer_cast<ComponentDescriptorRegistry>(registry);
mutableRegistry->setFallbackComponentDescriptor(
std::make_shared<UnimplementedNativeViewComponentDescriptor>(
ComponentDescriptorParameters{
eventDispatcher, contextContainer, nullptr}));
return registry;
};
delegate->buildRegistryFunction = buildRegistryFunction;
return instance;
}
void MainComponentsRegistry::registerNatives() {
registerHybrid({
makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid),
});
}
} // namespace react
} // namespace facebook

View File

@@ -2,11 +2,11 @@
buildscript {
ext {
buildToolsVersion = "31.0.0"
buildToolsVersion = "30.0.2"
minSdkVersion = 24
compileSdkVersion = 31
targetSdkVersion = 31
supportLibVersion = "31.0.0"
compileSdkVersion = 30
targetSdkVersion = 30
supportLibVersion = "28.0.0"
kotlinVersion = "1.5.30"
firebaseVersion = "21.0.0"
RNNKotlinVersion = kotlinVersion

View File

@@ -9,8 +9,9 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
# Default value: -Xmx1024m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.jvmargs=-Xmx2048M
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit

Binary file not shown.

View File

@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip

259
android/gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/bin/sh
#!/usr/bin/env sh
#
# Copyright © 2015-2021 the original authors.
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,113 +17,78 @@
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/}
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
MAX_FD="maximum"
warn () {
echo "$*"
} >&2
}
die () {
echo
echo "$*"
echo
exit 1
} >&2
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD=$JAVA_HOME/bin/java
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -132,7 +97,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -140,95 +105,79 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

View File

@@ -119,7 +119,12 @@ const ClientChannels = (superclass: any) => class extends superclass {
};
convertChannelToPrivate = async (channelId: string) => {
return this.updateChannelPrivacy(channelId, 'P');
analytics.trackAPI('api_channels_convert_to_private', {channel_id: channelId});
return this.doFetch(
`${this.getChannelRoute(channelId)}/convert`,
{method: 'post'},
);
};
updateChannelPrivacy = async (channelId: string, privacy: any) => {

View File

@@ -32,13 +32,12 @@ type Props = {
placeholder?: string;
dataSource?: string;
options?: DialogOption[];
selected?: DialogOption | DialogOption[] | null;
selected?: DialogOption | DialogOption[];
optional?: boolean;
showRequiredAsterisk?: boolean;
teammateNameDisplay?: string;
theme: Theme;
onSelected?: ((item: DialogOption) => void) | ((item: DialogOption[]) => void);
onClear?: () => void;
helpText?: string;
errorText?: string;
roundedBorders?: boolean;
@@ -48,7 +47,7 @@ type Props = {
type State = {
selectedText: string;
selected?: DialogOption | DialogOption[] | null;
selected?: DialogOption | DialogOption[];
}
export default class AutocompleteSelector extends PureComponent<Props, State> {
@@ -71,15 +70,7 @@ export default class AutocompleteSelector extends PureComponent<Props, State> {
}
static getDerivedStateFromProps(props: Props, state: State) {
if (props.selected === state.selected) {
return null;
}
if (!props.selected) {
if (state.selected) {
return {selected: props.selected};
}
if (!props.selected || props.selected === state.selected) {
return null;
}
@@ -108,11 +99,6 @@ export default class AutocompleteSelector extends PureComponent<Props, State> {
};
}
handleClear = () => {
this.setState({selectedText: ''});
this.props.onClear?.();
};
handleSelect = (selected: Selection) => {
if (!selected) {
return;
@@ -244,14 +230,14 @@ export default class AutocompleteSelector extends PureComponent<Props, State> {
showRequiredAsterisk,
roundedBorders,
disabled,
selected,
onClear,
} = this.props;
const {selectedText} = this.state;
const style = getStyleSheet(theme);
const textStyles = getMarkdownTextStyles(theme);
const blockStyles = getMarkdownBlockStyles(theme);
const chevron = Platform.select({ios: 'chevron-right', default: 'chevron-down'});
let text = placeholder || intl.formatMessage({id: 'mobile.action_menu.select', defaultMessage: 'Select an option'});
let selectedStyle = style.dropdownPlaceholder;
@@ -340,21 +326,11 @@ export default class AutocompleteSelector extends PureComponent<Props, State> {
>
{text}
</Text>
{!disabled && onClear && selected && (
<TouchableWithFeedback
type={'opacity'}
onPress={this.handleClear}
disabled={disabled}
style={style.clearx}
hitSlop={clearXHitSlop}
>
<CompassIcon
name='close-circle'
color={changeOpacity(theme.centerChannelColor, 0.5)}
size={20}
/>
</TouchableWithFeedback>
)}
<CompassIcon
name={chevron}
color={changeOpacity(theme.centerChannelColor, 0.32)}
style={style.icon}
/>
</View>
</TouchableWithFeedback>
{helpTextContent}
@@ -390,21 +366,18 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => {
dropdownPlaceholder: {
top: 3,
marginLeft: 5,
paddingRight: 55,
color: changeOpacity(theme.centerChannelColor, 0.5),
},
dropdownSelected: {
top: 3,
marginLeft: 5,
paddingRight: 55,
color: theme.centerChannelColor,
},
clearx: {
icon: {
position: 'absolute',
top: 1,
right: 5,
padding: 8,
marginRight: 7,
top: 6,
right: 12,
fontSize: 28,
},
labelContainer: {
flexDirection: 'row',
@@ -446,10 +419,3 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => {
},
};
});
const clearXHitSlop = {
left: 30,
right: 20,
top: 20,
bottom: 20,
};

View File

@@ -1,7 +1,7 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {useCallback} from 'react';
import React from 'react';
import AutocompleteSelector from '@components/autocomplete_selector';
import {PostActionOption} from '@mm-redux/types/integration_actions';
@@ -28,13 +28,13 @@ const ActionMenu = ({dataSource, defaultOption, disabled, id, name, options, pos
isSelected = selected;
}
const handleSelect = useCallback((selectedItem?: PostActionOption) => {
const handleSelect = (selectedItem?: PostActionOption) => {
if (!selectedItem) {
return;
}
selectAttachmentMenuAction(postId, id, selectedItem.text, selectedItem.value);
}, [postId, id]);
};
return (
<AutocompleteSelector

View File

@@ -38,7 +38,6 @@ export default class RemoveMarkdown extends React.PureComponent {
channelLink: Renderer.forwardChildren,
emoji: this.renderNull,
hashtag: Renderer.forwardChildren,
latexinline: Renderer.forwardChildren,
paragraph: Renderer.forwardChildren,
heading: Renderer.forwardChildren,

View File

@@ -140,16 +140,18 @@ export function componentDidDisappearListener({componentId}) {
if (componentId === 'MainSidebar') {
EventEmitter.emit(NavigationTypes.MAIN_SIDEBAR_DID_CLOSE);
} 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);
}
if (componentId === THREAD) {
if (EphemeralStore.hasModalsOpened()) {
for (const modal of EphemeralStore.navigationModalStack) {
const enableSwipe = {
modal: {
swipeToDismiss: true,
},
};
Navigation.mergeOptions(modal, enableSwipe);
}
}
}
}

View File

@@ -277,7 +277,7 @@ describe('Actions.Channels', () => {
it('convertChannelToPrivate', async () => {
const publicChannel = TestHelper.basicChannel;
nock(Client4.getChannelRoute(publicChannel.id)).
put('/privacy').
post('/convert').
reply(200, {...TestHelper.basicChannel, type: General.PRIVATE_CHANNEL});
assert.equal(TestHelper.basicChannel.type, General.OPEN_CHANNEL);

View File

@@ -150,7 +150,7 @@ export type AppForm = {
depends_on?: string[];
};
export type AppFormValue = string | AppSelectOption | AppSelectOption[] | boolean | null;
export type AppFormValue = string | AppSelectOption | boolean | null;
export type AppFormValues = {[name: string]: AppFormValue};
export type AppSelectOption = {

View File

@@ -59,13 +59,6 @@ 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

@@ -14,16 +14,15 @@ import {
import {Client4} from '@client/rest';
import {WebsocketEvents} from '@constants';
import {ICEServersConfigs} from '@mmproducts/calls/store/types/calls';
import Peer from './simple-peer';
import {WebSocketClient, wsReconnectionTimeoutErr} from './websocket';
import WebSocketClient from './websocket';
export let client: any = null;
const websocketConnectTimeout = 3000;
export async function newClient(channelID: string, iceServers: ICEServersConfigs, closeCb: () => void, setScreenShareURL: (url: string) => void) {
export async function newClient(channelID: string, iceServers: string[], closeCb: () => void, setScreenShareURL: (url: string) => void) {
let peer: Peer | null = null;
let stream: MediaStream;
let voiceTrackAdded = false;
@@ -44,17 +43,13 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs
console.log('Unable to get media device:', err); // eslint-disable-line no-console
}
const ws = new WebSocketClient(Client4.getWebSocketUrl(), Client4.getToken());
const ws = new WebSocketClient(Client4.getWebSocketUrl());
const disconnect = () => {
if (isClosed) {
return;
if (!isClosed) {
ws.close();
}
isClosed = true;
ws.send('leave');
ws.close();
if (onCallEnd) {
onCallEnd.remove();
onCallEnd = null;
@@ -85,19 +80,12 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs
});
const mute = () => {
if (!peer || peer.destroyed) {
if (!peer) {
return;
}
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 (voiceTrackAdded && voiceTrack) {
peer.replaceTrack(voiceTrack, null, stream);
}
if (voiceTrack) {
voiceTrack.enabled = false;
}
@@ -107,22 +95,15 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs
};
const unmute = () => {
if (!peer || !voiceTrack || peer.destroyed) {
if (!peer || !voiceTrack) {
return;
}
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;
if (voiceTrackAdded) {
peer.replaceTrack(voiceTrack, voiceTrack, stream);
} else {
peer.addStream(stream);
voiceTrackAdded = true;
}
voiceTrack.enabled = true;
if (ws) {
ws.send('unmute');
@@ -142,14 +123,13 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs
};
ws.on('error', (err) => {
console.log('calls: ws error', err); // eslint-disable-line no-console
if (err === wsReconnectionTimeoutErr) {
disconnect();
}
console.log('WS (CALLS) ERROR', err); // eslint-disable-line no-console
ws.close();
});
ws.on('close', () => {
console.log('calls: ws close'); // eslint-disable-line no-console
isClosed = true;
disconnect();
});
ws.on('join', async () => {
@@ -175,35 +155,19 @@ export async function newClient(channelID: string, iceServers: ICEServersConfigs
});
peer.on('error', (err: any) => {
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();
}
console.log('PEER ERROR', err); // eslint-disable-line no-console
});
});
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('open', async () => {
ws.send('join', {
channelID,
});
});
ws.on('message', ({data}) => {
const msg = JSON.parse(data);
if (msg.type === 'answer' || msg.type === 'candidate' || msg.type === 'offer') {
if (msg.type === 'answer' || msg.type === 'offer') {
peer?.signal(data);
}
});

View File

@@ -21,8 +21,6 @@ import {
} from 'react-native-webrtc';
import stream from 'readable-stream';
import {ICEServersConfigs} from '@mmproducts/calls/store/types/calls';
const queueMicrotask = (callback: any) => {
Promise.resolve().then(callback).catch((e) => setTimeout(() => {
throw e;
@@ -96,7 +94,7 @@ export default class Peer extends stream.Duplex {
private pc: RTCPeerConnection|null = null;
private onFinishBound?: () => void;
constructor(localStream: MediaStream | null, iceServers: ICEServersConfigs) {
constructor(localStream: MediaStream | null, iceServers?: string[]) {
super({allowHalfOpen: false});
this.streams = localStream ? [localStream] : [];
@@ -106,10 +104,21 @@ export default class Peer extends stream.Duplex {
};
const connConfig = {
iceServers,
iceServers: [
{
urls: [
'stun:stun.l.google.com:19302',
'stun:global.stun.twilio.com:3478',
],
},
],
sdpSemantics: 'unified-plan',
};
if (iceServers && iceServers.length > 0) {
connConfig.iceServers[0].urls = iceServers;
}
try {
this.pc = new RTCPeerConnection(connConfig);
} catch (err) {

View File

@@ -34,10 +34,7 @@ jest.mock('@client/rest', () => ({
},
]),
getCallsConfig: jest.fn(() => ({
ICEServersConfigs: [{
urls: 'stun:stun1.example.com',
},
],
ICEServers: ['mattermost.com'],
AllowEnableCalls: true,
DefaultEnabled: true,
last_retrieved_at: 1234,

View File

@@ -28,7 +28,6 @@ import CallsTypes from '@mmproducts/calls/store/action_types/calls';
import {
getCallInCurrentChannel,
getConfig,
getICEServersConfigs,
getNumCurrentConnectedParticipants,
} from '@mmproducts/calls/store/selectors/calls';
import {Call, CallParticipant, DefaultServerConfig} from '@mmproducts/calls/store/types/calls';
@@ -202,13 +201,7 @@ export function joinCall(channelId: string, intl: typeof intlShape): ActionFunc
dispatch(setSpeakerphoneOn(false));
try {
const state = getState();
const iceConfigs = [...getICEServersConfigs(state)];
if (getConfig(state).NeedsTURNCredentials) {
iceConfigs.push(...await Client4.genTURNCredentials());
}
ws = await newClient(channelId, iceConfigs, () => {
ws = await newClient(channelId, getConfig(getState()).ICEServers, () => {
dispatch(setSpeakerphoneOn(false));
dispatch({type: CallsTypes.RECEIVED_MYSELF_LEFT_CALL});
}, setScreenShareURL);

View File

@@ -408,7 +408,7 @@ describe('Reducers.calls.config', () => {
const testAction = {
type: CallsTypes.RECEIVED_CONFIG,
data: {
ICEServers: ['stun:stun.example.com'],
ICEServers: ['google.com'],
AllowEnableCalls: true,
DefaultEnabled: true,
last_retrieved_at: 123,

View File

@@ -197,47 +197,4 @@ describe('Selectors.Calls', () => {
// On cloud, MaxCallParticipants missing, default should be used.
assert.equal(Selectors.isLimitRestricted(newState, 'call1'), true);
});
it('getICEServersConfigs', () => {
assert.deepEqual(Selectors.getICEServersConfigs(testState), []);
// backwards compatible case, no ICEServersConfigs present.
let newState = {
...testState,
entities: {
...testState.entities,
calls: {
...testState.entities.calls,
config: {
...testState.entities.calls.config,
ICEServers: ['stun:stun1.example.com'],
},
},
},
};
assert.deepEqual(Selectors.getICEServersConfigs(newState), [{urls: ['stun:stun1.example.com']}]);
// ICEServersConfigs defined case
newState = {
...testState,
entities: {
...testState.entities,
calls: {
...testState.entities.calls,
config: {
...testState.entities.calls.config,
ICEServers: ['stun:stun1.example.com'],
ICEServersConfigs: [
{urls: 'stun:stun1.example.com'},
{urls: 'turn:turn.example.com', username: 'username', credentail: 'password'},
],
},
},
},
};
assert.deepEqual(Selectors.getICEServersConfigs(newState), [
{urls: 'stun:stun1.example.com'},
{urls: 'turn:turn.example.com', username: 'username', credentail: 'password'},
]);
});
});

View File

@@ -9,7 +9,7 @@ import {getCurrentChannelId} from '@mm-redux/selectors/entities/common';
import {getLicense, getServerVersion} from '@mm-redux/selectors/entities/general';
import {GlobalState} from '@mm-redux/types/store';
import {isMinimumServerVersion} from '@mm-redux/utils/helpers';
import {Call, ICEServersConfigs} from '@mmproducts/calls/store/types/calls';
import {Call} from '@mmproducts/calls/store/types/calls';
export function getConfig(state: GlobalState) {
return state.entities.calls.config;
@@ -114,25 +114,3 @@ export const isLimitRestricted: (state: GlobalState, channelId?: string) => bool
return max !== 0 && numParticipants >= max;
},
);
export const getICEServersConfigs: (state: GlobalState) => ICEServersConfigs = createSelector(
getConfig,
(config) => {
// if ICEServersConfigs is set, we can trust this to be complete and
// coming from an updated API.
if (config.ICEServersConfigs?.length > 0) {
return config.ICEServersConfigs;
}
// otherwise we revert to using the now deprecated field.
if (config.ICEServers?.length > 0) {
return [
{
urls: config.ICEServers,
},
];
}
return [];
},
);

View File

@@ -1,8 +1,6 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {ConfigurationParamWithUrls, ConfigurationParamWithUrl} from 'react-native-webrtc';
import {UserProfile} from '@mm-redux/types/users';
import {Dictionary} from '@mm-redux/types/utilities';
@@ -62,24 +60,18 @@ export type VoiceEventData = {
export type ServerConfig = {
ICEServers: string[];
ICEServersConfigs: ICEServersConfigs;
AllowEnableCalls: boolean;
DefaultEnabled: boolean;
MaxCallParticipants: number;
NeedsTURNCredentials: boolean;
sku_short_name: string;
last_retrieved_at: number;
}
export const DefaultServerConfig = {
ICEServers: [],
ICEServersConfigs: [],
AllowEnableCalls: false,
DefaultEnabled: false,
MaxCallParticipants: 0,
NeedsTURNCredentials: false,
sku_short_name: '',
last_retrieved_at: 0,
} as ServerConfig;
export type ICEServersConfigs = Array<ConfigurationParamWithUrls | ConfigurationParamWithUrl>;

View File

@@ -5,55 +5,25 @@ import {EventEmitter} from 'events';
import Calls from '@constants/calls';
import {encode} from '@msgpack/msgpack/dist';
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;
export default class WebSocketClient extends EventEmitter {
private ws: WebSocket | null;
private seqNo = 0;
private connID = '';
private originalConnID = '';
private eventPrefix = `custom_${Calls.PluginId}`;
private lastDisconnect = 0;
private reconnectRetryTime = wsMinReconnectRetryTimeMs;
private closed = false;
constructor(wsURL: string, authToken: string) {
constructor(connURL: string) {
super();
this.wsURL = wsURL;
this.authToken = authToken;
this.init(false);
}
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 = new WebSocket(connURL);
this.ws.onerror = (err) => {
this.emit('error', err);
this.ws = null;
this.close();
};
this.ws.onclose = () => {
this.ws = null;
if (!this.closed) {
this.close();
}
this.close();
};
this.ws.onmessage = ({data}) => {
@@ -64,12 +34,7 @@ export class WebSocketClient extends EventEmitter {
try {
msg = JSON.parse(data);
} catch (err) {
console.log('calls: ws msg parse error', err); // eslint-disable-line no-console
return;
}
if (msg) {
this.serverSeqNo = msg.seq + 1;
console.log(err); // eslint-disable-line no-console
}
if (!msg || !msg.event || !msg.data) {
@@ -77,22 +42,14 @@ export class WebSocketClient extends EventEmitter {
}
if (msg.event === 'hello') {
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);
}
this.connID = msg.data.connection_id;
this.emit('open');
return;
} else if (!this.connID) {
return;
}
if (msg.data.connID !== this.connID && msg.data.connID !== this.originalConnID) {
if (msg.data.connID !== this.connID) {
return;
}
@@ -127,35 +84,12 @@ export 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 = 0;
this.connID = '';
this.emit('close');
}
state() {

View File

@@ -26,12 +26,12 @@ export type Props = {
theme: Theme;
value: AppFormValue;
onChange: (name: string, value: AppFormValue) => void;
onChange: (name: string, value: string | AppSelectOption | AppSelectOption[] | boolean) => void;
performLookup: (name: string, userInput: string) => Promise<AppSelectOption[]>;
}
type State = {
selected?: DialogOption | DialogOption[] | null;
selected?: DialogOption | DialogOption[];
}
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => {
@@ -52,34 +52,7 @@ export default class AppsFormField extends React.PureComponent<Props, State> {
constructor(props: Props) {
super(props);
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,
};
this.state = {};
}
handleAutocompleteSelect = (selected: DialogOption) => {
@@ -100,15 +73,6 @@ export default class AppsFormField extends React.PureComponent<Props, State> {
this.props.onChange(field.name, selectedOption);
};
handleClear = () => {
const {field, onChange} = this.props;
const selected = null;
this.setState({selected});
onChange(field.name, selected);
};
handleMultioptionAutocompleteSelect = (selected: DialogOption[]) => {
if (!selected) {
return;
@@ -246,7 +210,6 @@ export default class AppsFormField extends React.PureComponent<Props, State> {
dataSource={dataSource}
options={options}
optional={!field.is_required}
onClear={this.handleClear}
onSelected={field.multiselect ? this.handleMultioptionAutocompleteSelect : this.handleAutocompleteSelect}
getDynamicOptions={this.getDynamicOptions}
helpText={field.description}

View File

@@ -54,13 +54,6 @@ export default class DialogElement extends PureComponent {
onChange(name, newValue);
};
handleClear = () => {
const {name, onChange} = this.props;
this.setState({selected: null});
onChange(name, null);
};
handleAutocompleteSelect = (selected) => {
if (!selected) {
return;
@@ -141,7 +134,6 @@ export default class DialogElement extends PureComponent {
options={options}
optional={optional}
onSelected={this.handleAutocompleteSelect}
onClear={this.handleClear}
helpText={helpText}
errorText={errorText}
placeholder={placeholder}

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

@@ -3,7 +3,6 @@
import {Linking} from 'react-native';
import TestHelper from '@test/test_helper';
import * as UrlUtils from '@utils/url';
/* eslint-disable max-nested-callbacks */
@@ -153,8 +152,7 @@ describe('UrlUtils', () => {
const onError = jest.fn();
const onSuccess = jest.fn();
UrlUtils.tryOpenURL(url, onError, onSuccess);
await TestHelper.wait(200);
await UrlUtils.tryOpenURL(url, onError, onSuccess);
expect(onError).toHaveBeenCalledTimes(1);
expect(onSuccess).not.toHaveBeenCalled();
});

View File

@@ -96,7 +96,7 @@
"channel_modal.headerHelp": "Der Text, der in der Kopfzeile des Kanals neben dem Namen steht. Zum Beispiel könntest Du häufig genutzte Links durch Hinzufügen von [Link Titel](http://example.de) anzeigen lassen.",
"channel_modal.name": "Name",
"channel_modal.nameEx": "Z.B.: \"Bugs\", \"Marketing\", \"客户支持\"",
"channel_modal.optional": "(optional)",
"channel_modal.optional": "(wahlweise)",
"channel_modal.purpose": "Zweck",
"channel_modal.purposeEx": "Z.B.: \"Ein Kanal um Fehler und Verbesserungsvorschläge abzulegen\"",
"channel_modal.type.private": "Privater Kanal",
@@ -115,7 +115,7 @@
"combined_system_message.added_to_channel.two": "{firstUser} und {secondUser} wurden durch {actor} **zum Kanal hinzugefügt**.",
"combined_system_message.added_to_team.many_expanded": "{users} und {lastUser} wurden durch {actor} **zum Team hinzugefügt**.",
"combined_system_message.added_to_team.one": "{firstUser} wurde durch {actor} **zum Team hinzugefügt**.",
"combined_system_message.added_to_team.one_you": "Du wurdest durch {actor} **zum Team hinzugefügt**.",
"combined_system_message.added_to_team.one_you": "Du wurden durch {actor} **zum Team hinzugefügt**.",
"combined_system_message.added_to_team.two": "{firstUser} und {secondUser} wurden durch {actor} **zum Team hinzugefügt**.",
"combined_system_message.joined_channel.many_expanded": "{users} und {lastUser} **sind dem Kanal beigetreten**.",
"combined_system_message.joined_channel.one": "{firstUser} **ist dem Kanal beigetreten**.",
@@ -683,11 +683,11 @@
"permalink.show_dialog_warn.description": "Du bist dabei, \"{channel}\" beizutreten ohne explizit durch den Kanaladministrator hinzugefügt worden zu sein. Bist Du sicher, dass du diesem privaten Kanal beitreten willst?",
"permalink.show_dialog_warn.join": "Beitreten",
"permalink.show_dialog_warn.title": "Privatem Kanal beitreten",
"post_body.check_for_out_of_channel_groups_mentions.message": "wurde durch diese Erwähnung nicht benachrichtigt, da sie sich nicht im Kanal befinden. Sie sind auch keine Mitglieder der mit diesem Kanal verknüpften Gruppen.",
"post_body.check_for_out_of_channel_groups_mentions.message": "wurde durch diese Erwähnung nicht benachrichtigt, da sich der Benutzer nicht im Kanal befindet. Er kann dem Kanal nicht hinzugefügt werden, da er nicht Mitglied der verknüpften Gruppen ist. Um ihn zu diesem Kanal hinzuzufügen, muss er zu den verknüpften Gruppen hinzugefügt werden.",
"post_body.check_for_out_of_channel_mentions.link.and": " und ",
"post_body.check_for_out_of_channel_mentions.link.private": "sie zu diesem privaten Kanal hinzufügen",
"post_body.check_for_out_of_channel_mentions.link.public": "ihn/sie zu diesem Kanal hinzufügen",
"post_body.check_for_out_of_channel_mentions.message.multiple": "wurden erwähnt, sind aber nicht im Kanal. Möchtest Du ",
"post_body.check_for_out_of_channel_mentions.link.public": "sie zu diesem Kanal hinzufügen",
"post_body.check_for_out_of_channel_mentions.message.multiple": "wurde durch diese Erwähnung nicht benachrichtigt, da der Benutzer sich nicht im Kanal befindet. Möchtest Du ",
"post_body.check_for_out_of_channel_mentions.message.one": "wurde durch diese Erwähnung nicht benachrichtigt, da der Benutzer sich nicht im Kanal befindet. Möchtest Du ",
"post_body.check_for_out_of_channel_mentions.message_last": "? Sie werden Zugriff auf den Nachrichtenverlauf haben.",
"post_body.commentedOn": "Kommentierte auf {name}{apostrophe} Nachricht: ",

View File

@@ -26,7 +26,7 @@
"apps.error.form.no_lookup": "No se ha definido el término \"búsqueda\".",
"apps.error.form.no_source": "La \"fuente\" no está definida.",
"apps.error.form.no_submit": "`enviar` no está definido",
"apps.error.form.refresh": "Se ha producido un error en la obtención de los campos seleccionados. Póngase en contacto con el desarrollador de la aplicación. Detalles: {details}",
"apps.error.form.refresh": "Se ha producido un error en la obtención de los campos seleccionados. Póngase en contacto con el desarrollador de la aplicación. Detalles: {detalles}",
"apps.error.form.refresh_no_refresh": "Llamada de refresco en un campo no refrescado.",
"apps.error.form.submit.pretext": "Se ha producido un error al enviar el modal. Póngase en contacto con el desarrollador de la aplicación. Detalles: {details}",
"apps.error.lookup.error_preparing_request": "Error al preparar la solicitud de búsqueda: {errorMessage}",
@@ -276,7 +276,7 @@
"mobile.alert_dialog.alertCancel": "Cancelar",
"mobile.android.back_handler_exit": "Presione de nuevo para salir",
"mobile.android.photos_permission_denied_description": "Para cargar imágenes desde tu biblioteca, por favor, cambia la configuración de permisos.",
"mobile.android.photos_permission_denied_title": "{applicationName} desea acceder a tus fotos",
"mobile.android.photos_permission_denied_title": "Acceso a la biblioteca de fotos es necesario",
"mobile.android.videos_permission_denied_description": "Para subir los vídeos de tu biblioteca, por favor, cambia la configuración de permisos.",
"mobile.android.videos_permission_denied_title": "Acceso a la biblioteca de vídeos es necesario",
"mobile.announcement_banner.title": "Anuncio",
@@ -388,7 +388,7 @@
"mobile.intro_messages.default_message": "Es es el primer canal que tus compañeros ven cuando se registran - puedes utilizarlo para enviar mensajes que todos deben leer.",
"mobile.intro_messages.default_welcome": "¡Bienvenido a {name}!",
"mobile.ios.photos_permission_denied_description": "Para guardar imágenes y vídeos en tu librería, por favor, cambia la configuración de permisos.",
"mobile.ios.photos_permission_denied_title": "{applicationName} desea acceder a tu librería de fotos",
"mobile.ios.photos_permission_denied_title": "Acceso a la biblioteca de fotos es necesario",
"mobile.join_channel.error": "No pudimos unirnos al canal {displayName}. Por favor revisa tu conexión e intenta de nuevo.",
"mobile.link.error.text": "No se pudo abrir el enlace.",
"mobile.link.error.title": "Error",
@@ -510,10 +510,10 @@
"mobile.post_textbox.entire_channel.cancel": "Cancelar",
"mobile.post_textbox.entire_channel.confirm": "Confirmar",
"mobile.post_textbox.entire_channel.message": "Al utilizar @all ó @channel estás a punto de enviar notificaciones a {totalMembers, number} {totalMembers, plural, one {persona} other {personas}}. ¿Estás seguro de querer hacer esto?",
"mobile.post_textbox.entire_channel.message.with_timezones": "Al utilizar @all ó @channel estás a punto de enviar notificaciones a {totalMembers, number} {totalMembers, plural, one {persona} other {personas}} en {timezones, number} {timezones, plural, one {zona horaria} other {zonas horarias}}. ¿Estás seguro de querer hacer esto?",
"mobile.post_textbox.entire_channel.message.with_timezones": "Al utilizar @all ó @channel estás a punto de enviar notificaciones a {totalMembers, number} {totalMembers, plural, one {persona} other {personas}} en {timezones, number} {zonas horarias, plural, one {zona horaria} other {zonas horarias}}. ¿Estás seguro de querer hacer esto?",
"mobile.post_textbox.entire_channel.title": "Confirma el envío de notificaciones a todo el canal",
"mobile.post_textbox.entire_channel_here.message": "Al utilizar @here estás a punto de enviar notificaciones a {totalMembers, number} {totalMembers, plural, one {persona} other {personas}}. ¿Estás seguro de querer hacer esto?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "Al utilizar @here estás a punto de enviar notificaciones a {totalMembers, number} {totalMembers, plural, one {persona} other {personas}} en {timezones, number} {timezones, plural, one {zona horaria} other {zonas horarias}}. ¿Estás seguro de querer hacer esto?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "Al utilizar @here estás a punto de enviar notificaciones a {totalMembers, number} {totalMembers, plural, one {persona} other {personas}} en {timezones, number} {zonas horarias, plural, one {zona horaria} other {zonas horarias}}. ¿Estás seguro de querer hacer esto?",
"mobile.post_textbox.groups.title": "Confirma el envío de notificaciones a grupos",
"mobile.post_textbox.multi_group.message.with_timezones": "Al utilizar {mentions} y {finalMention} estás a punto de enviar notificaciones al menos a {totalMembers} personas en {timezones, number} {timezones, plural, one {zona horaria} other {zonas horarias}}. ¿Estás seguro?",
"mobile.post_textbox.multi_group.message.without_timezones": "Al utilizar {mentions} y {finalMention} estás a punto de enviar notificaciones al menos a {totalMembers} personas. ¿Estás seguro?",
@@ -690,7 +690,7 @@
"post_body.check_for_out_of_channel_mentions.message.multiple": "fueron mencionados pero no son parte de este canal. Quieres ",
"post_body.check_for_out_of_channel_mentions.message.one": "fue mencionado pero no es parte de este canal. Quieres ",
"post_body.check_for_out_of_channel_mentions.message_last": "? Tendrán acceso al historial de mensajes.",
"post_body.commentedOn": "Comentado en el mensaje de {name}{apostrophe}: ",
"post_body.commentedOn": "Comento en el mensaje de {name}: ",
"post_body.deleted": "(mensaje eliminado)",
"post_info.auto_responder": "RESPUESTA AUTOMÁTICA",
"post_info.bot": "BOT",
@@ -702,8 +702,8 @@
"posts_view.newMsg": "Nuevos Mensajes",
"rhs_thread.rootPostDeletedMessage.body": "Parte de esta conversación ha sido eliminada debido a la política de retención de datos. No se puede seguir respondiendo a esta conversación.",
"search_bar.search": "Buscar",
"search_header.results": "Resultados de búsqueda",
"search_header.title2": "Mencines recientes",
"search_header.results": "Resultados de la Búsqueda",
"search_header.title2": "Menciones Recientes",
"search_header.title3": "Mensajes Guardados",
"search_item.channelArchived": "Archivado",
"sidebar.channels": "CANALES PÚBLICOS",

View File

@@ -39,7 +39,6 @@
"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

@@ -1 +0,0 @@
{}

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ál",
"global_threads.allThreads": "Összes üzenetszálad",
"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.",

View File

@@ -690,7 +690,7 @@
"post_body.check_for_out_of_channel_mentions.message.multiple": "がメンションされましたが、彼らはチャンネルにいません。 ",
"post_body.check_for_out_of_channel_mentions.message.one": "がメンションされましたが、彼はチャンネルにいません。 ",
"post_body.check_for_out_of_channel_mentions.message_last": "? 彼らは全ての会話履歴にアクセスできます。",
"post_body.commentedOn": "{name} {apostrophe} のメッセージへのコメント: ",
"post_body.commentedOn": "{name}のメッセージへのコメント: ",
"post_body.deleted": "(メッセージは削除されています)",
"post_info.auto_responder": "自動返信",
"post_info.bot": "BOT",
@@ -748,7 +748,7 @@
"threads.replies": "{count} {count, plural, one {返信} other {返信}}",
"threads.unfollowMessage": "メッセージのフォローをやめる",
"threads.unfollowThread": "スレッドのフォローをやめる",
"user.settings.display.clockDisplay": "時表示",
"user.settings.display.clockDisplay": "時表示",
"user.settings.display.custom_theme": "カスタムテーマ",
"user.settings.display.militaryClock": "時計の24時間表示(例: 16:00)",
"user.settings.display.normalClock": "時計の12時間表示(例: 4:00 PM)",

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@
"about.hashee": "EE Compilatiehash:",
"about.teamEditionLearn": "Word lid van de Mattermost-gemeenschap op ",
"about.teamEditionSt": "Alle team-communicatie op één plaats, doorzoekbaar en van overal bereikbaar.",
"about.teamEditiont0": "Team-Editie",
"about.teamEditiont1": "Enterprise-Editie",
"about.teamEditiont0": "Team Editie",
"about.teamEditiont1": "Enterprise Editie",
"about.title": "Info over {appTitle}",
"announcment_banner.dont_show_again": "Niet opnieuw tonen",
"api.channel.add_guest.added": "{addedUsername} werd toegevoegd aan het kanaal als gast door {username}.",
@@ -141,7 +141,7 @@
"combined_system_message.removed_from_team.one": "{firstUser} werd **verwijderd uit het team**.",
"combined_system_message.removed_from_team.one_you": "Je werd **verwijderd uit het team**.",
"combined_system_message.removed_from_team.two": "{firstUser} en {secondUser} werden **verwijderd van het team**.",
"combined_system_message.you": "jou",
"combined_system_message.you": "Jij",
"create_comment.addComment": "Voeg commentaar toe...",
"create_post.deactivated": "Je bekijkt een gearchiveerd kanaal met een gedeactiveerde gebruiker.",
"create_post.write": "Schrijven naar {channelDisplayName}",

View File

@@ -11,54 +11,35 @@
"about.teamEditiont1": "Enterprise Edition",
"about.title": "Sobre {appTitle}",
"announcment_banner.dont_show_again": "Não mostrar novamente",
"api.channel.add_guest.added": "{addedUsername} adicionado ao canal como convidado por {username}.",
"api.channel.add_member.added": "{addedUsername} foi adicionado ao canal por {username}.",
"api.channel.guest_join_channel.post_and_forget": "{username} entrou no canal como convidado.",
"apps.error": "Erro: {error}",
"apps.error.command.field_missing": "Campos obrigatórios ausentes: `{fieldName}`.",
"apps.error.command.same_channel": "Canal repetido para o campo `{fieldName}`: `{option}`.",
"apps.error.command.same_option": "Opção repetida para o campo `{fieldName}`: `{option}`.",
"apps.error.command.same_user": "Usuário repetido para o campo `{fieldName}`: `{option}`.",
"apps.error.command.unknown_channel": "Canal desconhecido para o campo `{fieldName}`: `{option}`.",
"apps.error.command.unknown_option": "Opção desconhecida para o campo `{fieldName}`: `{option}`.",
"apps.error.command.unknown_user": "Usuário desconhecido para o campo `{fieldName}`: `{opção}`.",
"apps.error.form.no_form": "`form` não está definido.",
"apps.error.form.no_lookup": "`procurar` não está definido.",
"apps.error.form.no_source": "`fonte` não está definida.",
"apps.error.form.no_submit": "`enviar ` não está definido",
"apps.error.form.refresh": "Ocorreu um erro ao buscar os campos selecionados. Entre em contato com o desenvolvedor do aplicativo. Detalhes: {details}",
"apps.error.form.refresh_no_refresh": "Atualização chamada no campo sem atualização.",
"apps.error.form.submit.pretext": "Ocorreu um erro ao enviar o modal. Entre em contato com o desenvolvedor do aplicativo. Detalhes: {details}",
"apps.error.lookup.error_preparing_request": "Erro ao preparar solicitação de pesquisa: {errorMessage}",
"apps.error.malformed_binding": "Esta ligação não está formada corretamente. Entre em contato com o desenvolvedor do aplicativo.",
"apps.error.parser": "Erro de análise: {error}",
"apps.error.parser.empty_value": "valores vazios não são permitidos",
"apps.error.parser.execute_non_leaf": "Você deve selecionar um subcomando.",
"apps.error.parser.missing_binding": "Ligações de comando ausentes.",
"apps.error.parser.missing_field_value": "Falta o valor do campo.",
"apps.error.parser.missing_list_end": "Token de fechamento de lista esperado.",
"apps.error.parser.missing_quote": "Aspas duplas correspondentes são esperadas antes do final da entrada.",
"apps.error.parser.missing_source": "O formulário não tem envio nem fonte.",
"apps.error.parser.missing_submit": "Nenhuma chamada de envio em forma ou vinculação.",
"apps.error.parser.missing_tick": "Crase correspondente é esperada antes do final de entrada.",
"apps.error.parser.multiple_equal": "Vários sinais `=` não são permitidos.",
"apps.error.parser.no_argument_pos_x": "Incapaz de identificar o argumento.",
"apps.error.parser.no_bindings": "Sem ligações de comando.",
"apps.error.parser.no_form": "Nenhum formulário encontrado.",
"apps.error.parser.no_match": "`{command}`: Nenhum comando correspondente encontrado neste espaço de trabalho.",
"apps.error.parser.no_slash_start": "O comando deve começar com `/`.",
"apps.error.parser.unexpected_character": "Caracter inesperado.",
"apps.error.parser.unexpected_comma": "Vírgula inesperada.",
"apps.error.parser.unexpected_error": "Erro inesperado.",
"apps.error.parser.unexpected_flag": "O comando não aceita o sinalizador `{flagName}`.",
"apps.error.parser.unexpected_squared_bracket": "Abertura de lista inesperada.",
"apps.error.parser.unexpected_state": "Inacessível: Estado inesperado em matchBinding: `{state}`.",
"apps.error.parser.unexpected_whitespace": "Inacessível: espaço em branco inesperado.",
"apps.error.responses.form.no_form": "O tipo de resposta é `form`, mas nenhum formulário foi incluído na resposta.",
"apps.error.responses.navigate.no_url": "O tipo de resposta é `navigate`, mas nenhuma url foi incluído na resposta.",
"apps.error.responses.unexpected_error": "Recebeu um erro inesperado.",
"apps.error.responses.unexpected_type": "O tipo de resposta do aplicativo não era esperado. Tipo de resposta: {type}.",
"apps.error.responses.unknown_field_error": "Recebeu um erro para um campo desconhecido. Nome do campo: `{field}`. Erro: `{error}`.",
"apps.error.responses.unknown_type": "O tipo de resposta do aplicativo não é compatível. Tipo de resposta: {type}.",
"apps.error.unknown": "Ocorreu um erro desconhecido.",
"apps.suggestion.dynamic.error": "Erro de seleção dinâmica",
@@ -67,9 +48,6 @@
"apps.suggestion.no_static": "Sem opções correspondentes.",
"apps.suggestion.no_suggestion": "Sem sugestões correspondentes.",
"archivedChannelMessage": "Você está vendo um **canal arquivado**. Novas mensagens não podem ser publicadas.",
"camera_type.photo.option": "Capturar foto",
"camera_type.title": "Escolha uma ação",
"camera_type.video.option": "Record Video",
"center_panel.archived.closeChannel": "Fechar Canal",
"channel.channelHasGuests": "Este canal tem convidados",
"channel.hasGuests": "Este grupo de mensagem tem convidados",
@@ -89,7 +67,6 @@
"channel_loader.someone": "Alguém",
"channel_members_modal.remove": "Remover",
"channel_modal.cancel": "Cancelar",
"channel_modal.channelType": "Modelo",
"channel_modal.descriptionHelp": "Descreva como este canal deve ser utilizado.",
"channel_modal.header": "Cabeçalho",
"channel_modal.headerEx": "Ex.: \"[Título do Link](http://example.com)\"",
@@ -99,8 +76,6 @@
"channel_modal.optional": "(opcional)",
"channel_modal.purpose": "Propósito",
"channel_modal.purposeEx": "Ex.: \"Um canal para arquivar bugs e melhorias\"",
"channel_modal.type.private": "Canal privado",
"channel_modal.type.public": "Canal público",
"channel_notifications.ignoreChannelMentions.settings": "Ignorar @channel, @here, @all",
"channel_notifications.muteChannel.settings": "Silenciar o canal",
"channel_notifications.preference.all_activity": "Para todas as atividades",
@@ -145,76 +120,21 @@
"create_comment.addComment": "Adicionar um comentário...",
"create_post.deactivated": "Você está vendo um canal arquivado com um usuário inativo.",
"create_post.write": "Escrever para {channelDisplayName}",
"custom_status.expiry.at": "no",
"custom_status.expiry.until": "Até",
"custom_status.expiry_dropdown.custom": "Personalizado",
"custom_status.expiry_dropdown.date_and_time": "Data e hora",
"custom_status.expiry_dropdown.dont_clear": "Não limpe",
"custom_status.expiry_dropdown.four_hours": "4 horas",
"custom_status.expiry_dropdown.one_hour": "1 hora",
"custom_status.expiry_dropdown.thirty_minutes": "30 minutos",
"custom_status.expiry_dropdown.this_week": "Essa semana",
"custom_status.expiry_dropdown.today": "Hoje",
"custom_status.expiry_time.today": "Hoje",
"custom_status.expiry_time.tomorrow": "Amanhã",
"custom_status.failure_message": "Falha ao atualizar o status. Tente novamente",
"custom_status.set_status": "Definir um status",
"custom_status.suggestions.in_a_meeting": "Em uma reunião",
"custom_status.suggestions.on_a_vacation": "De férias",
"custom_status.suggestions.out_for_lunch": "Almoçando",
"custom_status.suggestions.out_sick": "Doente",
"custom_status.suggestions.recent_title": "RECENTE",
"custom_status.suggestions.title": "SUGESTÕES",
"custom_status.suggestions.working_from_home": "Trabalhando em casa",
"date_separator.today": "Hoje",
"date_separator.yesterday": "Ontem",
"edit_post.editPost": "Editar o post...",
"edit_post.save": "Salvar",
"emoji_picker.activities": "Atividades",
"emoji_picker.animals-nature": "Animais e Natureza",
"emoji_picker.custom": "Personalizado",
"emoji_picker.flags": "Bandeiras",
"emoji_picker.food-drink": "Comida e bebida",
"emoji_picker.objects": "Objetos",
"emoji_picker.people-body": "Pessoas e Corpo",
"emoji_picker.recent": "Recente",
"emoji_picker.searchResults": "Resultados da Pesquisa",
"emoji_picker.smileys-emotion": "Sorrisos e Emoções",
"emoji_picker.symbols": "Símbolos",
"emoji_picker.travel-places": "Viagens e lugares",
"emoji_skin.dark_skin_tone": "tom de pele escuro",
"emoji_skin.default": "tom de pele padrão",
"emoji_skin.light_skin_tone": "tom de pele claro",
"emoji_skin.medium_dark_skin_tone": "pele morena escura",
"emoji_skin.medium_light_skin_tone": "tom de pele claro médio",
"emoji_skin.medium_skin_tone": "tom de pele médio",
"file_upload.fileAbove": "Arquivos devem ter menos de {max}",
"friendly_date.daysAgo": "{count} {count, plural, one {day} other {days}} atrás",
"friendly_date.hoursAgo": "{count} {count, plural, one {hour} other {hours}} atrás",
"friendly_date.minsAgo": "{count} {count, plural, one {min} other {mins}} atrás",
"friendly_date.monthsAgo": "{count} {count, plural, one {month} other {months}} atrás",
"friendly_date.now": "Agora",
"friendly_date.yearsAgo": "{count} {count, plural, one {year} other {years}} atrás",
"friendly_date.yesterday": "Ontem",
"gallery.download_file": "Baixar arquivo",
"gallery.footer.channel_name": "Compartilhado em {channelName}",
"gallery.open_file": "Abrir arquivo",
"gallery.unsuppored": "A visualização não é compatível com este tipo de arquivo",
"get_post_link_modal.title": "Copiar Link",
"global_threads.allThreads": "Todos os seus tópicos",
"global_threads.emptyThreads.message": "Todos os tópicos nos quais você é mencionado ou dos quais participou serão exibidos aqui junto com todos os tópicos que você seguiu.",
"global_threads.emptyThreads.title": "Nenhum tópico seguido ainda",
"global_threads.emptyUnreads.message": "Parece que você está todo preso.",
"global_threads.emptyUnreads.title": "Nenhum tópico não lido",
"global_threads.markAllRead.cancel": "Cancelar",
"global_threads.markAllRead.markRead": "Marcar como lido",
"global_threads.markAllRead.message": "Isso limpará qualquer status não lido de todos os seus tópicos mostrados aqui",
"global_threads.markAllRead.title": "Tem certeza de que deseja marcar todos os tópicos como lidos?",
"global_threads.options.mark_as_read": "Marcar como Lido",
"global_threads.options.open_in_channel": "Abrir no canal",
"global_threads.options.title": "AÇÕES DE TÓPICO",
"global_threads.options.unfollow": "Deixar de seguir o tópico",
"global_threads.unreads": "Não lidos",
"integrations.add": "Adicionar",
"intro_messages.anyMember": " Qualquer membro pode participar e ler este canal.",
"intro_messages.beginning": "Início do {name}",
@@ -288,7 +208,7 @@
"mobile.camera_photo_permission_denied_title": "{applicationName} gostaria de acessar sua camera",
"mobile.camera_video_permission_denied_description": "Faça vídeos e envie-os para a sua instância do Mattermost ou salve-os no seu dispositivo. Abra Configurações para conceder ao Mattermost acesso de leitura e gravação à sua câmera.",
"mobile.camera_video_permission_denied_title": "{applicationName} gostaria de acessar sua camera",
"mobile.channel_drawer.search": "Encontrar canal",
"mobile.channel_drawer.search": "Ir para...",
"mobile.channel_info.alertMessageConvertChannel": "Quando você converte {displayName} em um canal privado, o histórico e os membros são preservados. Os arquivos compartilhados publicamente permanecem acessíveis a qualquer pessoa com o link. O ingresso a um canal privado é apenas por convite.\n\nA mudança é permanente e não pode ser desfeita.\n\nTem certeza de que deseja converter {displayName} em um canal privado?",
"mobile.channel_info.alertMessageDeleteChannel": "Você tem certeza que quer arquivar o {term} {name}?",
"mobile.channel_info.alertMessageLeaveChannel": "Você tem certeza que quer deixar o {term} {name}?",
@@ -332,9 +252,6 @@
"mobile.create_channel.public": "Novo Canal Público",
"mobile.create_post.read_only": "Este canal é de apenas leitura",
"mobile.custom_list.no_results": "Nenhum Resultado",
"mobile.custom_status.choose_emoji": "Escolha um emoji",
"mobile.custom_status.clear_after": "Limpar depois",
"mobile.custom_status.modal_confirm": "Feito",
"mobile.display_settings.sidebar": "Barra lateral",
"mobile.display_settings.theme": "Tema",
"mobile.document_preview.failed_description": "Um erro aconteceu durante a abertura do documento. Por favor verifique que você tem o visualizador para {fileType} instalado e tente novamente.\n",
@@ -371,7 +288,7 @@
"mobile.file_upload.disabled": "Os uploads de arquivos do celular estão desabilitados. Entre em contato com o Administrador do Sistema para obter mais detalhes.",
"mobile.file_upload.disabled2": "Os envios de arquivos do celular estão desabilitados.",
"mobile.file_upload.library": "Biblioteca de Fotos",
"mobile.file_upload.max_warning": "Uploads limitados a {count} máximo de arquivos.",
"mobile.file_upload.max_warning": "Upload limitado ao máximo de 5 arquivos.",
"mobile.file_upload.unsupportedMimeType": "Somente imagens em BMP, JPG ou PNG podem ser usadas como imagem do perfil.",
"mobile.file_upload.video": "Galeria de Videos",
"mobile.files_paste.error_description": "Ocorreu um erro enquanto colava o arquivo. Por favor tente novamente.",
@@ -379,11 +296,9 @@
"mobile.files_paste.error_title": "Colar falhou",
"mobile.flagged_posts.empty_description": "As mensagens salvas são visíveis apenas para você. Marque mensagens para acompanhamento ou salve algo para mais tarde mantendo uma mensagem pressionada e escolhendo Salvar no menu.",
"mobile.flagged_posts.empty_title": "Nenhuma mensagem salva",
"mobile.forms.select.done": "Feito",
"mobile.gallery.title": "{index} de {total}",
"mobile.general.error.title": "Erro",
"mobile.help.title": "Ajuda",
"mobile.interactive_dialog.defaultSubmit": "Enviar",
"mobile.intro_messages.DM": "Este é o início do seu histórico de mensagens diretas com {teammate}. Mensagens diretas e arquivos compartilhados aqui não são mostrados para pessoas de fora desta área.",
"mobile.intro_messages.default_message": "Este é o primeiro canal da equipe veja quando eles se registrarem - use para postar atualizações que todos devem saber.",
"mobile.intro_messages.default_welcome": "Bem-vindo ao {name}!",
@@ -415,8 +330,6 @@
"mobile.message_length.message": "Sua mensagem atual é muito grande. Contagem corrente de caracters: {max}/{count}",
"mobile.message_length.message_split_left": "Mensagem excede o limite de caracteres",
"mobile.message_length.title": "Tamanho da Mensagem",
"mobile.microphone_permission_denied_description": "Para participar desta chamada, abra Configurações para conceder ao Mattermost acesso ao seu microfone.",
"mobile.microphone_permission_denied_title": "{applicationName} gostaria de acessar seu microfone",
"mobile.more_dms.add_more": "Você pode adicionar mais {remaining, number} usuários",
"mobile.more_dms.cannot_add_more": "Você não pode adicionar mais usuários",
"mobile.more_dms.one_more": "Você não pode adicionar mais 1 usuário",
@@ -436,7 +349,6 @@
"mobile.notification_settings.email": "E-mail",
"mobile.notification_settings.email.send": "ENVIAR NOTIFICAÇÕES POR EMAIL",
"mobile.notification_settings.email_title": "Notificações por Email",
"mobile.notification_settings.mentions": "Menções",
"mobile.notification_settings.mentions.channelWide": "Menções de todo canal",
"mobile.notification_settings.mentions.reply_title": "Enviar notificações de resposta para",
"mobile.notification_settings.mentions.sensitiveName": "Seu primeiro nome em maiúsculas e minúsculas",
@@ -447,10 +359,6 @@
"mobile.notification_settings.modal_cancel": "CANCELAR",
"mobile.notification_settings.modal_save": "SALVAR",
"mobile.notification_settings.ooo_auto_responder": "Respostas Automáticas para Mensagens Diretas",
"mobile.notification_settings.push_threads.description": "Notificar-me sobre todas as respostas aos tópicos que estou seguindo",
"mobile.notification_settings.push_threads.info": "Quando ativado, qualquer resposta a um tópico que você está seguindo enviará uma notificação por push móvel.",
"mobile.notification_settings.push_threads.title": "NOTIFICAÇÕES DE RESPOSTA DE TÓPICOS",
"mobile.notification_settings.push_threads.title_android": "Notificações de resposta do tópico",
"mobile.notification_settings.save_failed_description": "As configurações de notificação não conseguiram salvar devido a um problema de conexão. Por favor tente novamente.",
"mobile.notification_settings.save_failed_title": "Problema de conexão",
"mobile.notification_settings_mentions.keywords": "Palavras-chave",
@@ -483,8 +391,6 @@
"mobile.open_dm.error": "Não foi possível entrar nas mensagens diretas com {displayName}. Por favor verifique a sua conexão e tente novamente.",
"mobile.open_gm.error": "Não foi possível abrir uma mensagem em grupo com esses usuários. Por favor verifique sua conexão e tente novamente.",
"mobile.open_unknown_channel.error": "Não é possível entrar no canal. Por favor, limpe o cache e tente novamente.",
"mobile.participants.header": "PARTICIPANTES DO TÓPICO",
"mobile.participants.you": "(você)",
"mobile.permission_denied_dismiss": "Não Permitir",
"mobile.permission_denied_retry": "Configurações",
"mobile.pinned_posts.empty_description": "Fixe mensagens importantes que sejam visíveis para todo o canal. Mantenha uma mensagem pressionada e escolha Fixar no canal para salvá-la aqui.",
@@ -512,8 +418,6 @@
"mobile.post_textbox.entire_channel.message": "Usando @all ou @channel você está enviando notificações para {totalMembers, number} {totalMembers, plural, one {pessoa} other {pessoas}}. Você tem certeza que quer fazer isso?",
"mobile.post_textbox.entire_channel.message.with_timezones": "Usando @all ou @channel você está enviando notificações para {totalMembers, number} {totalMembers, plural, one {pessoa} other {pessoas}} em {timezones, number} {timezones, plural, one {fuso horário} other {fusos horários}}. Você tem certeza que quer fazer isso?",
"mobile.post_textbox.entire_channel.title": "Confirmar o envio de notificações para o canal todo",
"mobile.post_textbox.entire_channel_here.message": "Ao usar @here você está prestes a enviar notificações para {totalMembers, number} {totalMembers, plural, one {person} other {people}}. Você tem certeza de que quer fazer isso?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "Ao usar @here, você está prestes a enviar notificações para {totalMembers, number} {totalMembers, plural, one {person} other {people}} em {timezones, number} {timezones, plural, one {timezone} other {timezones} }. Você tem certeza de que quer fazer isso?",
"mobile.post_textbox.groups.title": "Confirmar envio de notificações para grupos",
"mobile.post_textbox.multi_group.message.with_timezones": "Ao usar {mentions} e {finalMention}, você está prestes a enviar notificações para pelo menos {totalMembers} pessoas em {timezones, number} {timezones, plural, one {fuso horário} other {fusos horários}}. Você tem certeza de que quer fazer isso?",
"mobile.post_textbox.multi_group.message.without_timezones": "Ao usar {mentions} e {finalMention}, você está prestes a enviar notificações para pelo menos {totalMembers} pessoas. Você tem certeza de que quer fazer isso?",
@@ -544,7 +448,7 @@
"mobile.reset_status.alert_cancel": "Cancelar",
"mobile.reset_status.alert_ok": "Ok",
"mobile.reset_status.title_ooo": "Desativar \"Fora Do Escritório\"?",
"mobile.retry_message": "Falha ao buscar mensagens. Toque aqui para tentar novamente.",
"mobile.retry_message": "Atualização de mensagens falharam. Puxe para tentar novamente.",
"mobile.routes.channelInfo": "Informações",
"mobile.routes.channelInfo.createdBy": "Criado por {creator} em ",
"mobile.routes.channelInfo.delete_channel": "Arquivar Canal",
@@ -556,7 +460,6 @@
"mobile.routes.channel_members.action_message_confirm": "Você tem certeza que quer remover o membro selecionado do canal?",
"mobile.routes.code": "{language} Código",
"mobile.routes.code.noLanguage": "Código",
"mobile.routes.custom_status": "Definir um status",
"mobile.routes.edit_profile": "Editar Perfil",
"mobile.routes.login": "Login",
"mobile.routes.loginOptions": "Selecionador de Login",
@@ -567,13 +470,10 @@
"mobile.routes.sso": "Single Sign-On",
"mobile.routes.table": "Tabela",
"mobile.routes.thread": "Tópico {channelName}",
"mobile.routes.thread_crt": "Tópico",
"mobile.routes.thread_crt.in": "em {channelName}",
"mobile.routes.thread_dm": "Tópico Mensagem Direta",
"mobile.routes.user_profile": "Perfil",
"mobile.routes.user_profile.edit": "Editar",
"mobile.routes.user_profile.local_time": "HORA LOCAL",
"mobile.routes.user_profile.organization": "ORGANIZAÇÃO",
"mobile.routes.user_profile.send_message": "Enviar Mensagem",
"mobile.search.after_modifier_description": "encontrar publicações após uma data específica",
"mobile.search.before_modifier_description": "encontrar publicações antes de uma data específica",
@@ -643,7 +543,6 @@
"mobile.user_list.deactivated": "Desativado",
"mobile.user_removed.message": "Você foi removido do canal.",
"mobile.user_removed.title": "Removido de {channelName}",
"mobile.video_playback.download": "Baixar video",
"mobile.video_playback.failed_description": "Ocorreu um erro ao tentar reproduzir o video.\n",
"mobile.video_playback.failed_title": "Erro ao realizar o playback do video",
"mobile.youtube_playback_error.description": "Ocorreu um erro ao tentar executar um vídeo do YouTube.\nDetalhes: {details}",
@@ -657,10 +556,8 @@
"more_channels.dropdownTitle": "Exibir",
"more_channels.noMore": "Não há mais canais para participar",
"more_channels.publicChannels": "Canais Públicos",
"more_channels.sharedChannels": "Canais compartilhados",
"more_channels.showArchivedChannels": "Exibir: Canais Arquivados",
"more_channels.showPublicChannels": "Exibir: Canais Públicos",
"more_channels.showSharedChannels": "Mostrar: canais compartilhados",
"more_channels.title": "Mais Canais",
"msg_typing.areTyping": "{users} e {last} estão digitando...",
"msg_typing.isTyping": "{user} está digitando...",
@@ -709,7 +606,6 @@
"sidebar.channels": "CANAIS PÚBLICOS",
"sidebar.direct": "MENSAGENS DIRETAS",
"sidebar.favorite": "CANAIS FAVORITOS",
"sidebar.favorites": "Favoritos",
"sidebar.pg": "CANAIS PRIVADOS",
"sidebar.types.recent": "ATIVIDADE RECENTE",
"sidebar.unreads": "Mais não lidos",
@@ -732,22 +628,12 @@
"suggestion.mention.morechannels": "Outros Canais",
"suggestion.mention.nonmembers": "Não no Canal",
"suggestion.mention.special": "Menções Especiais",
"suggestion.mention.you": " (você)",
"suggestion.mention.you": "(você)",
"suggestion.search.direct": "Mensagens Diretas",
"suggestion.search.private": "Canais Privados",
"suggestion.search.public": "Canais Públicos",
"terms_of_service.agreeButton": "Eu Concordo",
"terms_of_service.api_error": "Não é possível concluir o pedido. Se esse problema persistir, entre em contato com o Administrador do Sistema.",
"threads": "Tópicos",
"threads.deleted": "Mensagem original excluída",
"threads.follow": "Seguir",
"threads.followMessage": "Seguir mensagem",
"threads.followThread": "Seguir Tópico",
"threads.following": "Seguindo",
"threads.newReplies": "{count} novo {count, plural, one {reply} other {replies}}",
"threads.replies": "{count} {count, plural, one {reply} other {replies}}",
"threads.unfollowMessage": "Deixar de seguir a mensagem",
"threads.unfollowThread": "Deixar de seguir o tópico",
"user.settings.display.clockDisplay": "Exibição do Relógio",
"user.settings.display.custom_theme": "Tema Personalizado",
"user.settings.display.militaryClock": "Relógio de 24 horas (exemplo: 16:00)",
@@ -766,7 +652,6 @@
"user.settings.general.lastName": "Último Nome",
"user.settings.general.nickname": "Apelido",
"user.settings.general.position": "Cargo",
"user.settings.general.status": "Status",
"user.settings.general.username": "Usuário",
"user.settings.modal.display": "Exibição",
"user.settings.modal.notifications": "Notificações",
@@ -778,10 +663,6 @@
"user.settings.notifications.email.never": "Nunca",
"user.settings.notifications.email.send": "Enviar notificações por email",
"user.settings.notifications.emailInfo": "As notificações por email são enviadas para menções e mensagens diretas quando você estiver offline ou ausente por mais de 5 minutos.",
"user.settings.notifications.email_threads.description": "Notifique-me sobre todas as respostas aos tópicos que estou seguindo.",
"user.settings.notifications.email_threads.info": "Quando ativado, qualquer resposta a uma conversa que você está seguindo enviará uma notificação por e-mail.",
"user.settings.notifications.email_threads.title": "NOTIFICAÇÕES DE RESPOSTA DE TÓPICOS",
"user.settings.notifications.email_threads.title_android": "Notificações de resposta do tópico",
"user.settings.notifications.never": "Nunca",
"user.settings.notifications.onlyMentions": "Somente para menções e mensagens diretas",
"user.settings.push_notification.away": "Ausente ou desconectado",

View File

@@ -141,7 +141,7 @@
"combined_system_message.removed_from_team.one": "{firstUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_team.one_you": "Du **togs bort från teamet**.",
"combined_system_message.removed_from_team.two": "{firstUser} och {secondUser} **togs bort från teamet**.",
"combined_system_message.you": "dig",
"combined_system_message.you": "Du",
"create_comment.addComment": "Lägg till en kommentar...",
"create_post.deactivated": "Du visar en arkiverad kanal med ett avstängt användarkonto.",
"create_post.write": "Skriv i kanalen {channelDisplayName}",
@@ -343,7 +343,7 @@
"mobile.downloader.disabled_title": "Nedladdning inaktiverat",
"mobile.downloader.failed_description": "Ett fel inträffade när filen skulle laddas ner. Kontrollera din anslutning till internet och försök igen.\n",
"mobile.downloader.failed_title": "Nedladdning misslyckades",
"mobile.drawer.teamsTitle": "Team",
"mobile.drawer.teamsTitle": "Grupper",
"mobile.edit_channel": "Spara",
"mobile.edit_post.title": "Editerar meddelande",
"mobile.edit_profile.remove_profile_photo": "Ta bort foto",
@@ -561,8 +561,8 @@
"mobile.routes.login": "Logga in",
"mobile.routes.loginOptions": "Välj inloggningsmetod",
"mobile.routes.mfa": "Flerfaktorsautentisering",
"mobile.routes.selectChannel": "Välj kanal",
"mobile.routes.selectTeam": "Välj team",
"mobile.routes.selectChannel": "Ändra kanalnamn",
"mobile.routes.selectTeam": "Välj grupp",
"mobile.routes.settings": "Inställningar",
"mobile.routes.sso": "Auto-inloggning",
"mobile.routes.table": "Tabell",
@@ -586,7 +586,7 @@
"mobile.search.on_modifier_description": "för att hitta inlägg före ett visst datum",
"mobile.search.recent_title": "Senaste sökningar",
"mobile.select_team.guest_cant_join_team": "Ditt gästkonto finns inte i något team eller kanal. Kontakta en administratör.",
"mobile.select_team.join_open": "Öppna team du kan gå med i",
"mobile.select_team.join_open": "Öppna grupper du kan gå med i",
"mobile.select_team.no_teams": "Det finns inget team tillgängligt för dig att ansluta till.",
"mobile.server_link.error.text": "Länken kunde inte hittas på servern.",
"mobile.server_link.error.title": "Länk-fel",

View File

@@ -1,14 +1,14 @@
{
"about.date": "Yapım tarihi:",
"about.enterpriseEditionLearn": "Enterprise paketi hakkında ayrıntılı bilgiyi şuradan alabilirsiniz ",
"about.enterpriseEditionLearn": "Enterprise sürüm hakkında şuradan ayrıntılı bilgi alabilirsiniz ",
"about.enterpriseEditionSt": "Güvenlik duvarının arkasından modern iletişim.",
"about.enterpriseEditione1": "Enterprise paketi",
"about.enterpriseEditione1": "Enterprise sürümü",
"about.hash": "Yapım karması:",
"about.hashee": "Enterprise tarifesi yapım karması:",
"about.hashee": "Enterprise sürüm yapım karması:",
"about.teamEditionLearn": "Mattermost topluluğuna katılın: ",
"about.teamEditionSt": "Tüm takım iletişimi tek bir yerde, anında aranabilir ve her yerden erişilebilir.",
"about.teamEditiont0": "Team paketi",
"about.teamEditiont1": "Enterprise paketi",
"about.teamEditiont0": "Team sürümü",
"about.teamEditiont1": "Enterprise sürümü",
"about.title": "{appTitle} hakkında",
"announcment_banner.dont_show_again": "Yeniden görüntülenmesin",
"api.channel.add_guest.added": "{addedUsername}, {username} tarafından konuk olarak kanala eklendi.",
@@ -107,7 +107,7 @@
"channel_notifications.preference.global_default": "Genel varsayılan ({notifyLevel})",
"channel_notifications.preference.header": "Bildirimler gönderimi",
"channel_notifications.preference.never": "Asla",
"channel_notifications.preference.only_mentions": "Yalnızca anmalar ve doğrudan iletiler",
"channel_notifications.preference.only_mentions": "Yalnız anmalar ve doğrudan iletiler",
"channel_notifications.preference.save_error": "Bildirim ayarı kaydedilemedi. Lütfen bağlantınızı denetleyip yeniden deneyin.",
"combined_system_message.added_to_channel.many_expanded": "{users} ve {lastUser} {actor} tarafından **kanala eklendi**.",
"combined_system_message.added_to_channel.one": "{firstUser} {actor} tarafından **kanala eklendi**.",
@@ -202,8 +202,8 @@
"gallery.unsuppored": "Bu dosya türü ön izlenemiyor",
"get_post_link_modal.title": "Bağlantıyı kopyala",
"global_threads.allThreads": "Tüm konularınız",
"global_threads.emptyThreads.message": "Bahsettiğiniz veya katıldığınız tüm konular, izlediğiniz tüm konularla birlikte burada görüntülenir.",
"global_threads.emptyThreads.title": "İzlenen bir konu yok",
"global_threads.emptyThreads.message": "Bahsettiğiniz veya katıldığınız tüm konular, takip ettiğiniz tüm konularla birlikte burada görüntülenir.",
"global_threads.emptyThreads.title": "Takip edilen bir konu yok",
"global_threads.emptyUnreads.message": "Tüm konulara bakmışsınız gibi görünüyor.",
"global_threads.emptyUnreads.title": "Okunmamış bir konu yok",
"global_threads.markAllRead.cancel": "İptal",
@@ -222,7 +222,7 @@
"intro_messages.creatorPrivate": "{name} özel kanalı, {creator} tarafından {date} tarihinde başlatılmış.",
"intro_messages.group_message": "Bu takım arkadaşlarınız ile doğrudan ileti geçmişinizin başlangıcı. Bu bölüm dışındaki kişiler burada paylaşılan doğrudan ileti ve dosyaları göremez.",
"intro_messages.noCreator": "{date} tarihinde oluşturulmuş {name} kanalının başlangıcı.",
"intro_messages.onlyInvited": " Bu özel kanalı yalnızca çağrılmış üyeler görüntüleyebilir.",
"intro_messages.onlyInvited": " Bu özel kanalı yalnız çağrılmış üyeler görüntüleyebilir.",
"last_users_message.added_to_channel.type": "{actor} tarafından **kanala eklendiniz**.",
"last_users_message.added_to_team.type": "{actor} tarafından **takıma eklendiniz**.",
"last_users_message.first": "{firstUser} ve ",
@@ -289,7 +289,7 @@
"mobile.camera_video_permission_denied_description": "Görüntü çekin ve Mattermost kopyanıza yükleyin ya da aygıtınıza kaydedin. Mattermost uygulamasına kameranızı okuma ve yazma izni vermek için ayarlarıın.",
"mobile.camera_video_permission_denied_title": "{applicationName} kameranıza erişmek istiyor",
"mobile.channel_drawer.search": "Kanal ara",
"mobile.channel_info.alertMessageConvertChannel": "{displayName} özel bir kanala dönüştürüldüğünde, geçmiş iletiler ve üyelikler korunur. Herkese açık olarak paylaşılmış dosyalara bağlantıya sahip olan herkes erişmeye devam edebilir. Özel kanallara yalnızca çağrı ile üye olunabilir. \n \nBu değişiklik kalıcıdır ve geri alınamaz.\n\n{displayName} kanalını özel kanala dönüştürmek istediğinize emin misiniz?",
"mobile.channel_info.alertMessageConvertChannel": "{displayName} özel bir kanala dönüştürüldüğünde, geçmiş iletiler ve üyelikler korunur. Herkese açık olarak paylaşılmış dosyalara bağlantıya sahip olan herkes erişmeye devam edebilir. Özel kanallara yalnız çağrı ile üye olunabilir. \n \nBu değişiklik kalıcıdır ve geri alınamaz.\n\n{displayName} kanalını özel kanala dönüştürmek istediğinize emin misiniz?",
"mobile.channel_info.alertMessageDeleteChannel": "{term} {name} kanalını arşivlemek istediğinize emin misiniz?",
"mobile.channel_info.alertMessageLeaveChannel": "{term} {name} kanalından ayrılmak istediğinize emin misiniz?",
"mobile.channel_info.alertMessageUnarchiveChannel": "{term} {name} kanalını arşivden çıkarmak istediğinize emin misiniz?",
@@ -372,12 +372,12 @@
"mobile.file_upload.disabled2": "Mobil uygulamadan dosya yüklemek devre dışı bırakılmış.",
"mobile.file_upload.library": "Fotoğraf kitaplığı",
"mobile.file_upload.max_warning": "En fazla {count} dosya yüklenebilir.",
"mobile.file_upload.unsupportedMimeType": "Profil görseli olarak yalnızca BMP, JPG ya da PNG dosyaları kullanılabilir.",
"mobile.file_upload.unsupportedMimeType": "Profil görseli olarak yalnız BMP, JPG ya da PNG dosyaları kullanılabilir.",
"mobile.file_upload.video": "Görüntü kitaplığı",
"mobile.files_paste.error_description": "Dosyalar yapıştırılırken bir sorun çıktı. Lütfen yeniden deneyin.",
"mobile.files_paste.error_dismiss": "Yok say",
"mobile.files_paste.error_title": "Yapıştırılamadı",
"mobile.flagged_posts.empty_description": "Kaydedilmiş iletileri yalnızca siz görebilirsiniz. İletileri izlemek için işaretleyin ya da bir şeyi kaydetmek için ileti üzerine uzun basıp menüden Kaydet komutunu seçin.",
"mobile.flagged_posts.empty_description": "Kaydedilmiş iletileri yalnız siz görebilirsiniz. İletileri takip etmek için işaretleyin ya da bir şeyi kaydetmek için ileti üzerine uzun basıp menüden Kaydet komutunu seçin.",
"mobile.flagged_posts.empty_title": "Kaydedilmiş bir ileti yok",
"mobile.forms.select.done": "Tamam",
"mobile.gallery.title": "{index} / {total}",
@@ -447,8 +447,8 @@
"mobile.notification_settings.modal_cancel": "İPTAL",
"mobile.notification_settings.modal_save": "KAYDET",
"mobile.notification_settings.ooo_auto_responder": "Otomatik doğrudan ileti yanıtları",
"mobile.notification_settings.push_threads.description": "İzlediğim konulara yazılan tüm yanıtlar ile ilgili bildirim gönderilsin",
"mobile.notification_settings.push_threads.info": "Bu seçenek etkinleştirildiğinde, izlediğiniz bir konuya yazılan yanıtlar mobil uygulamada anında bildirim olarak iletilir.",
"mobile.notification_settings.push_threads.description": "Takip ettiğim konulara yazılan tüm yanıtlar ile ilgili bildirim gönderilsin",
"mobile.notification_settings.push_threads.info": "Bu seçenek etkinleştirildiğinde, takip ettiğiniz bir konuya yazılan yanıtlar mobil anında bildirim olarak iletilir.",
"mobile.notification_settings.push_threads.title": "KONU YANITI BİLDİRİMLERİ",
"mobile.notification_settings.push_threads.title_android": "Konu yanıtı bildirimleri",
"mobile.notification_settings.save_failed_description": "Bir bağlantı sorunu nedeniyle bildirim ayarları kaydedilemedi. Lütfen yeniden deneyin.",
@@ -595,7 +595,7 @@
"mobile.server_link.unreachable_user.error": "Bu bağlantı silinmiş bir kullanıcıya ait.",
"mobile.server_ssl.error.text": "{host} sertifikası güvenilir değil.\n\nLütfen sertifika sorunlarını çözerek bu sunucu ile bağlantı kurulabilmesini sağlaması için sistem yöneticiniz ile görüşün.",
"mobile.server_ssl.error.title": "Güvenli olmayan sertifika",
"mobile.server_upgrade.alert_description": "Bu sunucu sürümü desteklenmediğinden, kullanıcılar uyumluluk sorunlarından kaynaklanan çökmeler ya da uygulamanın temel işlevselliğini bozan ciddi sorunlar ile karşılaşacak. Sunucunun {serverVersion} ya da üzerindeki bir sürüme güncellenmesi gerekli.",
"mobile.server_upgrade.alert_description": "Bu sunucu sürümü desteklenmediğinden, kullanıcılar uyumluluk sorunlarından kaynaklanan çökmeler ya da uygulamanın temel işlevselliğini bozan ciddi sorunlar ile karşılaşacak. Sunucu sürümünün {serverVersion} ya da üzerindeki bir sürüme yükseltilmesi gerekli.",
"mobile.server_upgrade.button": "Tamam",
"mobile.server_upgrade.dismiss": "Kapat",
"mobile.server_upgrade.learn_more": "Ayrıntılı bilgi alın",
@@ -636,7 +636,7 @@
"mobile.timezone_settings.manual": "Saat dilimini değiştir",
"mobile.timezone_settings.select": "Saat dilimini seçin",
"mobile.tos_link": "Hizmet koşulları",
"mobile.unsupported_server.message": "Ek dosyalar, bağlantı ön izlemeleri, tepkiler ve gömülü veriler doğru görüntülenmeyebilir. Bu sorun sürerse sistem yöneticinize Mattermost sunucusunu güncellemesi gerektiğini bildirin.",
"mobile.unsupported_server.message": "Ek dosyalar, bağlantı ön izlemeleri, tepkiler ve gömülü veriler doğru görüntülenmeyebilir. Bu sorun sürerse sistem yöneticinize Mattermost sürümünü yükseltmesi gerektiğini bildirin.",
"mobile.unsupported_server.ok": "Tamam",
"mobile.unsupported_server.title": "Sunucu sürümü desteklenmiyor",
"mobile.user.settings.notifications.email.fifteenMinutes": "15 dakikada bir",
@@ -740,10 +740,10 @@
"terms_of_service.api_error": "İstek yerine getirilemedi. Sorun sürerse sistem yöneticiniz ile görüşün.",
"threads": "Konular",
"threads.deleted": "Özgün ileti silindi",
"threads.follow": "İzle",
"threads.followMessage": "İletiyi izle",
"threads.followThread": "Konuyu izle",
"threads.following": "İzleniyor",
"threads.follow": "Takip et",
"threads.followMessage": "İletiyi takip et",
"threads.followThread": "Konuyu takip et",
"threads.following": "Takip ediliyor",
"threads.newReplies": "{count} yeni {count, plural, one {yanıt} other {yanıt}}",
"threads.replies": "{count} {count, plural, one {yanıt} other {yanıt}}",
"threads.unfollowMessage": "İletiyi takibi bırak",
@@ -778,12 +778,12 @@
"user.settings.notifications.email.never": "Asla",
"user.settings.notifications.email.send": "E-posta bildirimleri gönderilsin",
"user.settings.notifications.emailInfo": "5 dakikadan uzun süre uzak ya da çevrimdışı olduğunuzda anma ve doğrudan iletiler için e-posta bildirimi gönderilir.",
"user.settings.notifications.email_threads.description": "İzlediğim konulara yazılan tüm yanıtlar ile ilgili bildirim gönderilsin.",
"user.settings.notifications.email_threads.info": "Bu seçenek etkinleştirildiğinde, izlediğiniz bir konuya yazılan yanıtlar e-posta bildirimi olarak iletilir.",
"user.settings.notifications.email_threads.description": "Takip ettiğim konulara yazılan tüm yanıtlar ile ilgili bildirim gönderilsin.",
"user.settings.notifications.email_threads.info": "Bu seçenek etkinleştirildiğinde, takip ettiğiniz bir konuya yazılan yanıtlar e-posta bildirimi olarak iletilir.",
"user.settings.notifications.email_threads.title": "KONU YANITI BİLDİRİMLERİ",
"user.settings.notifications.email_threads.title_android": "Konu yanıtı bildirimleri",
"user.settings.notifications.never": "Asla",
"user.settings.notifications.onlyMentions": "Yalnızca anmalar ve doğrudan iletiler için",
"user.settings.notifications.onlyMentions": "Yalnız anmalar ve doğrudan iletiler için",
"user.settings.push_notification.away": "Uzakta ya da çevrimdışı",
"user.settings.push_notification.disabled": "Anında bildirimler devre dışı bırakılmış",
"user.settings.push_notification.disabled_long": "Anında bildirimler sistem yöneticiniz tarafından devre dışı bırakılmış.",

View File

@@ -11,15 +11,7 @@
"about.teamEditiont1": "Enterprise Edition",
"about.title": "Про {appTitle}",
"announcment_banner.dont_show_again": "Не показувати знову",
"api.channel.add_guest.added": "{addedUsername} доданий до каналу під гостьовим ім'ям {username}.",
"api.channel.add_member.added": "{addedUsername} додано до каналу за {username}.",
"api.channel.guest_join_channel.post_and_forget": "{username} приєднався до каналу як гість.",
"apps.error": "Помилка:{error}",
"apps.error.command.field_missing": "Обов'язкові поля відсутні:`{fieldName}`.",
"apps.error.command.same_channel": "Канал повторюється для поля `{fieldName}`: `{option}`.",
"apps.error.command.same_option": "Опція повторюється для поля `{fieldName}`: `{option}`.",
"apps.error.command.same_user": "Користувач повторюється для поля `{fieldName}`: `{option}`.",
"apps.error.command.unknown_channel": "Невідомий канал для поля `{fieldName}`: `{option}`.",
"archivedChannelMessage": "Ви переглядаєте **архівований канал**. Нові повідомлення не можуть бути опубліковані.",
"center_panel.archived.closeChannel": "Закрити канал",
"channel.channelHasGuests": "У цому каналі є гості",
@@ -40,7 +32,6 @@
"channel_loader.someone": "Хтось",
"channel_members_modal.remove": "Видалити",
"channel_modal.cancel": "Відміна",
"channel_modal.channelType": "Тип",
"channel_modal.descriptionHelp": "Опишіть, як слід використовувати цей канал.",
"channel_modal.header": "Заголовок",
"channel_modal.headerEx": "Наприклад: \"[Тема посилання](http://example.com)\"",
@@ -79,7 +70,7 @@
"combined_system_message.left_channel.one_you": "**залишив канал**.",
"combined_system_message.left_channel.two": "{firstUser} і {secondUser} **залишив канал**. ",
"combined_system_message.left_team.many_expanded": "{users} і {lastUser} **залишили команду**.",
"combined_system_message.left_team.one": "{firstUser} **залишає команду**.",
"combined_system_message.left_team.one": "{firstUser} **залишає команду**. ",
"combined_system_message.left_team.one_you": "**залишив команду**.",
"combined_system_message.left_team.two": "{firstUser} та {secondUser} **залишили команду**.",
"combined_system_message.removed_from_channel.many_expanded": "{users} та {lastUser} **видалені з каналу**.",
@@ -94,26 +85,16 @@
"create_comment.addComment": "Додати коментар...",
"create_post.deactivated": "Ви переглядаєте архівований канал з деактивованим користувачем.",
"create_post.write": "Написати у {channelDisplayName}",
"custom_status.expiry_dropdown.custom": "На вибір",
"custom_status.expiry_dropdown.today": "Сьогодні",
"custom_status.expiry_time.today": "Сьогодні",
"date_separator.today": "Сьогодні",
"date_separator.yesterday": "Вчора",
"edit_post.editPost": "Редагувати повідомлення...",
"edit_post.save": "Зберегти",
"emoji_picker.custom": "На вибір",
"emoji_picker.flags": "Прапори",
"emoji_picker.objects": "Об'єкти",
"emoji_picker.searchResults": "Результати пошуку",
"emoji_picker.symbols": "Символи",
"file_upload.fileAbove": "Не можна завантажити файл більше {max} МВ: {filename}",
"friendly_date.yesterday": "Вчора",
"gallery.download_file": "Завантажити файл",
"gallery.footer.channel_name": "Поділилися в {channelName}",
"gallery.open_file": "Відкрити файл",
"gallery.unsuppored": "Попередній перегляд не підтримується для цього типу файлу",
"get_post_link_modal.title": "Скопіювати посилання",
"global_threads.markAllRead.cancel": "Відміна",
"integrations.add": "Додати",
"intro_messages.anyMember": "Будь-який учасник може зайти і читати цей канал.",
"intro_messages.beginning": "Початок {name}",
@@ -171,7 +152,7 @@
"mobile.advanced_settings.delete_message": "\nДана дія приведе до очищення локальних даних і перезапуску програми.\n",
"mobile.advanced_settings.delete_title": "Delete Documents & Data",
"mobile.advanced_settings.timezone": "Часовий пояс ",
"mobile.advanced_settings.title": "Додаткові параметри",
"mobile.advanced_settings.title": "Додаткові параметри ",
"mobile.alert_dialog.alertCancel": "Відміна",
"mobile.android.back_handler_exit": "Повторно натисніть назад, щоб вийти",
"mobile.android.photos_permission_denied_description": "Щоб завантажити зображення з вашої бібліотеки, будь-ласка, змініть налаштування вашого дозволу.",
@@ -230,7 +211,6 @@
"mobile.create_channel.public": "Новий публічний канал",
"mobile.create_post.read_only": "Цей канал доступний лише для читання",
"mobile.custom_list.no_results": "Немає результатів",
"mobile.custom_status.modal_confirm": "Готово",
"mobile.display_settings.sidebar": "Бічна панель ",
"mobile.display_settings.theme": "Тема ",
"mobile.document_preview.failed_description": "Під час відкриття документа сталася помилка. Будь-ласка, переконайтеся, що ви встановили програму перегляду {fileType} та повторіть спробу.\n",
@@ -275,24 +255,19 @@
"mobile.files_paste.error_title": "Не вдалося вставити",
"mobile.flagged_posts.empty_description": "Збережені повідомлення бачите лише ви. Позначте повідомлення для подальших дій або збережіть на потім, довго натискаючи повідомлення та вибираючи Зберегти в меню.",
"mobile.flagged_posts.empty_title": "Ще немає збережених повідомлень",
"mobile.forms.select.done": "Готово",
"mobile.gallery.title": "{index} з {total}",
"mobile.general.error.title": "Помилка",
"mobile.help.title": "Допомога ",
"mobile.interactive_dialog.defaultSubmit": "Відправити",
"mobile.intro_messages.DM": "Початок історії особистих повідомлень з {teammate}. Особисті повідомлення і файли доступні тут і не видно за межами цієї області.",
"mobile.intro_messages.default_message": "Це перший канал, який бачить новий учасник групи - використовуйте його для направлення повідомлень, які повинні побачити всі.",
"mobile.intro_messages.default_welcome": "Ласкаво просимо до {name}!",
"mobile.ios.photos_permission_denied_description": "Щоб зберегти зображення та відео в бібліотеці, змініть налаштування вашого дозволу.",
"mobile.ios.photos_permission_denied_title": "Потрібен доступ до фото-бібліотеки",
"mobile.join_channel.error": "Ми не можемо підключитися до каналу {displayName}. Будь-ласка, перевірте підключення та спробуйте знову.",
"mobile.link.error.title": "Помилка",
"mobile.loading_channels": "Завантаження списку каналів...",
"mobile.loading_members": "Завантаження списку учасників...",
"mobile.loading_options": "Параметри завантаження...",
"mobile.loading_posts": "Завантаження повідомлень...",
"mobile.login_options.choose_title": "Виберіть спосіб входу",
"mobile.mailTo.error.title": "Помилка",
"mobile.managed.blocked_by": "Заблоковано {vendor}",
"mobile.managed.exit": "Вхід",
"mobile.managed.jailbreak": "Пристрої з Jailbroken не є довіреними {vendor}, вийдіть з програми.",
@@ -358,7 +333,6 @@
"mobile.open_dm.error": "Ми не можемо підключитися до каналу {displayName}. Будь-ласка, перевірте підключення та спробуйте знову.",
"mobile.open_gm.error": "Помилка з'єднання із групи з цими користувачами. Будь-ласка, перевірте підключення та спробуйте заново.",
"mobile.open_unknown_channel.error": "Не вдається приєднатися до каналу. Скиньте кеш і спробуйте ще раз.",
"mobile.participants.you": "(Це ви)",
"mobile.permission_denied_dismiss": "Не дозволяти",
"mobile.permission_denied_retry": "Налаштування",
"mobile.pinned_posts.empty_description": "Закріпіть важливі повідомлення, видимі для всього каналу. Довго натискайте повідомлення та виберіть Закріпити на каналі, щоб зберегти його тут.",
@@ -388,7 +362,7 @@
"mobile.post_textbox.entire_channel.title": "Підтвердьте надсилання повідомлень на весь канал",
"mobile.post_textbox.groups.title": "Confirm sending notifications to groups",
"mobile.post_textbox.one_group.message.without_timezones": "Використовуючи {mention}, ви збираєтеся надіслати сповіщення {totalMembers} людям. Ви впевнені, що хочете це зробити?",
"mobile.post_textbox.uploadFailedDesc": "Деякі вкладення не змогли завантажити на сервер. Ви впевнені, що хочете опублікувати це повідомлення?",
"mobile.post_textbox.uploadFailedDesc": "Деякі вкладення не змогли завантажити на сервер. Ви впевнені, що хочете опублікувати це повідомлення? ",
"mobile.post_textbox.uploadFailedTitle": "Вкладення несправності",
"mobile.posts_view.moreMsg": "Більше нових повідомлень ",
"mobile.prepare_file.failed_description": "Під час підготовки файлу сталася помилка. Будь ласка спробуйте ще раз.\n",
@@ -434,7 +408,6 @@
"mobile.routes.sso": "Одиночна система входу",
"mobile.routes.table": "Таблиця",
"mobile.routes.thread": "{channelName} Деталі",
"mobile.routes.thread_crt": "Thread",
"mobile.routes.thread_dm": "Прямий потік повідомлень",
"mobile.routes.user_profile": "Профіль ",
"mobile.routes.user_profile.edit": "Редагувати",
@@ -537,7 +510,6 @@
"password_send.reset": "Скинути пароль ",
"permalink.error.access": "Постійне посилання належить до видаленого повідомлення або до каналу, на який ви не маєте доступу.",
"permalink.error.link_not_found": "Посилання не знайдено",
"permalink.show_dialog_warn.cancel": "Відміна",
"post_body.check_for_out_of_channel_groups_mentions.message": "did not get notified by this mention because they are not in the channel. They cannot be added to the channel because they are not a member of the linked groups. To add them to this channel, they must be added to the linked groups.",
"post_body.check_for_out_of_channel_mentions.link.and": "і",
"post_body.check_for_out_of_channel_mentions.link.private": "додайте їх до цього приватного каналу",
@@ -606,10 +578,9 @@
"user.settings.general.emailSamlCantUpdate": "Вхід здійснюється через GitLab. Електронна пошта не може бути оновлена. Електронна адреса, яку використовують для сповіщень, є {email}. ",
"user.settings.general.field_handled_externally": "Це поле обробляється вашим провайдером входу. Якщо ви хочете це змінити,то потрібно це зробити через свого постачальника послуг входу.",
"user.settings.general.firstName": "Ім'я ",
"user.settings.general.lastName": "Прізвище",
"user.settings.general.lastName": "Прізвище ",
"user.settings.general.nickname": "Псевдонім",
"user.settings.general.position": "Посада",
"user.settings.general.status": "Статус",
"user.settings.general.username": "Ім'я користувача",
"user.settings.modal.display": "Вигляд",
"user.settings.modal.notifications": "Сповіщення ",

View File

@@ -1,45 +0,0 @@
# Notice.txt File Configuration
We are automatically generating Notice.txt by using first-level dependencies of the project. The related pipeline uses `config.yaml` stored in this folder.
## Configuration
Notice.txt will be always generated from first-level dependencies scanned from package.json files. For some cases it may be useful to define
the dependency to add its licence to the Notice.txt even if it is not a first-level dependency or development dependency.
For instance, at the desktop project we need to add `wix`'s licence to the Notice.txt even if it is not a first-level dependency. To do that define
all dependencies at `dependencies` array at the configuration. For any dependency at `dependencies` section, pipeline code will add their
licenses to the Notice.txt file.
At the webapp project, `webpack` is used in `devDependencies` and it is requested because we are using some files generated by `webpack`. If there is any dependency
referenced at `devDependencies` section, pipeline will add those dependency licences when they are referenced at `package.json` files.
Sample:
```
title: "Mattermost Mobile"
copyright: "© 2016-present Mattermost, Inc. All Rights Reserved. See LICENSE.txt for license information."
description: "This document includes a list of open source components used in Mattermost Mobile, including those that have been modified."
reviewers:
- mattermost/release-managers
- enahum
search:
- "package.json"
dependencies:
- "wix"
devDependencies:
- "webpack"
```
| Field | Type | Purpose |
| :-- | :-- | :-- |
| title | string | Field content will be used as a title of the application. See first line of `NOTICE.txt` file. |
| copyright | string | Field content will be used as a copyright message. See second line of `NOTICE.txt` file. |
| description | string | Field content will be used as notice file description. See third line of `NOTICE.txt` file. |
| reviewers | array of GitHub user/teams | Those will be automatically assigned to the PRs as reviewers. |
| dependencies | array | If any dependency name mentioned, it will be automatically added even if it is not a first-level dependency. |
| devDependencies | array | If any dependency name mentioned, it will be added when it is referenced in devDependency section. |
| search | array | Pipeline will search for package.json files mentioned here. Globstar format is supported ie. `packages/**/package.json`. |

View File

@@ -1,14 +0,0 @@
---
title: "Mattermost Mobile"
copyright: "© 2016-present Mattermost, Inc. All Rights Reserved. See LICENSE.txt for license information."
description: "This document includes a list of open source components used in Mattermost Mobile, including those that have been modified."
reviewers:
- "mattermost/release-managers"
- "enahum"
search:
- "package.json"
dependencies: []
devDependencies: []
...

View File

@@ -6765,9 +6765,9 @@
}
},
"node_modules/moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
"version": "2.29.2",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
"integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==",
"dev": true,
"optional": true,
"engines": {
@@ -7698,9 +7698,9 @@
}
},
"node_modules/shell-quote": {
"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==",
"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==",
"dev": true
},
"node_modules/signal-exit": {
@@ -13536,9 +13536,9 @@
}
},
"moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
"version": "2.29.2",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
"integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==",
"dev": true,
"optional": true
},
@@ -14258,9 +14258,9 @@
"dev": true
},
"shell-quote": {
"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==",
"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==",
"dev": true
},
"signal-exit": {

View File

@@ -661,6 +661,14 @@ platform :android do
beta_dir = './android/app/src/main/java/com/mattermost/rnbeta/'
release_dir = "./android/app/src/main/java/#{package_id.gsub '.', '/'}/"
if ENV['BUILD_FOR_RELEASE'] == 'true'
find_replace_string(
path_to_file: "#{beta_dir}MainApplication.java",
old_string: 'return BuildConfig.DEBUG;',
new_string: 'return false;'
)
end
if release_dir != beta_dir
unless Dir.exist?(".#{release_dir}")
FileUtils.mkdir_p ".#{release_dir}"
@@ -681,14 +689,6 @@ platform :android do
new_string: "package #{package_id};"
)
end
Dir.glob('../android/app/src/main/java/com/mattermost/newarchitecture/*.java') do |item|
find_replace_string(
path_to_file: item[1..-1],
old_string: 'import com.mattermost.rnbeta.BuildConfig;',
new_string: "import #{package_id}.BuildConfig;"
)
end
Dir.glob('../android/app/src/main/java/com/mattermost/share/*.java') do |item|
find_replace_string(

View File

@@ -3,25 +3,25 @@ GEM
specs:
CFPropertyList (3.0.5)
rexml
addressable (2.8.1)
public_suffix (>= 2.0.2, < 6.0)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.2.0)
aws-partitions (1.656.0)
aws-sdk-core (3.166.0)
aws-partitions (1.590.0)
aws-sdk-core (3.131.1)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.59.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.117.1)
aws-sdk-core (~> 3, >= 3.165.0)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.57.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.2)
aws-sigv4 (1.5.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.1.0)
@@ -34,10 +34,10 @@ GEM
rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
dotenv (2.8.1)
dotenv (2.7.6)
emoji_regex (3.2.3)
excon (0.93.1)
faraday (1.10.2)
excon (0.92.3)
faraday (1.10.0)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
@@ -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.4)
multipart-post (~> 2)
faraday-multipart (1.0.3)
multipart-post (>= 1.2, < 3)
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.210.1)
fastlane (2.206.1)
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.31.0)
google-apis-core (>= 0.9.1, < 2.a)
google-apis-core (0.9.1)
google-apis-androidpublisher_v3 (0.21.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-core (0.5.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.16.0)
google-apis-core (>= 0.9.1, < 2.a)
google-apis-playcustomapp_v1 (0.12.0)
google-apis-core (>= 0.9.1, < 2.a)
google-apis-storage_v1 (0.19.0)
google-apis-core (>= 0.9.0, < 2.a)
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-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.3.0)
google-cloud-storage (1.44.0)
google-cloud-errors (1.2.0)
google-cloud-storage (1.36.2)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.19.0)
google-apis-storage_v1 (~> 0.1)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.3.0)
googleauth (1.1.3)
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.5)
http-cookie (1.0.4)
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.6.1)
json (2.6.2)
jwt (2.5.0)
jwt (2.3.0)
memoist (0.16.2)
mini_magick (4.11.0)
mini_mime (1.1.2)
@@ -164,13 +164,13 @@ GEM
multipart-post (2.0.0)
nanaimo (0.3.0)
naturally (2.2.1)
nokogiri (1.13.9)
nokogiri (1.13.6)
mini_portile2 (~> 2.8.0)
racc (~> 1.4)
optparse (0.1.1)
os (1.1.4)
plist (3.6.0)
public_suffix (5.0.0)
public_suffix (4.0.7)
racc (1.6.0)
rake (13.0.6)
representable (3.2.0)
@@ -183,9 +183,9 @@ GEM
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
security (0.1.3)
signet (0.17.0)
signet (0.16.1)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
faraday (>= 0.17.5, < 3.0)
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.2)
unf_ext (0.0.8.1)
unicode-display_width (1.8.0)
webrick (1.7.0)
word_wrap (1.0.0)
xcodeproj (1.22.0)
xcodeproj (1.21.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)

View File

@@ -3,14 +3,10 @@
import 'react-native/Libraries/Core/InitializeCore';
import {Platform, Text} from 'react-native';
import ViewReactNativeStyleAttributes from 'react-native/Libraries/Components/View/ReactNativeStyleAttributes';
import 'react-native-gesture-handler';
import 'app/mattermost';
// Add scaleY back to work around its removal in React Native 0.70.
ViewReactNativeStyleAttributes.scaleY = true;
if (Platform.OS === 'android') {
require('harmony-reflect');
}

View File

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

View File

@@ -21,7 +21,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.56.0</string>
<string>1.53.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
@@ -37,7 +37,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>436</string>
<string>404</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.56.0</string>
<string>1.53.0</string>
<key>CFBundleVersion</key>
<string>436</string>
<string>404</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.56.0</string>
<string>1.53.0</string>
<key>CFBundleVersion</key>
<string>436</string>
<string>404</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>

View File

@@ -38,11 +38,6 @@ target 'Mattermost' do
config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
end
end
if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
target.build_configurations.each do |config|
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
end
end
end

View File

@@ -3,14 +3,14 @@ PODS:
- BVLinearGradient (2.5.6):
- React
- DoubleConversion (1.1.6)
- FBLazyVector (0.67.5)
- FBReactNativeSpec (0.67.5):
- FBLazyVector (0.67.2)
- FBReactNativeSpec (0.67.2):
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.67.5)
- RCTTypeSafety (= 0.67.5)
- React-Core (= 0.67.5)
- React-jsi (= 0.67.5)
- ReactCommon/turbomodule/core (= 0.67.5)
- RCTRequired (= 0.67.2)
- RCTTypeSafety (= 0.67.2)
- React-Core (= 0.67.2)
- React-jsi (= 0.67.2)
- ReactCommon/turbomodule/core (= 0.67.2)
- fmt (6.2.1)
- glog (0.3.5)
- HMSegmentedControl (1.5.6)
@@ -52,195 +52,195 @@ PODS:
- DoubleConversion
- fmt (~> 6.2.1)
- glog
- RCTRequired (0.67.5)
- RCTTypeSafety (0.67.5):
- FBLazyVector (= 0.67.5)
- RCTRequired (0.67.2)
- RCTTypeSafety (0.67.2):
- FBLazyVector (= 0.67.2)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTRequired (= 0.67.5)
- React-Core (= 0.67.5)
- RCTRequired (= 0.67.2)
- React-Core (= 0.67.2)
- RCTYouTube (2.0.2):
- React
- YoutubePlayer-in-WKWebView (~> 0.3.1)
- React (0.67.5):
- React-Core (= 0.67.5)
- React-Core/DevSupport (= 0.67.5)
- React-Core/RCTWebSocket (= 0.67.5)
- React-RCTActionSheet (= 0.67.5)
- React-RCTAnimation (= 0.67.5)
- React-RCTBlob (= 0.67.5)
- React-RCTImage (= 0.67.5)
- React-RCTLinking (= 0.67.5)
- React-RCTNetwork (= 0.67.5)
- React-RCTSettings (= 0.67.5)
- React-RCTText (= 0.67.5)
- React-RCTVibration (= 0.67.5)
- React-callinvoker (0.67.5)
- React-Core (0.67.5):
- React (0.67.2):
- React-Core (= 0.67.2)
- React-Core/DevSupport (= 0.67.2)
- React-Core/RCTWebSocket (= 0.67.2)
- React-RCTActionSheet (= 0.67.2)
- React-RCTAnimation (= 0.67.2)
- React-RCTBlob (= 0.67.2)
- React-RCTImage (= 0.67.2)
- React-RCTLinking (= 0.67.2)
- React-RCTNetwork (= 0.67.2)
- React-RCTSettings (= 0.67.2)
- React-RCTText (= 0.67.2)
- React-RCTVibration (= 0.67.2)
- React-callinvoker (0.67.2)
- React-Core (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.67.5)
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-Core/Default (= 0.67.2)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/CoreModulesHeaders (0.67.5):
- React-Core/CoreModulesHeaders (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/Default (0.67.5):
- React-Core/Default (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/DevSupport (0.67.5):
- React-Core/DevSupport (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.67.5)
- React-Core/RCTWebSocket (= 0.67.5)
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-jsinspector (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-Core/Default (= 0.67.2)
- React-Core/RCTWebSocket (= 0.67.2)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-jsinspector (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/RCTActionSheetHeaders (0.67.5):
- React-Core/RCTActionSheetHeaders (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/RCTAnimationHeaders (0.67.5):
- React-Core/RCTAnimationHeaders (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/RCTBlobHeaders (0.67.5):
- React-Core/RCTBlobHeaders (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/RCTImageHeaders (0.67.5):
- React-Core/RCTImageHeaders (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/RCTLinkingHeaders (0.67.5):
- React-Core/RCTLinkingHeaders (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/RCTNetworkHeaders (0.67.5):
- React-Core/RCTNetworkHeaders (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/RCTSettingsHeaders (0.67.5):
- React-Core/RCTSettingsHeaders (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/RCTTextHeaders (0.67.5):
- React-Core/RCTTextHeaders (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/RCTVibrationHeaders (0.67.5):
- React-Core/RCTVibrationHeaders (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-Core/RCTWebSocket (0.67.5):
- React-Core/RCTWebSocket (0.67.2):
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/Default (= 0.67.5)
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsiexecutor (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-Core/Default (= 0.67.2)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsiexecutor (= 0.67.2)
- React-perflogger (= 0.67.2)
- Yoga
- React-CoreModules (0.67.5):
- FBReactNativeSpec (= 0.67.5)
- React-CoreModules (0.67.2):
- FBReactNativeSpec (= 0.67.2)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.67.5)
- React-Core/CoreModulesHeaders (= 0.67.5)
- React-jsi (= 0.67.5)
- React-RCTImage (= 0.67.5)
- ReactCommon/turbomodule/core (= 0.67.5)
- React-cxxreact (0.67.5):
- RCTTypeSafety (= 0.67.2)
- React-Core/CoreModulesHeaders (= 0.67.2)
- React-jsi (= 0.67.2)
- React-RCTImage (= 0.67.2)
- ReactCommon/turbomodule/core (= 0.67.2)
- React-cxxreact (0.67.2):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.67.5)
- React-jsi (= 0.67.5)
- React-jsinspector (= 0.67.5)
- React-logger (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-runtimeexecutor (= 0.67.5)
- React-jsi (0.67.5):
- React-callinvoker (= 0.67.2)
- React-jsi (= 0.67.2)
- React-jsinspector (= 0.67.2)
- React-logger (= 0.67.2)
- React-perflogger (= 0.67.2)
- React-runtimeexecutor (= 0.67.2)
- React-jsi (0.67.2):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsi/Default (= 0.67.5)
- React-jsi/Default (0.67.5):
- React-jsi/Default (= 0.67.2)
- React-jsi/Default (0.67.2):
- boost (= 1.76.0)
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-jsiexecutor (0.67.5):
- React-jsiexecutor (0.67.2):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-jsinspector (0.67.5)
- React-logger (0.67.5):
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-perflogger (= 0.67.2)
- React-jsinspector (0.67.2)
- React-logger (0.67.2):
- glog
- react-native-cameraroll (4.1.2):
- React-Core
@@ -259,7 +259,7 @@ PODS:
- React-Core
- react-native-netinfo (7.1.9):
- React-Core
- react-native-notifications (4.3.1):
- react-native-notifications (4.1.3):
- React-Core
- react-native-passcode-status (1.1.2):
- React
@@ -281,71 +281,71 @@ PODS:
- React
- react-native-webview (11.17.1):
- React-Core
- React-perflogger (0.67.5)
- React-RCTActionSheet (0.67.5):
- React-Core/RCTActionSheetHeaders (= 0.67.5)
- React-RCTAnimation (0.67.5):
- FBReactNativeSpec (= 0.67.5)
- React-perflogger (0.67.2)
- React-RCTActionSheet (0.67.2):
- React-Core/RCTActionSheetHeaders (= 0.67.2)
- React-RCTAnimation (0.67.2):
- FBReactNativeSpec (= 0.67.2)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.67.5)
- React-Core/RCTAnimationHeaders (= 0.67.5)
- React-jsi (= 0.67.5)
- ReactCommon/turbomodule/core (= 0.67.5)
- React-RCTBlob (0.67.5):
- FBReactNativeSpec (= 0.67.5)
- RCTTypeSafety (= 0.67.2)
- React-Core/RCTAnimationHeaders (= 0.67.2)
- React-jsi (= 0.67.2)
- ReactCommon/turbomodule/core (= 0.67.2)
- React-RCTBlob (0.67.2):
- FBReactNativeSpec (= 0.67.2)
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/RCTBlobHeaders (= 0.67.5)
- React-Core/RCTWebSocket (= 0.67.5)
- React-jsi (= 0.67.5)
- React-RCTNetwork (= 0.67.5)
- ReactCommon/turbomodule/core (= 0.67.5)
- React-RCTImage (0.67.5):
- FBReactNativeSpec (= 0.67.5)
- React-Core/RCTBlobHeaders (= 0.67.2)
- React-Core/RCTWebSocket (= 0.67.2)
- React-jsi (= 0.67.2)
- React-RCTNetwork (= 0.67.2)
- ReactCommon/turbomodule/core (= 0.67.2)
- React-RCTImage (0.67.2):
- FBReactNativeSpec (= 0.67.2)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.67.5)
- React-Core/RCTImageHeaders (= 0.67.5)
- React-jsi (= 0.67.5)
- React-RCTNetwork (= 0.67.5)
- ReactCommon/turbomodule/core (= 0.67.5)
- React-RCTLinking (0.67.5):
- FBReactNativeSpec (= 0.67.5)
- React-Core/RCTLinkingHeaders (= 0.67.5)
- React-jsi (= 0.67.5)
- ReactCommon/turbomodule/core (= 0.67.5)
- React-RCTNetwork (0.67.5):
- FBReactNativeSpec (= 0.67.5)
- RCTTypeSafety (= 0.67.2)
- React-Core/RCTImageHeaders (= 0.67.2)
- React-jsi (= 0.67.2)
- React-RCTNetwork (= 0.67.2)
- ReactCommon/turbomodule/core (= 0.67.2)
- React-RCTLinking (0.67.2):
- FBReactNativeSpec (= 0.67.2)
- React-Core/RCTLinkingHeaders (= 0.67.2)
- React-jsi (= 0.67.2)
- ReactCommon/turbomodule/core (= 0.67.2)
- React-RCTNetwork (0.67.2):
- FBReactNativeSpec (= 0.67.2)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.67.5)
- React-Core/RCTNetworkHeaders (= 0.67.5)
- React-jsi (= 0.67.5)
- ReactCommon/turbomodule/core (= 0.67.5)
- React-RCTSettings (0.67.5):
- FBReactNativeSpec (= 0.67.5)
- RCTTypeSafety (= 0.67.2)
- React-Core/RCTNetworkHeaders (= 0.67.2)
- React-jsi (= 0.67.2)
- ReactCommon/turbomodule/core (= 0.67.2)
- React-RCTSettings (0.67.2):
- FBReactNativeSpec (= 0.67.2)
- RCT-Folly (= 2021.06.28.00-v2)
- RCTTypeSafety (= 0.67.5)
- React-Core/RCTSettingsHeaders (= 0.67.5)
- React-jsi (= 0.67.5)
- ReactCommon/turbomodule/core (= 0.67.5)
- React-RCTText (0.67.5):
- React-Core/RCTTextHeaders (= 0.67.5)
- React-RCTVibration (0.67.5):
- FBReactNativeSpec (= 0.67.5)
- RCTTypeSafety (= 0.67.2)
- React-Core/RCTSettingsHeaders (= 0.67.2)
- React-jsi (= 0.67.2)
- ReactCommon/turbomodule/core (= 0.67.2)
- React-RCTText (0.67.2):
- React-Core/RCTTextHeaders (= 0.67.2)
- React-RCTVibration (0.67.2):
- FBReactNativeSpec (= 0.67.2)
- RCT-Folly (= 2021.06.28.00-v2)
- React-Core/RCTVibrationHeaders (= 0.67.5)
- React-jsi (= 0.67.5)
- ReactCommon/turbomodule/core (= 0.67.5)
- React-runtimeexecutor (0.67.5):
- React-jsi (= 0.67.5)
- ReactCommon/turbomodule/core (0.67.5):
- React-Core/RCTVibrationHeaders (= 0.67.2)
- React-jsi (= 0.67.2)
- ReactCommon/turbomodule/core (= 0.67.2)
- React-runtimeexecutor (0.67.2):
- React-jsi (= 0.67.2)
- ReactCommon/turbomodule/core (0.67.2):
- DoubleConversion
- glog
- RCT-Folly (= 2021.06.28.00-v2)
- React-callinvoker (= 0.67.5)
- React-Core (= 0.67.5)
- React-cxxreact (= 0.67.5)
- React-jsi (= 0.67.5)
- React-logger (= 0.67.5)
- React-perflogger (= 0.67.5)
- React-callinvoker (= 0.67.2)
- React-Core (= 0.67.2)
- React-cxxreact (= 0.67.2)
- React-jsi (= 0.67.2)
- React-logger (= 0.67.2)
- React-perflogger (= 0.67.2)
- ReactNativeExceptionHandler (2.10.10):
- React-Core
- ReactNativeIncallManager (3.3.0):
@@ -730,8 +730,8 @@ SPEC CHECKSUMS:
boost: a7c83b31436843459a1961bfd74b96033dc77234
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
FBLazyVector: d2db9d00883282819d03bbd401b2ad4360d47580
FBReactNativeSpec: 94da4d84ba3b1acf459103320882daa481a2b62d
FBLazyVector: 244195e30d63d7f564c55da4410b9a24e8fbceaa
FBReactNativeSpec: c94002c1d93da3658f4d5119c6994d19961e3d52
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
glog: 85ecdd10ee8d8ec362ef519a6a45ff9aa27b2e85
HMSegmentedControl: 34c1f54d822d8308e7b24f5d901ec674dfa31352
@@ -747,18 +747,18 @@ SPEC CHECKSUMS:
Permission-PhotoLibrary: 7bec836dcdd04a0bfb200c314f1aae06d4476357
Permission-PhotoLibraryAddOnly: 06fb0cdb1d35683b235ad8c464ef0ecc88859ea3
RCT-Folly: 803a9cfd78114b2ec0f140cfa6fa2a6bafb2d685
RCTRequired: 412e994c1e570cf35378a32c18fd46e50634938b
RCTTypeSafety: ef27340c728e6d673af345ed69e479a010c8a2d8
RCTRequired: cd47794163052d2b8318c891a7a14fcfaccc75ab
RCTTypeSafety: 393bb40b3e357b224cde53d3fec26813c52428b1
RCTYouTube: a8bb45705622a6fc9decf64be04128d3658ed411
React: 36b9f5116572e5b80f01e562bb1f1451e8848e47
React-callinvoker: 91e62870884d3db3a0db33bbb1ba4e53fa5210ca
React-Core: 765ccc3861be1b93c7d5ca37f6b06e2efd6e7999
React-CoreModules: da2ddff50a92576b6d58fbfc80a62ba3f81d8a4e
React-cxxreact: b54cffd4feb550c3213cd38db4a2a4bdd896f715
React-jsi: 103674913e4159a07df20ef214c6b563e90e7b2e
React-jsiexecutor: e9895ccae253323ca70f693945fecbba091f0abd
React-jsinspector: ec4fe4f65ccf9d67c8429dda955d3412db8a25ef
React-logger: 85f4ef06b9723714b2dfa5b0e5502b673b271b58
React: dec6476bc27155b250eeadfc11ea779265f53ebf
React-callinvoker: e5047929e80aea942e6fdd96482504ef0189ca63
React-Core: e382655566b2b9a6e3b4f641d777b7bfdbe52358
React-CoreModules: cf262e82fa101c0aee022b6f90d1a5b612038b64
React-cxxreact: 69d53de3b30c7c161ba087ca1ecdffed9ccb1039
React-jsi: ce9a2d804adf75809ce2fe2374ba3fbbf5d59b03
React-jsiexecutor: 52beb652bbc61201bd70cbe4f0b8edb607e8da4f
React-jsinspector: 595f76eba2176ebd8817a1fffd47b84fbdab9383
React-logger: 23de8ea0f44fa00ee77e96060273225607fd4d78
react-native-cameraroll: 2957f2bce63ae896a848fbe0d5352c1bd4d20866
react-native-cookies: cd92f3824ed1e32a20802e8185101e14bb5b76da
react-native-document-picker: 429972f7ece4463aa5bcdd789622b3a674a3c5d1
@@ -767,7 +767,7 @@ SPEC CHECKSUMS:
react-native-local-auth: 49d336dcf0cb0268a930100013a6525844093844
react-native-mmkv-storage: 2b57ca101fae52428f6cef6552793f83c0cdbc46
react-native-netinfo: 87e5bfaf21ea5c6c110941290aa481dd8e849f98
react-native-notifications: 33ec77006f7987bb22de8f1665889abc633b9196
react-native-notifications: 805108822ceff3440644d5701944f0cda35f5b4b
react-native-passcode-status: e78f76b3c8db613e6ced6bd40b54aa4f53374173
react-native-paste-input: 80c06e2c5c65afd696f9bd43cfd371141d8b3a1b
react-native-safe-area: e8230b0017d76c00de6b01e2412dcf86b127c6a3
@@ -776,18 +776,18 @@ SPEC CHECKSUMS:
react-native-video: a4c2635d0802f983594b7057e1bce8f442f0ad28
react-native-webrtc: 86d841823e66d68cc1f86712db1c2956056bf0c2
react-native-webview: 162b6453d074e0b1c7025242bb7a939b6f72b9e7
React-perflogger: d32ee13196f4ae2e4098fb7f8e7ed4f864c6fb0f
React-RCTActionSheet: 81779c09e34a6a3d6b15783407ba9016a774f535
React-RCTAnimation: b778eaaa42a884abcc5719035a7a0b2f54672658
React-RCTBlob: 8edfc04c117decb0e7d4e6ab32bec91707e63ecb
React-RCTImage: 2022097f1291bfebd0003e477318c72b07853578
React-RCTLinking: bd8d889c65695181342541ce4420e9419845084c
React-RCTNetwork: eae64b805d967bf3ece2cec3ad09218eeb32cb74
React-RCTSettings: 0645af8aec5f40726e98d434a07ff58e75a81aa9
React-RCTText: e55de507cda263ff58404c3e7d75bf76c2b80813
React-RCTVibration: c3b8a3245267a3849b0c7cb91a37606bf5f3aa65
React-runtimeexecutor: 434efc9e5b6d0f14f49867f130b39376c971c1aa
ReactCommon: a30c2448e5a88bae6fcb0e3da124c14ae493dac1
React-perflogger: 3c9bb7372493e49036f07a82c44c8cf65cbe88db
React-RCTActionSheet: 052606483045a408693aa7e864410b4a052f541a
React-RCTAnimation: 08d4cac13222bb1348c687a0158dfd3b577cdb63
React-RCTBlob: 928ad1df65219c3d9e2ac80983b943a75b5c3629
React-RCTImage: 524d7313b142a39ee0e20fa312b67277917fe076
React-RCTLinking: 44036ea6f13a2e46238be07a67566247fee35244
React-RCTNetwork: 9b6faacf1e0789253e319ca53b1f8d92c2ac5455
React-RCTSettings: ecd8094f831130a49581d5112a8607220e5d12a5
React-RCTText: 14ba976fb48ed283cfdb1a754a5d4276471e0152
React-RCTVibration: 99c7f67fba7a5ade46e98e870c6ff2444484f995
React-runtimeexecutor: 2450b43df7ffe8e805a0b3dcb2abd4282f1f1836
ReactCommon: d98c6c96b567f9b3a15f9fd4cc302c1eda8e3cf2
ReactNativeExceptionHandler: b11ff67c78802b2f62eed0e10e75cb1ef7947c60
ReactNativeIncallManager: 642c22630caadff0a0619413aff4a9da08d63df9
ReactNativeKeyboardTrackingView: 02137fac3b2ebd330d74fa54ead48b14750a2306
@@ -819,9 +819,9 @@ SPEC CHECKSUMS:
Sentry: 2f7e91f247cfb05b05bd01e0b5d0692557a7687b
Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b
XCDYouTubeKit: b120aced3d8638ffb570c5450cddb5a1dac448c7
Yoga: 099a946cbf84c9b32ffdc4278d72db26710ecf92
Yoga: 9b6696970c3289e8dea34b3eda93f23e61fb8121
YoutubePlayer-in-WKWebView: 4fca3b4f6f09940077bfbae7bddb771f2b43aacd
PODFILE CHECKSUM: f291d3248a7b8e74342008fb662bad0b0e1b7589
PODFILE CHECKSUM: 8214414d5676358401d8ad51dff19e7fd8c71b5c
COCOAPODS: 1.11.2
COCOAPODS: 1.11.3

346
package-lock.json generated
View File

@@ -1,12 +1,11 @@
{
"name": "mattermost-mobile",
"version": "1.56.0",
"version": "1.53.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "mattermost-mobile",
"version": "1.56.0",
"version": "1.51.0",
"hasInstallScript": true,
"license": "Apache 2.0",
"dependencies": {
@@ -43,7 +42,7 @@
"prop-types": "15.8.1",
"react": "17.0.2",
"react-intl": "2.8.0",
"react-native": "0.67.5",
"react-native": "0.67.2",
"react-native-android-open-settings": "1.3.0",
"react-native-animatable": "1.3.3",
"react-native-button": "3.0.1",
@@ -68,7 +67,7 @@
"react-native-math-view": "3.9.5",
"react-native-mmkv-storage": "0.6.11",
"react-native-navigation": "7.25.1",
"react-native-notifications": "4.3.1",
"react-native-notifications": "4.1.3",
"react-native-passcode-status": "1.1.2",
"react-native-permissions": "3.2.0",
"react-native-reanimated": "2.3.1",
@@ -2863,70 +2862,6 @@
"node": ">=8"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
"dev": true,
"peer": true,
"dependencies": {
"@jridgewell/set-array": "^1.0.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
"dev": true,
"peer": true,
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/set-array": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
"integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
"dev": true,
"peer": true,
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
"integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
"dev": true,
"peer": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
"dev": true,
"peer": true
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.14",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
"integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
"dev": true,
"peer": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"node_modules/@mattermost/react-native-paste-input": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@mattermost/react-native-paste-input/-/react-native-paste-input-0.3.6.tgz",
@@ -17480,9 +17415,9 @@
"integrity": "sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ=="
},
"node_modules/moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
"version": "2.29.2",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
"integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==",
"engines": {
"node": "*"
}
@@ -19357,9 +19292,9 @@
"integrity": "sha512-txfpPCQYiazVdcbMRhatqWKcAxJweUu2wDXvts5/7Wyp6+Y9cHojqXHsLPEckzutfHlxZhG8Oiundbmp8Fd6eQ=="
},
"node_modules/react-native": {
"version": "0.67.5",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.67.5.tgz",
"integrity": "sha512-/xEksthqImZGDfcqzEmbOw0KRkp9/x+cC8T8uTHhSKLLa8pOFLGdF190UOjnLammGmAmFy0+ZcJf0Ujm53IGeA==",
"version": "0.67.2",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.67.2.tgz",
"integrity": "sha512-grEtpOLLvtSg8Bivg0ffVRCjTkresqMt7Jdog/geF6VAYhb4RnLaaUCWvyrfyB9buf135FKnqg5BIuve/XQNXA==",
"dependencies": {
"@jest/create-cache-key-function": "^27.0.1",
"@react-native-community/cli": "^6.0.0",
@@ -19691,12 +19626,12 @@
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
},
"node_modules/react-native-notifications": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/react-native-notifications/-/react-native-notifications-4.3.1.tgz",
"integrity": "sha512-A668d+Q0/VQRjmrh+LvDpc/REA8GXgwCijXDCIlDHGMK8enmrtdxY5OANQf1VM3hecf+fD0wYFw2uqL/ZR8jgg==",
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/react-native-notifications/-/react-native-notifications-4.1.3.tgz",
"integrity": "sha512-A4SmRyfh2OlkptlJQvcQKkfnBKO1toUShmFplTkLXPNCqfpm/i4Fz+Uv+LzHSvbsU5U7EYf3JX9sfuyR06ZGPg==",
"peerDependencies": {
"react": "*",
"react-native": "*"
"react": ">=0.14.5",
"react-native": ">=0.25.1"
}
},
"node_modules/react-native-passcode-status": {
@@ -22580,15 +22515,14 @@
}
},
"node_modules/terser": {
"version": "5.14.2",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
"integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
"version": "5.10.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
"integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
"dev": true,
"peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0",
"commander": "^2.20.0",
"source-map": "~0.7.2",
"source-map-support": "~0.5.20"
},
"bin": {
@@ -22596,6 +22530,14 @@
},
"engines": {
"node": ">=10"
},
"peerDependencies": {
"acorn": "^8.5.0"
},
"peerDependenciesMeta": {
"acorn": {
"optional": true
}
}
},
"node_modules/terser-webpack-plugin": {
@@ -22703,6 +22645,16 @@
"dev": true,
"peer": true
},
"node_modules/terser/node_modules/source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"dev": true,
"peer": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
@@ -26065,66 +26017,12 @@
}
}
},
"@jridgewell/gen-mapping": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
"dev": true,
"peer": true,
"requires": {
"@jridgewell/set-array": "^1.0.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"@jridgewell/resolve-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
"dev": true,
"peer": true
},
"@jridgewell/set-array": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
"integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
"dev": true,
"peer": true
},
"@jridgewell/source-map": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
"integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
"dev": true,
"peer": true,
"requires": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"@jridgewell/sourcemap-codec": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
"dev": true,
"peer": true
},
"@jridgewell/trace-mapping": {
"version": "0.3.14",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
"integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
"dev": true,
"peer": true,
"requires": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"@mattermost/react-native-paste-input": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@mattermost/react-native-paste-input/-/react-native-paste-input-0.3.6.tgz",
"integrity": "sha512-/XwUkWfkXDPv1/N+3sILKRoqa4sElqN/fADQzkC2KHYxVKN72297vMm8s+X1n2l+y7phNQ8ZmhjjL0ghuz/1og==",
"requires": {}
"requires": {
}
},
"@msgpack/msgpack": {
"version": "2.7.1",
@@ -26176,7 +26074,8 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/@react-native-community/cameraroll/-/cameraroll-4.1.2.tgz",
"integrity": "sha512-jkdhMByMKD2CZ/5MPeBieYn8vkCfC4MOTouPpBpps3I8N6HUYJk+1JnDdktVYl2WINnqXpQptDA2YptVyifYAg==",
"requires": {}
"requires": {
}
},
"@react-native-community/cli": {
"version": "6.4.0",
@@ -26926,7 +26825,8 @@
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz",
"integrity": "sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA==",
"requires": {}
"requires": {
}
},
"@react-native-community/datetimepicker": {
"version": "5.1.0",
@@ -27031,7 +26931,8 @@
"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz",
"integrity": "sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg==",
"dev": true,
"requires": {}
"requires": {
}
},
"eslint-plugin-react-native": {
"version": "3.11.0",
@@ -27061,13 +26962,15 @@
"version": "0.1.11",
"resolved": "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.11.tgz",
"integrity": "sha512-rQfMIGSR/1r/SyN87+VD8xHHzDYeHaJq6elOSCAD+0iLagXkSI2pfA0LmSXP21uw5i3em7GkkRjfJ8wpqWXZNw==",
"requires": {}
"requires": {
}
},
"@react-native-community/netinfo": {
"version": "7.1.9",
"resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-7.1.9.tgz",
"integrity": "sha512-xxbxFherpOjQeJm3rIx6gmZNEEBqVDIcmBII5QVSN8zf3xAwmaT/RxT74ISYDkeSlZwv4eegpkD4QA1ky52CNg==",
"requires": {}
"requires": {
}
},
"@react-native-cookies/cookies": {
"version": "6.0.11",
@@ -27108,7 +27011,8 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.0.tgz",
"integrity": "sha512-C0roIxajvleskEpeYYJ1+2XTg8UqZO6o/SyzqTRuEUVsVD8CbFzKSOfj9kpfzA7jbYNzZPbzUJcm9kIigY9kHg==",
"requires": {}
"requires": {
}
},
"@react-navigation/native": {
"version": "6.0.7",
@@ -28058,7 +27962,8 @@
"resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz",
"integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==",
"dev": true,
"requires": {}
"requires": {
}
},
"@webpack-cli/info": {
"version": "1.4.1",
@@ -28074,7 +27979,8 @@
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz",
"integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==",
"dev": true,
"requires": {}
"requires": {
}
},
"@xtuc/ieee754": {
"version": "1.2.0",
@@ -28159,14 +28065,16 @@
"integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
"dev": true,
"peer": true,
"requires": {}
"requires": {
}
},
"acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
"requires": {}
"requires": {
}
},
"acorn-walk": {
"version": "7.2.0",
@@ -28554,7 +28462,8 @@
"version": "7.0.0-bridge.0",
"resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
"integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
"requires": {}
"requires": {
}
},
"babel-eslint": {
"version": "10.1.0",
@@ -30862,7 +30771,8 @@
"resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz",
"integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==",
"dev": true,
"requires": {}
"requires": {
}
},
"eslint-plugin-import": {
"version": "2.25.4",
@@ -30989,7 +30899,8 @@
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz",
"integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==",
"dev": true,
"requires": {}
"requires": {
}
},
"eslint-plugin-react-native-globals": {
"version": "0.1.2",
@@ -34631,7 +34542,8 @@
"resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
"integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
"dev": true,
"requires": {}
"requires": {
}
},
"jest-regex-util": {
"version": "27.4.0",
@@ -35452,7 +35364,8 @@
"integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==",
"dev": true,
"peer": true,
"requires": {}
"requires": {
}
}
}
},
@@ -35461,7 +35374,8 @@
"resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz",
"integrity": "sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=",
"dev": true,
"requires": {}
"requires": {
}
},
"jsesc": {
"version": "2.5.2",
@@ -37464,9 +37378,9 @@
"integrity": "sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ=="
},
"moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
"version": "2.29.2",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
"integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg=="
},
"moment-timezone": {
"version": "0.5.34",
@@ -38879,7 +38793,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.0.tgz",
"integrity": "sha512-yQaiOqDmoKqks56LN9MTgY06O0qQHgV4FUrikH357DydArSZHQhl0BJFqGKIZoTqi8JizF9Dxhuk1FIZD6qCaw==",
"requires": {}
"requires": {
}
},
"react-intl": {
"version": "2.8.0",
@@ -38911,9 +38826,9 @@
"integrity": "sha512-txfpPCQYiazVdcbMRhatqWKcAxJweUu2wDXvts5/7Wyp6+Y9cHojqXHsLPEckzutfHlxZhG8Oiundbmp8Fd6eQ=="
},
"react-native": {
"version": "0.67.5",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.67.5.tgz",
"integrity": "sha512-/xEksthqImZGDfcqzEmbOw0KRkp9/x+cC8T8uTHhSKLLa8pOFLGdF190UOjnLammGmAmFy0+ZcJf0Ujm53IGeA==",
"version": "0.67.2",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.67.2.tgz",
"integrity": "sha512-grEtpOLLvtSg8Bivg0ffVRCjTkresqMt7Jdog/geF6VAYhb4RnLaaUCWvyrfyB9buf135FKnqg5BIuve/XQNXA==",
"requires": {
"@jest/create-cache-key-function": "^27.0.1",
"@react-native-community/cli": "^6.0.0",
@@ -39087,7 +39002,8 @@
"version": "8.4.8",
"resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-8.4.8.tgz",
"integrity": "sha512-92676ZWHZHsPM/EW1ulgb2MuVfjYfMWRTWMbLcrCsipkcMaZ9Traz5mpsnCS7KZpsOksnvUinzDIjsct2XGc6Q==",
"requires": {}
"requires": {
}
},
"react-native-document-picker": {
"version": "8.0.0",
@@ -39125,19 +39041,22 @@
"version": "2.10.10",
"resolved": "https://registry.npmjs.org/react-native-exception-handler/-/react-native-exception-handler-2.10.10.tgz",
"integrity": "sha512-otAXGoZDl1689OoUJWN/rXxVbdoZ3xcmyF1uq/CsizdLwwyZqVGd6d+p/vbYvnF996FfEyAEBnHrdFxulTn51w==",
"requires": {}
"requires": {
}
},
"react-native-fast-image": {
"version": "8.5.11",
"resolved": "https://registry.npmjs.org/react-native-fast-image/-/react-native-fast-image-8.5.11.tgz",
"integrity": "sha512-cNW4bIJg3nvKaheG8vGMfqCt5LMWX9MS5+wMudgKIHbGO51spRr4sgnlhVgwHLcZ5aeNOVJ8CPRxDIWKRq/0QA==",
"requires": {}
"requires": {
}
},
"react-native-file-viewer": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/react-native-file-viewer/-/react-native-file-viewer-2.1.5.tgz",
"integrity": "sha512-MGC6sx9jsqHdefhVQ6o0akdsPGpkXgiIbpygb2Sg4g4bh7v6K1cardLV1NwGB9A6u1yICOSDT/MOC//9Ez6EUg==",
"requires": {}
"requires": {
}
},
"react-native-gesture-handler": {
"version": "2.2.0",
@@ -39155,36 +39074,42 @@
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-1.13.0.tgz",
"integrity": "sha512-g8G5QURitDeC/zRlobDvUXLxKYfMlIM2HQNWJKbHPSu61qfs0djnK4s1NZuQzihkeAO0KJ4AS2XWvKBzUmlXtA==",
"requires": {}
"requires": {
}
},
"react-native-hw-keyboard-event": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/react-native-hw-keyboard-event/-/react-native-hw-keyboard-event-0.0.4.tgz",
"integrity": "sha512-G8qp0nm17PHigLb/axgdF9xg51BKCG2p1AGeq//J/luLp5zNczIcQJh+nm02R1MeEUE3e53wqO4LMe0MV3raZg==",
"requires": {}
"requires": {
}
},
"react-native-image-picker": {
"version": "4.7.3",
"resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-4.7.3.tgz",
"integrity": "sha512-eRKm4wlsmZHmsWFyv77kYc2F+ZyEVqe0m7mqhsMzWk6TQT4FBDtEDxmRDDFq+ivCu/1QD+EPhmYcAIpeGr7Ekg==",
"requires": {}
"requires": {
}
},
"react-native-incall-manager": {
"version": "git+ssh://git@github.com/cpoile/react-native-incall-manager.git#8c55b9dac0a2ab25d651fb54b504d384f9989b36",
"from": "react-native-incall-manager@github:cpoile/react-native-incall-manager",
"requires": {}
"requires": {
}
},
"react-native-keyboard-aware-scrollview": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/react-native-keyboard-aware-scrollview/-/react-native-keyboard-aware-scrollview-2.1.0.tgz",
"integrity": "sha512-XfWozWFPhdecfxN+wuqERX3mCGDrAim5siC6TWg3Qw7wK/zlwIwe1UIsHDNOQCzf9oIh0SkZXvoOFsMrnyIVmQ==",
"requires": {}
"requires": {
}
},
"react-native-keyboard-tracking-view": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/react-native-keyboard-tracking-view/-/react-native-keyboard-tracking-view-5.7.0.tgz",
"integrity": "sha512-MDeEwAbn9LJDOfHq0QLCGaZirVLk2X/tHqkAqz3y6uxryTRdSl9PwleOVar5Jx2oAPEg4J9BXbUD1wwOOi+5Kg==",
"requires": {}
"requires": {
}
},
"react-native-keychain": {
"version": "8.0.0",
@@ -39195,19 +39120,22 @@
"version": "2.5.6",
"resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.5.6.tgz",
"integrity": "sha512-HDwEaXcQIuXXCV70O+bK1rizFong3wj+5Q/jSyifKFLg0VWF95xh8XQgfzXwtq0NggL9vNjPKXa016KuFu+VFg==",
"requires": {}
"requires": {
}
},
"react-native-local-auth": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/react-native-local-auth/-/react-native-local-auth-1.6.0.tgz",
"integrity": "sha512-36cYGZGCG82pMiVJbQa5WMA93khP4v5JqLutFkMyB/eRpCULHmojNIBlbUPIY9SCeN4sg5VBRFTVGCtTg2r2kA==",
"requires": {}
"requires": {
}
},
"react-native-localize": {
"version": "2.1.9",
"resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-2.1.9.tgz",
"integrity": "sha512-n2Bi5P0cII8BrnG23Fs9PmpYcufD3JRbr1IBn3ArIA3Z3cGWg4eebv6am+CgdFC4kTPWUlVzX9fEgEMA+X8d6w==",
"requires": {}
"requires": {
}
},
"react-native-math-view": {
"version": "3.9.5",
@@ -39224,7 +39152,8 @@
"version": "0.6.11",
"resolved": "https://registry.npmjs.org/react-native-mmkv-storage/-/react-native-mmkv-storage-0.6.11.tgz",
"integrity": "sha512-PaxUxbTwr+PHfzoYt6E1Mds9/CjV5uOFVstuBW0laFUWlGrTHgiaLWR8VwJt0EPScSl5Lz4RM8IiqmXbIUSbbw==",
"requires": {}
"requires": {
}
},
"react-native-navigation": {
"version": "7.25.1",
@@ -39246,10 +39175,11 @@
}
},
"react-native-notifications": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/react-native-notifications/-/react-native-notifications-4.3.1.tgz",
"integrity": "sha512-A668d+Q0/VQRjmrh+LvDpc/REA8GXgwCijXDCIlDHGMK8enmrtdxY5OANQf1VM3hecf+fD0wYFw2uqL/ZR8jgg==",
"requires": {}
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/react-native-notifications/-/react-native-notifications-4.1.3.tgz",
"integrity": "sha512-A4SmRyfh2OlkptlJQvcQKkfnBKO1toUShmFplTkLXPNCqfpm/i4Fz+Uv+LzHSvbsU5U7EYf3JX9sfuyR06ZGPg==",
"requires": {
}
},
"react-native-passcode-status": {
"version": "1.1.2",
@@ -39260,7 +39190,8 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-3.2.0.tgz",
"integrity": "sha512-UPXxf2twjYL9vPI4HP2kT15AOTY489MhsNuyAgp+wJM2IRkkSVW6rO3k4WuSRL9ZmPhwkWb9bYjf8EEwRzZcXg==",
"requires": {}
"requires": {
}
},
"react-native-ratings": {
"version": "8.0.4",
@@ -39318,7 +39249,8 @@
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-3.3.2.tgz",
"integrity": "sha512-yOwiiPJ1rk+/nfK13eafbpW6sKW0jOnsRem2C1LPJjM3tfTof6hlvV5eWHATye3XOpu2cJ7N+HdkUvUDGwFD2Q==",
"requires": {}
"requires": {
}
},
"react-native-screens": {
"version": "3.10.2",
@@ -39343,7 +39275,8 @@
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/react-native-size-matters/-/react-native-size-matters-0.3.1.tgz",
"integrity": "sha512-mKOfBLIBFBcs9br1rlZDvxD5+mAl8Gfr5CounwJtxI6Z82rGrMO+Kgl9EIg3RMVf3G855a85YVqHJL2f5EDRlw==",
"requires": {}
"requires": {
}
},
"react-native-slider": {
"version": "0.11.0",
@@ -39357,7 +39290,8 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/react-native-startup-time/-/react-native-startup-time-2.0.0.tgz",
"integrity": "sha512-tYruEDvwoVEOf+FMTTqp3aHNfA5ARWXXV+ar4wJBIQBdIlPEYDQWaYljOAV2dITuTsKAyPY2Q/N58gkKvGWIrA==",
"requires": {}
"requires": {
}
},
"react-native-svg": {
"version": "12.1.1",
@@ -39722,7 +39656,8 @@
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/redux-batched-actions/-/redux-batched-actions-0.5.0.tgz",
"integrity": "sha512-6orZWyCnIQXMGY4DUGM0oj0L7oYnwTACsfsru/J7r94RM3P9eS7SORGpr3LCeRCMoIMQcpfKZ7X4NdyFHBS8Eg==",
"requires": {}
"requires": {
}
},
"redux-mock-store": {
"version": "1.5.4",
@@ -39737,7 +39672,8 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz",
"integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==",
"requires": {}
"requires": {
}
},
"redux-persist-node-storage": {
"version": "2.0.0",
@@ -39766,7 +39702,8 @@
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz",
"integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==",
"requires": {}
"requires": {
}
},
"reflect.ownkeys": {
"version": "0.2.0",
@@ -40109,7 +40046,8 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/rn-placeholder/-/rn-placeholder-3.0.3.tgz",
"integrity": "sha512-EmVeLT8zDcTPilQZ2OHO/IiYUy2gApKGgbshDZBX0C4qxsn0cFATwgwOwyz8O7Vwg1Hul97Ci95hu7d6Js6XMQ==",
"requires": {}
"requires": {
}
},
"rst-selector-parser": {
"version": "2.2.3",
@@ -40425,7 +40363,8 @@
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"requires": {}
"requires": {
}
},
"json-schema-traverse": {
"version": "0.4.1",
@@ -41432,15 +41371,14 @@
}
},
"terser": {
"version": "5.14.2",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
"integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
"version": "5.10.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
"integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
"dev": true,
"peer": true,
"requires": {
"@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0",
"commander": "^2.20.0",
"source-map": "~0.7.2",
"source-map-support": "~0.5.20"
},
"dependencies": {
@@ -41450,6 +41388,13 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"peer": true
},
"source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"dev": true,
"peer": true
}
}
},
@@ -41486,7 +41431,8 @@
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"peer": true,
"requires": {}
"requires": {
}
},
"json-schema-traverse": {
"version": "0.4.1",
@@ -42214,7 +42160,8 @@
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"peer": true,
"requires": {}
"requires": {
}
},
"json-schema-traverse": {
"version": "0.4.1",
@@ -42488,7 +42435,8 @@
"version": "7.5.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
"integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==",
"requires": {}
"requires": {
}
},
"xcode": {
"version": "3.0.1",

View File

@@ -1,6 +1,6 @@
{
"name": "mattermost-mobile",
"version": "1.56.0",
"version": "1.53.0",
"description": "Mattermost Mobile with React Native",
"repository": "git@github.com:mattermost/mattermost-mobile.git",
"author": "Mattermost, Inc.",
@@ -40,7 +40,7 @@
"prop-types": "15.8.1",
"react": "17.0.2",
"react-intl": "2.8.0",
"react-native": "0.67.5",
"react-native": "0.67.2",
"react-native-android-open-settings": "1.3.0",
"react-native-animatable": "1.3.3",
"react-native-button": "3.0.1",
@@ -65,7 +65,7 @@
"react-native-math-view": "3.9.5",
"react-native-mmkv-storage": "0.6.11",
"react-native-navigation": "7.25.1",
"react-native-notifications": "4.3.1",
"react-native-notifications": "4.1.3",
"react-native-passcode-status": "1.1.2",
"react-native-permissions": "3.2.0",
"react-native-reanimated": "2.3.1",

View File

@@ -1,5 +1,5 @@
diff --git a/node_modules/react-native-notifications/lib/android/app/src/main/AndroidManifest.xml b/node_modules/react-native-notifications/lib/android/app/src/main/AndroidManifest.xml
index 24cd226..4bfacba 100644
index abd988a..4ac4725 100644
--- a/node_modules/react-native-notifications/lib/android/app/src/main/AndroidManifest.xml
+++ b/node_modules/react-native-notifications/lib/android/app/src/main/AndroidManifest.xml
@@ -3,6 +3,7 @@
@@ -10,7 +10,7 @@ index 24cd226..4bfacba 100644
<application>
<!--
@@ -23,6 +24,9 @@
@@ -22,6 +23,9 @@
android:name=".fcm.FcmInstanceIdRefreshHandlerService"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />
@@ -21,19 +21,10 @@ index 24cd226..4bfacba 100644
</manifest>
diff --git a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/RNNotificationsModule.java b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/RNNotificationsModule.java
index 90969b2..36a9a84 100644
index db9eaba..af65d0e 100644
--- a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/RNNotificationsModule.java
+++ b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/RNNotificationsModule.java
@@ -63,7 +63,7 @@ public class RNNotificationsModule extends ReactContextBaseJavaModule implements
@Override
public void onNewIntent(Intent intent) {
if (NotificationIntentAdapter.canHandleIntent(intent)) {
- Bundle notificationData = intent.getExtras();
+ Bundle notificationData = NotificationIntentAdapter.extractPendingNotificationDataFromIntent(intent);
final IPushNotification notification = PushNotification.get(getReactApplicationContext().getApplicationContext(), notificationData);
if (notification != null) {
notification.onOpened();
@@ -102,7 +102,18 @@ public class RNNotificationsModule extends ReactContextBaseJavaModule implements
@@ -100,7 +100,12 @@ public class RNNotificationsModule extends ReactContextBaseJavaModule implements
if(BuildConfig.DEBUG) Log.d(LOGTAG, "Native method invocation: postLocalNotification");
final Bundle notificationProps = Arguments.toBundle(notificationPropsMap);
final IPushNotification pushNotification = PushNotification.get(getReactApplicationContext().getApplicationContext(), notificationProps);
@@ -44,82 +35,28 @@ index 90969b2..36a9a84 100644
+ } else {
+ pushNotification.onScheduleRequest(notificationId);
+ }
+ }
+
}
@ReactMethod
@@ -109,6 +114,12 @@ public class RNNotificationsModule extends ReactContextBaseJavaModule implements
notificationsDrawer.onNotificationClearRequest(notificationId);
}
+ @ReactMethod
+ public void cancelAllLocalNotifications() {
+ IPushNotificationsDrawer notificationDrawer = PushNotificationsDrawer.get(getReactApplicationContext().getApplicationContext());
+ notificationDrawer.onCancelAllLocalNotifications();
}
@ReactMethod
diff --git a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/RNNotificationsPackage.java b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/RNNotificationsPackage.java
index eadf41e..3279431 100644
--- a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/RNNotificationsPackage.java
+++ b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/RNNotificationsPackage.java
@@ -15,6 +15,7 @@ import com.wix.reactnativenotifications.core.AppLifecycleFacade;
import com.wix.reactnativenotifications.core.AppLifecycleFacadeHolder;
import com.wix.reactnativenotifications.core.InitialNotificationHolder;
import com.wix.reactnativenotifications.core.NotificationIntentAdapter;
+import com.wix.reactnativenotifications.core.ReactAppLifecycleFacade;
import com.wix.reactnativenotifications.core.notification.IPushNotification;
import com.wix.reactnativenotifications.core.notification.PushNotification;
import com.wix.reactnativenotifications.core.notification.PushNotificationProps;
@@ -67,7 +68,12 @@ public class RNNotificationsPackage implements ReactPackage, AppLifecycleFacade.
@Override
public void onActivityStarted(Activity activity) {
- if (InitialNotificationHolder.getInstance().get() == null) {
+ boolean isInitialized = false;
+ if (AppLifecycleFacadeHolder.get() instanceof ReactAppLifecycleFacade) {
+ isInitialized = AppLifecycleFacadeHolder.get().isReactInitialized();
+ }
+ }
+
+ if (!isInitialized && InitialNotificationHolder.getInstance().get() == null) {
callOnOpenedIfNeed(activity);
}
}
@@ -96,8 +102,7 @@ public class RNNotificationsPackage implements ReactPackage, AppLifecycleFacade.
Intent intent = activity.getIntent();
if (NotificationIntentAdapter.canHandleIntent(intent)) {
Context appContext = mApplication.getApplicationContext();
- Bundle notificationData = NotificationIntentAdapter.cannotHandleTrampolineActivity(appContext) ?
- NotificationIntentAdapter.extractPendingNotificationDataFromIntent(intent) : intent.getExtras();
+ Bundle notificationData = NotificationIntentAdapter.extractPendingNotificationDataFromIntent(intent);
final IPushNotification pushNotification = PushNotification.get(appContext, notificationData);
if (pushNotification != null) {
pushNotification.onOpened();
diff --git a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/NotificationIntentAdapter.java b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/NotificationIntentAdapter.java
index 41b4824..4285ac5 100644
--- a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/NotificationIntentAdapter.java
+++ b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/NotificationIntentAdapter.java
@@ -14,17 +14,9 @@ public class NotificationIntentAdapter {
@SuppressLint("UnspecifiedImmutableFlag")
public static PendingIntent createPendingNotificationIntent(Context appContext, PushNotificationProps notification) {
- if (cannotHandleTrampolineActivity(appContext)) {
- Intent mainActivityIntent = appContext.getPackageManager().getLaunchIntentForPackage(appContext.getPackageName());
- mainActivityIntent.putExtra(PUSH_NOTIFICATION_EXTRA_NAME, notification.asBundle());
- TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(appContext);
- taskStackBuilder.addNextIntentWithParentStack(mainActivityIntent);
- return taskStackBuilder.getPendingIntent((int) System.currentTimeMillis(), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
- } else {
- Intent intent = new Intent(appContext, ProxyService.class);
- intent.putExtra(PUSH_NOTIFICATION_EXTRA_NAME, notification.asBundle());
- return PendingIntent.getService(appContext, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_ONE_SHOT);
- }
+ Intent intent = appContext.getPackageManager().getLaunchIntentForPackage(appContext.getPackageName());
+ intent.putExtra(PUSH_NOTIFICATION_EXTRA_NAME, notification.asBundle());
+ return PendingIntent.getActivity(appContext, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
}
public static boolean cannotHandleTrampolineActivity(Context appContext) {
@ReactMethod
public void setCategories(ReadableArray categories) {
diff --git a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/helpers/ScheduleNotificationHelper.java b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/helpers/ScheduleNotificationHelper.java
new file mode 100644
index 0000000..433c754
index 0000000..dde4a2c
--- /dev/null
+++ b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/helpers/ScheduleNotificationHelper.java
@@ -0,0 +1,91 @@
@@ -0,0 +1,89 @@
+package com.wix.reactnativenotifications.core.helpers;
+
+import android.app.AlarmManager;
@@ -160,15 +97,13 @@ index 0000000..433c754
+ Intent notificationIntent = new Intent(mContext, PushNotificationPublisher.class);
+ notificationIntent.putExtra(ScheduleNotificationHelper.NOTIFICATION_ID, notificationId);
+ notificationIntent.putExtras(bundle);
+ return PendingIntent.getBroadcast(mContext, notificationId, notificationIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
+ return PendingIntent.getBroadcast(mContext, notificationId, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ }
+
+ public void schedulePendingNotificationIntent(PendingIntent intent, long fireDate) {
+ AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ alarmManager.set(AlarmManager.RTC_WAKEUP, fireDate, intent);
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ alarmManager.setExact(AlarmManager.RTC_WAKEUP, fireDate, intent);
+ } else {
+ alarmManager.set(AlarmManager.RTC_WAKEUP, fireDate, intent);
@@ -238,7 +173,7 @@ index 0d70024..b9e6c88 100644
PushNotificationProps asProps();
}
diff --git a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notification/PushNotification.java b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notification/PushNotification.java
index 54a5fb8..f38881e 100644
index fe1fb94..c9e0301 100644
--- a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notification/PushNotification.java
+++ b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notification/PushNotification.java
@@ -8,6 +8,10 @@ import android.content.Context;
@@ -252,17 +187,17 @@ index 54a5fb8..f38881e 100644
import com.facebook.react.bridge.ReactContext;
import com.wix.reactnativenotifications.core.AppLaunchHelper;
@@ -17,7 +21,9 @@ import com.wix.reactnativenotifications.core.AppLifecycleFacadeHolder;
import com.wix.reactnativenotifications.core.InitialNotificationHolder;
@@ -18,7 +22,9 @@ import com.wix.reactnativenotifications.core.InitialNotificationHolder;
import com.wix.reactnativenotifications.core.JsIOHelper;
import com.wix.reactnativenotifications.core.NotificationIntentAdapter;
import com.wix.reactnativenotifications.core.ProxyService;
+import com.wix.reactnativenotifications.core.helpers.ScheduleNotificationHelper;
+import static com.wix.reactnativenotifications.Defs.LOGTAG;
import static com.wix.reactnativenotifications.Defs.NOTIFICATION_OPENED_EVENT_NAME;
import static com.wix.reactnativenotifications.Defs.NOTIFICATION_RECEIVED_EVENT_NAME;
import static com.wix.reactnativenotifications.Defs.NOTIFICATION_RECEIVED_BACKGROUND_EVENT_NAME;
@@ -28,7 +34,7 @@ public class PushNotification implements IPushNotification {
@@ -29,7 +35,7 @@ public class PushNotification implements IPushNotification {
final protected AppLifecycleFacade mAppLifecycleFacade;
final protected AppLaunchHelper mAppLaunchHelper;
final protected JsIOHelper mJsIOHelper;
@@ -271,7 +206,7 @@ index 54a5fb8..f38881e 100644
final protected AppVisibilityListener mAppVisibilityListener = new AppVisibilityListener() {
@Override
public void onAppVisible() {
@@ -61,7 +67,7 @@ public class PushNotification implements IPushNotification {
@@ -62,7 +68,7 @@ public class PushNotification implements IPushNotification {
}
@Override
@@ -280,8 +215,8 @@ index 54a5fb8..f38881e 100644
if (!mAppLifecycleFacade.isAppVisible()) {
postNotification(null);
notifyReceivedBackgroundToJS();
@@ -70,6 +76,41 @@ public class PushNotification implements IPushNotification {
}
@@ -81,6 +87,41 @@ public class PushNotification implements IPushNotification {
return postNotification(notificationId);
}
+ @Override
@@ -320,9 +255,9 @@ index 54a5fb8..f38881e 100644
+ }
+
@Override
public void onOpened() {
digestNotification();
@@ -140,15 +181,16 @@ public class PushNotification implements IPushNotification {
public PushNotificationProps asProps() {
return mNotificationProps.copy();
@@ -143,15 +184,16 @@ public class PushNotification implements IPushNotification {
}
protected Notification buildNotification(PendingIntent intent) {
@@ -343,7 +278,7 @@ index 54a5fb8..f38881e 100644
.setAutoCancel(true);
setUpIcon(notification);
@@ -163,7 +205,7 @@ public class PushNotification implements IPushNotification {
@@ -166,7 +208,7 @@ public class PushNotification implements IPushNotification {
return notification;
}
@@ -352,7 +287,7 @@ index 54a5fb8..f38881e 100644
int iconResId = getAppResourceId("notification_icon", "drawable");
if (iconResId != 0) {
notification.setSmallIcon(iconResId);
@@ -174,7 +216,7 @@ public class PushNotification implements IPushNotification {
@@ -177,7 +219,7 @@ public class PushNotification implements IPushNotification {
setUpIconColor(notification);
}
@@ -361,7 +296,7 @@ index 54a5fb8..f38881e 100644
int colorResID = getAppResourceId("colorAccent", "color");
if (colorResID != 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int color = mContext.getResources().getColor(colorResID);
@@ -189,7 +231,7 @@ public class PushNotification implements IPushNotification {
@@ -192,7 +234,7 @@ public class PushNotification implements IPushNotification {
}
protected void postNotification(int id, Notification notification) {
@@ -372,7 +307,7 @@ index 54a5fb8..f38881e 100644
diff --git a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notification/PushNotificationPublisher.java b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notification/PushNotificationPublisher.java
new file mode 100644
index 0000000..58ff887
index 0000000..5b64593
--- /dev/null
+++ b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notification/PushNotificationPublisher.java
@@ -0,0 +1,27 @@
@@ -403,6 +338,7 @@ index 0000000..58ff887
+ pushNotification.onPostScheduledRequest(notificationId);
+ }
+}
\ No newline at end of file
diff --git a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notificationdrawer/IPushNotificationsDrawer.java b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notificationdrawer/IPushNotificationsDrawer.java
index e22cd62..48aa1cd 100644
--- a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notificationdrawer/IPushNotificationsDrawer.java
@@ -414,7 +350,7 @@ index e22cd62..48aa1cd 100644
+ void onCancelAllLocalNotifications();
}
diff --git a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notificationdrawer/PushNotificationsDrawer.java b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notificationdrawer/PushNotificationsDrawer.java
index a14089f..7aedafc 100644
index a14089f..1262e6d 100644
--- a/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notificationdrawer/PushNotificationsDrawer.java
+++ b/node_modules/react-native-notifications/lib/android/app/src/main/java/com/wix/reactnativenotifications/core/notificationdrawer/PushNotificationsDrawer.java
@@ -2,9 +2,15 @@ package com.wix.reactnativenotifications.core.notificationdrawer;
@@ -433,26 +369,10 @@ index a14089f..7aedafc 100644
public class PushNotificationsDrawer implements IPushNotificationsDrawer {
@@ -49,17 +55,56 @@ public class PushNotificationsDrawer implements IPushNotificationsDrawer {
public void onNotificationClearRequest(int id) {
final NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(id);
+ cancelScheduledNotification(String.valueOf(id));
}
@Override
public void onNotificationClearRequest(String tag, int id) {
final NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(tag, id);
+ cancelScheduledNotification(String.valueOf(id));
}
@Override
public void onAllNotificationsClearRequest() {
@@ -62,4 +68,37 @@ public class PushNotificationsDrawer implements IPushNotificationsDrawer {
final NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancelAll();
+ cancelAllScheduledNotifications();
+ }
}
+
+ @Override
+ public void onCancelAllLocalNotifications() {
@@ -473,9 +393,6 @@ index a14089f..7aedafc 100644
+ Log.i(LOGTAG, "Cancelling scheduled notification: " + notificationId);
+
+ ScheduleNotificationHelper helper = ScheduleNotificationHelper.getInstance(mContext);
+ if (!helper.getPreferencesKeys().contains(notificationId)) {
+ return;
+ }
+
+ // Remove it from the alarm manger schedule
+ Bundle bundle = new Bundle();
@@ -488,7 +405,7 @@ index a14089f..7aedafc 100644
+ // Remove it from the notification center
+ final NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.cancel(Integer.parseInt(notificationId));
}
+ }
}
diff --git a/node_modules/react-native-notifications/lib/dist/DTO/Notification.d.ts b/node_modules/react-native-notifications/lib/dist/DTO/Notification.d.ts
index 7b2b3b1..3a2f872 100644
@@ -513,7 +430,7 @@ index ad7fc1a..a04ec6b 100644
get title() {
return this.payload.title;
diff --git a/node_modules/react-native-notifications/lib/dist/Notifications.d.ts b/node_modules/react-native-notifications/lib/dist/Notifications.d.ts
index 6e49fd4..7deeea8 100644
index 6e49fd4..1d94217 100644
--- a/node_modules/react-native-notifications/lib/dist/Notifications.d.ts
+++ b/node_modules/react-native-notifications/lib/dist/Notifications.d.ts
@@ -37,6 +37,10 @@ export declare class NotificationsRoot {
@@ -522,13 +439,13 @@ index 6e49fd4..7deeea8 100644
cancelLocalNotification(notificationId: number): void;
+ /**
+ * cancelAllLocalNotifications
+ */
+ cancelAllLocalNotifications(): void;
+ */
+ cancelAllLocalNotifications(): void;
/**
* removeAllDeliveredNotifications
*/
diff --git a/node_modules/react-native-notifications/lib/dist/Notifications.js b/node_modules/react-native-notifications/lib/dist/Notifications.js
index 44ab53f..4ff06a1 100644
index 44ab53f..8000701 100644
--- a/node_modules/react-native-notifications/lib/dist/Notifications.js
+++ b/node_modules/react-native-notifications/lib/dist/Notifications.js
@@ -55,6 +55,12 @@ class NotificationsRoot {
@@ -537,18 +454,29 @@ index 44ab53f..4ff06a1 100644
}
+ /**
+ * cancelAllLocalNotifications
+ */
+ cancelAllLocalNotifications() {
+ */
+ cancelAllLocalNotifications() {
+ this.commands.cancelAllLocalNotifications();
+ }
+ }
/**
* removeAllDeliveredNotifications
*/
diff --git a/node_modules/react-native-notifications/lib/dist/interfaces/NotificationCategory.d.ts b/node_modules/react-native-notifications/lib/dist/interfaces/NotificationCategory.d.ts
index 0e78cb5..ae90bd1 100644
--- a/node_modules/react-native-notifications/lib/dist/interfaces/NotificationCategory.d.ts
+++ b/node_modules/react-native-notifications/lib/dist/interfaces/NotificationCategory.d.ts
@@ -13,5 +13,5 @@ export declare class NotificationAction {
title: string;
authenticationRequired: boolean;
textInput?: NotificationTextInput;
- constructor(identifier: string, activationMode: 'foreground' | 'authenticationRequired' | 'destructive', title: string, authenticationRequired: boolean, textInput?: NotificationTextInput);
+ constructor(identifier: string, activationMode: 'background' | 'foreground' | 'authenticationRequired' | 'destructive', title: string, authenticationRequired: boolean, textInput?: NotificationTextInput);
}
diff --git a/node_modules/react-native-notifications/lib/ios/RNNotificationCenter.m b/node_modules/react-native-notifications/lib/ios/RNNotificationCenter.m
index afd5c73..6036dda 100644
index 7452523..a093262 100644
--- a/node_modules/react-native-notifications/lib/ios/RNNotificationCenter.m
+++ b/node_modules/react-native-notifications/lib/ios/RNNotificationCenter.m
@@ -87,7 +87,7 @@
@@ -83,7 +83,7 @@
for (UNNotification *notification in notifications) {
[formattedNotifications addObject:[RCTConvert UNNotificationPayload:notification]];
}
@@ -557,51 +485,8 @@ index afd5c73..6036dda 100644
}];
}
diff --git a/node_modules/react-native-notifications/lib/ios/RNNotificationEventHandler.m b/node_modules/react-native-notifications/lib/ios/RNNotificationEventHandler.m
index 5c8dd0b..1c7e575 100644
--- a/node_modules/react-native-notifications/lib/ios/RNNotificationEventHandler.m
+++ b/node_modules/react-native-notifications/lib/ios/RNNotificationEventHandler.m
@@ -6,11 +6,13 @@
@implementation RNNotificationEventHandler {
RNNotificationsStore* _store;
+ NSDate* wakeTime;
}
- (instancetype)initWithStore:(RNNotificationsStore *)store {
self = [super init];
_store = store;
+ wakeTime = [[NSDate alloc] init];
return self;
}
@@ -31,6 +33,15 @@
- (void)didReceiveNotificationResponse:(UNNotificationResponse *)response completionHandler:(void (^)(void))completionHandler {
[_store setActionCompletionHandler:completionHandler withCompletionKey:response.notification.request.identifier];
[RNEventEmitter sendEvent:RNNotificationOpened body:[RNNotificationParser parseNotificationResponse:response]];
+ dispatch_async(dispatch_get_main_queue(), ^{
+ NSDate* now = [[NSDate alloc] init];
+ double interval = [now timeIntervalSinceDate:self->wakeTime];
+ BOOL background = [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground;
+ NSDictionary* userInfo = response.notification.request.content.userInfo;
+ if (interval < 1.0 && !background) {
+ [self->_store setInitialNotification:userInfo];
+ }
+ });
}
- (void)didReceiveBackgroundNotification:(NSDictionary *)userInfo withCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
@@ -38,7 +49,7 @@
NSString *uuid = [[NSUUID UUID] UUIDString];
__block BOOL completionHandlerCalled = NO;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
- [_store setBackgroundActionCompletionHandler:^(UIBackgroundFetchResult result) {
+ [self->_store setBackgroundActionCompletionHandler:^(UIBackgroundFetchResult result) {
dispatch_async(dispatch_get_main_queue(), ^{
completionHandler(result);
});
diff --git a/node_modules/react-native-notifications/lib/src/Notifications.ts b/node_modules/react-native-notifications/lib/src/Notifications.ts
index 0848f6d..1f945b7 100644
index 0848f6d..ceb271d 100644
--- a/node_modules/react-native-notifications/lib/src/Notifications.ts
+++ b/node_modules/react-native-notifications/lib/src/Notifications.ts
@@ -80,6 +80,13 @@ export class NotificationsRoot {
@@ -610,10 +495,10 @@ index 0848f6d..1f945b7 100644
+ /**
+ * cancelAllLocalNotifications
+ */
+ public cancelAllLocalNotifications() {
+ */
+ public cancelAllLocalNotifications() {
+ this.commands.cancelAllLocalNotifications();
+ }
+ }
+
/**
* removeAllDeliveredNotifications

View File

@@ -101,7 +101,9 @@ jest.doMock('react-native', () => {
const Linking = {
...RNLinking,
openURL: jest.fn(),
openURL: jest.fn().mockImplementation(
() => Promise.resolve(''),
),
};
return Object.setPrototypeOf({

View File

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