From 14d404f107860006cdac5a927b6b2479c14ca25b Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Tue, 15 Dec 2020 21:47:31 +0100 Subject: [PATCH 01/12] chore: Update deps --- android/app/build.gradle | 4 +- android/app/proguard-rules.pro | 3 + android/build.gradle | 3 + package.json | 18 +-- yarn.lock | 264 ++++++++++++++++++--------------- 5 files changed, 165 insertions(+), 127 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 7d4feee..bd2e9b5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -128,10 +128,10 @@ dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "com.google.android.gms:play-services-cast-framework:$rootProject.ext.castFrameworkVersion" - implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01' implementation 'com.facebook.react:react-native:+' - implementation 'com.butterproject:vlc-android-sdk:3.0.10' + implementation 'org.videolan.android:libvlc-all:3.1.12' implementation 'androidx.tvprovider:tvprovider:1.0.0' diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 31a967c..74f8cb7 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -72,3 +72,6 @@ # Hermes -keep class com.facebook.hermes.unicode.** { *; } -keep class com.facebook.jni.** { *; } + +# VLC +-keep class org.videolan.libvlc.** { *; } diff --git a/android/build.gradle b/android/build.gradle index 543b7f3..a019887 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -38,6 +38,9 @@ allprojects { // Local Maven repo containing AARs with JSC library built for Android url "$rootDir/../node_modules/jsc-android/dist" } + maven { + url "https://dl.bintray.com/videolan/Android" + } } } diff --git a/package.json b/package.json index b565ab9..393b7c1 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "react-native-reanimated": "1.13.0" }, "dependencies": { - "@apollo/client": "^3.3.2", + "@apollo/client": "^3.3.6", "@react-native-community/async-storage": "1.12.1", "@react-native-community/masked-view": "^0.1.10", "@react-native-community/netinfo": "5.9.9", @@ -48,7 +48,7 @@ "react": "17.0.1", "react-native": "0.63.4", "react-native-animatable": "1.3.3", - "react-native-device-info": "7.2.1", + "react-native-device-info": "7.3.1", "react-native-fs": "2.16.6", "react-native-gesture-handler": "1.8.0", "react-native-google-cast": "github:pct-org/react-native-google-cast#7e409ca7c129d628d5c2902944790bc611b64aaa", @@ -58,7 +58,7 @@ "react-native-orientation": "^3.1.3", "react-native-reanimated": "1.13.0", "react-native-safe-area-context": "3.1.9", - "react-native-screens": "2.15.0", + "react-native-screens": "2.16.1", "react-native-splash-screen": "3.2.0", "react-native-static-server": "0.5.0", "react-native-vector-icons": "7.1.0", @@ -69,14 +69,14 @@ "update-react-native-app": "^1.3.1" }, "devDependencies": { - "@babel/core": "7.12.9", + "@babel/core": "7.12.10", "@babel/plugin-proposal-class-properties": "7.12.1", "@babel/plugin-proposal-decorators": "7.12.1", "@babel/plugin-proposal-export-namespace-from": "7.12.1", "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-transform-flow-strip-types": "7.12.1", - "@babel/plugin-transform-runtime": "7.12.1", - "@babel/preset-react": "7.12.7", + "@babel/plugin-transform-flow-strip-types": "7.12.10", + "@babel/plugin-transform-runtime": "7.12.10", + "@babel/preset-react": "7.12.10", "@babel/runtime": "7.12.5", "@commitlint/cli": "11.0.0", "@commitlint/config-conventional": "11.0.0", @@ -85,7 +85,7 @@ "babel-plugin-module-resolver": "4.0.0", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "1.15.5", - "eslint": "7.14.0", + "eslint": "7.15.0", "eslint-config-airbnb": "18.2.1", "eslint-config-standard": "16.0.2", "eslint-config-standard-react": "11.0.1", @@ -98,7 +98,7 @@ "eslint-plugin-react": "7.21.5", "eslint-plugin-standard": "5.0.0", "get-dev-paths": "^0.1.1", - "husky": "4.3.0", + "husky": "4.3.6", "jest": "26.6.3", "jest-enzyme": "^7.1.2", "jest-react-native": "^18.0.0", diff --git a/yarn.lock b/yarn.lock index f26cc3d..1124a40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@apollo/client@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.2.tgz#112bfad9a2656b2ffb2819d5e55c9f2ac591bdb1" - integrity sha512-drgbagTptpo33EfOL9VedyOrPwx6u49vUdySAA3FMYRW5pSOtnWf5WMOC0fRp2xIGEtKAf0ZGC0DBbXbLvxiig== +"@apollo/client@^3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.6.tgz#f359646308167f38d5bc498dfc2344c888400093" + integrity sha512-XSm/STyNS8aHdDigLLACKNMHwI0qaQmEHWHtTP+jHe/E1wZRnn66VZMMgwKLy2V4uHISHfmiZ4KpUKDPeJAKqg== dependencies: "@graphql-typed-document-node/core" "^3.0.0" "@types/zen-observable" "^0.8.0" @@ -17,7 +17,7 @@ optimism "^0.13.1" prop-types "^15.7.2" symbol-observable "^2.0.0" - ts-invariant "^0.5.1" + ts-invariant "^0.6.0" tslib "^1.10.0" zen-observable "^0.8.14" @@ -28,25 +28,24 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== +"@babel/core@7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" + "@babel/generator" "^7.12.10" "@babel/helper-module-transforms" "^7.12.1" "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" + "@babel/parser" "^7.12.10" "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" lodash "^4.17.19" - resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" @@ -81,6 +80,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.10.tgz#2b188fc329fb8e4f762181703beffc0fe6df3460" + integrity sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww== + dependencies: + "@babel/types" "^7.12.10" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/generator@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" @@ -97,6 +105,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-annotate-as-pure@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" + integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ== + dependencies: + "@babel/types" "^7.12.10" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" @@ -114,6 +129,15 @@ "@babel/helper-module-imports" "^7.10.4" "@babel/types" "^7.10.5" +"@babel/helper-builder-react-jsx-experimental@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.10.tgz#a58cb96a793dc0fcd5c9ed3bb36d62fdc60534c2" + integrity sha512-3Kcr2LGpL7CTRDTTYm1bzeor9qZbxbvU2AxsLA6mUG9gYarSfIKMK0UlU+azLWI+s0+BH768bwyaziWB2NOJlQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.10" + "@babel/helper-module-imports" "^7.12.5" + "@babel/types" "^7.12.10" + "@babel/helper-builder-react-jsx-experimental@^7.12.4": version "7.12.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz#55fc1ead5242caa0ca2875dcb8eed6d311e50f48" @@ -217,7 +241,7 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-module-imports@^7.12.1": +"@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== @@ -378,6 +402,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== +"@babel/parser@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.10.tgz#824600d59e96aea26a5a2af5a9d812af05c3ae81" + integrity sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA== + "@babel/parser@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" @@ -691,10 +720,10 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-flow-strip-types@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz#8430decfa7eb2aea5414ed4a3fa6e1652b7d77c4" - integrity sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg== +"@babel/plugin-transform-flow-strip-types@7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.10.tgz#d85e30ecfa68093825773b7b857e5085bbd32c95" + integrity sha512-0ti12wLTLeUIzu9U7kjqIn4MyOL7+Wibc7avsHhj4o1l5C0ATs8p2IMHrVYjm9t9wzhfEO6S3kxax0Rpdo8LTg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-flow" "^7.12.1" @@ -814,13 +843,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-self@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.1.tgz#ef43cbca2a14f1bd17807dbe4376ff89d714cf28" - integrity sha512-FbpL0ieNWiiBB5tCldX17EtXgmzeEZjFrix72rQYeq9X6nUK38HCaxexzVQrZWXanxKJPKVVIU37gFjEQYkPkA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-jsx-source@^7.0.0": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4" @@ -829,13 +851,6 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx-source@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.1.tgz#d07de6863f468da0809edcf79a1aa8ce2a82a26b" - integrity sha512-keQ5kBfjJNRc6zZN1/nVHCd6LLIHq4aUKcVnvE/2l+ZZROSbqoiGFRtT5t3Is89XJxBQaP7NLZX2jgGHdZvvFQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-jsx@^7.0.0": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2" @@ -846,13 +861,13 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.7.tgz#8b14d45f6eccd41b7f924bcb65c021e9f0a06f7f" - integrity sha512-YFlTi6MEsclFAPIDNZYiCRbneg1MFGao9pPG9uD5htwE0vDbPaMUMeYd6itWjw7K4kro4UbdQf3ljmFl9y48dQ== +"@babel/plugin-transform-react-jsx@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.10.tgz#a7af3097c73479123594c8c8fe39545abebd44e3" + integrity sha512-MM7/BC8QdHXM7Qc1wdnuk73R4gbuOpfrSUgfV/nODGc86sPY1tgmY2M9E9uAnf2e4DOIp8aKGWqgZfQxnTNGuw== dependencies: "@babel/helper-builder-react-jsx" "^7.10.4" - "@babel/helper-builder-react-jsx-experimental" "^7.12.4" + "@babel/helper-builder-react-jsx-experimental" "^7.12.10" "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.12.1" @@ -871,14 +886,13 @@ dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-runtime@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz#04b792057eb460389ff6a4198e377614ea1e7ba5" - integrity sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg== +"@babel/plugin-transform-runtime@7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz#af0fded4e846c4b37078e8e5d06deac6cd848562" + integrity sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA== dependencies: - "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-module-imports" "^7.12.5" "@babel/helper-plugin-utils" "^7.10.4" - resolve "^1.8.1" semver "^5.5.1" "@babel/plugin-transform-runtime@^7.0.0": @@ -938,17 +952,15 @@ "@babel/helper-create-regexp-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/preset-react@7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.7.tgz#36d61d83223b07b6ac4ec55cf016abb0f70be83b" - integrity sha512-wKeTdnGUP5AEYCYQIMeXMMwU7j+2opxrG0WzuZfxuuW9nhKvvALBjl67653CWamZJVefuJGI219G591RSldrqQ== +"@babel/preset-react@7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.10.tgz#4fed65f296cbb0f5fb09de6be8cddc85cc909be9" + integrity sha512-vtQNjaHRl4DUpp+t+g4wvTHsLQuye+n0H/wsXIZRn69oz/fvNC7gQ4IK73zGJBaxvHoxElDvnYCthMcT7uzFoQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-react-display-name" "^7.12.1" - "@babel/plugin-transform-react-jsx" "^7.12.7" + "@babel/plugin-transform-react-jsx" "^7.12.10" "@babel/plugin-transform-react-jsx-development" "^7.12.7" - "@babel/plugin-transform-react-jsx-self" "^7.12.1" - "@babel/plugin-transform-react-jsx-source" "^7.12.1" "@babel/plugin-transform-react-pure-annotations" "^7.12.1" "@babel/register@^7.0.0": @@ -1039,17 +1051,17 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.12.9": - version "7.12.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.9.tgz#fad26c972eabbc11350e0b695978de6cc8e8596f" - integrity sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw== +"@babel/traverse@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.10.tgz#2d1f4041e8bf42ea099e5b2dc48d6a594c00017a" + integrity sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" + "@babel/generator" "^7.12.10" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" + "@babel/parser" "^7.12.10" + "@babel/types" "^7.12.10" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" @@ -1081,6 +1093,15 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.10.tgz#7965e4a7260b26f09c56bcfcb0498af1f6d9b260" + integrity sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@babel/types@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" @@ -1246,10 +1267,10 @@ dependencies: "@types/hammerjs" "^2.0.36" -"@eslint/eslintrc@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c" - integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA== +"@eslint/eslintrc@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" + integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -1938,6 +1959,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== +"@types/ungap__global-this@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@types/ungap__global-this/-/ungap__global-this-0.3.1.tgz#18ce9f657da556037a29d50604335614ce703f4c" + integrity sha512-+/DsiV4CxXl6ZWefwHZDXSe1Slitz21tom38qPCaG0DYCS1NnDPIQDTKcmQ/tvK/edJUKkmuIDBJbmKDiB0r/g== + "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" @@ -2009,6 +2035,11 @@ "@typescript-eslint/types" "4.2.0" eslint-visitor-keys "^2.0.0" +"@ungap/global-this@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@ungap/global-this/-/global-this-0.4.3.tgz#44cb668b03e7c4bc88cb6e6f9329d381131878ee" + integrity sha512-MuHEpDBurNVeD6mV9xBcAN2wfTwuaFQhHuhWkJuXmyVJ5P5sBCw+nnFpdfb0tAvgWkfefWCsAoAsh7MTUr3LPg== + "@wry/context@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.5.2.tgz#f2a5d5ab9227343aa74c81e06533c1ef84598ec7" @@ -2077,6 +2108,11 @@ acorn-jsx@^5.2.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" @@ -3951,13 +3987,13 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.14.0: - version "7.14.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.14.0.tgz#2d2cac1d28174c510a97b377f122a5507958e344" - integrity sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA== +eslint@7.15.0: + version "7.15.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.15.0.tgz#eb155fb8ed0865fcf5d903f76be2e5b6cd7e0bc7" + integrity sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA== dependencies: "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.1" + "@eslint/eslintrc" "^0.2.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -3967,10 +4003,10 @@ eslint@7.14.0: eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" - espree "^7.3.0" + espree "^7.3.1" esquery "^1.2.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + file-entry-cache "^6.0.0" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" globals "^12.1.0" @@ -4003,6 +4039,15 @@ espree@^7.3.0: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.3.0" +espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -4280,12 +4325,12 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" file-uri-to-path@1.0.0: version "1.0.0" @@ -4376,19 +4421,18 @@ find-versions@^3.2.0: dependencies: semver-regex "^2.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flatted@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" + integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== for-in@^1.0.2: version "1.0.2" @@ -4793,10 +4837,10 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -husky@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de" - integrity sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA== +husky@4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.6.tgz#ebd9dd8b9324aa851f1587318db4cccb7665a13c" + integrity sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag== dependencies: chalk "^4.0.0" ci-info "^2.0.0" @@ -7751,10 +7795,10 @@ react-native-animatable@1.3.3: dependencies: prop-types "^15.7.2" -react-native-device-info@7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-7.2.1.tgz#06a71703af744a30a1eb621cf20e95b43b3bbf85" - integrity sha512-7zn2cASst13qlSSGsKOhGsPpeX2yV0O69s7o0kc/4E00VqWrlpx241YB09AL2ZerCPsVOPdKcAvXM+wcJ9xQTw== +react-native-device-info@7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-7.3.1.tgz#6c4b0120d57872a2f7534332323306b386828a3d" + integrity sha512-RQP3etbmXsOlcaxHeHNug68nRli02S9iGC7TbaXpkvyyevIuRogfnrI71sWtqmlT91kdpYAOYKmNfRL9LOSKVw== react-native-fit-image@^1.5.2: version "1.5.5" @@ -7837,10 +7881,10 @@ react-native-safe-modules@^1.0.0: dependencies: dedent "^0.6.0" -react-native-screens@2.15.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.15.0.tgz#9b97c1881c4fcdf304bf363f0013225901625f44" - integrity sha512-qTSQPy0WKHtlb8xt5gY0Gt6sdvfQUQAnFSqgsggW9UEvySbkHzpqOrOYNA79Ca8oXO0dCFwp6X8buIiDefa7+Q== +react-native-screens@2.16.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.16.1.tgz#b105a127378d90018a46daf0c2f6518fca60c06f" + integrity sha512-WZ7m0sBDVaHbBnlHxwQnUlI6KNfQKHq+Unfw+VBuAlnSXvT+aw6Bb/K2bUlHzBgvrPjwY3Spc7ZERFuTwRLLwg== react-native-splash-screen@3.2.0: version "3.2.0" @@ -8270,13 +8314,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.5.4: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -8284,7 +8321,7 @@ rimraf@^2.5.4: dependencies: glob "^7.1.3" -rimraf@^3.0.0: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -9171,11 +9208,13 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= -ts-invariant@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.5.1.tgz#4171fdb85f72a40381c147afd97c12154ada2abc" - integrity sha512-k3UpDNrBZpqJFnAAkAHNmSHtNuCxcU6xLiziPgalHRKZHme6T6jnKC8CcXDmk1zbHLQM8pc+rNC1Q6FvXMAl+g== +ts-invariant@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.6.0.tgz#44066ecfeb7a806ff1c3b0b283408a337a885412" + integrity sha512-caoafsfgb8QxdrKzFfjKt627m4i8KTtfAiji0DYJfWI4A/S9ORNNpzYuD9br64kyKFgxn9UNaLLbSupam84mCA== dependencies: + "@types/ungap__global-this" "^0.3.1" + "@ungap/global-this" "^0.4.2" tslib "^1.9.3" tsconfig-paths@^3.9.0: @@ -9632,13 +9671,6 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@^1.1.0, ws@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" From fb96b51b52fe4e36bde83a7bddb8679f396add77 Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Tue, 15 Dec 2020 21:48:30 +0100 Subject: [PATCH 02/12] refactor: Started on subtitle implementation Native side is done, switcher needs to be build for mobile and tv --- .../popcorn/VlcPlayer/VlcPlayerModule.java | 7 ++ .../com/popcorn/VlcPlayer/VlcPlayerView.java | 10 ++- app/components/IconButton/IconButton.js | 6 +- app/components/Typography/Typography.js | 10 +++ .../Typography/Typography.styles.js | 7 ++ app/components/VlcPlayer/VlcPLayer.js | 26 +++---- .../MobilePlayerManager.js | 4 +- app/mobile/screens/Player/Player.js | 22 ++++-- .../VideoAndControls/ResizeMode/ResizeMode.js | 10 +-- .../VideoAndControls/SeekBar/SeekBar.js | 2 +- .../SelectSubtitle/SelectSubtitle.js | 74 +++++++++++++++++++ .../VideoAndControls/SelectSubtitle/index.js | 1 + .../VideoAndControls/VideoAndControls.js | 30 +++++--- app/mobile/screens/Settings/About/About.js | 6 +- .../BottomSheetManager/BottomSheetProvider.js | 1 + .../GraphQL/fragments/downloadFragment.js | 52 ++++++------- app/modules/PlayerManager/PlayerManager.js | 11 ++- app/modules/dimensions.js | 10 ++- app/modules/i18n/translations/en.json | 3 +- app/modules/i18n/translations/nl.json | 3 +- 20 files changed, 219 insertions(+), 76 deletions(-) create mode 100644 app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js create mode 100644 app/mobile/screens/Player/VideoAndControls/SelectSubtitle/index.js diff --git a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerModule.java b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerModule.java index c17802f..1ca24fa 100644 --- a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerModule.java +++ b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerModule.java @@ -1,5 +1,6 @@ package com.popcorn.VlcPlayer; +import android.net.Uri; import android.text.TextUtils; import com.facebook.react.bridge.ReadableMap; @@ -20,6 +21,7 @@ public class VlcPlayerModule extends ViewGroupManager { public static final String PROP_VOLUME = "volume"; public static final String PROP_RESIZE_MODE = "resizeMode"; public static final String PROP_FULLSCREEN = "fullscreen"; + public static final String PROP_SUBTITLE = "subtitleUri"; @Override public String getName() { @@ -89,6 +91,11 @@ public void setFullscreen(final VlcPlayerView videoView, final boolean fullscree videoView.setFullscreen(fullscreen); } + @ReactProp(name = PROP_SUBTITLE) + public void setSubtitle(final VlcPlayerView videoView, final String uri) { + videoView.setSubtitle(Uri.parse(uri)); + } + private @ResizeMode.Mode int convertToIntDef(String resizeModeOrdinalString) { if (!TextUtils.isEmpty(resizeModeOrdinalString)) { diff --git a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java index 6af60d1..c2f7193 100644 --- a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java +++ b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java @@ -124,11 +124,9 @@ private void initializePlayerIfNeeded() { if (mMediaPlayer == null) { ArrayList options = new ArrayList<>(50); - options.add("--vout=android_display,none"); - - libvlc = new LibVLC(getContext(),options); + libvlc = new LibVLC(getContext(), options); // Create media player mMediaPlayer = new MediaPlayer(libvlc); @@ -300,6 +298,12 @@ public void run() { } }; + public void setSubtitle(Uri uri) { + if (mMediaPlayer != null) { + mMediaPlayer.addSlave(Media.Slave.Type.Subtitle, uri, true); + } + } + public void setFullscreen(boolean fullscreen) { if (fullscreen == isFullscreen) { return; // Avoid generating events when nothing is changing diff --git a/app/components/IconButton/IconButton.js b/app/components/IconButton/IconButton.js index 02131ef..00a5486 100644 --- a/app/components/IconButton/IconButton.js +++ b/app/components/IconButton/IconButton.js @@ -30,6 +30,7 @@ export const IconButton = ({ animatable, animatableStyle, buttonProps, + textProps, children, ...rest }) => ( @@ -50,7 +51,8 @@ export const IconButton = ({ + emphasis={'medium'} + {...textProps}> {children} )} @@ -67,6 +69,7 @@ IconButton.propTypes = { onBlur: PropTypes.func, children: PropTypes.string, buttonProps: PropTypes.object, + textProps: PropTypes.object, animatableStyle: PropTypes.object, animatable: PropTypes.object, size: PropTypes.number, @@ -74,6 +77,7 @@ IconButton.propTypes = { IconButton.defaultProps = { buttonProps: {}, + textProps: {}, animatable: {}, onPress: null, onPressIn: null, diff --git a/app/components/Typography/Typography.js b/app/components/Typography/Typography.js index 4af8275..1df7dfd 100644 --- a/app/components/Typography/Typography.js +++ b/app/components/Typography/Typography.js @@ -39,6 +39,12 @@ export default class Typography extends Component { 'primaryDark', ]), + transform: PropTypes.oneOf([ + 'default', + 'lowercase', + 'uppercase', + ]), + emphasis: PropTypes.oneOf([ 'high', 'medium', @@ -70,6 +76,7 @@ export default class Typography extends Component { color: 'white', variant: 'body1', fontWeight: 'default', + transform: 'default', textProps: {}, component: null, children: null, @@ -81,17 +88,20 @@ export default class Typography extends Component { fontWeight = Typography.defaultProps.fontWeight, color = Typography.defaultProps.color, emphasis = Typography.defaultProps.emphasis, + transform = Typography.defaultProps.transform, style: styleProp = null, asObject = false, }) => { const styledColor = styles[`color${capitalizeFirstLetter(color)}`] const styledFont = fontWeight !== 'default' ? styles[`fontFamily${capitalizeFirstLetter(fontWeight)}`] : null const styledEmphasis = styles[`emphasis${capitalizeFirstLetter(emphasis)}`] + const styledTransform = transform !== 'default' ? styles[`transform${capitalizeFirstLetter(transform)}`] : null const textStyles = [ styledColor, styles[variant], styledEmphasis, + styledTransform, ] if (styledFont) { diff --git a/app/components/Typography/Typography.styles.js b/app/components/Typography/Typography.styles.js index 283e4b7..a5914e5 100644 --- a/app/components/Typography/Typography.styles.js +++ b/app/components/Typography/Typography.styles.js @@ -144,4 +144,11 @@ export default { opacity: 0.38, }, + transformLowercase: { + textTransform: 'lowercase' + }, + + transformUppercase: { + textTransform: 'uppercase' + } } diff --git a/app/components/VlcPlayer/VlcPLayer.js b/app/components/VlcPlayer/VlcPLayer.js index cc1fa1b..de5c476 100644 --- a/app/components/VlcPlayer/VlcPLayer.js +++ b/app/components/VlcPlayer/VlcPLayer.js @@ -10,7 +10,6 @@ export const styles = { } - export default class VlcPLayer extends React.Component { componentWillUnmount() { @@ -33,17 +32,17 @@ export default class VlcPLayer extends React.Component { this.setNativeProps({ fullscreen: false }) } - _assignRoot = (component) => { + assignRoot = (component) => { this._root = component } - _onProgress = (event) => { + handleOnProgress = (event) => { if (this.props.onProgress) { this.props.onProgress(event.nativeEvent) } } - _onPaused = (event) => { + handleOnPaused = (event) => { StatusBar.setHidden(false) if (this.props.onPaused) { @@ -51,7 +50,7 @@ export default class VlcPLayer extends React.Component { } } - _onPlaying = (event) => { + handleOnPlaying = (event) => { StatusBar.setHidden(true) if (this.props.onPlaying) { @@ -67,10 +66,7 @@ export default class VlcPLayer extends React.Component { } render() { - const { - source, - resizeMode, - } = this.props + const { source, resizeMode, subtitleUri } = this.props source.initOptions = source.initOptions || [] const RCTVideoInstance = this.getViewManagerConfig('VlcPlayer') @@ -92,16 +88,17 @@ export default class VlcPLayer extends React.Component { const nativeProps = Object.assign({}, this.props) Object.assign(nativeProps, { style: [styles.base, StyleSheet.absoluteFill], - source: source, + source, resizeMode: nativeResizeMode, - onPlaying: this._onPlaying, - onProgress: this._onProgress, - onPaused: this._onPaused, + subtitleUri, + onPlaying: this.handleOnPlaying, + onProgress: this.handleOnProgress, + onPaused: this.handleOnPaused, }) return ( ) } @@ -119,6 +116,7 @@ VlcPLayer.propTypes = { 'cover', 'stretch', ]), + subtitleUri: PropTypes.string, rate: PropTypes.number, volume: PropTypes.number, diff --git a/app/mobile/modules/MobilePlayerManager/MobilePlayerManager.js b/app/mobile/modules/MobilePlayerManager/MobilePlayerManager.js index ab25805..0661d2e 100644 --- a/app/mobile/modules/MobilePlayerManager/MobilePlayerManager.js +++ b/app/mobile/modules/MobilePlayerManager/MobilePlayerManager.js @@ -180,7 +180,7 @@ export default class MobilePlayerManager extends PlayerManager { getChildProps = () => { const { casting, mediaUrl, startPosition } = this.state - const { download, isBuffering } = this.state + const { download, isBuffering, subtitles } = this.state return { casting, @@ -188,6 +188,8 @@ export default class MobilePlayerManager extends PlayerManager { startPosition, download, isBuffering, + subtitles, + selectSubtitle: this.handleSelectSubtitle, renderCastButton: this.renderCastButton, setProgress: this.handleSetProgress, } diff --git a/app/mobile/screens/Player/Player.js b/app/mobile/screens/Player/Player.js index 7d81547..e81ed4f 100644 --- a/app/mobile/screens/Player/Player.js +++ b/app/mobile/screens/Player/Player.js @@ -18,7 +18,17 @@ export const Player = ({ route: { params: { item, torrent } } }) => ( item={item} torrent={torrent} style={styles.root}> - {({ casting, renderCastButton, mediaUrl, setProgress, startPosition, isBuffering, download }) => ( + {({ + casting, + renderCastButton, + mediaUrl, + setProgress, + startPosition, + isBuffering, + download, + subtitleUri, + selectSubtitle, + }) => ( {(isBuffering || casting) && ( @@ -83,6 +93,8 @@ export const Player = ({ route: { params: { item, torrent } } }) => ( {!isBuffering && !casting && download && ( @@ -94,12 +106,10 @@ export const Player = ({ route: { params: { item, torrent } } }) => ( truncateSynopsis /> - + {renderCastButton({ - right: dimensions.UNIT * 10, + right: dimensions.UNIT * 16, bottom: dimensions.UNIT * 2.4, })} @@ -142,7 +152,7 @@ const styles = StyleSheet.create({ position: 'absolute', top: dimensions.UNIT * 3, left: dimensions.UNIT * 4, - zIndex: 500 + zIndex: 500, }, }) diff --git a/app/mobile/screens/Player/VideoAndControls/ResizeMode/ResizeMode.js b/app/mobile/screens/Player/VideoAndControls/ResizeMode/ResizeMode.js index 95b092b..9ba10bc 100644 --- a/app/mobile/screens/Player/VideoAndControls/ResizeMode/ResizeMode.js +++ b/app/mobile/screens/Player/VideoAndControls/ResizeMode/ResizeMode.js @@ -9,8 +9,9 @@ export const ResizeMode = ({ activeMode, changeResizeMode, toggleControls }) => const getNextMode = () => { if (activeMode === 'contain') { return 'cover' + } - } else if (activeMode === 'cover') { + if (activeMode === 'cover') { return 'stretch' } @@ -29,18 +30,15 @@ export const ResizeMode = ({ activeMode, changeResizeMode, toggleControls }) => pointerEvents={'box-none'}> { // Also toggle the controls so they stay visible toggleControls() changeResizeMode(getNextMode()) }} - name={'cellphone-screenshot'} + name={'overscan'} color={'primary'} - size={dimensions.ICON_SIZE_MEDIUM}> + size={dimensions.ICON_SIZE_DEFAULT}> {activeMode} diff --git a/app/mobile/screens/Player/VideoAndControls/SeekBar/SeekBar.js b/app/mobile/screens/Player/VideoAndControls/SeekBar/SeekBar.js index c655c02..2ac4314 100644 --- a/app/mobile/screens/Player/VideoAndControls/SeekBar/SeekBar.js +++ b/app/mobile/screens/Player/VideoAndControls/SeekBar/SeekBar.js @@ -10,7 +10,7 @@ import Typography from 'components/Typography' const styles = { container: { position: 'absolute', - bottom: dimensions.ICON_SIZE_DEFAULT + dimensions.UNIT * 4, + bottom: dimensions.ICON_SIZE_DEFAULT + dimensions.UNIT * 5, left: (dimensions.UNIT * 5), zIndex: 2000, flexDirection: 'row', diff --git a/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js b/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js new file mode 100644 index 0000000..4b644a3 --- /dev/null +++ b/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js @@ -0,0 +1,74 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { View } from 'react-native' + +import i18n from 'modules/i18n' +import dimensions from 'modules/dimensions' +import IconButton from 'components/IconButton' +import { useBottomSheet } from 'modules/BottomSheetManager' + +export const SelectSubtitle = ({ handlePauseVideo, handlePlayVideo, selectSubtitle, subtitles }) => { + // TODO:: Create an "useSideSheet" that does the same but comes from the side + // this can then also be used on tv + const [openBottomSheet, updateBottomSheet, closeBottomSheet] = useBottomSheet() + + const getBottomSheetConfig = () => { + return { + renderContent: renderBottomSheetContent, + snapPoints: [ + 300, + 300, + 0, + ], + contentHeight: 300, + onClose: console.log, + } + } + + const renderBottomSheetContent = React.useCallback(() => ( + + + + ), [subtitles]) + + const handleOnOpenSubtitlesPress = () => { + openBottomSheet(getBottomSheetConfig()) + } + + return ( + + + + {i18n.t('Subtitles')} + + + + ) +} + +SelectSubtitle.propTypes = { + paused: PropTypes.bool, + handlePauseVideo: PropTypes.func.isRequired, + handlePlayVideo: PropTypes.func.isRequired, +} + +SelectSubtitle.defaultProps = { + paused: false, +} + +export default SelectSubtitle diff --git a/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/index.js b/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/index.js new file mode 100644 index 0000000..1508cad --- /dev/null +++ b/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/index.js @@ -0,0 +1 @@ +export { default } from './SelectSubtitle' diff --git a/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js b/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js index 9e13e4b..59257e4 100644 --- a/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js +++ b/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js @@ -10,6 +10,7 @@ import Overlay from 'components/Overlay' import PlayPauseIcon from './PlayPauseIcon' import ResizeMode from './ResizeMode' import SeekBar from './SeekBar' +import SelectSubtitle from './SelectSubtitle' const styles = StyleSheet.create({ @@ -58,7 +59,6 @@ const styles = StyleSheet.create({ }) - export class VideoAndControls extends React.Component { scrollViewRef @@ -252,16 +252,15 @@ export class VideoAndControls extends React.Component { return this.toggleControlsOff() } - return + } else { + this.setState({ + showControls: true, + }, () => { + if (withTimeout) { + this.toggleControlsOff() + } + }) } - - this.setState({ - showControls: true, - }, () => { - if (withTimeout) { - return this.toggleControlsOff() - } - }) } toggleControlsOff = () => { @@ -279,7 +278,7 @@ export class VideoAndControls extends React.Component { } render() { - const { url, children, forcePaused } = this.props + const { url, children, forcePaused, subtitleUri, selectSubtitle } = this.props const { isPortrait, resizeMode } = this.state const { showControls, paused } = this.state const { currentTime, duration, progress } = this.state @@ -300,6 +299,7 @@ export class VideoAndControls extends React.Component { uri: url, autoplay: true, }} + subtitleUri={subtitleUri} style={styles.video} paused={paused || forcePaused} resizeMode={resizeMode} @@ -335,10 +335,16 @@ export class VideoAndControls extends React.Component { onSeek={this.onSliderPositionChange} /> + + {children} this.scrollViewRef = ref} + ref={(ref) => this.scrollViewRef = ref} showsHorizontalScrollIndicator={false} showsVerticalScrollIndicator={false} contentContainerStyle={styles.contentContainerStyle} diff --git a/app/mobile/screens/Settings/About/About.js b/app/mobile/screens/Settings/About/About.js index 2418954..ae39623 100644 --- a/app/mobile/screens/Settings/About/About.js +++ b/app/mobile/screens/Settings/About/About.js @@ -75,7 +75,9 @@ export const About = ({ data, ipFinder }) => ( About + variant={'headline6'}> + {i18n.t('About')} + ( - GraphQL-API + API {i18n.t('Version: {{version}}', { version: data?.status?.version ?? 'unknown' })} diff --git a/app/modules/BottomSheetManager/BottomSheetProvider.js b/app/modules/BottomSheetManager/BottomSheetProvider.js index c2b2458..d9b6155 100644 --- a/app/modules/BottomSheetManager/BottomSheetProvider.js +++ b/app/modules/BottomSheetManager/BottomSheetProvider.js @@ -129,6 +129,7 @@ export const BottomSheetProvider = ({ children }) => { elevation={1} style={{ height: bottomSheetConfig.biggestSnapPoint, + width: 300, }}> {bottomSheetConfig.renderContent()} diff --git a/app/modules/GraphQL/fragments/downloadFragment.js b/app/modules/GraphQL/fragments/downloadFragment.js index f12e6db..235cf87 100644 --- a/app/modules/GraphQL/fragments/downloadFragment.js +++ b/app/modules/GraphQL/fragments/downloadFragment.js @@ -1,31 +1,31 @@ import { gql } from '@apollo/client' export default gql` - fragment download on Download { - _id - type - itemType - torrentType - status - quality - progress - numPeers - speed - timeRemaining - subtitles { - language - code + fragment download on Download { + _id + type + itemType + torrentType + status + quality + progress + numPeers + speed + timeRemaining + subtitles { + language + code + } + movie { + title + } + episode { + title + season + number + show { + title + } + } } - movie { - title - } - episode { - title - season - number - show { - title - } - } - } ` diff --git a/app/modules/PlayerManager/PlayerManager.js b/app/modules/PlayerManager/PlayerManager.js index 6d8a299..7901ab7 100644 --- a/app/modules/PlayerManager/PlayerManager.js +++ b/app/modules/PlayerManager/PlayerManager.js @@ -21,6 +21,7 @@ export class PlayerManager extends React.Component { startPosition: item.watched.progress === 100 ? 0 : item.watched.progress, + subtitles: null, } } @@ -79,6 +80,12 @@ export class PlayerManager extends React.Component { }) } + handleSelectSubtitle = (languageCode) => { + const { download } = this.state + + console.log('handleSelectSubtitle', languageCode, download.subtitles) + } + /** * Does the start stream mutation * @@ -145,13 +152,15 @@ export class PlayerManager extends React.Component { getChildProps = () => { const { mediaUrl, startPosition } = this.state - const { download, isBuffering } = this.state + const { download, isBuffering, subtitleUri } = this.state return { mediaUrl, startPosition, download, isBuffering, + subtitleUri, + selectSubtitle: this.handleSelectSubtitle, setProgress: this.handleSetProgress, } } diff --git a/app/modules/dimensions.js b/app/modules/dimensions.js index 52395b0..bd5cb35 100644 --- a/app/modules/dimensions.js +++ b/app/modules/dimensions.js @@ -2,7 +2,15 @@ import { Dimensions, StatusBar } from 'react-native' import useCorrect from 'modules/useCorrect' -const { width: screenWidth, height: screenHeight } = Dimensions.get('window') +const { width, height } = Dimensions.get('window') + +let screenWidth = width +let screenHeight = height + +if (width > height) { + screenWidth = (height) + screenHeight = (width) +} const UNIT = 8 const SKETCH_DEFAULT_WIDTH = useCorrect(360, null, 1920) diff --git a/app/modules/i18n/translations/en.json b/app/modules/i18n/translations/en.json index fd2888c..7fdc746 100644 --- a/app/modules/i18n/translations/en.json +++ b/app/modules/i18n/translations/en.json @@ -85,5 +85,6 @@ "Year": "Year", "Added": "Added", "All": "All", - "Trending": "Trending" + "Trending": "Trending", + "About": "About", } diff --git a/app/modules/i18n/translations/nl.json b/app/modules/i18n/translations/nl.json index fe22d81..e06b9a6 100644 --- a/app/modules/i18n/translations/nl.json +++ b/app/modules/i18n/translations/nl.json @@ -83,5 +83,6 @@ "Year": "Jaar", "Added": "Toegevoegd", "All": "Alles", - "Trending": "Trending" + "Trending": "Trending", + "About": "Over" } From 5789435a8402b0068936cb1e11008ad25983c3b3 Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Wed, 16 Dec 2020 18:33:54 +0100 Subject: [PATCH 03/12] refactor: Basic version working with subs --- README.md | 13 +- app/components/BottomSheet/BottomSheet.js | 105 -- app/components/BottomSheet/index.js | 1 - app/components/VlcPlayer/VlcPLayer.js | 2 +- .../MobilePlayerManager.js | 4 +- app/mobile/root.js | 11 +- app/mobile/screens/Player/Player.js | 1 + .../SelectSubtitle/SelectSubtitle.js | 38 +- .../VideoAndControls/VideoAndControls.js | 20 +- .../screens/Settings/Subtitles/Subtitles.js | 1 + app/modules/PlayerManager/PlayerManager.js | 10 +- app/modules/SideSheetManager/SideSheet.tsx | 1066 +++++++++++++++++ .../SideSheetManager/SideSheetProvider.js | 137 +++ app/modules/SideSheetManager/index.js | 2 + 14 files changed, 1256 insertions(+), 155 deletions(-) delete mode 100644 app/components/BottomSheet/BottomSheet.js delete mode 100644 app/components/BottomSheet/index.js create mode 100644 app/modules/SideSheetManager/SideSheet.tsx create mode 100644 app/modules/SideSheetManager/SideSheetProvider.js create mode 100644 app/modules/SideSheetManager/index.js diff --git a/README.md b/README.md index 1328b37..1f243b6 100644 --- a/README.md +++ b/README.md @@ -27,18 +27,7 @@ --- -## Projects - -Popcorn Time consists of several projects, each doing it's own part. - -| Project | Description | -| ---------------------------- | -------------------------------------------------------- | -| [`@pct-org/getting-started`] | Explains how to get started with this setup | -| [`@pct-org/graphql-api`] | Serves the data to the clients from the MongoDB database | -| [`@pct-org/scraper`] | Scrapes everything and saves it to MongoDB database | -| [`@pct-org/mongo-models`] | Models used for MongoDB and GraphQL object types | -| [`@pct-org/native-app`] | React Native App | -| [`@pct-org/updater`] | Updater that automatically updates the projects | +This app runs on the [Popcorn ENV](https://github.com/pct-org/popcorn-env) setup. ## Installation diff --git a/app/components/BottomSheet/BottomSheet.js b/app/components/BottomSheet/BottomSheet.js deleted file mode 100644 index 03c0afc..0000000 --- a/app/components/BottomSheet/BottomSheet.js +++ /dev/null @@ -1,105 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { StyleSheet, View } from 'react-native' -import ReanimatedBottomSheet from 'reanimated-bottom-sheet' -import Animated from 'react-native-reanimated' - -import useBackButton from 'modules/hooks/useBackButton' - -import Container from '../Container' -import Portal from '../Portal' - -export const styles = StyleSheet.create({ - - overlayContainer: { - position: 'absolute', - top: 0, - right: 0, - bottom: 0, - left: 0, - }, - - overlay: { - backgroundColor: 'black', - }, - -}) - -export const BottomSheet = React.forwardRef(({ children, contentHeight, renderHeader, snapPoints }, ref) => { - const [fall] = React.useState(new Animated.Value(1)) - const [visible, toggleVisible] = React.useState(false) - - const biggestSnapPoint = contentHeight || snapPoints.reduce((biggest, current) => current > biggest ? current - : biggest, 0) - - const handleBottomSheetOpen = React.useCallback(() => { - toggleVisible(true) - }, []) - - const handleBottomSheetClose = React.useCallback(() => { - toggleVisible(false) - }, []) - - useBackButton(() => { - if (visible && ref.current) { - ref.current.snapTo(snapPoints.length - 1) - - return true - } - - return false - }) - - return ( - - - - - - ( - - {children} - - )} - /> - - ) -}) - -BottomSheet.propTypes = { - snapPoints: PropTypes.array, - contentHeight: PropTypes.number, -} - -BottomSheet.defaultProps = { - snapPoints: [400, 0], - contentHeight: null, -} - -export default BottomSheet diff --git a/app/components/BottomSheet/index.js b/app/components/BottomSheet/index.js deleted file mode 100644 index e08c7cb..0000000 --- a/app/components/BottomSheet/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './BottomSheet' diff --git a/app/components/VlcPlayer/VlcPLayer.js b/app/components/VlcPlayer/VlcPLayer.js index de5c476..ca427b7 100644 --- a/app/components/VlcPlayer/VlcPLayer.js +++ b/app/components/VlcPlayer/VlcPLayer.js @@ -90,7 +90,7 @@ export default class VlcPLayer extends React.Component { style: [styles.base, StyleSheet.absoluteFill], source, resizeMode: nativeResizeMode, - subtitleUri, + subtitleUri: subtitleUri || undefined, onPlaying: this.handleOnPlaying, onProgress: this.handleOnProgress, onPaused: this.handleOnPaused, diff --git a/app/mobile/modules/MobilePlayerManager/MobilePlayerManager.js b/app/mobile/modules/MobilePlayerManager/MobilePlayerManager.js index 0661d2e..c91bc7c 100644 --- a/app/mobile/modules/MobilePlayerManager/MobilePlayerManager.js +++ b/app/mobile/modules/MobilePlayerManager/MobilePlayerManager.js @@ -180,7 +180,7 @@ export default class MobilePlayerManager extends PlayerManager { getChildProps = () => { const { casting, mediaUrl, startPosition } = this.state - const { download, isBuffering, subtitles } = this.state + const { download, isBuffering, subtitleUri } = this.state return { casting, @@ -188,7 +188,7 @@ export default class MobilePlayerManager extends PlayerManager { startPosition, download, isBuffering, - subtitles, + subtitleUri, selectSubtitle: this.handleSelectSubtitle, renderCastButton: this.renderCastButton, setProgress: this.handleSetProgress, diff --git a/app/mobile/root.js b/app/mobile/root.js index ad1f6ec..65690e7 100644 --- a/app/mobile/root.js +++ b/app/mobile/root.js @@ -6,6 +6,7 @@ import IpFinder from 'modules/IpFinder' import WatchOnTvManager from 'modules/WatchOnTvManager' import navigationRef from 'modules/RootNavigation' import BottomSheetManager from 'modules/BottomSheetManager' +import SideSheetManager from 'modules/SideSheetManager' import Portal from 'components/Portal' import ApolloLoader from 'components/ApolloLoader' @@ -24,11 +25,11 @@ export default () => ( - - - - - + + + + + diff --git a/app/mobile/screens/Player/Player.js b/app/mobile/screens/Player/Player.js index e81ed4f..b7356c5 100644 --- a/app/mobile/screens/Player/Player.js +++ b/app/mobile/screens/Player/Player.js @@ -95,6 +95,7 @@ export const Player = ({ route: { params: { item, torrent } } }) => ( item={item} subtitleUri={subtitleUri} selectSubtitle={selectSubtitle} + subtitles={download.subtitles} url={mediaUrl} startPosition={startPosition} setProgress={setProgress}> diff --git a/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js b/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js index 4b644a3..a8e38cc 100644 --- a/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js +++ b/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js @@ -1,3 +1,4 @@ +import Typography from 'components/Typography' import React from 'react' import PropTypes from 'prop-types' import { View } from 'react-native' @@ -5,33 +6,40 @@ import { View } from 'react-native' import i18n from 'modules/i18n' import dimensions from 'modules/dimensions' import IconButton from 'components/IconButton' -import { useBottomSheet } from 'modules/BottomSheetManager' +import TextButton from 'components/TextButton' +import { useSideSheet } from 'modules/SideSheetManager' -export const SelectSubtitle = ({ handlePauseVideo, handlePlayVideo, selectSubtitle, subtitles }) => { +export const SelectSubtitle = ({ pauseVideo, playVideo, selectSubtitle, subtitles }) => { // TODO:: Create an "useSideSheet" that does the same but comes from the side // this can then also be used on tv - const [openBottomSheet, updateBottomSheet, closeBottomSheet] = useBottomSheet() + const [openBottomSheet, updateBottomSheet, closeBottomSheet] = useSideSheet() const getBottomSheetConfig = () => { return { renderContent: renderBottomSheetContent, - snapPoints: [ - 300, - 300, - 0, - ], - contentHeight: 300, - onClose: console.log, + onClose: () => { + playVideo() + }, } } const renderBottomSheetContent = React.useCallback(() => ( - + + {subtitles.map((subtitle) => ( + selectSubtitle(subtitle)} + > + {subtitle.language} + + ))} ), [subtitles]) const handleOnOpenSubtitlesPress = () => { + pauseVideo() + openBottomSheet(getBottomSheetConfig()) } @@ -41,7 +49,7 @@ export const SelectSubtitle = ({ handlePauseVideo, handlePlayVideo, selectSubtit position: 'absolute', zIndex: 2000, width: dimensions.ICON_SIZE_MEDIUM + (dimensions.UNIT * 2), - right: dimensions.UNIT * 7 + dimensions.ICON_SIZE_MEDIUM, + right: dimensions.UNIT * 5, bottom: dimensions.UNIT * 2, }} pointerEvents={'box-none'}> @@ -63,12 +71,12 @@ export const SelectSubtitle = ({ handlePauseVideo, handlePlayVideo, selectSubtit SelectSubtitle.propTypes = { paused: PropTypes.bool, - handlePauseVideo: PropTypes.func.isRequired, - handlePlayVideo: PropTypes.func.isRequired, + pauseVideo: PropTypes.func.isRequired, + playVideo: PropTypes.func.isRequired, } SelectSubtitle.defaultProps = { paused: false, } -export default SelectSubtitle +export default React.memo(SelectSubtitle) diff --git a/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js b/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js index 59257e4..0e25fa9 100644 --- a/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js +++ b/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js @@ -8,7 +8,6 @@ import VlcPlayer from 'components/VlcPlayer' import Overlay from 'components/Overlay' import PlayPauseIcon from './PlayPauseIcon' -import ResizeMode from './ResizeMode' import SeekBar from './SeekBar' import SelectSubtitle from './SelectSubtitle' @@ -278,7 +277,7 @@ export class VideoAndControls extends React.Component { } render() { - const { url, children, forcePaused, subtitleUri, selectSubtitle } = this.props + const { url, children, forcePaused, subtitleUri, selectSubtitle, subtitles } = this.props const { isPortrait, resizeMode } = this.state const { showControls, paused } = this.state const { currentTime, duration, progress } = this.state @@ -287,7 +286,7 @@ export class VideoAndControls extends React.Component { if (isPortrait) { return null } - +console.log('active subtitleUri', subtitleUri) return ( {url && ( @@ -322,11 +321,11 @@ export class VideoAndControls extends React.Component { paused={paused} /> - + {/**/} {children} diff --git a/app/mobile/screens/Settings/Subtitles/Subtitles.js b/app/mobile/screens/Settings/Subtitles/Subtitles.js index 4507ac4..04760ba 100644 --- a/app/mobile/screens/Settings/Subtitles/Subtitles.js +++ b/app/mobile/screens/Settings/Subtitles/Subtitles.js @@ -46,6 +46,7 @@ export const styles = { } +// TODO:: Change to use bottom sheet export const Subtitles = () => { const [showSubSelector, toggleSubSelector] = useState(false) const [defaultSubtitleCode, updateStorageItem] = useAsyncStorage(constants.KEY_DEFAULT_SUBTITLE) diff --git a/app/modules/PlayerManager/PlayerManager.js b/app/modules/PlayerManager/PlayerManager.js index 7901ab7..c67a220 100644 --- a/app/modules/PlayerManager/PlayerManager.js +++ b/app/modules/PlayerManager/PlayerManager.js @@ -21,7 +21,7 @@ export class PlayerManager extends React.Component { startPosition: item.watched.progress === 100 ? 0 : item.watched.progress, - subtitles: null, + subtitleUri: null, } } @@ -80,10 +80,12 @@ export class PlayerManager extends React.Component { }) } - handleSelectSubtitle = (languageCode) => { - const { download } = this.state + handleSelectSubtitle = (subtitle) => { + const { ipFinder, item } = this.props - console.log('handleSelectSubtitle', languageCode, download.subtitles) + this.setState({ + subtitleUri: `http://${ipFinder.host}/subtitle/${item._id}/${subtitle.code}`, + }) } /** diff --git a/app/modules/SideSheetManager/SideSheet.tsx b/app/modules/SideSheetManager/SideSheet.tsx new file mode 100644 index 0000000..e4ccb8c --- /dev/null +++ b/app/modules/SideSheetManager/SideSheet.tsx @@ -0,0 +1,1066 @@ +import React from 'react' +import { Dimensions, Platform, View, LayoutChangeEvent } from 'react-native' +import Animated from 'react-native-reanimated' +import { + PanGestureHandler, + TapGestureHandler, + State as GestureState +} from 'react-native-gesture-handler' + +/** + * Based on https://github.com/osdnk/react-native-reanimated-bottom-sheet/blob/master/src/index.tsx + * But made to snap from right to left instead of bottom to top + */ + +type Props = { + /** + * Points for snapping of bottom sheet component. They define distance from bottom of the screen. + * Might be number or percent (as string e.g. '20%') for points or percents of screen height from bottom. + */ + snapPoints: (number | string)[] + + /** + * Determines initial snap point of bottom sheet. Defaults to 0. + */ + initialSnap: number + + /** + * Method for rendering scrollable content of bottom sheet. + */ + renderContent?: () => React.ReactNode + + /** + * Method for rendering non-scrollable header of bottom sheet. + */ + renderHeader?: () => React.ReactNode + + /** + * Defines if bottom sheet could be scrollable by gesture. Defaults to true. + */ + enabledGestureInteraction?: boolean + enabledHeaderGestureInteraction?: boolean + enabledContentGestureInteraction?: boolean + + /** + * Defines if bottom sheet content responds to taps. Defaults to true. + */ + enabledContentTapInteraction?: boolean + + /** + * When true, clamp bottom position to first snapPoint. + */ + enabledBottomClamp?: boolean + + /** + * When true, sheet will grows up from bottom to initial snapPoint. + */ + enabledBottomInitialAnimation?: boolean + + /** + * If false blocks snapping using snapTo method. Defaults to true. + */ + enabledManualSnapping?: boolean + + /** + * Defines whether it's possible to scroll inner content of bottom sheet. Defaults to true. + */ + enabledInnerScrolling?: boolean + + /** + * Reanimated node which holds position of bottom sheet, where 1 it the highest snap point and 0 is the lowest. + */ + callbackNode?: Animated.Value + + /** + * Reanimated node which holds position of bottom sheet;s content (in dp). + */ + contentPosition?: Animated.Value + + /** + * Reanimated node which holds position of bottom sheet's header (in dp). + */ + headerPosition?: Animated.Value + + /** + * Defines how violently sheet has to stopped while overdragging. 0 means no overdrag. Defaults to 0. + */ + overdragResistanceFactor: number + + /** + * Array of Refs passed to gesture handlers for simultaneous event handling + */ + simultaneousHandlers?: Array> | React.RefObject + + /** + * Overrides config for spring animation + */ + springConfig: { + damping?: number + mass?: number + stiffness?: number + restSpeedThreshold?: number + restDisplacementThreshold?: number + toss?: number + } + + /** + * Refs for gesture handlers used for building bottomsheet + */ + innerGestureHandlerRefs: [ + React.RefObject, + React.RefObject, + React.RefObject + ] + + enabledImperativeSnapping?: boolean + + onOpenStart?: () => void + onOpenEnd?: () => void + onCloseStart?: () => void + onCloseEnd?: () => void + callbackThreshold?: number + borderRadius?: number + overflow?: 'visible' | 'hidden' +} + +type State = { + snapPoints: Animated.Value[] + init: any + initSnap: number + propsToNewIndices: { [key: string]: number } + heightOfContent: Animated.Value + heightOfHeader: number + heightOfHeaderAnimated: Animated.Value +} + +const { width: screenHeight } = Dimensions.get('window') + +const P = (android: T, ios: T): T => + Platform.OS === 'ios' ? ios : android + +const magic = { + damping: 50, + mass: 0.3, + stiffness: 121.6, + overshootClamping: true, + restSpeedThreshold: 0.3, + restDisplacementThreshold: 0.3, + deceleration: 0.999, + bouncyFactor: 1, + velocityFactor: P(1, 0.8), + toss: 0.4, + coefForTranslatingVelocities: 5 +} + +const { + damping, + mass, + stiffness, + overshootClamping, + restSpeedThreshold, + restDisplacementThreshold, + deceleration, + velocityFactor, + toss +} = magic + +const { + set, + cond, + onChange, + block, + eq, + greaterOrEq, + sqrt, + not, + defined, + max, + add, + and, + Value, + spring, + or, + divide, + greaterThan, + sub, + event, + diff, + multiply, + clockRunning, + startClock, + stopClock, + decay, + Clock, + lessThan, + call, + lessOrEq, + neq +} = Animated + +function runDecay( + clock: Animated.Clock, + value: Animated.Node, + velocity: Animated.Node, + wasStartedFromBegin: Animated.Value +) { + const state = { + finished: new Value(0), + velocity: new Value(0), + position: new Value(0), + time: new Value(0) + } + + const config = { deceleration } + + return [ + cond(clockRunning(clock), 0, [ + cond(wasStartedFromBegin, 0, [ + set(wasStartedFromBegin, 1), + set(state.finished, 0), + set(state.velocity, multiply(velocity, velocityFactor)), + set(state.position, value), + set(state.time, 0), + startClock(clock) + ]) + ]), + cond(clockRunning(clock), decay(clock, state, config)), + cond(state.finished, stopClock(clock)), + state.position + ] +} + +function withPreservingAdditiveOffset( + drag: Animated.Node, + state: Animated.Node +) { + const prev = new Value(0) + const valWithPreservedOffset = new Value(0) + + return block([ + cond( + eq(state, GestureState.BEGAN), + [set(prev, 0)], + [ + set( + valWithPreservedOffset, + add(valWithPreservedOffset, sub(drag, prev)) + ), + set(prev, drag) + ] + ), + valWithPreservedOffset + ]) +} + +function withDecaying( + drag: Animated.Node, + state: Animated.Node, + decayClock: Animated.Clock, + velocity: Animated.Node, + prevent: Animated.Value +) { + const valDecayed = new Value(0) + const offset = new Value(0) + // since there might be moar than one clock + const wasStartedFromBegin = new Value(0) + return block([ + cond( + eq(state, GestureState.END), + [ + cond( + prevent, + stopClock(decayClock), + set( + valDecayed, + runDecay( + decayClock, + add(drag, offset), + velocity, + wasStartedFromBegin + ) + ) + ) + ], + [ + stopClock(decayClock), + cond(eq(state, GestureState.BEGAN), set(prevent, 0)), + cond( + or(eq(state, GestureState.BEGAN), eq(state, GestureState.ACTIVE)), + set(wasStartedFromBegin, 0) + ), + cond(eq(state, GestureState.BEGAN), [ + set(offset, sub(valDecayed, drag)) + ]), + set(valDecayed, add(drag, offset)) + ] + ), + valDecayed + ]) +} + +export default class BottomSheetBehavior extends React.Component { + static defaultProps = { + overdragResistanceFactor: 0, + initialSnap: 0, + enabledImperativeSnapping: true, + enabledGestureInteraction: true, + enabledBottomClamp: false, + enabledBottomInitialAnimation: false, + enabledHeaderGestureInteraction: true, + enabledContentGestureInteraction: true, + enabledContentTapInteraction: true, + enabledInnerScrolling: true, + springConfig: {}, + innerGestureHandlerRefs: [ + React.createRef(), + React.createRef(), + React.createRef() + ], + callbackThreshold: 0.01 + } + + private decayClock = new Clock() + private panState = new Value(0) + private tapState = new Value(0) + private velocity = new Value(0) + private panMasterState: Animated.Value = new Value(GestureState.END) + private masterVelocity = new Value(0) + private isManuallySetValue: Animated.Value = new Value(0) + private manuallySetValue = new Value(0) + private masterClockForOverscroll = new Clock() + private preventDecaying: Animated.Value = new Value(0) + private dragMasterY = new Value(0) + private dragY = new Value(0) + private translateMaster: Animated.Node + private panRef: React.RefObject + private master: React.RefObject + private tapRef: React.RefObject + private snapPoint: Animated.Node + private Y: Animated.Node + private clampingValue: Animated.Value = new Value(0) + private onOpenStartValue: Animated.Value = new Value(0) + private onOpenEndValue: Animated.Value = new Value(0) + private onCloseStartValue: Animated.Value = new Value(1) + private onCloseEndValue: Animated.Value = new Value(0) + + constructor(props: Props) { + super(props) + + this.panRef = props.innerGestureHandlerRefs[0] + this.master = props.innerGestureHandlerRefs[1] + this.tapRef = props.innerGestureHandlerRefs[2] + this.state = BottomSheetBehavior.getDerivedStateFromProps(props, undefined) + + const { snapPoints, init } = this.state + const middlesOfSnapPoints: [ + Animated.Node, + Animated.Node + ][] = [] + + for (let i = 1; i < snapPoints.length; i++) { + const tuple: [Animated.Node, Animated.Node] = [ + add(snapPoints[i - 1], 10), + sub(snapPoints[i], 25) + ] + middlesOfSnapPoints.push(tuple) + } + + const masterOffseted = new Value(init) + // destination point is a approximation of movement if finger released + const tossForMaster = + props.springConfig.hasOwnProperty('toss') && + props.springConfig.toss != undefined + ? props.springConfig.toss + : toss + const destinationPoint = add( + masterOffseted, + multiply(tossForMaster, this.masterVelocity) + ) + + const positive = greaterOrEq( + multiply(tossForMaster, this.masterVelocity), + 0 + ) + // method for generating condition for finding the nearest snap point + const currentSnapPoint = (i = 0): Animated.Node => + i + 1 === snapPoints.length + ? snapPoints[i] + : cond( + positive, + cond( + greaterThan(destinationPoint, middlesOfSnapPoints[i][0]), + cond( + lessThan(destinationPoint, middlesOfSnapPoints[i][1]), + snapPoints[i + 1], + currentSnapPoint(i + 1) + ), + snapPoints[i] + ), + cond( + greaterThan(destinationPoint, middlesOfSnapPoints[i][1]), + cond( + lessThan(destinationPoint, middlesOfSnapPoints[i][0]), + snapPoints[i + 1], + currentSnapPoint(i + 1) + ), + snapPoints[i] + ) + ) + // current snap point desired + this.snapPoint = currentSnapPoint() + + if (props.enabledBottomClamp) { + this.clampingValue.setValue(snapPoints[snapPoints.length - 1]) + } + + const masterClock = new Clock() + const prevMasterDrag = new Value(0) + const wasRun: Animated.Value = new Value(0) + this.translateMaster = block([ + cond( + or( + eq(this.panMasterState, GestureState.END), + eq(this.panMasterState, GestureState.CANCELLED), + eq(this.panMasterState, GestureState.FAILED) + ), + [ + set(prevMasterDrag, 0), + cond( + or(clockRunning(masterClock), not(wasRun), this.isManuallySetValue), + [ + cond(this.isManuallySetValue, stopClock(masterClock)), + set( + masterOffseted, + this.runSpring( + masterClock, + masterOffseted, + this.masterVelocity, + cond( + this.isManuallySetValue, + this.manuallySetValue, + this.snapPoint + ), + wasRun, + this.isManuallySetValue, + this.masterVelocity + ) + ), + set(this.isManuallySetValue, 0) + ] + ) + ], + [ + stopClock(masterClock), + set(this.preventDecaying, 1), + set( + masterOffseted, + add(masterOffseted, sub(this.dragMasterY, prevMasterDrag)) + ), + set(prevMasterDrag, this.dragMasterY), + set(wasRun, 0), // not sure about this move for cond-began + cond( + eq(this.panMasterState, GestureState.BEGAN), + stopClock(this.masterClockForOverscroll) + ) + ] + ), + cond( + greaterThan(masterOffseted, snapPoints[0]), + cond( + and( + props.enabledBottomClamp ? 1 : 0, + greaterThan(masterOffseted, this.clampingValue) + ), + this.clampingValue, + masterOffseted + ), + max( + multiply( + sub( + snapPoints[0], + sqrt(add(1, sub(snapPoints[0], masterOffseted))) + ), + !props.enabledInnerScrolling ? props.overdragResistanceFactor : 0 + ), + masterOffseted + ) + ) + ]) + + this.Y = this.withEnhancedLimits( + withDecaying( + withPreservingAdditiveOffset(this.dragY, this.panState), + this.panState, + this.decayClock, + this.velocity, + this.preventDecaying + ), + masterOffseted + ) + } + + componentDidUpdate(_prevProps: Props, prevState: State) { + const { snapPoints } = this.state + if (this.props.enabledBottomClamp && snapPoints !== prevState.snapPoints) { + this.clampingValue.setValue(snapPoints[snapPoints.length - 1]) + } + } + + private runSpring( + clock: Animated.Clock, + value: Animated.Value, + velocity: Animated.Node, + dest: Animated.Node, + wasRun: Animated.Value, + isManuallySet: Animated.Node | number, + valueToBeZeroed: Animated.Value + ) { + const state = { + finished: new Value(0), + velocity: new Value(0), + position: new Value(0), + time: new Value(0) + } + + const config = { + damping, + mass, + stiffness, + overshootClamping, + restSpeedThreshold, + restDisplacementThreshold, + toValue: new Value(0), + ...this.props.springConfig + } + + return [ + cond(clockRunning(clock), 0, [ + set(state.finished, 0), + set(state.velocity, velocity), + set(state.position, value), + set(config.toValue, dest), + cond(and(wasRun, not(isManuallySet)), 0, startClock(clock)), + cond(defined(wasRun), set(wasRun, 1)) + ]), + spring(clock, state, config), + cond(state.finished, [stopClock(clock), set(valueToBeZeroed, 0)]), + state.position + ] + } + + private handleMasterPan = event([ + { + nativeEvent: { + translationX: this.dragMasterY, + state: this.panMasterState, + velocityX: this.masterVelocity, + }, + }, + ]) + + private handlePan = event([ + { + nativeEvent: { + translationX: this.props.enabledInnerScrolling + ? this.dragY + : this.dragMasterY, + state: this.props.enabledInnerScrolling + ? this.panState + : this.panMasterState, + velocityX: this.props.enabledInnerScrolling + ? this.velocity + : this.masterVelocity + } + } + ]) + + private handleTap = event([{ nativeEvent: { state: this.tapState } }]) + + private withEnhancedLimits( + val: Animated.Node, + masterOffseted: Animated.Value + ) { + const wasRunMaster = new Value(0) + const min = multiply( + -1, + add(this.state.heightOfContent, this.state.heightOfHeaderAnimated) + ) + const prev = new Value(0) + const limitedVal = new Value(0) + const diffPres = new Value(0) + const flagWasRunSpring = new Value(0) + const justEndedIfEnded: Animated.Value = new Value(1) + const wasEndedMasterAfterInner: Animated.Value = new Value(1) + const prevMaster = new Value(1) + const prevState = new Value(0) + const rev = new Value(0) + + return block([ + set(rev, limitedVal), + cond( + or( + eq(this.panState, GestureState.BEGAN), + and( + eq(this.panState, GestureState.ACTIVE), + eq(prevState, GestureState.END) + ) + ), + [ + set(prev, val), + set(flagWasRunSpring, 0), + stopClock(this.masterClockForOverscroll), + set(wasRunMaster, 0) + ], + [ + set(limitedVal, add(limitedVal, sub(val, prev))), + cond(lessThan(limitedVal, min), set(limitedVal, min)) + ] + ), + set(prevState, this.panState), // on iOS sometimes BEGAN event does not trigger + set(diffPres, sub(prev, val)), + set(prev, val), + cond( + or(greaterOrEq(limitedVal, 0), greaterThan(masterOffseted, 0)), + [ + cond( + eq(this.panState, GestureState.ACTIVE), + set(masterOffseted, sub(masterOffseted, diffPres)) + ), + cond(greaterThan(masterOffseted, 0), [set(limitedVal, 0)]), + cond( + not(eq(this.panState, GestureState.END)), + set(justEndedIfEnded, 1) + ), + cond( + or( + eq(this.panState, GestureState.ACTIVE), + eq(this.panMasterState, GestureState.ACTIVE) + ), + set(wasEndedMasterAfterInner, 0) + ), + cond( + and( + eq(prevMaster, GestureState.ACTIVE), + eq(this.panMasterState, GestureState.END), + eq(this.panState, GestureState.END) + ), + set(wasEndedMasterAfterInner, 1) + ), + set(prevMaster, this.panMasterState), + cond( + and( + eq(this.panState, GestureState.END), + not(wasEndedMasterAfterInner), + not(eq(this.panMasterState, GestureState.ACTIVE)), + not(eq(this.panMasterState, GestureState.BEGAN)), + or(clockRunning(this.masterClockForOverscroll), not(wasRunMaster)) + ), + [ + // cond(justEndedIfEnded, set(this.masterVelocity, diff(val))), + set( + this.masterVelocity, + cond(justEndedIfEnded, diff(val), this.velocity) + ), + set( + masterOffseted, + this.runSpring( + this.masterClockForOverscroll, + masterOffseted, + diff(val), + this.snapPoint, + wasRunMaster, + 0, + this.masterVelocity + ) + ), + set(this.masterVelocity, 0) + ] + ), + // cond(eq(this.panState, State.END), set(wasEndedMasterAfterInner, 0)), + cond(eq(this.panState, GestureState.END), set(justEndedIfEnded, 0)), + set(this.preventDecaying, 1), + 0 + ], + [set(this.preventDecaying, 0), limitedVal] + ) + ]) + } + + snapTo = (index: number) => { + if (!this.props.enabledImperativeSnapping) { + return + } + + this.isManuallySetValue.setValue(1) + this.manuallySetValue.setValue( + // @ts-ignore + this.state.snapPoints[this.state.propsToNewIndices[index]] + ) + } + + private height: Animated.Value = new Value(0) + + private handleLayoutHeader = ({ + nativeEvent: { + layout: { width: heightOfHeader } + } + }: LayoutChangeEvent) => { + this.state.heightOfHeaderAnimated.setValue(heightOfHeader) + this.setState({ heightOfHeader }) + } + + private handleFullHeader = ({ + nativeEvent: { + layout: { width } + } + }: LayoutChangeEvent) => + requestAnimationFrame(() => this.height.setValue(width)) + + private handleLayoutContent = ({ + nativeEvent: { + layout: { width } + } + }: LayoutChangeEvent) => + this.state.heightOfContent.setValue(width - this.state.initSnap) + + static renumber = (str: string) => + (Number(str.split('%')[0]) * screenHeight) / 100 + + static getDerivedStateFromProps( + props: Props, + state: State | undefined + ): State { + let snapPoints + const sortedPropsSnapPoints: Array<{ + val: number + ind: number + }> = props.snapPoints + .map( + ( + s: number | string, + i: number + ): { + val: number + ind: number + } => { + if (typeof s === 'number') { + return { val: s, ind: i } + } else if (typeof s === 'string') { + return { val: BottomSheetBehavior.renumber(s), ind: i } + } + + throw new Error(`Invalid type for value ${s}: ${typeof s}`) + } + ) + .sort(({ val: a }, { val: b }) => b - a) + if (state && state.snapPoints) { + state.snapPoints.forEach( + (s, i) => + // @ts-ignore + s.__initialized && + s.setValue( + sortedPropsSnapPoints[0].val - sortedPropsSnapPoints[i].val + ) + ) + snapPoints = state.snapPoints + } else { + snapPoints = sortedPropsSnapPoints.map( + p => new Value(sortedPropsSnapPoints[0].val - p.val) + ) + } + + const propsToNewIndices: { [key: string]: number } = {} + sortedPropsSnapPoints.forEach(({ ind }, i) => (propsToNewIndices[ind] = i)) + + const { initialSnap } = props + + let init = + sortedPropsSnapPoints[0].val - + sortedPropsSnapPoints[propsToNewIndices[initialSnap]].val + + if (props.enabledBottomInitialAnimation) { + init = + sortedPropsSnapPoints[ + sortedPropsSnapPoints.length - 1 - propsToNewIndices[initialSnap] + ].val + } + + return { + init, + propsToNewIndices, + heightOfHeaderAnimated: + (state && state.heightOfHeaderAnimated) || new Value(0), + heightOfContent: (state && state.heightOfContent) || new Value(0), + initSnap: sortedPropsSnapPoints[0].val, + snapPoints, + heightOfHeader: (state && state.heightOfHeader) || 0 + } + } + + render() { + const { borderRadius } = this.props + console.log('render') + return ( + <> + + + + + + + + + + + + {this.props.renderContent && this.props.renderContent()} + + + + + + {this.props.callbackNode && ( + + )} + {(this.props.onOpenStart || this.props.onCloseEnd) && ( + { + if (this.props.onOpenStart) this.props.onOpenStart() + }), + set(this.onOpenStartValue, 1), + cond( + defined(this.onCloseEndValue), + set(this.onCloseEndValue, 0) + ) + ] + ) + ])} + /> + )} + {(this.props.onOpenEnd || this.props.onCloseStart) && ( + { + if (this.props.onOpenEnd) this.props.onOpenEnd() + }), + set(this.onOpenEndValue, 1), + cond( + defined(this.onCloseStartValue), + set(this.onCloseStartValue, 0) + ) + ] + ) + ])} + /> + )} + {(this.props.onCloseStart || this.props.onOpenEnd) && ( + { + if (this.props.onCloseStart) this.props.onCloseStart() + }), + set(this.onCloseStartValue, 1), + cond( + defined(this.onCloseStartValue), + set(this.onOpenEndValue, 0) + ) + ] + ) + ])} + /> + )} + {(this.props.onCloseEnd || this.props.onOpenStart) && ( + { + if (this.props.onCloseEnd) this.props.onCloseEnd() + }), + set(this.onCloseEndValue, 1), + cond( + defined(this.onOpenStartValue), + set(this.onOpenStartValue, 0) + ), + cond( + defined(this.onOpenEndValue), + set(this.onOpenEndValue, 0) + ) + ] + ) + ])} + /> + )} + {this.props.contentPosition && ( + + )} + {this.props.headerPosition && ( + + )} + + + + ) + } +} diff --git a/app/modules/SideSheetManager/SideSheetProvider.js b/app/modules/SideSheetManager/SideSheetProvider.js new file mode 100644 index 0000000..52be8e5 --- /dev/null +++ b/app/modules/SideSheetManager/SideSheetProvider.js @@ -0,0 +1,137 @@ +import React from 'react' +import { StyleSheet, View, TouchableWithoutFeedback } from 'react-native' +import ReAnimated from 'react-native-reanimated' + +import useBackButton from 'modules/hooks/useBackButton' + +import Container from 'components/Container' + +import SideSheet from './SideSheet' + +export const styles = StyleSheet.create({ + + overlayContainer: { + position: 'absolute', + top: 0, + right: 0, + bottom: 0, + left: 0, + }, + + overlay: { + backgroundColor: 'black', + }, + +}) + +export const SideSheetContext = React.createContext(null) + +export const useSideSheet = () => React.useContext(SideSheetContext) + +export const SideSheetProvider = ({ children }) => { + const sheetRef = React.useRef(null) + const [fall] = React.useState(new ReAnimated.Value(1)) + const [visible, toggleVisible] = React.useState(false) + + const [bottomSheetConfig, setBottomSheetConfig] = React.useState({ + renderContent: () => null, + borderRadius: 0, + snapPoints: [200, 0], + biggestSnapPoint: 200, + contentHeight: 200, + onClose: null, + }) + + const handleSideSheetOpen = React.useCallback(() => { + toggleVisible(true) + }, []) + + const handleSideSheetClose = React.useCallback(() => { + toggleVisible(false) + + if (bottomSheetConfig.onClose) { + bottomSheetConfig.onClose() + } + }, [bottomSheetConfig.onClose]) + + useBackButton(() => { + if (visible && sheetRef.current) { + closeBottomSheet() + + return true + } + + return false + }) + + const updateBottomSheet = (config, force = false) => { + if (visible || force) { + setBottomSheetConfig({ + ...bottomSheetConfig, + ...config, + }) + } + } + + const openBottomSheet = (config) => { + updateBottomSheet(config, true) + + // if we are already visible it can be content changes + if (!visible) { + sheetRef.current.snapTo(0) + } + } + + const closeBottomSheet = () => { + sheetRef.current.snapTo(bottomSheetConfig.snapPoints.length - 1) + } + + return ( + + + {children} + + + + + + + + + ( + + {bottomSheetConfig.renderContent()} + + )} + /> + + ) +} + +export default SideSheetProvider diff --git a/app/modules/SideSheetManager/index.js b/app/modules/SideSheetManager/index.js new file mode 100644 index 0000000..e1a39b1 --- /dev/null +++ b/app/modules/SideSheetManager/index.js @@ -0,0 +1,2 @@ +export { default } from './SideSheetProvider' +export { useSideSheet } from './SideSheetProvider' From 02f3b5aa99099ac31776d386329e5ee3acdd2653 Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Thu, 17 Dec 2020 20:33:56 +0100 Subject: [PATCH 04/12] refactor: Improvements for subtiles --- .eslintrc | 73 +++---- android/app/build.gradle | 13 +- .../main/java/com/popcorn/MainActivity.java | 76 +++---- .../popcorn/VlcPlayer/VlcPlayerModule.java | 173 ++++++++-------- .../com/popcorn/VlcPlayer/VlcPlayerView.java | 62 +++--- android/app/src/main/res/values/colors.xml | 1 + android/build.gradle | 6 +- app/components/Icon/Icon.js | 3 +- app/components/IconButton/IconButton.js | 13 +- app/components/VlcPlayer/VlcPLayer.js | 8 +- app/{index.js => index.ts} | 0 app/mobile/{root.js => root.tsx} | 2 +- .../PlayPauseIcon/PlayPauseIcon.js | 21 +- .../VideoAndControls/SeekBar/SeekBar.js | 2 + .../SelectSubtitle/SelectSubtitle.js | 13 +- .../VideoAndControls/VideoAndControls.js | 117 ++--------- .../BottomSheetManager/BottomSheetProvider.js | 1 - app/modules/PlayerManager/PlayerManager.js | 6 + package.json | 11 +- tsconfig.json | 23 +++ yarn.lock | 190 ++++++++++-------- 21 files changed, 414 insertions(+), 400 deletions(-) rename app/{index.js => index.ts} (100%) rename app/mobile/{root.js => root.tsx} (97%) create mode 100644 tsconfig.json diff --git a/.eslintrc b/.eslintrc index ee7a288..b65339e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,16 +1,21 @@ { - "parser": "babel-eslint", + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "project": "./tsconfig.*?.json" + }, "extends": [ - "standard", - "standard-react", - "airbnb", - "plugin:jest/recommended" + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:jest/recommended", + "eslint:recommended" ], "plugins": [ + "@typescript-eslint", "babel", "react", "promise", - "jsx-a11y", "jest" ], "root": true, @@ -108,38 +113,26 @@ }], "react/sort-prop-types": [0], "react/style-prop-object": [2], - - // React JSX Rules - "react/jsx-boolean-value": [0], - "react/jsx-closing-bracket-location": [0], - "react/jsx-curly-brace-presence": [2, { "props": "always", "children": "never" }], - "react/jsx-curly-spacing": [2], - "react/jsx-equals-spacing": [2], - "react/jsx-filename-extension": [2, { "extensions": [".js"] }], - "react/jsx-first-prop-new-line": [2, "multiline-multiprop"], - "react/jsx-handler-names": [2], - "react/jsx-indent": [2, 2], - "react/jsx-indent-props": [0, 2], - "react/jsx-key": [2], - "react/jsx-no-bind": [1], - "react/jsx-no-comment-textnodes": [2], - "react/jsx-no-duplicate-props": [2], - "react/jsx-no-literals": [0], - "react/jsx-no-target-blank": [2], - "react/jsx-no-undef": [2], - "react/jsx-pascal-case": [2], - "react/jsx-space-before-closing": [2], - "react/jsx-uses-react": [2], - "react/jsx-uses-vars": [2], - "react/jsx-wrap-multilines": [2], - - // a11y Rules - "jsx-a11y/img-has-alt": [0], - "jsx-a11y/img-redundant-alt": [2], - "jsx-a11y/aria-role": [2], - "jsx-a11y/no-access-key": [2], - "jsx-a11y/href-no-hash": "off", - "react/jsx-one-expression-per-line": 0 - - } + }, + "overrides": [ + { + "files": [ + "**/*.spec.js", + "**/*.spec.jsx", + "**/*.spec.ts", + "**/*.spec.tsx" + ], + "env": { + "jest": true + } + }, + { + "files": [ + "*.tsx" + ], + "rules": { + "@typescript-eslint/no-unused-vars": "off" + } + } + ] } diff --git a/android/app/build.gradle b/android/app/build.gradle index bd2e9b5..ab8e863 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -9,6 +9,8 @@ project.ext.react = [ enableHermes: true ] +def enableHermes = project.ext.react.get("enableHermes", false) + apply from: "../../node_modules/react-native/react.gradle" apply from: "$rootDir/buildsystem/helpers.gradle" @@ -131,15 +133,16 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01' implementation 'com.facebook.react:react-native:+' - implementation 'org.videolan.android:libvlc-all:3.1.12' + implementation 'org.videolan.android:libvlc-all:3.2.6' implementation 'androidx.tvprovider:tvprovider:1.0.0' - if (useIntlJsc) { - implementation 'org.webkit:android-jsc-intl:+' - + if (enableHermes) { + def hermesPath = "../../node_modules/hermes-engine/android/" + debugImplementation files(hermesPath + "hermes-debug.aar") + releaseImplementation files(hermesPath + "hermes-release.aar") } else { - implementation 'org.webkit:android-jsc:+' + implementation jscFlavor } } diff --git a/android/app/src/main/java/com/popcorn/MainActivity.java b/android/app/src/main/java/com/popcorn/MainActivity.java index 1a23a1d..d757721 100644 --- a/android/app/src/main/java/com/popcorn/MainActivity.java +++ b/android/app/src/main/java/com/popcorn/MainActivity.java @@ -15,38 +15,46 @@ public class MainActivity extends GoogleCastActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - SplashScreen.show(this, R.style.SplashTheme); - super.onCreate(savedInstanceState); - } - - /** - * Returns the name of the main component registered from JavaScript. - * This is used to schedule rendering of the component. - */ - @Override - protected String getMainComponentName() { - return "popcorn"; - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - Intent intent = new Intent("onConfigurationChanged"); - intent.putExtra("newConfig", newConfig); - - this.sendBroadcast(intent); - } - - @Override - protected ReactActivityDelegate createReactActivityDelegate() { - return new ReactActivityDelegate(this, getMainComponentName()) { - @Override - protected ReactRootView createRootView() { - return new RNGestureHandlerEnabledRootView(MainActivity.this); - } - }; - } + @Override + protected void onCreate(Bundle savedInstanceState) { + SplashScreen.show(this, R.style.SplashTheme); + + super.onCreate(savedInstanceState); + } + + @Override + protected void onPause() { + SplashScreen.hide(this); + + super.onPause(); + } + + /** + * Returns the name of the main component registered from JavaScript. + * This is used to schedule rendering of the component. + */ + @Override + protected String getMainComponentName() { + return "popcorn"; + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + Intent intent = new Intent("onConfigurationChanged"); + intent.putExtra("newConfig", newConfig); + + this.sendBroadcast(intent); + } + + @Override + protected ReactActivityDelegate createReactActivityDelegate() { + return new ReactActivityDelegate(this, getMainComponentName()) { + @Override + protected ReactRootView createRootView() { + return new RNGestureHandlerEnabledRootView(MainActivity.this); + } + }; + } } diff --git a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerModule.java b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerModule.java index 1ca24fa..415c0e2 100644 --- a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerModule.java +++ b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerModule.java @@ -2,6 +2,7 @@ import android.net.Uri; import android.text.TextUtils; +import android.util.Log; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.common.MapBuilder; @@ -15,94 +16,94 @@ public class VlcPlayerModule extends ViewGroupManager { - public static final String PROP_SOURCE = "source"; - public static final String PROP_SEEK = "seek"; - public static final String PROP_PAUSED = "paused"; - public static final String PROP_VOLUME = "volume"; - public static final String PROP_RESIZE_MODE = "resizeMode"; - public static final String PROP_FULLSCREEN = "fullscreen"; - public static final String PROP_SUBTITLE = "subtitleUri"; - - @Override - public String getName() { - return "VlcPlayer"; - } - - @Override - protected VlcPlayerView createViewInstance(ThemedReactContext reactContext) { - return new VlcPlayerView(reactContext); - } - - @Override - public @Nullable - Map getExportedViewConstants() { - return MapBuilder.of( - "ScaleNone", Integer.toString(ResizeMode.RESIZE_MODE_FIT), - "ScaleAspectFit", Integer.toString(ResizeMode.RESIZE_MODE_FIT), - "ScaleToFill", Integer.toString(ResizeMode.RESIZE_MODE_FILL), - "ScaleAspectFill", Integer.toString(ResizeMode.RESIZE_MODE_CENTER_CROP) - ); - } - - @Override - public void onDropViewInstance(VlcPlayerView view) { - super.onDropViewInstance(view); - view.onDropViewInstance(); - } - - @Nullable - @Override - public Map getExportedCustomDirectEventTypeConstants() { - MapBuilder.Builder builder = MapBuilder.builder(); - - for (VlcEventEmitter.Events event : VlcEventEmitter.Events.values()) { - builder.put(event.toString(), MapBuilder.of("registrationName", event.toString())); + public static final String PROP_SOURCE = "source"; + public static final String PROP_SEEK = "seek"; + public static final String PROP_PAUSED = "paused"; + public static final String PROP_VOLUME = "volume"; + public static final String PROP_RESIZE_MODE = "resizeMode"; + public static final String PROP_FULLSCREEN = "fullscreen"; + public static final String PROP_SUBTITLE = "subtitleUri"; + + @Override + public String getName() { + return "VlcPlayer"; } - return builder.build(); - } - - @ReactProp(name = PROP_SOURCE) - public void setPath(final VlcPlayerView playerView, ReadableMap map) { - String path = map.getString("uri"); - boolean autoPlay = map.getBoolean("autoplay"); - - playerView.setAutoPlay(autoPlay); - playerView.setFilePath(path); - } - - @ReactProp(name = PROP_SEEK) - public void setSeek(final VlcPlayerView playerView, float seek) { - playerView.seek((long) seek); - } - - @ReactProp(name = PROP_PAUSED) - public void setPaused(final VlcPlayerView playerView, boolean paused) { - playerView.setPaused(paused); - } - - @ReactProp(name = PROP_RESIZE_MODE) - public void setResizeMode(final VlcPlayerView videoView, final String resizeModeOrdinalString) { - videoView.setResizeMode(convertToIntDef(resizeModeOrdinalString)); - } - - @ReactProp(name = PROP_FULLSCREEN, defaultBoolean = false) - public void setFullscreen(final VlcPlayerView videoView, final boolean fullscreen) { - videoView.setFullscreen(fullscreen); - } - - @ReactProp(name = PROP_SUBTITLE) - public void setSubtitle(final VlcPlayerView videoView, final String uri) { - videoView.setSubtitle(Uri.parse(uri)); - } - - private @ResizeMode.Mode - int convertToIntDef(String resizeModeOrdinalString) { - if (!TextUtils.isEmpty(resizeModeOrdinalString)) { - int resizeModeOrdinal = Integer.parseInt(resizeModeOrdinalString); - return ResizeMode.toResizeMode(resizeModeOrdinal); + @Override + protected VlcPlayerView createViewInstance(ThemedReactContext reactContext) { + return new VlcPlayerView(reactContext); } - return ResizeMode.RESIZE_MODE_FIT; - } + @Override + public @Nullable + Map getExportedViewConstants() { + return MapBuilder.of( + "ScaleNone", Integer.toString(ResizeMode.RESIZE_MODE_FIT), + "ScaleAspectFit", Integer.toString(ResizeMode.RESIZE_MODE_FIT), + "ScaleToFill", Integer.toString(ResizeMode.RESIZE_MODE_FILL), + "ScaleAspectFill", Integer.toString(ResizeMode.RESIZE_MODE_CENTER_CROP) + ); + } + + @Override + public void onDropViewInstance(VlcPlayerView view) { + super.onDropViewInstance(view); + view.onDropViewInstance(); + } + + @Nullable + @Override + public Map getExportedCustomDirectEventTypeConstants() { + MapBuilder.Builder builder = MapBuilder.builder(); + + for (VlcEventEmitter.Events event : VlcEventEmitter.Events.values()) { + builder.put(event.toString(), MapBuilder.of("registrationName", event.toString())); + } + + return builder.build(); + } + + @ReactProp(name = PROP_SOURCE) + public void setPath(final VlcPlayerView playerView, ReadableMap map) { + String path = map.getString("uri"); + boolean autoPlay = map.getBoolean("autoplay"); + + playerView.setAutoPlay(autoPlay); + playerView.setFilePath(path); + } + + @ReactProp(name = PROP_SEEK) + public void setSeek(final VlcPlayerView playerView, float seek) { + playerView.seek((long) seek); + } + + @ReactProp(name = PROP_PAUSED) + public void setPaused(final VlcPlayerView playerView, boolean paused) { + playerView.setPaused(paused); + } + + @ReactProp(name = PROP_RESIZE_MODE) + public void setResizeMode(final VlcPlayerView videoView, final String resizeModeOrdinalString) { + videoView.setResizeMode(convertToIntDef(resizeModeOrdinalString)); + } + + @ReactProp(name = PROP_FULLSCREEN, defaultBoolean = false) + public void setFullscreen(final VlcPlayerView videoView, final boolean fullscreen) { + videoView.setFullscreen(fullscreen); + } + + @ReactProp(name = PROP_SUBTITLE) + public void setSubtitle(final VlcPlayerView videoView, final String uri) { + videoView.setSubtitle(uri); + } + + private @ResizeMode.Mode + int convertToIntDef(String resizeModeOrdinalString) { + if (!TextUtils.isEmpty(resizeModeOrdinalString)) { + int resizeModeOrdinal = Integer.parseInt(resizeModeOrdinalString); + return ResizeMode.toResizeMode(resizeModeOrdinal); + } + + return ResizeMode.RESIZE_MODE_FIT; + } } diff --git a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java index c2f7193..bdba4df 100644 --- a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java +++ b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java @@ -1,10 +1,9 @@ package com.popcorn.VlcPlayer; import android.app.Activity; -import android.content.SharedPreferences; +import android.graphics.PixelFormat; import android.net.Uri; import android.os.Handler; -import android.preference.PreferenceManager; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; @@ -14,8 +13,6 @@ import android.view.Window; import android.widget.FrameLayout; -import androidx.core.content.ContextCompat; - import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.uimanager.ThemedReactContext; @@ -28,7 +25,6 @@ import java.util.ArrayList; public class VlcPlayerView extends FrameLayout implements - IVLCVout.Callback, IVLCVout.OnNewVideoLayoutListener, LifecycleEventListener { @@ -39,6 +35,7 @@ public class VlcPlayerView extends FrameLayout implements private final AspectRatioFrameLayout layout; private ViewGroup.LayoutParams layoutParams; private SurfaceView surfaceView; + private SurfaceView subtitleView; private ThemedReactContext context; private boolean isFullscreen; @@ -71,8 +68,6 @@ public VlcPlayerView(ThemedReactContext context, AttributeSet attrs, int defStyl layout = new AspectRatioFrameLayout(context); layout.setLayoutParams(aspectRatioParams); - layout.setBackgroundColor(ContextCompat.getColor(context, android.R.color.black)); - layoutParams = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT @@ -93,16 +88,23 @@ public void setId(int id) { } private void updateSurfaceView() { - SurfaceView view = new SurfaceView(context); - view.setLayoutParams(layoutParams); + surfaceView = new SurfaceView(context); + surfaceView.setLayoutParams(layoutParams); - surfaceView = view; + subtitleView = new SurfaceView(context); + subtitleView.setLayoutParams(layoutParams); + subtitleView.setZOrderMediaOverlay(true); + subtitleView.getHolder().setFormat(PixelFormat.TRANSLUCENT); if (layout.getChildAt(0) != null) { layout.removeViewAt(0); } layout.addView(surfaceView, 0, layoutParams); + layout.addView(subtitleView, 1, new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + )); if (this.mMediaPlayer != null) { setVideoView(); @@ -114,17 +116,26 @@ private void setVideoView() { if (!vout.areViewsAttached()) { vout.setVideoView(surfaceView); - } + vout.setSubtitlesView(subtitleView); - vout.addCallback(this); - vout.attachViews(this); + vout.attachViews(this); + } } private void initializePlayerIfNeeded() { if (mMediaPlayer == null) { - ArrayList options = new ArrayList<>(50); options.add("--vout=android_display,none"); + options.add("--subsdec-encoding"); + options.add("UTF-8"); + options.add("--android-display-chroma"); + options.add("RV16"); + options.add("--audio-resampler"); + options.add("soxr"); + + options.add("--freetype-rel-fontsize=16"); + options.add("--freetype-color=16777215"); + options.add("--freetype-background-opacity=0"); libvlc = new LibVLC(getContext(), options); @@ -147,7 +158,7 @@ private void setMedia(String filePath) { media.setHWDecoderEnabled(true, true); mMediaPlayer.setMedia(media); - // mMediaPlayer.setRenderer() + if (autoPlay) { mMediaPlayer.play(); } @@ -164,7 +175,6 @@ private void releasePlayer() { mMediaPlayer.stop(); final IVLCVout vout = mMediaPlayer.getVLCVout(); - vout.removeCallback(this); vout.detachViews(); libvlc.release(); libvlc = null; @@ -243,16 +253,6 @@ public void onNewVideoLayout(IVLCVout vout, int width, int height, int visibleWi } } - @Override - public void onSurfacesCreated(IVLCVout vout) { - - } - - @Override - public void onSurfacesDestroyed(IVLCVout vout) { - - } - @Override public void onHostResume() { new Handler().post(new Runnable() { @@ -298,9 +298,15 @@ public void run() { } }; - public void setSubtitle(Uri uri) { + public void setSubtitle(String uri) { if (mMediaPlayer != null) { - mMediaPlayer.addSlave(Media.Slave.Type.Subtitle, uri, true); + if (uri != null) { + mMediaPlayer.addSlave(Media.Slave.Type.Subtitle, Uri.parse(uri), true); + + } else { + // Uri is null so remove the subtitle + mMediaPlayer.setSpuTrack(-1); + } } } diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index 9a322b2..2a4e1fb 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -3,4 +3,5 @@ #202125 #FAFAFA + #00000000 \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index a019887..8be4cfc 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,8 +2,8 @@ buildscript { ext { - buildToolsVersion = "28.0.3" - minSdkVersion = 21 + buildToolsVersion = "29.0.2" + minSdkVersion = 24 compileSdkVersion = 28 targetSdkVersion = 27 supportLibVersion = "28.0.0" @@ -17,7 +17,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.0.2' - classpath 'com.google.gms:google-services:4.3.2' + classpath 'com.google.gms:google-services:4.3.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/app/components/Icon/Icon.js b/app/components/Icon/Icon.js index 240c9cc..2fec0fe 100644 --- a/app/components/Icon/Icon.js +++ b/app/components/Icon/Icon.js @@ -72,8 +72,7 @@ Icon.defaultProps = { emphasis: 'high', color: 'white', size: dimensions.ICON_SIZE_DEFAULT, - style: null + style: null, } - export default Icon diff --git a/app/components/IconButton/IconButton.js b/app/components/IconButton/IconButton.js index 00a5486..2a1ee3a 100644 --- a/app/components/IconButton/IconButton.js +++ b/app/components/IconButton/IconButton.js @@ -32,6 +32,7 @@ export const IconButton = ({ buttonProps, textProps, children, + disabled, ...rest }) => ( @@ -51,7 +58,11 @@ export const IconButton = ({ {children} diff --git a/app/components/VlcPlayer/VlcPLayer.js b/app/components/VlcPlayer/VlcPLayer.js index ca427b7..3979a03 100644 --- a/app/components/VlcPlayer/VlcPLayer.js +++ b/app/components/VlcPlayer/VlcPLayer.js @@ -51,14 +51,16 @@ export default class VlcPLayer extends React.Component { } handleOnPlaying = (event) => { + const { onPlaying } = this.props + StatusBar.setHidden(true) - if (this.props.onPlaying) { - this.props.onPlaying(event.nativeEvent) + if (onPlaying) { + onPlaying(event.nativeEvent) } } - getViewManagerConfig = viewManagerName => { + getViewManagerConfig = (viewManagerName) => { if (!NativeModules.UIManager.getViewManagerConfig) { return NativeModules.UIManager[viewManagerName] } diff --git a/app/index.js b/app/index.ts similarity index 100% rename from app/index.js rename to app/index.ts diff --git a/app/mobile/root.js b/app/mobile/root.tsx similarity index 97% rename from app/mobile/root.js rename to app/mobile/root.tsx index 65690e7..3e6c121 100644 --- a/app/mobile/root.js +++ b/app/mobile/root.tsx @@ -19,7 +19,7 @@ export default () => ( - {(host) => ( + {(host: string) => ( diff --git a/app/mobile/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js b/app/mobile/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js index 610777a..e5b407b 100644 --- a/app/mobile/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js +++ b/app/mobile/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js @@ -1,13 +1,14 @@ +import colors from 'modules/colors' import React from 'react' import PropTypes from 'prop-types' -import { View } from 'react-native' +import { ActivityIndicator, View } from 'react-native' import dimensions from 'modules/dimensions' import IconButton from 'components/IconButton' const ICON_SIZE = 76 -export const PlayPauseIcon = ({ paused, handlePauseVideo, handlePlayVideo }) => ( +export const PlayPauseIcon = ({ paused, handlePauseVideo, handlePlayVideo, loading }) => ( }} pointerEvents={'box-none'}> - {!paused && ( + {!paused && !loading && ( + size={dimensions.ICON_PLAY_BIG} /> )} - {paused && ( + {paused && !loading && ( + size={dimensions.ICON_PLAY_BIG} /> + )} + + {loading && ( + )} ) PlayPauseIcon.propTypes = { paused: PropTypes.bool, + loading: PropTypes.bool, handlePauseVideo: PropTypes.func.isRequired, handlePlayVideo: PropTypes.func.isRequired, } PlayPauseIcon.defaultProps = { paused: false, + loading: false, } export default PlayPauseIcon diff --git a/app/mobile/screens/Player/VideoAndControls/SeekBar/SeekBar.js b/app/mobile/screens/Player/VideoAndControls/SeekBar/SeekBar.js index 2ac4314..d0e7f1b 100644 --- a/app/mobile/screens/Player/VideoAndControls/SeekBar/SeekBar.js +++ b/app/mobile/screens/Player/VideoAndControls/SeekBar/SeekBar.js @@ -45,6 +45,7 @@ const SeekBar = ({ duration, currentTime, onSeek, + disabled }) => { const [isSeekingPreviousValue, setSeeking] = useState(null) @@ -109,6 +110,7 @@ const SeekBar = ({ maximumTrackTintColor={colors.BACKGROUND_SNACKBAR} thumbStyle={styles.thumb} trackStyle={styles.track} + disabled={disabled} /> diff --git a/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js b/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js index a8e38cc..9bc51fd 100644 --- a/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js +++ b/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js @@ -9,7 +9,7 @@ import IconButton from 'components/IconButton' import TextButton from 'components/TextButton' import { useSideSheet } from 'modules/SideSheetManager' -export const SelectSubtitle = ({ pauseVideo, playVideo, selectSubtitle, subtitles }) => { +export const SelectSubtitle = ({ pauseVideo, playVideo, selectSubtitle, subtitles, disabled }) => { // TODO:: Create an "useSideSheet" that does the same but comes from the side // this can then also be used on tv const [openBottomSheet, updateBottomSheet, closeBottomSheet] = useSideSheet() @@ -26,6 +26,12 @@ export const SelectSubtitle = ({ pauseVideo, playVideo, selectSubtitle, subtitle const renderBottomSheetContent = React.useCallback(() => ( + selectSubtitle(null)} + > + NONE + + {subtitles.map((subtitle) => ( + size={dimensions.ICON_SIZE_DEFAULT} + disabled={disabled}> {i18n.t('Subtitles')} @@ -73,10 +80,12 @@ SelectSubtitle.propTypes = { paused: PropTypes.bool, pauseVideo: PropTypes.func.isRequired, playVideo: PropTypes.func.isRequired, + disabled: PropTypes.bool, } SelectSubtitle.defaultProps = { paused: false, + disabled: false, } export default React.memo(SelectSubtitle) diff --git a/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js b/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js index 0e25fa9..ddf1220 100644 --- a/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js +++ b/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js @@ -1,5 +1,5 @@ import React from 'react' -import { StyleSheet, View, ScrollView, TouchableWithoutFeedback } from 'react-native' +import { StyleSheet, View, TouchableWithoutFeedback } from 'react-native' import * as Animatable from 'react-native-animatable' import Orientation from 'react-native-orientation' @@ -60,8 +60,6 @@ const styles = StyleSheet.create({ export class VideoAndControls extends React.Component { - scrollViewRef - videoRef controlsTimer = null @@ -74,23 +72,17 @@ export class VideoAndControls extends React.Component { this.state = { showControls: true, isPortrait: Orientation.getInitialOrientation() === 'PORTRAIT', - - scrollViewHeight: 0, - scrollViewHeightWithPlaceholder: 0, - loading: true, paused: false, resizeMode: 'contain', // 'contain', 'cover', null, 'stretch' - currentTime: 0, + duration: 0, } } componentDidMount() { Orientation.addOrientationListener(this.handleOrientationChange) Orientation.lockToLandscape() - - this.toggleControls() } componentWillUnmount() { @@ -114,30 +106,6 @@ export class VideoAndControls extends React.Component { } } - positionScroller = (event = null) => { - const { scrollViewHeight, scrollViewHeightWithPlaceholder } = this.state - - if (event && (scrollViewHeight / 2) < event.nativeEvent.contentOffset.y) { - this.scrollViewRef.scrollTo({ y: scrollViewHeightWithPlaceholder, animated: true }) - - this.toggleControls(false) - - } else { - this.toggleControlsOff() - - this.scrollViewRef.scrollTo({ y: 0, animated: true }) - } - } - - onContentSizeChange = (contentWidth, contentHeight) => { - // Save the content height in state - this.setState({ - scrollViewHeight: contentHeight - styles.placeholderStyle.height, - - scrollViewHeightWithPlaceholder: contentHeight, - }) - } - onSliderPositionChange = (position) => { this.setState({ progress: position, @@ -147,32 +115,6 @@ export class VideoAndControls extends React.Component { }) } - getEpisodes = () => { - const { item } = this.props - - let episodes = [] - - if (item.type === 'episode') { - const season = item.show.seasons.find(season => season.number === item.season) - - if (season) { - episodes = season.episodes - } - } - - return episodes - } - - playEpisode = (episode, quality) => { - const { playOtherEpisode, item } = this.props - - console.log('playEpisode', episode, quality) - // playOtherEpisode('other', 'https://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_1080p_h264.mov', { - // ...item, - // ...episode, - // }) - } - handlePauseVideo = () => { const { paused } = this.state @@ -191,7 +133,6 @@ export class VideoAndControls extends React.Component { handlePlayVideo = () => { this.setState({ paused: false, - }, () => { this.toggleControlsOff() }) @@ -209,6 +150,8 @@ export class VideoAndControls extends React.Component { if (startPosition > 0 && wasLoading) { this.videoRef.seek((duration / 100) * startPosition) } + + this.toggleControls() }) } @@ -279,14 +222,14 @@ export class VideoAndControls extends React.Component { render() { const { url, children, forcePaused, subtitleUri, selectSubtitle, subtitles } = this.props const { isPortrait, resizeMode } = this.state - const { showControls, paused } = this.state + const { showControls, paused, loading } = this.state const { currentTime, duration, progress } = this.state // Wait until we are in landscape if (isPortrait) { return null } -console.log('active subtitleUri', subtitleUri) + return ( {url && ( @@ -307,7 +250,7 @@ console.log('active subtitleUri', subtitleUri) /> )} - {!isPortrait && duration && ( + {!isPortrait && ( - {/**/} - {children} - this.scrollViewRef = ref} - showsHorizontalScrollIndicator={false} - showsVerticalScrollIndicator={false} - contentContainerStyle={styles.contentContainerStyle} - onScroll={this.toggleControls} - scrollEnabled={showControls} - onScrollEndDrag={this.positionScroller} - onContentSizeChange={this.onContentSizeChange}> + - + - {/* this.toggleControls(false)}*/} - {/* scrollEventThrottle={10}*/} - {/* contentContainerStyle={{*/} - {/* flexGrow: 1,*/} - {/* backgroundColor: 'green',*/} - {/* }}*/} - {/* horizontal>*/} - - {/* {this.getEpisodes().map(episode => (*/} - {/* */} - {/* ))}*/} - - {/**/} - - + )} diff --git a/app/modules/BottomSheetManager/BottomSheetProvider.js b/app/modules/BottomSheetManager/BottomSheetProvider.js index d9b6155..c2b2458 100644 --- a/app/modules/BottomSheetManager/BottomSheetProvider.js +++ b/app/modules/BottomSheetManager/BottomSheetProvider.js @@ -129,7 +129,6 @@ export const BottomSheetProvider = ({ children }) => { elevation={1} style={{ height: bottomSheetConfig.biggestSnapPoint, - width: 300, }}> {bottomSheetConfig.renderContent()} diff --git a/app/modules/PlayerManager/PlayerManager.js b/app/modules/PlayerManager/PlayerManager.js index c67a220..9cdf058 100644 --- a/app/modules/PlayerManager/PlayerManager.js +++ b/app/modules/PlayerManager/PlayerManager.js @@ -83,6 +83,12 @@ export class PlayerManager extends React.Component { handleSelectSubtitle = (subtitle) => { const { ipFinder, item } = this.props + if (subtitle === null) { + return this.setState({ + subtitleUri: null, + }) + } + this.setState({ subtitleUri: `http://${ipFinder.host}/subtitle/${item._id}/${subtitle.code}`, }) diff --git a/package.json b/package.json index 393b7c1..dc095ee 100644 --- a/package.json +++ b/package.json @@ -80,9 +80,14 @@ "@babel/runtime": "7.12.5", "@commitlint/cli": "11.0.0", "@commitlint/config-conventional": "11.0.0", + "@types/jest": "^26.0.19", + "@types/node": "^14.14.14", + "@types/react": "^17.0.0", + "@typescript-eslint/eslint-plugin": "^4.10.0", + "@typescript-eslint/parser": "^4.10.0", "babel-eslint": "10.1.0", "babel-plugin-inline-import": "^3.0.0", - "babel-plugin-module-resolver": "4.0.0", + "babel-plugin-module-resolver": "4.1.0", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "1.15.5", "eslint": "7.15.0", @@ -92,7 +97,6 @@ "eslint-plugin-babel": "5.3.1", "eslint-plugin-import": "2.22.1", "eslint-plugin-jest": "24.1.3", - "eslint-plugin-jsx-a11y": "6.4.1", "eslint-plugin-node": "11.1.0", "eslint-plugin-promise": "4.2.1", "eslint-plugin-react": "7.21.5", @@ -105,6 +109,7 @@ "metro-react-native-babel-preset": "0.64.0", "mock-async-storage": "^2.2.0", "react-dom": "^17.0.1", - "react-test-renderer": "17.0.1" + "react-test-renderer": "17.0.1", + "typescript": "^4.1.3" } } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..626410d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "isolatedModules": true, + "jsx": "react", + "lib": [ + "es6" + ], + "moduleResolution": "node", + "noEmit": true, + "strict": true, + "target": "esnext", + "baseUrl": "app", + }, + "exclude": [ + "node_modules", + "babel.config.js", + "metro.config.js", + "jest.config.js" + ] +} diff --git a/yarn.lock b/yarn.lock index 1124a40..df381ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -974,14 +974,6 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime-corejs3@^7.10.2": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.5.tgz#a57fe6c13045ca33768a2aa527ead795146febe1" - integrity sha512-RMafpmrNB5E/bwdSphLr8a8++9TosnyJp98RZzI6VOx2R2CCMpsXXXRvmI700O9oEKpXdZat6oEK68/F0zjd4A== - dependencies: - core-js-pure "^3.0.0" - regenerator-runtime "^0.13.4" - "@babel/runtime@7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" @@ -989,7 +981,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.8.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== @@ -1889,6 +1881,14 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jest@^26.0.19": + version "26.0.19" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.19.tgz#e6fa1e3def5842ec85045bd5210e9bb8289de790" + integrity sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + "@types/json-schema@^7.0.3": version "7.0.5" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" @@ -1914,6 +1914,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.24.tgz#b0f86f58564fa02a28b68f8b55d4cdec42e3b9d6" integrity sha512-btt/oNOiDWcSuI721MdL8VQGnjsKjlTMdrKyTcLCKeQp/n4AAMFJ961wMbp+09y8WuGPClDEv07RIItdXKIXAA== +"@types/node@^14.14.14": + version "14.14.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz#f7fd5f3cc8521301119f63910f0fb965c7d761ae" + integrity sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -1949,6 +1954,14 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/react@^17.0.0": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.0.tgz#5af3eb7fad2807092f0046a1302b7823e27919b8" + integrity sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -1988,6 +2001,31 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== +"@typescript-eslint/eslint-plugin@^4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.10.0.tgz#19ed3baf4bc4232c5a7fcd32eaca75c3a5baf9f3" + integrity sha512-h6/V46o6aXpKRlarP1AiJEXuCJ7cMQdlpfMDrcllIgX3dFkLwEBTXAoNP98ZoOmqd1xvymMVRAI4e7yVvlzWEg== + dependencies: + "@typescript-eslint/experimental-utils" "4.10.0" + "@typescript-eslint/scope-manager" "4.10.0" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.10.0.tgz#dbf5d0f89802d5feaf7d11e5b32df29bbc2f3a0e" + integrity sha512-opX+7ai1sdWBOIoBgpVJrH5e89ra1KoLrJTz0UtWAa4IekkKmqDosk5r6xqRaNJfCXEfteW4HXQAwMdx+jjEmw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.10.0" + "@typescript-eslint/types" "4.10.0" + "@typescript-eslint/typescript-estree" "4.10.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + "@typescript-eslint/experimental-utils@^4.0.1": version "4.2.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.2.0.tgz#3d0b5cd4aa61f5eb7aa1e873dea0db1410b062d2" @@ -2000,6 +2038,24 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" +"@typescript-eslint/parser@^4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.10.0.tgz#1a622b0847b765b2d8f0ede6f0cdd85f03d76031" + integrity sha512-amBvUUGBMadzCW6c/qaZmfr3t9PyevcSWw7hY2FuevdZVp5QPw/K76VSQ5Sw3BxlgYCHZcK6DjIhSZK0PQNsQg== + dependencies: + "@typescript-eslint/scope-manager" "4.10.0" + "@typescript-eslint/types" "4.10.0" + "@typescript-eslint/typescript-estree" "4.10.0" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.10.0.tgz#dbd7e1fc63d7363e3aaff742a6f2b8afdbac9d27" + integrity sha512-WAPVw35P+fcnOa8DEic0tQUhoJJsgt+g6DEcz257G7vHFMwmag58EfowdVbiNcdfcV27EFR0tUBVXkDoIvfisQ== + dependencies: + "@typescript-eslint/types" "4.10.0" + "@typescript-eslint/visitor-keys" "4.10.0" + "@typescript-eslint/scope-manager@4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.2.0.tgz#d10e6854a65e175b22a28265d372a97c8cce4bfc" @@ -2008,11 +2064,30 @@ "@typescript-eslint/types" "4.2.0" "@typescript-eslint/visitor-keys" "4.2.0" +"@typescript-eslint/types@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.10.0.tgz#12f983750ebad867f0c806e705c1953cd6415789" + integrity sha512-+dt5w1+Lqyd7wIPMa4XhJxUuE8+YF+vxQ6zxHyhLGHJjHiunPf0wSV8LtQwkpmAsRi1lEOoOIR30FG5S2HS33g== + "@typescript-eslint/types@4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.2.0.tgz#6f6b094329e72040f173123832397c7c0b910fc8" integrity sha512-xkv5nIsxfI/Di9eVwN+G9reWl7Me9R5jpzmZUch58uQ7g0/hHVuGUbbn4NcxcM5y/R4wuJIIEPKPDb5l4Fdmwg== +"@typescript-eslint/typescript-estree@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.10.0.tgz#1e62e45fd57866afd42daf5e9fb6bd4e8dbcfa75" + integrity sha512-mGK0YRp9TOk6ZqZ98F++bW6X5kMTzCRROJkGXH62d2azhghmq+1LNLylkGe6uGUOQzD452NOAEth5VAF6PDo5g== + dependencies: + "@typescript-eslint/types" "4.10.0" + "@typescript-eslint/visitor-keys" "4.10.0" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + "@typescript-eslint/typescript-estree@4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.2.0.tgz#9d746240991c305bf225ad5e96cbf57e7fea0551" @@ -2027,6 +2102,14 @@ semver "^7.3.2" tsutils "^3.17.1" +"@typescript-eslint/visitor-keys@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.10.0.tgz#9478822329a9bc8ebcc80623d7f79a01da5ee451" + integrity sha512-hPyz5qmDMuZWFtHZkjcCpkAKHX8vdu1G3YsCLEd25ryZgnJfj6FQuJ5/O7R+dB1ueszilJmAFMtlU4CA6se3Jg== + dependencies: + "@typescript-eslint/types" "4.10.0" + eslint-visitor-keys "^2.0.0" + "@typescript-eslint/visitor-keys@4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.2.0.tgz#ae13838e3a260b63ae51021ecaf1d0cdea8dbba5" @@ -2300,14 +2383,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -aria-query@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" - integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== - dependencies: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" - arr-diff@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" @@ -2447,11 +2522,6 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= - astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -2494,16 +2564,6 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== -axe-core@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.0.2.tgz#c7cf7378378a51fcd272d3c09668002a4990b1cb" - integrity sha512-arU1h31OGFu+LPrOLGZ7nB45v940NMDMEJeNmbutu57P+UFDVnkZg3e+J1I2HJRZ9hT7gO8J91dn/PMrAiKakA== - -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== - babel-eslint@10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" @@ -2575,10 +2635,10 @@ babel-plugin-jest-hoist@^26.6.2: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-module-resolver@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.0.0.tgz#8f3a3d9d48287dc1d3b0d5595113adabd36a847f" - integrity sha512-3pdEq3PXALilSJ6dnC4wMWr0AZixHRM4utpdpBR9g5QG7B7JwWyukQv7a9hVxkbGFl+nQbrHDqqQOIBtTXTP/Q== +babel-plugin-module-resolver@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2" + integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA== dependencies: find-babel-config "^1.2.0" glob "^7.1.6" @@ -3179,11 +3239,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-pure@^3.0.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" - integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== - core-js@^2.2.2, core-js@^2.4.1: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" @@ -3293,10 +3348,10 @@ csstype@^2.2.0: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5" integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw== -damerau-levenshtein@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" - integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== +csstype@^3.0.2: + version "3.0.5" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.5.tgz#7fdec6a28a67ae18647c51668a9ff95bb2fa7bb8" + integrity sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ== dargs@^7.0.0: version "7.0.0" @@ -3602,11 +3657,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.0.0.tgz#48a2309cc8a1d2e9d23bc6a67c39b63032e76ea4" - integrity sha512-6p1NII1Vm62wni/VR/cUMauVQoxmLVb9csqQlvLz+hO2gk8U2UYDfXHQSUYIBKmZwAKz867IDqG7B+u0mj+M6w== - encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -3893,23 +3943,6 @@ eslint-plugin-jest@24.1.3: dependencies: "@typescript-eslint/experimental-utils" "^4.0.1" -eslint-plugin-jsx-a11y@6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz#a2d84caa49756942f42f1ffab9002436391718fd" - integrity sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg== - dependencies: - "@babel/runtime" "^7.11.2" - aria-query "^4.2.2" - array-includes "^3.1.1" - ast-types-flow "^0.0.7" - axe-core "^4.0.2" - axobject-query "^2.2.0" - damerau-levenshtein "^1.0.6" - emoji-regex "^9.0.0" - has "^1.0.3" - jsx-ast-utils "^3.1.0" - language-tags "^1.0.5" - eslint-plugin-node@11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" @@ -5382,7 +5415,7 @@ jest-config@^26.6.3: micromatch "^4.0.2" pretty-format "^26.6.2" -jest-diff@^26.6.2: +jest-diff@^26.0.0, jest-diff@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== @@ -6030,7 +6063,7 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.1.0: +"jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.1.0" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz#642f1d7b88aa6d7eb9d8f2210e166478444fa891" integrity sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA== @@ -6079,18 +6112,6 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -language-subtag-registry@~0.3.2: - version "0.3.20" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.20.tgz#a00a37121894f224f763268e431c55556b0c0755" - integrity sha512-KPMwROklF4tEx283Xw0pNKtfTj1gZ4UByp4EsIFWLgBavJltF4TiYPc39k06zSTsLzxTVXXDSpbwaQXaFB4Qeg== - -language-tags@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= - dependencies: - language-subtag-registry "~0.3.2" - left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" @@ -7629,7 +7650,7 @@ pretty-format@^25.1.0, pretty-format@^25.2.0: ansi-styles "^4.0.0" react-is "^16.12.0" -pretty-format@^26.6.2: +pretty-format@^26.0.0, pretty-format@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== @@ -9312,6 +9333,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" + integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== + ua-parser-js@^0.7.18: version "0.7.21" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" From 8a657bda919e23845bc362e43af2a3629c25b443 Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Fri, 18 Dec 2020 17:39:33 +0100 Subject: [PATCH 05/12] refactor: Improvements for mobile subtitles --- .eslintrc | 1 - .../{OptionsHeader.js => OptionsHeader.tsx} | 6 +- .../OptionsHeader/{index.js => index.ts} | 0 .../{OptionsItem.js => OptionsItem.tsx} | 23 +++++-- ...tionsItemInner.js => OptionsItemInner.tsx} | 43 ++++++++++-- .../OptionsItem/{index.js => index.ts} | 0 .../SelectSubtitle/SelectSubtitle.js | 67 +++++++++++++------ app/modules/i18n/translations/en.json | 1 + app/modules/i18n/translations/nl.json | 3 +- 9 files changed, 109 insertions(+), 35 deletions(-) rename app/mobile/components/OptionsHeader/{OptionsHeader.js => OptionsHeader.tsx} (81%) rename app/mobile/components/OptionsHeader/{index.js => index.ts} (100%) rename app/mobile/components/OptionsItem/{OptionsItem.js => OptionsItem.tsx} (71%) rename app/mobile/components/OptionsItem/{OptionsItemInner.js => OptionsItemInner.tsx} (87%) rename app/mobile/components/OptionsItem/{index.js => index.ts} (100%) diff --git a/.eslintrc b/.eslintrc index b65339e..7c4928e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -84,7 +84,6 @@ "react/no-unused-prop-types": [0], "react/prefer-es6-class": [2, "always"], "react/prefer-stateless-function": [2], - "react/prop-types": [2], "react/react-in-jsx-scope": [2], "react/require-optimization": [1], "react/require-render-return": [2], diff --git a/app/mobile/components/OptionsHeader/OptionsHeader.js b/app/mobile/components/OptionsHeader/OptionsHeader.tsx similarity index 81% rename from app/mobile/components/OptionsHeader/OptionsHeader.js rename to app/mobile/components/OptionsHeader/OptionsHeader.tsx index ba6e843..93363d3 100644 --- a/app/mobile/components/OptionsHeader/OptionsHeader.js +++ b/app/mobile/components/OptionsHeader/OptionsHeader.tsx @@ -14,7 +14,11 @@ export const styles = StyleSheet.create({ }) -export const SettingsHeader = ({ label }) => { +export interface Props { + label: string +} + +export const SettingsHeader: React.FC = ({ label }) => { return ( <> { +export interface Props extends OptionsItemInnerProps { + + style?: object + + disabled?: boolean + + onPress?: () => void + +} + +export const OptionsItem: React.FC = ({ + style, + disabled, + onPress, + ...rest +}) => { if (disabled || !onPress) { return ( diff --git a/app/mobile/components/OptionsItem/OptionsItemInner.js b/app/mobile/components/OptionsItem/OptionsItemInner.tsx similarity index 87% rename from app/mobile/components/OptionsItem/OptionsItemInner.js rename to app/mobile/components/OptionsItem/OptionsItemInner.tsx index 58de589..7c7b36e 100644 --- a/app/mobile/components/OptionsItem/OptionsItemInner.js +++ b/app/mobile/components/OptionsItem/OptionsItemInner.tsx @@ -13,20 +13,49 @@ import Icon from 'components/Icon' export const styles = StyleSheet.create({ icon: { - marginRight: dimensions.UNIT, + marginRight: dimensions.UNIT }, labelsContainer: { - flex: 1, + flex: 1 }, labels: { - flexDirection: 'row', - }, + flexDirection: 'row' + } }) -export const SettingsItem = ({ label, labelLine2, subLabel, subLabelLine2, icon, disabled, loading, downloading }) => { +export interface Props { + + label: string + + labelLine2?: string + + subLabel?: string + + subLabelLine2?: string + + icon?: string + + disabled?: boolean + + loading?: boolean + + downloading?: boolean + +} + +export const SettingsItem: React.FC = ({ + label, + labelLine2, + subLabel, + subLabelLine2, + icon, + disabled, + loading, + downloading +}) => { return ( <> {loading && ( @@ -76,7 +105,7 @@ export const SettingsItem = ({ label, labelLine2, subLabel, subLabelLine2, icon, { +import IconButton from 'components/IconButton' +import OptionsHeader from 'mobile/components/OptionsHeader' +import OptionsGroup from 'mobile/components/OptionsGroup' +import OptionsItem from 'mobile/components/OptionsItem' + +export const styles = StyleSheet.create({ + + statusBar: { + height: dimensions.STATUSBAR_HEIGHT, + width: 200, + }, + +}) + +export const SelectSubtitle = ({ + pauseVideo, + playVideo, + selectSubtitle, + subtitles, + disabled, +}) => { // TODO:: Create an "useSideSheet" that does the same but comes from the side // this can then also be used on tv const [openBottomSheet, updateBottomSheet, closeBottomSheet] = useSideSheet() + const handleSubtitleClick = React.useCallback((subtitle) => () => { + selectSubtitle(subtitle) + closeBottomSheet() + }, []) + const getBottomSheetConfig = () => { return { renderContent: renderBottomSheetContent, @@ -24,22 +46,22 @@ export const SelectSubtitle = ({ pauseVideo, playVideo, selectSubtitle, subtitle } const renderBottomSheetContent = React.useCallback(() => ( - - - selectSubtitle(null)} - > - NONE - - - {subtitles.map((subtitle) => ( - selectSubtitle(subtitle)} - > - {subtitle.language} - - ))} + + + + + + + + {subtitles.map((subtitle) => ( + + ))} + ), [subtitles]) @@ -80,12 +102,15 @@ SelectSubtitle.propTypes = { paused: PropTypes.bool, pauseVideo: PropTypes.func.isRequired, playVideo: PropTypes.func.isRequired, + selectSubtitle: PropTypes.func.isRequired, disabled: PropTypes.bool, + subtitles: PropTypes.array, } SelectSubtitle.defaultProps = { paused: false, disabled: false, + subtitles: [], } export default React.memo(SelectSubtitle) diff --git a/app/modules/i18n/translations/en.json b/app/modules/i18n/translations/en.json index 7fdc746..658fab7 100644 --- a/app/modules/i18n/translations/en.json +++ b/app/modules/i18n/translations/en.json @@ -87,4 +87,5 @@ "All": "All", "Trending": "Trending", "About": "About", + "No subtitles": "No subtitles" } diff --git a/app/modules/i18n/translations/nl.json b/app/modules/i18n/translations/nl.json index e06b9a6..3f4c501 100644 --- a/app/modules/i18n/translations/nl.json +++ b/app/modules/i18n/translations/nl.json @@ -84,5 +84,6 @@ "Added": "Toegevoegd", "All": "Alles", "Trending": "Trending", - "About": "Over" + "About": "Over", + "No subtitles": "Geen ondertiteling" } From b792b54f05b86b50ed686f2e7c53e1a888e628bb Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Tue, 22 Dec 2020 11:20:55 +0100 Subject: [PATCH 06/12] feat(tv): Added continue or restart in player --- .../ContinueOrRestart/ContinueOrRestart.tsx | 111 ++++++++++++++++++ app/components/ContinueOrRestart/index.ts | 1 + app/components/TextButton/TextButton.js | 26 ++-- app/modules/PlayerManager/PlayerManager.js | 2 +- app/modules/dimensions.js | 4 +- app/modules/i18n/translations/en.json | 5 +- app/modules/i18n/translations/nl.json | 5 +- .../Home/{HomeScreen.js => HomeScreen.tsx} | 6 +- app/tv/screens/Home/{index.js => index.ts} | 0 .../VideoAndControls/SeekBar/SeekBar.js | 7 ++ .../VideoAndControls/VideoAndControls.js | 38 ++++-- babel.config.js | 1 + 12 files changed, 175 insertions(+), 31 deletions(-) create mode 100644 app/components/ContinueOrRestart/ContinueOrRestart.tsx create mode 100644 app/components/ContinueOrRestart/index.ts rename app/tv/screens/Home/{HomeScreen.js => HomeScreen.tsx} (92%) rename app/tv/screens/Home/{index.js => index.ts} (100%) diff --git a/app/components/ContinueOrRestart/ContinueOrRestart.tsx b/app/components/ContinueOrRestart/ContinueOrRestart.tsx new file mode 100644 index 0000000..0c0a4ab --- /dev/null +++ b/app/components/ContinueOrRestart/ContinueOrRestart.tsx @@ -0,0 +1,111 @@ +import React from 'react' +import { StyleSheet, View, TouchableNativeFeedback, Text } from 'react-native' + +import dimensions from 'modules/dimensions' +import i18n from 'modules/i18n' + +import Overlay from '../Overlay' +import TextButton from '../TextButton' +import Typography from '../Typography' +import IconButton from '../IconButton' +import Remote from '../../tv/modules/Controls/Remote' + +export const styles = StyleSheet.create({ + + container: { + ...StyleSheet.absoluteFillObject, + width: dimensions.SCREEN_WIDTH, + height: dimensions.SCREEN_HEIGHT, + zIndex: 2500, + + display: 'flex', + justifyContent: 'center', + alignContent: 'center', + alignItems: 'center' + }, + + info: { + textAlign: 'center', + width: '40%' + }, + + actions: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'center', + zIndex: 2501, + marginTop: dimensions.UNIT + }, + + action: { + marginHorizontal: dimensions.UNIT, + zIndex: 2502 + } + +}) + +export interface Props { + + pauseVideo: () => void + + handleContinueVideo: () => void + + handleRestartVideo: () => void + +} + +export const ContinueOrRestart: React.FC = ({ + pauseVideo, + handleContinueVideo, + handleRestartVideo +}) => { + const [showedOverlay, setOverlayVisible] = React.useState(true) + + React.useEffect(() => { + pauseVideo() + }, []) + + const handleContinue = () => { + handleContinueVideo() + setOverlayVisible(false) + } + + const handleRestart = () => { + handleRestartVideo() + setOverlayVisible(false) + } + + if (!showedOverlay) { + return null + } + + return ( + + + + + {i18n.t('You already started watching this video, what do you want to do?')} + + + + + {i18n.t('Restart')} + + + + {i18n.t('Continue')} + + + + + ) +} + +export default ContinueOrRestart diff --git a/app/components/ContinueOrRestart/index.ts b/app/components/ContinueOrRestart/index.ts new file mode 100644 index 0000000..cea30e9 --- /dev/null +++ b/app/components/ContinueOrRestart/index.ts @@ -0,0 +1 @@ +export { default } from './ContinueOrRestart' diff --git a/app/components/TextButton/TextButton.js b/app/components/TextButton/TextButton.js index e410a1b..3154800 100644 --- a/app/components/TextButton/TextButton.js +++ b/app/components/TextButton/TextButton.js @@ -5,6 +5,7 @@ import { Text } from 'react-native' import dimensions from 'modules/dimensions' import Typography from 'components/Typography' +import * as Animatable from 'react-native-animatable' import BaseButton from '../BaseButton' @@ -25,7 +26,6 @@ export const TextButton = ({ onLongPress, onFocus, onBlur, - upperCase, component, hasTVPreferredFocus, nextFocusUp, @@ -34,6 +34,8 @@ export const TextButton = ({ nextFocusLeft, nextFocusRight, nativeID, + animatable, + animatableStyle, ...rest }) => ( - - {children} - - + + + {children} + + ) @@ -65,15 +70,16 @@ TextButton.propTypes = { onLongPress: PropTypes.func, children: PropTypes.oneOfType([ PropTypes.string, - PropTypes.array + PropTypes.array, ]).isRequired, } TextButton.defaultProps = { - upperCase: true, variant: 'button', color: 'white', emphasis: 'high', + animatable: {}, + animatableStyle: {} } export default TextButton diff --git a/app/modules/PlayerManager/PlayerManager.js b/app/modules/PlayerManager/PlayerManager.js index 9cdf058..60f5b43 100644 --- a/app/modules/PlayerManager/PlayerManager.js +++ b/app/modules/PlayerManager/PlayerManager.js @@ -99,7 +99,7 @@ export class PlayerManager extends React.Component { * * @returns {Promise} */ - startStream = async() => { + startStream = () => { const { apollo, item, torrent } = this.props return apollo.mutate({ diff --git a/app/modules/dimensions.js b/app/modules/dimensions.js index bd5cb35..970fe4d 100644 --- a/app/modules/dimensions.js +++ b/app/modules/dimensions.js @@ -1,4 +1,4 @@ -import { Dimensions, StatusBar } from 'react-native' +import { Dimensions, StatusBar, Platform } from 'react-native' import useCorrect from 'modules/useCorrect' @@ -7,7 +7,7 @@ const { width, height } = Dimensions.get('window') let screenWidth = width let screenHeight = height -if (width > height) { +if (width > height && !Platform.isTV) { screenWidth = (height) screenHeight = (width) } diff --git a/app/modules/i18n/translations/en.json b/app/modules/i18n/translations/en.json index 658fab7..6158c45 100644 --- a/app/modules/i18n/translations/en.json +++ b/app/modules/i18n/translations/en.json @@ -87,5 +87,8 @@ "All": "All", "Trending": "Trending", "About": "About", - "No subtitles": "No subtitles" + "No subtitles": "No subtitles", + "You already started watching this video, what do you want to do?": "You already started watching this video, what do you want to do?", + "Continue": "Continue", + "Restart": "Restart" } diff --git a/app/modules/i18n/translations/nl.json b/app/modules/i18n/translations/nl.json index 3f4c501..34352dd 100644 --- a/app/modules/i18n/translations/nl.json +++ b/app/modules/i18n/translations/nl.json @@ -85,5 +85,8 @@ "All": "Alles", "Trending": "Trending", "About": "Over", - "No subtitles": "Geen ondertiteling" + "No subtitles": "Geen ondertiteling", + "You already started watching this video, what do you want to do?": "Je was al begonnen aan deze video, wat wil je doen?", + "Continue": "Verdergaan", + "Restart": "Herstarten" } diff --git a/app/tv/screens/Home/HomeScreen.js b/app/tv/screens/Home/HomeScreen.tsx similarity index 92% rename from app/tv/screens/Home/HomeScreen.js rename to app/tv/screens/Home/HomeScreen.tsx index eb9250a..6ff6088 100644 --- a/app/tv/screens/Home/HomeScreen.js +++ b/app/tv/screens/Home/HomeScreen.tsx @@ -13,7 +13,7 @@ export const styles = StyleSheet.create({ flex: 1, position: 'relative', - width: '100%', + width: '100%' }, background: { @@ -21,11 +21,11 @@ export const styles = StyleSheet.create({ width: dimensions.SCREEN_WIDTH, height: dimensions.SCREEN_HEIGHT - }, + } }) -export const Home = () => { +export const Home: React.FC = () => { React.useEffect(() => { SplashScreen.hide() }, []) diff --git a/app/tv/screens/Home/index.js b/app/tv/screens/Home/index.ts similarity index 100% rename from app/tv/screens/Home/index.js rename to app/tv/screens/Home/index.ts diff --git a/app/tv/screens/Player/VideoAndControls/SeekBar/SeekBar.js b/app/tv/screens/Player/VideoAndControls/SeekBar/SeekBar.js index cdff102..32bc0d2 100644 --- a/app/tv/screens/Player/VideoAndControls/SeekBar/SeekBar.js +++ b/app/tv/screens/Player/VideoAndControls/SeekBar/SeekBar.js @@ -76,12 +76,18 @@ const SeekBar = ({ seconds -= minutes * 60 minutes = `0${minutes}`.substr(-2) + + } else { + minutes = `00` } if (seconds > 0) { seconds = parseInt(seconds, 10) seconds = `0${seconds}`.substr(-2) + + } else { + seconds = `00` } if (hours > 0 && minutes > 0) { @@ -112,6 +118,7 @@ const SeekBar = ({ maximumTrackTintColor={colors.BACKGROUND_SNACKBAR} thumbStyle={styles.thumb} trackStyle={styles.track} + disabled /> diff --git a/app/tv/screens/Player/VideoAndControls/VideoAndControls.js b/app/tv/screens/Player/VideoAndControls/VideoAndControls.js index fd4eb5c..0014808 100644 --- a/app/tv/screens/Player/VideoAndControls/VideoAndControls.js +++ b/app/tv/screens/Player/VideoAndControls/VideoAndControls.js @@ -7,6 +7,7 @@ import dimensions from 'modules/dimensions' import VlcPlayer from 'components/VlcPlayer' import Overlay from 'components/Overlay' +import ContinueOrRestart from 'components/ContinueOrRestart' import PlayPauseIcon from './PlayPauseIcon' import SeekBar from './SeekBar' @@ -39,8 +40,8 @@ const styles = StyleSheet.create({ justifyContent: 'center', alignItems: 'center', alignContent: 'center', - height: 76 - } + height: 76, + }, }) @@ -126,7 +127,17 @@ export class VideoAndControls extends React.Component { }) } - handleOnProgress = ({ currentTime, duration }) => { + handleRestartVideo = () => { + this.videoRef.seek(0) + + this.handlePlayVideo() + } + + handleContinueVideo = () => { + this.handlePlayVideo() + } + + handleOnProgress = ({ currentTime, duration = this.state.duration }) => { const { setProgress } = this.props const currentTimeSeconds = currentTime / 1000 @@ -147,12 +158,6 @@ export class VideoAndControls extends React.Component { }) } - handleResizeModeChange = (resizeMode) => { - this.setState({ - resizeMode, - }) - } - toggleControls = (withTimeout = true) => { const { showControls } = this.state @@ -192,10 +197,9 @@ export class VideoAndControls extends React.Component { } render() { - const { url, children, forcePaused } = this.props - const { resizeMode } = this.state - const { showControls, paused } = this.state - const { currentTime, duration, progress } = this.state + const { url, children, forcePaused, startPosition } = this.props + const { showControls, paused, resizeMode } = this.state + const { currentTime, duration, progress, loading } = this.state return ( @@ -233,6 +237,14 @@ export class VideoAndControls extends React.Component { pointerEvents={'box-none'} useNativeDriver> + {startPosition > 0 && !loading && ( + + )} + Date: Tue, 22 Dec 2020 11:23:21 +0100 Subject: [PATCH 07/12] refactor: Small changes --- .../app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java | 2 +- index.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java index bdba4df..4ea49d2 100644 --- a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java +++ b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java @@ -129,7 +129,7 @@ private void initializePlayerIfNeeded() { options.add("--subsdec-encoding"); options.add("UTF-8"); options.add("--android-display-chroma"); - options.add("RV16"); + options.add("RV32"); options.add("--audio-resampler"); options.add("soxr"); diff --git a/index.js b/index.js index b56a65a..797757d 100644 --- a/index.js +++ b/index.js @@ -5,7 +5,6 @@ import { enableScreens } from 'react-native-screens' enableScreens() LogBox.ignoreLogs([ - 'Debugger and device times', 'Cache data may be lost when replacing', 'The updateQuery callback for fetchMore is deprecated' ]) From e46b4c732f00f3f5e462e05ea33b3bd77b0bb390 Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Tue, 22 Dec 2020 11:46:12 +0100 Subject: [PATCH 08/12] refactor: Small improvement --- .../src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java index 4ea49d2..b5f6060 100644 --- a/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java +++ b/android/app/src/main/java/com/popcorn/VlcPlayer/VlcPlayerView.java @@ -98,6 +98,10 @@ private void updateSurfaceView() { if (layout.getChildAt(0) != null) { layout.removeViewAt(0); + + if (layout.getChildAt(1) != null) { + layout.removeViewAt(1); + } } layout.addView(surfaceView, 0, layoutParams); From 0b49946f642df95c2df85f3fd47c02a7e2c04b03 Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Tue, 22 Dec 2020 12:06:50 +0100 Subject: [PATCH 09/12] refactor(tv): Started on subtitles select --- app/components/IconButton/IconButton.js | 22 ++++++++----- .../SelectSubtitle/SelectSubtitle.js | 33 +++++++++++-------- .../SelectSubtitle/index.js | 0 .../OptionsHeader/OptionsHeader.tsx | 9 +++-- .../components/OptionsItem/OptionsItem.tsx | 14 ++++++-- .../VideoAndControls/VideoAndControls.js | 18 +++++----- app/modules/dimensions.js | 1 + app/modules/useCorrect.js | 4 +-- app/tv/root.js | 28 ++++++++-------- app/tv/screens/Player/Player.js | 4 ++- .../PlayPauseIcon/PlayPauseIcon.js | 4 +-- .../VideoAndControls/SeekBar/SeekBar.js | 2 +- .../VideoAndControls/VideoAndControls.js | 13 +++++++- 13 files changed, 98 insertions(+), 54 deletions(-) rename app/{mobile/screens/Player/VideoAndControls => components}/SelectSubtitle/SelectSubtitle.js (80%) rename app/{mobile/screens/Player/VideoAndControls => components}/SelectSubtitle/index.js (100%) diff --git a/app/components/IconButton/IconButton.js b/app/components/IconButton/IconButton.js index 2a1ee3a..1380440 100644 --- a/app/components/IconButton/IconButton.js +++ b/app/components/IconButton/IconButton.js @@ -1,3 +1,4 @@ +import useCorrect from 'modules/useCorrect' import React from 'react' import PropTypes from 'prop-types' import { StyleSheet } from 'react-native' @@ -11,16 +12,21 @@ import Icon from '../Icon' export const styles = StyleSheet.create({ - container: { - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - }, + container: { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + }, - text: { - marginTop: -(dimensions.UNIT / 2), + text: { + marginTop: useCorrect( + -(dimensions.UNIT / 2), + null, + 0, + ), + }, }, -}) +) export const IconButton = ({ onPress, diff --git a/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js b/app/components/SelectSubtitle/SelectSubtitle.js similarity index 80% rename from app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js rename to app/components/SelectSubtitle/SelectSubtitle.js index bfabeec..418dbfa 100644 --- a/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/SelectSubtitle.js +++ b/app/components/SelectSubtitle/SelectSubtitle.js @@ -1,6 +1,7 @@ +import useCorrect from 'modules/useCorrect' import React from 'react' import PropTypes from 'prop-types' -import { StyleSheet, View } from 'react-native' +import { StyleSheet, View, Platform } from 'react-native' import i18n from 'modules/i18n' import dimensions from 'modules/dimensions' @@ -18,6 +19,16 @@ export const styles = StyleSheet.create({ width: 200, }, + root: { + zIndex: 2000, + width: dimensions.ICON_SIZE_MEDIUM + (dimensions.UNIT * 2), + right: useCorrect( + dimensions.UNIT * 5, + null, + dimensions.UNIT, + ), + }, + }) export const SelectSubtitle = ({ @@ -27,8 +38,6 @@ export const SelectSubtitle = ({ subtitles, disabled, }) => { - // TODO:: Create an "useSideSheet" that does the same but comes from the side - // this can then also be used on tv const [openBottomSheet, updateBottomSheet, closeBottomSheet] = useSideSheet() const handleSubtitleClick = React.useCallback((subtitle) => () => { @@ -38,14 +47,14 @@ export const SelectSubtitle = ({ const getBottomSheetConfig = () => { return { - renderContent: renderBottomSheetContent, + renderContent: renderSideSheetContent, onClose: () => { playVideo() }, } } - const renderBottomSheetContent = React.useCallback(() => ( + const renderSideSheetContent = React.useCallback(() => ( @@ -73,13 +82,7 @@ export const SelectSubtitle = ({ return ( {i18n.t('Subtitles')} diff --git a/app/mobile/screens/Player/VideoAndControls/SelectSubtitle/index.js b/app/components/SelectSubtitle/index.js similarity index 100% rename from app/mobile/screens/Player/VideoAndControls/SelectSubtitle/index.js rename to app/components/SelectSubtitle/index.js diff --git a/app/mobile/components/OptionsHeader/OptionsHeader.tsx b/app/mobile/components/OptionsHeader/OptionsHeader.tsx index 93363d3..91d466f 100644 --- a/app/mobile/components/OptionsHeader/OptionsHeader.tsx +++ b/app/mobile/components/OptionsHeader/OptionsHeader.tsx @@ -2,6 +2,7 @@ import React from 'react' import { StyleSheet } from 'react-native' import dimensions from 'modules/dimensions' +import useCorrect from 'modules/useCorrect' import Divider from 'components/Divider' import OptionsItem from '../OptionsItem' @@ -9,8 +10,12 @@ import OptionsItem from '../OptionsItem' export const styles = StyleSheet.create({ root: { - marginVertical: dimensions.UNIT * 2, - }, + marginVertical: useCorrect( + dimensions.UNIT * 2, + null, + dimensions.UNIT + ) + } }) diff --git a/app/mobile/components/OptionsItem/OptionsItem.tsx b/app/mobile/components/OptionsItem/OptionsItem.tsx index 55b1ed9..1387551 100644 --- a/app/mobile/components/OptionsItem/OptionsItem.tsx +++ b/app/mobile/components/OptionsItem/OptionsItem.tsx @@ -2,6 +2,7 @@ import React from 'react' import { StyleSheet, View } from 'react-native' import dimensions from 'modules/dimensions' +import useCorrect from 'modules/useCorrect' import BaseButton from 'components/BaseButton' import OptionsItemInner, { Props as OptionsItemInnerProps } from './OptionsItemInner' @@ -9,9 +10,16 @@ import OptionsItemInner, { Props as OptionsItemInnerProps } from './OptionsItemI export const styles = StyleSheet.create({ root: { - marginVertical: 7, - paddingHorizontal: dimensions.UNIT * 2, - + marginVertical: useCorrect( + 7, + null, + dimensions.UNIT / 2 + ), + paddingHorizontal: useCorrect( + dimensions.UNIT * 2, + null, + dimensions.UNIT + ), display: 'flex', flexDirection: 'row', alignItems: 'center' diff --git a/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js b/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js index ddf1220..382535a 100644 --- a/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js +++ b/app/mobile/screens/Player/VideoAndControls/VideoAndControls.js @@ -6,10 +6,10 @@ import Orientation from 'react-native-orientation' import dimensions from 'modules/dimensions' import VlcPlayer from 'components/VlcPlayer' import Overlay from 'components/Overlay' +import SelectSubtitle from 'components/SelectSubtitle' import PlayPauseIcon from './PlayPauseIcon' import SeekBar from './SeekBar' -import SelectSubtitle from './SelectSubtitle' const styles = StyleSheet.create({ @@ -273,13 +273,15 @@ export class VideoAndControls extends React.Component { disabled={loading} /> - + {subtitles && subtitles.length > 0 && ( + + )} {children} diff --git a/app/modules/dimensions.js b/app/modules/dimensions.js index 970fe4d..de838f7 100644 --- a/app/modules/dimensions.js +++ b/app/modules/dimensions.js @@ -29,6 +29,7 @@ export default { ICON_SIZE_SMALL: 18, ICON_SIZE_DEFAULT: 24, ICON_SIZE_MEDIUM: 32, + ICON_SIZE_TV_MEDIUM: 60, ICON_PLAY_DEFAULT: 30, ICON_PLAY_BIG: 45, diff --git a/app/modules/useCorrect.js b/app/modules/useCorrect.js index dd01808..932a060 100644 --- a/app/modules/useCorrect.js +++ b/app/modules/useCorrect.js @@ -2,11 +2,11 @@ import { Platform } from 'react-native' import Device from 'modules/DeviceDetection' export default (mobile, tablet, tv) => { - if (Platform.isTV && tv) { + if (Platform.isTV && tv !== null) { return tv } - if (Device.isTablet && tablet) { + if (Device.isTablet && tablet !== null) { return tablet } diff --git a/app/tv/root.js b/app/tv/root.js index 27f419f..1285160 100644 --- a/app/tv/root.js +++ b/app/tv/root.js @@ -3,7 +3,7 @@ import { NavigationContainer } from '@react-navigation/native' import DownloadManager from 'modules/DownloadManager' import IpFinder from 'modules/IpFinder' -// import FocusManager from './modules/FocusManager' +import SideSheetManager from 'modules/SideSheetManager' import navigationRef from 'modules/RootNavigation' import WatchOnTvManager from 'modules/WatchOnTvManager' @@ -13,20 +13,22 @@ import Screens from './screens' export default () => ( // - - - {(host) => ( - - - + + + {(host) => ( + + + + + - - - - )} - - + + + + )} + + // ) diff --git a/app/tv/screens/Player/Player.js b/app/tv/screens/Player/Player.js index 46f4219..7be3a24 100644 --- a/app/tv/screens/Player/Player.js +++ b/app/tv/screens/Player/Player.js @@ -57,7 +57,7 @@ export const Player = ({ route: { params: { item, torrent } } }) => ( item={item} torrent={torrent} style={styles.root}> - {({ mediaUrl, setProgress, startPosition, isBuffering, download }) => ( + {({ mediaUrl, setProgress, startPosition, isBuffering, download, selectSubtitle }) => ( {(isBuffering) && ( @@ -126,6 +126,8 @@ export const Player = ({ route: { params: { item, torrent } } }) => ( diff --git a/app/tv/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js b/app/tv/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js index f0abd30..7ae7ca3 100644 --- a/app/tv/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js +++ b/app/tv/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js @@ -2,6 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import { View, StyleSheet } from 'react-native' +import dimensions from 'modules/dimensions' import Remote from 'tv/modules/Controls/Remote' import IconButton from 'components/IconButton' @@ -33,10 +34,9 @@ export const PlayPauseIcon = ({ paused, handlePauseVideo, handlePlayVideo }) => } buttonProps={{ hasTVPreferredFocus: true, - // component: TouchableWithoutFeedback, }} color={'primary'} - size={60} /> + size={dimensions.ICON_SIZE_TV_MEDIUM} /> ) diff --git a/app/tv/screens/Player/VideoAndControls/SeekBar/SeekBar.js b/app/tv/screens/Player/VideoAndControls/SeekBar/SeekBar.js index 32bc0d2..3734e9c 100644 --- a/app/tv/screens/Player/VideoAndControls/SeekBar/SeekBar.js +++ b/app/tv/screens/Player/VideoAndControls/SeekBar/SeekBar.js @@ -21,7 +21,7 @@ const styles = { }, slider: { - width: dimensions.SCREEN_WIDTH - dimensions.UNIT * 26, + width: dimensions.SCREEN_WIDTH - dimensions.UNIT * 28, }, track: { diff --git a/app/tv/screens/Player/VideoAndControls/VideoAndControls.js b/app/tv/screens/Player/VideoAndControls/VideoAndControls.js index 0014808..839822b 100644 --- a/app/tv/screens/Player/VideoAndControls/VideoAndControls.js +++ b/app/tv/screens/Player/VideoAndControls/VideoAndControls.js @@ -8,6 +8,7 @@ import dimensions from 'modules/dimensions' import VlcPlayer from 'components/VlcPlayer' import Overlay from 'components/Overlay' import ContinueOrRestart from 'components/ContinueOrRestart' +import SelectSubtitle from 'components/SelectSubtitle' import PlayPauseIcon from './PlayPauseIcon' import SeekBar from './SeekBar' @@ -197,7 +198,7 @@ export class VideoAndControls extends React.Component { } render() { - const { url, children, forcePaused, startPosition } = this.props + const { url, children, forcePaused, startPosition, selectSubtitle, subtitles } = this.props const { showControls, paused, resizeMode } = this.state const { currentTime, duration, progress, loading } = this.state @@ -258,6 +259,16 @@ export class VideoAndControls extends React.Component { progress={progress} onSeek={this.onSliderPositionChange} /> + + {subtitles && subtitles.length > 0 && ( + + )} {children} From 7ec309542c3f8409844908bdbf1cd4ee24efa27a Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Tue, 22 Dec 2020 21:30:50 +0100 Subject: [PATCH 10/12] feat: Added subtitles for TV --- .../ContinueOrRestart/ContinueOrRestart.tsx | 41 +++- app/components/IconButton/IconButton.js | 5 +- .../SelectSubtitle/SelectSubtitle.js | 21 +- app/components/TextButton/TextButton.js | 2 +- app/components/TextButton/TextButton.tv.js | 36 +++ app/components/TextButton/index.js | 7 +- .../components/OptionsGroup/OptionsGroup.js | 30 --- .../components/OptionsGroup/OptionsGroup.tsx | 45 ++++ .../OptionsGroup/{index.js => index.ts} | 0 .../OptionsHeader/OptionsHeader.tsx | 24 +- .../components/OptionsItem/OptionsItem.tsx | 25 +- .../SideSheetManager/SideSheetProvider.js | 57 ++--- app/tv/modules/Controls/FocusContainer.js | 222 ------------------ .../modules/Controls/FocusManagerConstants.js | 3 - app/tv/modules/Controls/OpacityManager.js | 63 ----- .../{FocusProvider.js => TvRemoteProvider.js} | 82 ++++--- app/tv/root.js | 37 ++- app/tv/screens/Player/Player.js | 3 +- .../PlayPauseIcon/PlayPauseIcon.js | 8 +- .../VideoAndControls/VideoAndControls.js | 28 ++- 20 files changed, 287 insertions(+), 452 deletions(-) create mode 100644 app/components/TextButton/TextButton.tv.js delete mode 100644 app/mobile/components/OptionsGroup/OptionsGroup.js create mode 100644 app/mobile/components/OptionsGroup/OptionsGroup.tsx rename app/mobile/components/OptionsGroup/{index.js => index.ts} (100%) delete mode 100644 app/tv/modules/Controls/FocusContainer.js delete mode 100644 app/tv/modules/Controls/FocusManagerConstants.js delete mode 100644 app/tv/modules/Controls/OpacityManager.js rename app/tv/modules/Controls/{FocusProvider.js => TvRemoteProvider.js} (57%) diff --git a/app/components/ContinueOrRestart/ContinueOrRestart.tsx b/app/components/ContinueOrRestart/ContinueOrRestart.tsx index 0c0a4ab..f16c40f 100644 --- a/app/components/ContinueOrRestart/ContinueOrRestart.tsx +++ b/app/components/ContinueOrRestart/ContinueOrRestart.tsx @@ -1,14 +1,13 @@ import React from 'react' -import { StyleSheet, View, TouchableNativeFeedback, Text } from 'react-native' +import { StyleSheet, TouchableHighlight, View } from 'react-native' import dimensions from 'modules/dimensions' import i18n from 'modules/i18n' +import { useTvRemoteProvider } from 'tv/modules/Controls/TvRemoteProvider' import Overlay from '../Overlay' import TextButton from '../TextButton' import Typography from '../Typography' -import IconButton from '../IconButton' -import Remote from '../../tv/modules/Controls/Remote' export const styles = StyleSheet.create({ @@ -48,30 +47,40 @@ export interface Props { pauseVideo: () => void - handleContinueVideo: () => void + continueVideo: () => void - handleRestartVideo: () => void + restartVideo: () => void + + disableControls: () => void + + enableControls: () => void } export const ContinueOrRestart: React.FC = ({ pauseVideo, - handleContinueVideo, - handleRestartVideo + continueVideo, + restartVideo, + disableControls, + enableControls }) => { const [showedOverlay, setOverlayVisible] = React.useState(true) + const tvRemote = useTvRemoteProvider() React.useEffect(() => { pauseVideo() + disableControls() }, []) const handleContinue = () => { - handleContinueVideo() + continueVideo() + enableControls() setOverlayVisible(false) } const handleRestart = () => { - handleRestartVideo() + restartVideo() + enableControls() setOverlayVisible(false) } @@ -91,12 +100,26 @@ export const ContinueOrRestart: React.FC = ({ {i18n.t('Restart')} diff --git a/app/components/IconButton/IconButton.js b/app/components/IconButton/IconButton.js index 1380440..ded963a 100644 --- a/app/components/IconButton/IconButton.js +++ b/app/components/IconButton/IconButton.js @@ -39,6 +39,7 @@ export const IconButton = ({ textProps, children, disabled, + emphasis, ...rest }) => ( @@ -90,6 +91,7 @@ IconButton.propTypes = { animatableStyle: PropTypes.object, animatable: PropTypes.object, size: PropTypes.number, + emphasis: PropTypes.string, } IconButton.defaultProps = { @@ -105,6 +107,7 @@ IconButton.defaultProps = { onFocus: null, onBlur: null, size: dimensions.ICON_SIZE_DEFAULT, + emphasis: 'high' } export default IconButton diff --git a/app/components/SelectSubtitle/SelectSubtitle.js b/app/components/SelectSubtitle/SelectSubtitle.js index 418dbfa..270c8ff 100644 --- a/app/components/SelectSubtitle/SelectSubtitle.js +++ b/app/components/SelectSubtitle/SelectSubtitle.js @@ -38,14 +38,16 @@ export const SelectSubtitle = ({ subtitles, disabled, }) => { - const [openBottomSheet, updateBottomSheet, closeBottomSheet] = useSideSheet() + const [selectingSubs, setSelectingSubs] = React.useState(false) + const [openSideSheet, updateSideSheet, closeSideSheet] = useSideSheet() const handleSubtitleClick = React.useCallback((subtitle) => () => { selectSubtitle(subtitle) - closeBottomSheet() + closeSideSheet() + setSelectingSubs(false) }, []) - const getBottomSheetConfig = () => { + const getSideSheetConfig = () => { return { renderContent: renderSideSheetContent, onClose: () => { @@ -61,23 +63,28 @@ export const SelectSubtitle = ({ + label={i18n.t('No subtitles')} + buttonProps={{ + hasTVPreferredFocus: selectingSubs, + }} /> {subtitles.map((subtitle) => ( ))} - ), [subtitles]) + ), [subtitles, selectingSubs]) const handleOnOpenSubtitlesPress = () => { pauseVideo() - - openBottomSheet(getBottomSheetConfig()) + setSelectingSubs(true) + openSideSheet(getSideSheetConfig()) } return ( diff --git a/app/components/TextButton/TextButton.js b/app/components/TextButton/TextButton.js index 3154800..b1a7260 100644 --- a/app/components/TextButton/TextButton.js +++ b/app/components/TextButton/TextButton.js @@ -1,11 +1,11 @@ import React from 'react' import PropTypes from 'prop-types' import { Text } from 'react-native' +import * as Animatable from 'react-native-animatable' import dimensions from 'modules/dimensions' import Typography from 'components/Typography' -import * as Animatable from 'react-native-animatable' import BaseButton from '../BaseButton' diff --git a/app/components/TextButton/TextButton.tv.js b/app/components/TextButton/TextButton.tv.js new file mode 100644 index 0000000..9943d43 --- /dev/null +++ b/app/components/TextButton/TextButton.tv.js @@ -0,0 +1,36 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { TouchableHighlight } from 'react-native' + +import BaseTextButton from './TextButton' + +// TODO:: Wrap onFocus and onBlur and then make it visible? +export const TextButton = ({ + children, + ...rest +}) => ( + + {children} + +) + +TextButton.propTypes = { + onPress: PropTypes.func.isRequired, + onLongPress: PropTypes.func, + children: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.array, + ]).isRequired, +} + +TextButton.defaultProps = { + variant: 'button', + color: 'white', + emphasis: 'high', + animatable: {}, + animatableStyle: {}, +} + +export default TextButton diff --git a/app/components/TextButton/index.js b/app/components/TextButton/index.js index e3778df..72ca1f2 100644 --- a/app/components/TextButton/index.js +++ b/app/components/TextButton/index.js @@ -1 +1,6 @@ -export { default } from './TextButton' +import useCorrect from 'modules/useCorrect' + +import TextButton from './TextButton' +import TextButtonTV from './TextButton.tv' + +export default useCorrect(TextButton, null, TextButtonTV) diff --git a/app/mobile/components/OptionsGroup/OptionsGroup.js b/app/mobile/components/OptionsGroup/OptionsGroup.js deleted file mode 100644 index 101a2b0..0000000 --- a/app/mobile/components/OptionsGroup/OptionsGroup.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react' -import { View, StyleSheet } from 'react-native' - -import dimensions from 'modules/dimensions' - -import Divider from 'components/Divider' - -export const styles = StyleSheet.create({ - - root: { - marginVertical: dimensions.UNIT * 2, - }, - -}) - -export const OptionsGroup = ({ children, withDivider, style }) => { - return ( - <> - - {children} - - - {withDivider && ( - - )} - - ) -} - -export default OptionsGroup diff --git a/app/mobile/components/OptionsGroup/OptionsGroup.tsx b/app/mobile/components/OptionsGroup/OptionsGroup.tsx new file mode 100644 index 0000000..307e174 --- /dev/null +++ b/app/mobile/components/OptionsGroup/OptionsGroup.tsx @@ -0,0 +1,45 @@ +import React from 'react' +import { View, StyleSheet } from 'react-native' + +import dimensions from 'modules/dimensions' +import useCorrect from 'modules/useCorrect' + +import Divider from 'components/Divider' + +export interface Props { + + withDivider?: boolean + + style?: any + +} + +export const styles = StyleSheet.create({ + + root: { + marginVertical: useCorrect( + dimensions.UNIT * 2, + null, + 0 + ) + } + +}) + +export const OptionsGroup: React.FC = ({ + children, + withDivider, + style +}) => ( + <> + + {children} + + + {withDivider && ( + + )} + +) + +export default OptionsGroup diff --git a/app/mobile/components/OptionsGroup/index.js b/app/mobile/components/OptionsGroup/index.ts similarity index 100% rename from app/mobile/components/OptionsGroup/index.js rename to app/mobile/components/OptionsGroup/index.ts diff --git a/app/mobile/components/OptionsHeader/OptionsHeader.tsx b/app/mobile/components/OptionsHeader/OptionsHeader.tsx index 91d466f..d942a52 100644 --- a/app/mobile/components/OptionsHeader/OptionsHeader.tsx +++ b/app/mobile/components/OptionsHeader/OptionsHeader.tsx @@ -20,20 +20,20 @@ export const styles = StyleSheet.create({ }) export interface Props { + label: string -} -export const SettingsHeader: React.FC = ({ label }) => { - return ( - <> - - - - - ) } +export const SettingsHeader: React.FC = ({ label }) => ( + <> + + + + +) + export default SettingsHeader diff --git a/app/mobile/components/OptionsItem/OptionsItem.tsx b/app/mobile/components/OptionsItem/OptionsItem.tsx index 1387551..2c07fa0 100644 --- a/app/mobile/components/OptionsItem/OptionsItem.tsx +++ b/app/mobile/components/OptionsItem/OptionsItem.tsx @@ -13,13 +13,18 @@ export const styles = StyleSheet.create({ marginVertical: useCorrect( 7, null, - dimensions.UNIT / 2 + dimensions.UNIT / 4 ), paddingHorizontal: useCorrect( dimensions.UNIT * 2, null, dimensions.UNIT ), + paddingVertical: useCorrect( + 0, + null, + dimensions.UNIT / 2 + ), display: 'flex', flexDirection: 'row', alignItems: 'center' @@ -29,18 +34,20 @@ export const styles = StyleSheet.create({ export interface Props extends OptionsItemInnerProps { - style?: object + style?: any disabled?: boolean onPress?: () => void + buttonProps?: any } export const OptionsItem: React.FC = ({ - style, - disabled, + style = {}, + disabled = false, onPress, + buttonProps = {}, ...rest }) => { if (disabled || !onPress) { @@ -58,10 +65,12 @@ export const OptionsItem: React.FC = ({ rippleBorderless={false} onPress={onPress} disabled={disabled} - style={[styles.root, style]}> - + {...buttonProps}> + + + ) } diff --git a/app/modules/SideSheetManager/SideSheetProvider.js b/app/modules/SideSheetManager/SideSheetProvider.js index 52be8e5..6ab4af6 100644 --- a/app/modules/SideSheetManager/SideSheetProvider.js +++ b/app/modules/SideSheetManager/SideSheetProvider.js @@ -33,9 +33,8 @@ export const SideSheetProvider = ({ children }) => { const [fall] = React.useState(new ReAnimated.Value(1)) const [visible, toggleVisible] = React.useState(false) - const [bottomSheetConfig, setBottomSheetConfig] = React.useState({ + const [sideSheetConfig, setSideSheetConfig] = React.useState({ renderContent: () => null, - borderRadius: 0, snapPoints: [200, 0], biggestSnapPoint: 200, contentHeight: 200, @@ -49,14 +48,25 @@ export const SideSheetProvider = ({ children }) => { const handleSideSheetClose = React.useCallback(() => { toggleVisible(false) - if (bottomSheetConfig.onClose) { - bottomSheetConfig.onClose() + if (sideSheetConfig.onClose) { + sideSheetConfig.onClose() } - }, [bottomSheetConfig.onClose]) + }, [sideSheetConfig.onClose]) + + const handleRenderContent = React.useCallback(() => ( + + {sideSheetConfig.renderContent()} + + ), [sideSheetConfig.biggestSnapPoint, sideSheetConfig.renderContent]) useBackButton(() => { if (visible && sheetRef.current) { - closeBottomSheet() + closeSideSheet() return true } @@ -64,17 +74,17 @@ export const SideSheetProvider = ({ children }) => { return false }) - const updateBottomSheet = (config, force = false) => { + const updateSideSheet = (config, force = false) => { if (visible || force) { - setBottomSheetConfig({ - ...bottomSheetConfig, + setSideSheetConfig({ + ...sideSheetConfig, ...config, }) } } - const openBottomSheet = (config) => { - updateBottomSheet(config, true) + const openSideSheet = (config) => { + updateSideSheet(config, true) // if we are already visible it can be content changes if (!visible) { @@ -82,12 +92,12 @@ export const SideSheetProvider = ({ children }) => { } } - const closeBottomSheet = () => { - sheetRef.current.snapTo(bottomSheetConfig.snapPoints.length - 1) + const closeSideSheet = () => { + sheetRef.current.snapTo(sideSheetConfig.snapPoints.length - 1) } return ( - + {children} @@ -105,30 +115,21 @@ export const SideSheetProvider = ({ children }) => { }), }}> - + ( - - {bottomSheetConfig.renderContent()} - - )} + initialSnap={sideSheetConfig.snapPoints.length - 1} + renderContent={handleRenderContent} /> ) diff --git a/app/tv/modules/Controls/FocusContainer.js b/app/tv/modules/Controls/FocusContainer.js deleted file mode 100644 index db17193..0000000 --- a/app/tv/modules/Controls/FocusContainer.js +++ /dev/null @@ -1,222 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Animated, Easing } from 'react-native' - -export const ContainerContext = React.createContext({ focusedIndex: 0 }) - -export default class FocusContainer extends React.Component { - - static propTypes = { - offset: PropTypes.number, - } - - static defaultProps = { - offset: 0, - } - - childLayouts = [] - - transformY = new Animated.Value(0) - - state = { - focusedIndex: 0, - } - - handleChildGainedFocus = (index) => () => { - // TODO:: Check if this function is causing all the rerenders - const { focusedIndex } = this.state - const { offset } = this.props - - if (focusedIndex === index) { - return - } - - console.log('handleChildGainedFocus', index) - - let toValue = this.childLayouts[index]?.y ?? 0 - - if (toValue > 0) { - toValue = toValue - offset - } - - this.setState({ - focusedIndex: index, - }) - - Animated.timing( - this.transformY, - { - toValue: -(toValue), - easing: Easing.linear, - duration: 220, - useNativeDriver: true, - }, - ).start() - } - - renderChildren = () => React.Children.map(this.props.children, (child, index) => { - if (React.isValidElement(child)) { - return React.cloneElement(child, { - index, - onLayout: (event) => { - this.childLayouts[index] = event.nativeEvent.layout - }, - gainedFocus: this.handleChildGainedFocus(index), - }) - } - }) - - render() { - // const { children } = this.props - const { focusedIndex } = this.state - - console.log('render focus container') - return ( - - - {this.renderChildren()} - - - ) - } - -} - -/** - * render() { - const { children } = this.props - const { transformY, focusedIndex } = this.state - - return ( - - - {children} - - - ) - } - - */ -/** - import React from 'react' - import PropTypes from 'prop-types' - import { Animated, Easing } from 'react-native' - - export const ContainerContext = React.createContext({ focusedIndex: 0 }) - - export default class FocusContainer extends React.Component { - - static propTypes = { - offset: PropTypes.number, - } - - static defaultProps = { - offset: 0, - } - - childLayouts = {} - - state = { - focusedIndex: 0, - focusedId: null, - transformY: new Animated.Value(0), - } - - handleChildGainedFocus = (id) => { - const { transformY } = this.state - const { offset } = this.props - - let toValue = this.childLayouts[id]?.y ?? 0 - - if (toValue > 0) { - toValue = toValue - offset - } - - this.setState({ - focusedIndex: this.getIndexForId(id), - focusedId: id, - }) - - Animated.timing( - transformY, - { - toValue: -(toValue), - easing: Easing.linear, - duration: 250, - useNativeDriver: true, - }, - ).start() - } - - handleAddLayout = (id, event) => { - this.childLayouts[id] = event.nativeEvent.layout - } - - getIndexForId = (id) => { - const index = Object.keys(this.childLayouts).indexOf(id) - - return index > -1 ? index : 0 - } - - getApi = () => { - const { focusedIndex, focusedId } = this.state - - return { - focusedIndex, - focusedId, - addLayout: this.handleAddLayout, - gainedFocus: this.handleChildGainedFocus, - getIndexForId: this.getIndexForId, - } - } - - render() { - const { children } = this.props - const { transformY, focusedIndex } = this.state - - return ( - - - {React.Children.map(children, (child, index) => { - return React.cloneElement(child, { - index, - onLayout: (event) => { - this.childLayouts[index] = event.nativeEvent.layout - this.childOpacities[index] = new Animated.Value(1) - }, - gainedFocus: this.handleChildGainedFocus(index), - }) - })} - - - ) - } - -} - - /** - * render() { - const { children } = this.props - const { transformY, focusedIndex } = this.state - - return ( - - - {children} - - - ) - } - - */ -/** - {React.Children.map(children, (child, index) => { - return React.cloneElement(child, { - onLayout: (event) => { - this.childLayouts[index] = event.nativeEvent.layout - this.childOpacities[index] = new Animated.Value(1) - }, - gainedFocus: this.handleChildGainedFocus(index), - }) - })} - **/ diff --git a/app/tv/modules/Controls/FocusManagerConstants.js b/app/tv/modules/Controls/FocusManagerConstants.js deleted file mode 100644 index c070735..0000000 --- a/app/tv/modules/Controls/FocusManagerConstants.js +++ /dev/null @@ -1,3 +0,0 @@ -export const HOME_SLIDER = 'home-slider' -export const HOME_MOVIES = 'home-movies' -export const HOME_MAIN_COVER_PLAY = 'home-main-cover-play' diff --git a/app/tv/modules/Controls/OpacityManager.js b/app/tv/modules/Controls/OpacityManager.js deleted file mode 100644 index 71bd8b7..0000000 --- a/app/tv/modules/Controls/OpacityManager.js +++ /dev/null @@ -1,63 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import { Animated, Easing } from 'react-native' - -import { ContainerContext } from './FocusContainer' - -export class OpacityManager extends React.PureComponent { - - // static contextType = ContainerContext - - state = { - animatedOpacity: new Animated.Value(1), - } - - componentDidUpdate(prevProps, prevState, snapshot) { - const { index } = this.props - const { focusedIndex } = this.context - - if (focusedIndex > index) { - Animated.timing( - this.state.animatedOpacity, - { - toValue: 0, - easing: Easing.linear, - duration: 220, - useNativeDriver: true, - }, - ).start() - } else { - Animated.timing( - this.state.animatedOpacity, - { - toValue: 1, - easing: Easing.linear, - duration: 220, - useNativeDriver: true, - }, - ).start() - } - } - - render() { - const { children, style, onLayout, gainedFocus } = this.props - const { animatedOpacity } = this.state - - console.log('render opacity manager') - - return ( - - {React.Children.map(children, (child) => { - return React.cloneElement(child, { - gainedFocus, - }) - })} - - ) - } - -} - -export default OpacityManager diff --git a/app/tv/modules/Controls/FocusProvider.js b/app/tv/modules/Controls/TvRemoteProvider.js similarity index 57% rename from app/tv/modules/Controls/FocusProvider.js rename to app/tv/modules/Controls/TvRemoteProvider.js index 3bb9434..e49ba89 100644 --- a/app/tv/modules/Controls/FocusProvider.js +++ b/app/tv/modules/Controls/TvRemoteProvider.js @@ -1,11 +1,11 @@ import React from 'react' -import { findNodeHandle, TVEventHandler, Animated, Easing } from 'react-native' -import { transitionDuration } from 'tv/modules/BackgroundManager/BackgroundManager' +import { findNodeHandle, TVEventHandler } from 'react-native' import Context from './FocusManagerContext' -import * as constants from './FocusManagerConstants' -export default class FocusProvider extends React.Component { +export const useTvRemoteProvider = () => React.useContext(Context) + +export default class TvRemoteProvider extends React.Component { focusRefs = {} @@ -26,19 +26,9 @@ export default class FocusProvider extends React.Component { this._tvEventHandler.enable(this, function(manager, evt) { const { dirty } = manager.state - // eventKeyAction is an integer value representing button press(key down) and release(key up). "key up" is 1, "key down" is 0. - - // if (eventType === 'playPause' && eventKeyAction === 0) - // { - // console.log('play pressed') - // } - if (!dirty && ['up', 'right', 'down', 'left'].includes(evt.eventType)) { - console.log('set dirty state') manager.setState({ dirty: true }) } - - console.log(dirty, evt) }) } @@ -47,36 +37,15 @@ export default class FocusProvider extends React.Component { } getApi = () => { - const { dirty, currentFocusContainer } = this.state + const { dirty, currentFocusElement } = this.state return { - constants, dirty, - currentFocusContainer, + currentFocusElement, addRef: this.addRef, + onFocus: this.handleFocusChange, updateCurrentItem: this.updateCurrentItem, toRight: this.handleToRight, - focusContainer: this.focusContainer, - } - } - - focusContainer = (container, value, toValue) => { - const { currentFocusContainer } = this.state - - if (currentFocusContainer !== container) { - this.setState({ - currentFocusContainer: container, - }, () => { - Animated.timing( - value, - { - toValue: toValue, - easing: Easing.linear, - duration: 250, - useNativeDriver: true, - }, - ).start() - }) } } @@ -101,13 +70,48 @@ export default class FocusProvider extends React.Component { const next = { nextFocusLeft: findNodeHandle(this.focusRefs[elementLeft]), nextFocusRight: findNodeHandle(this.focusRefs[elementRight]), + nextFocusDown: findNodeHandle(this.focusRefs[elementBottom]), } + // this.focusRefs[element].setNativeProps(next) + }) + } + + handleFocusChange = (element, nextFocus) => () => { + const { currentFocusElement } = this.state + + this.setState({ + nextFocus, + currentFocusElement: element, + }, () => { + const { elementTop = null, elementBottom = null, elementLeft = null, elementRight = null } = nextFocus + + const next = { + nextFocusUp: elementTop !== null + ? findNodeHandle(this.focusRefs[elementTop]) + : null, + + nextFocusLeft: elementLeft !== null + ? findNodeHandle(this.focusRefs[elementLeft]) + : null, + + nextFocusRight: elementRight !== null + ? findNodeHandle(this.focusRefs[elementRight]) + : null, + + nextFocusDown: elementBottom !== null + ? findNodeHandle(this.focusRefs[elementBottom]) + : null, + } + + console.log('focus change', element, next) + this.focusRefs[element].setNativeProps(next) }) } - addRef = (key, ref) => { + addRef = (key) => (ref) => { + console.log(ref) this.focusRefs[key] = ref } diff --git a/app/tv/root.js b/app/tv/root.js index 1285160..a162997 100644 --- a/app/tv/root.js +++ b/app/tv/root.js @@ -6,29 +6,28 @@ import IpFinder from 'modules/IpFinder' import SideSheetManager from 'modules/SideSheetManager' import navigationRef from 'modules/RootNavigation' import WatchOnTvManager from 'modules/WatchOnTvManager' +import TvRemoteProvider from 'tv/modules/Controls/TvRemoteProvider' import ApolloLoader from 'components/ApolloLoader' import Screens from './screens' export default () => ( - // - - - {(host) => ( - - - - - - - - - - - - )} - - - // + + + + {(host) => ( + + + + + + + + + + )} + + + ) diff --git a/app/tv/screens/Player/Player.js b/app/tv/screens/Player/Player.js index 7be3a24..9261bfa 100644 --- a/app/tv/screens/Player/Player.js +++ b/app/tv/screens/Player/Player.js @@ -57,7 +57,7 @@ export const Player = ({ route: { params: { item, torrent } } }) => ( item={item} torrent={torrent} style={styles.root}> - {({ mediaUrl, setProgress, startPosition, isBuffering, download, selectSubtitle }) => ( + {({ mediaUrl, setProgress, startPosition, isBuffering, download, selectSubtitle, subtitleUri }) => ( {(isBuffering) && ( @@ -126,6 +126,7 @@ export const Player = ({ route: { params: { item, torrent } } }) => ( ( +export const PlayPauseIcon = ({ paused, handlePauseVideo, handlePlayVideo, disabled }) => ( @@ -33,10 +33,12 @@ export const PlayPauseIcon = ({ paused, handlePauseVideo, handlePlayVideo }) => : 'pause' } buttonProps={{ - hasTVPreferredFocus: true, + hasTVPreferredFocus: !disabled, }} color={'primary'} - size={dimensions.ICON_SIZE_TV_MEDIUM} /> + + size={dimensions.ICON_SIZE_TV_MEDIUM} + disabled={disabled} /> ) diff --git a/app/tv/screens/Player/VideoAndControls/VideoAndControls.js b/app/tv/screens/Player/VideoAndControls/VideoAndControls.js index 839822b..cd88581 100644 --- a/app/tv/screens/Player/VideoAndControls/VideoAndControls.js +++ b/app/tv/screens/Player/VideoAndControls/VideoAndControls.js @@ -60,6 +60,7 @@ export class VideoAndControls extends React.Component { this.state = { showControls: true, + disableControls: false, loading: true, paused: false, resizeMode: 'contain', @@ -159,6 +160,18 @@ export class VideoAndControls extends React.Component { }) } + handleDisableControls = () => { + this.setState({ + disableControls: true + }) + } + + handleEnableControls = () => { + this.setState({ + disableControls: false + }) + } + toggleControls = (withTimeout = true) => { const { showControls } = this.state @@ -198,8 +211,9 @@ export class VideoAndControls extends React.Component { } render() { - const { url, children, forcePaused, startPosition, selectSubtitle, subtitles } = this.props - const { showControls, paused, resizeMode } = this.state + const { url, children, forcePaused, startPosition } = this.props + const { subtitleUri, selectSubtitle, subtitles } = this.props + const { showControls, disableControls, paused, resizeMode } = this.state const { currentTime, duration, progress, loading } = this.state return ( @@ -220,6 +234,7 @@ export class VideoAndControls extends React.Component { style={styles.video} paused={paused || forcePaused} resizeMode={resizeMode} + subtitleUri={subtitleUri} onPlaying={this.handleOnPlaying} onProgress={this.handleOnProgress} /> @@ -241,8 +256,10 @@ export class VideoAndControls extends React.Component { {startPosition > 0 && !loading && ( )} @@ -251,6 +268,7 @@ export class VideoAndControls extends React.Component { handlePlayVideo={this.handlePlayVideo} handlePauseVideo={this.handlePauseVideo} paused={paused} + disabled={disableControls} /> )} From d1ad47760b75edcf83b2cc6b2c39973d8acab7d3 Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Wed, 23 Dec 2020 17:15:26 +0100 Subject: [PATCH 11/12] refactor: Small changes Changes for TV so you can better see what button you have selected --- app/components/IconButton/IconButton.js | 34 ++++---- app/components/IconButton/IconButton.tv.js | 81 +++++++++++++++++++ app/components/IconButton/index.js | 7 +- .../SelectSubtitle/SelectSubtitle.js | 6 -- app/components/TextButton/TextButton.js | 3 +- app/components/TextButton/TextButton.tv.js | 63 +++++++++++++-- .../SideSheetManager/SideSheetProvider.js | 4 +- app/modules/colors.js | 1 + app/tv/modules/Controls/TvRemoteProvider.js | 1 - .../PlayPauseIcon/PlayPauseIcon.js | 3 +- 10 files changed, 166 insertions(+), 37 deletions(-) create mode 100644 app/components/IconButton/IconButton.tv.js diff --git a/app/components/IconButton/IconButton.js b/app/components/IconButton/IconButton.js index ded963a..0e3e888 100644 --- a/app/components/IconButton/IconButton.js +++ b/app/components/IconButton/IconButton.js @@ -1,9 +1,9 @@ -import useCorrect from 'modules/useCorrect' import React from 'react' import PropTypes from 'prop-types' import { StyleSheet } from 'react-native' import * as Animatable from 'react-native-animatable' +import useCorrect from 'modules/useCorrect' import dimensions from 'modules/dimensions' import BaseButton from '../BaseButton' @@ -12,21 +12,21 @@ import Icon from '../Icon' export const styles = StyleSheet.create({ - container: { - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - }, + container: { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + }, - text: { - marginTop: useCorrect( - -(dimensions.UNIT / 2), - null, - 0, - ), - }, + text: { + marginTop: useCorrect( + -(dimensions.UNIT / 2), + null, + 0, + ), }, -) + +}) export const IconButton = ({ onPress, @@ -40,6 +40,7 @@ export const IconButton = ({ children, disabled, emphasis, + innerRef, ...rest }) => ( {children} @@ -107,7 +109,7 @@ IconButton.defaultProps = { onFocus: null, onBlur: null, size: dimensions.ICON_SIZE_DEFAULT, - emphasis: 'high' + emphasis: 'high', } export default IconButton diff --git a/app/components/IconButton/IconButton.tv.js b/app/components/IconButton/IconButton.tv.js new file mode 100644 index 0000000..212fdd7 --- /dev/null +++ b/app/components/IconButton/IconButton.tv.js @@ -0,0 +1,81 @@ +import dimensions from 'modules/dimensions' +import React from 'react' +import PropTypes from 'prop-types' +import { TouchableHighlight } from 'react-native' + +import colors from 'modules/colors' + +import BaseIconButton from './IconButton' + +export const styles = { + + root: { + borderWidth: 1, + borderColor: colors.TRANSPARENT, + + padding: dimensions.UNIT, + }, + + active: { + borderColor: colors.WHITE, + }, + +} + +export const IconButtonTV = ({ + children, + onFocus, + onBlur, + buttonProps = {}, + emphasis, + size, + ...rest +}) => { + const [active, setActive] = React.useState(false) + + const handleOnFocus = React.useCallback(() => { + setActive(true) + + if (onFocus) { + onFocus() + } + }, []) + + const handleOnBlur = React.useCallback(() => { + setActive(false) + + if (onBlur) { + onBlur() + } + }, []) + + return ( + + {children} + + ) +} + +IconButtonTV.propTypes = { + onPress: PropTypes.func.isRequired, + onLongPress: PropTypes.func, +} + +IconButtonTV.defaultProps = { + variant: 'button', + color: 'white', + emphasis: 'high', + animatable: {}, + animatableStyle: {}, +} + +export default IconButtonTV diff --git a/app/components/IconButton/index.js b/app/components/IconButton/index.js index 9de6d2c..cfbf30d 100644 --- a/app/components/IconButton/index.js +++ b/app/components/IconButton/index.js @@ -1 +1,6 @@ -export { default } from './IconButton' +import useCorrect from 'modules/useCorrect' + +import IconButton from './IconButton' +import IconButtonTV from './IconButton.tv' + +export default useCorrect(IconButton, null, IconButtonTV) diff --git a/app/components/SelectSubtitle/SelectSubtitle.js b/app/components/SelectSubtitle/SelectSubtitle.js index 270c8ff..b1b4a2c 100644 --- a/app/components/SelectSubtitle/SelectSubtitle.js +++ b/app/components/SelectSubtitle/SelectSubtitle.js @@ -21,12 +21,6 @@ export const styles = StyleSheet.create({ root: { zIndex: 2000, - width: dimensions.ICON_SIZE_MEDIUM + (dimensions.UNIT * 2), - right: useCorrect( - dimensions.UNIT * 5, - null, - dimensions.UNIT, - ), }, }) diff --git a/app/components/TextButton/TextButton.js b/app/components/TextButton/TextButton.js index b1a7260..04a0ffd 100644 --- a/app/components/TextButton/TextButton.js +++ b/app/components/TextButton/TextButton.js @@ -51,7 +51,8 @@ export const TextButton = ({ nextFocusForward={nextFocusForward} nextFocusLeft={nextFocusLeft} nextFocusRight={nextFocusRight} - rippleBorderless={false}> + rippleBorderless={false} + nativeID={nativeID}> diff --git a/app/components/TextButton/TextButton.tv.js b/app/components/TextButton/TextButton.tv.js index 9943d43..4f7b705 100644 --- a/app/components/TextButton/TextButton.tv.js +++ b/app/components/TextButton/TextButton.tv.js @@ -1,20 +1,67 @@ +import dimensions from 'modules/dimensions' import React from 'react' import PropTypes from 'prop-types' import { TouchableHighlight } from 'react-native' +import colors from 'modules/colors' + import BaseTextButton from './TextButton' -// TODO:: Wrap onFocus and onBlur and then make it visible? +export const styles = { + + root: { + borderWidth: 1, + borderColor: colors.TRANSPARENT, + + padding: dimensions.UNIT + }, + + active: { + borderColor: colors.WHITE, + }, + +} + export const TextButton = ({ children, + onFocus, + onBlur, + style = {}, ...rest -}) => ( - - {children} - -) +}) => { + const [active, setActive] = React.useState(false) + + const handleOnFocus = React.useCallback(() => { + setActive(true) + + if (onFocus) { + onFocus() + } + }, []) + + const handleOnBlur = React.useCallback(() => { + setActive(false) + + if (onBlur) { + onBlur() + } + }, []) + + return ( + + {children} + + ) +} TextButton.propTypes = { onPress: PropTypes.func.isRequired, diff --git a/app/modules/SideSheetManager/SideSheetProvider.js b/app/modules/SideSheetManager/SideSheetProvider.js index 6ab4af6..b2021d6 100644 --- a/app/modules/SideSheetManager/SideSheetProvider.js +++ b/app/modules/SideSheetManager/SideSheetProvider.js @@ -60,9 +60,9 @@ export const SideSheetProvider = ({ children }) => { height: '100%', width: sideSheetConfig.biggestSnapPoint, }}> - {sideSheetConfig.renderContent()} + {visible && sideSheetConfig.renderContent()} - ), [sideSheetConfig.biggestSnapPoint, sideSheetConfig.renderContent]) + ), [visible, sideSheetConfig.biggestSnapPoint, sideSheetConfig.renderContent]) useBackButton(() => { if (visible && sheetRef.current) { diff --git a/app/modules/colors.js b/app/modules/colors.js index 1b69e8d..e8ed4fb 100644 --- a/app/modules/colors.js +++ b/app/modules/colors.js @@ -48,4 +48,5 @@ export default { STATUS_BAR_TRANSPARENT: 'rgba(0, 0, 0, 0.20)', STATUS_BAR_GONE: 'rgba(0, 0, 0, 0)', + TRANSPARENT: 'rgba(0, 0, 0, 0)', } diff --git a/app/tv/modules/Controls/TvRemoteProvider.js b/app/tv/modules/Controls/TvRemoteProvider.js index e49ba89..c32a879 100644 --- a/app/tv/modules/Controls/TvRemoteProvider.js +++ b/app/tv/modules/Controls/TvRemoteProvider.js @@ -111,7 +111,6 @@ export default class TvRemoteProvider extends React.Component { } addRef = (key) => (ref) => { - console.log(ref) this.focusRefs[key] = ref } diff --git a/app/tv/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js b/app/tv/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js index 1d66c27..170045a 100644 --- a/app/tv/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js +++ b/app/tv/screens/Player/VideoAndControls/PlayPauseIcon/PlayPauseIcon.js @@ -36,7 +36,6 @@ export const PlayPauseIcon = ({ paused, handlePauseVideo, handlePlayVideo, disab hasTVPreferredFocus: !disabled, }} color={'primary'} - size={dimensions.ICON_SIZE_TV_MEDIUM} disabled={disabled} /> @@ -53,4 +52,4 @@ PlayPauseIcon.defaultProps = { paused: false, } -export default PlayPauseIcon +export default React.memo(PlayPauseIcon) From 8227e0c94d64156786beab02e4b44edeaa384edb Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Tue, 23 Feb 2021 21:05:39 +0100 Subject: [PATCH 12/12] chore: Update deps --- app/components/BaseButton/BaseButton.js | 5 +- package.json | 64 +- yarn.lock | 1479 ++++++++++++++--------- 3 files changed, 939 insertions(+), 609 deletions(-) diff --git a/app/components/BaseButton/BaseButton.js b/app/components/BaseButton/BaseButton.js index 5124418..664190b 100644 --- a/app/components/BaseButton/BaseButton.js +++ b/app/components/BaseButton/BaseButton.js @@ -1,15 +1,16 @@ import React from 'react' import PropTypes from 'prop-types' import { TouchableNativeFeedback } from 'react-native-gesture-handler' +import { TouchableNativeFeedback as RNTouchableNativeFeedback } from 'react-native' export const BaseButton = ({ children, component: Component, innerRef, rippleColor, rippleBorderless, ...rest }) => ( diff --git a/package.json b/package.json index dc095ee..d0ae753 100644 --- a/package.json +++ b/package.json @@ -30,15 +30,15 @@ "react-native-reanimated": "1.13.0" }, "dependencies": { - "@apollo/client": "^3.3.6", + "@apollo/client": "^3.3.11", "@react-native-community/async-storage": "1.12.1", "@react-native-community/masked-view": "^0.1.10", - "@react-native-community/netinfo": "5.9.9", + "@react-native-community/netinfo": "6.0.0", "@react-native-community/slider": "3.0.3", - "@react-navigation/native": "5.8.10", - "@react-navigation/stack": "5.12.8", + "@react-navigation/native": "5.9.3", + "@react-navigation/stack": "5.14.3", "apollo-cache-persist": "^0.1.1", - "graphql": "15.4.0", + "graphql": "15.5.0", "graphql-tag": "2.11.0", "hoist-non-react-statics": "3.3.2", "i18n-js": "3.8.0", @@ -48,7 +48,7 @@ "react": "17.0.1", "react-native": "0.63.4", "react-native-animatable": "1.3.3", - "react-native-device-info": "7.3.1", + "react-native-device-info": "8.0.1", "react-native-fs": "2.16.6", "react-native-gesture-handler": "1.8.0", "react-native-google-cast": "github:pct-org/react-native-google-cast#7e409ca7c129d628d5c2902944790bc611b64aaa", @@ -58,10 +58,10 @@ "react-native-orientation": "^3.1.3", "react-native-reanimated": "1.13.0", "react-native-safe-area-context": "3.1.9", - "react-native-screens": "2.16.1", + "react-native-screens": "2.17.1", "react-native-splash-screen": "3.2.0", "react-native-static-server": "0.5.0", - "react-native-vector-icons": "7.1.0", + "react-native-vector-icons": "8.1.0", "react-navigation-collapsible": "5.8.1", "reanimated-bottom-sheet": "^1.0.0-alpha.22", "redux-persist-fs-storage": "^1.3.0", @@ -69,47 +69,47 @@ "update-react-native-app": "^1.3.1" }, "devDependencies": { - "@babel/core": "7.12.10", - "@babel/plugin-proposal-class-properties": "7.12.1", - "@babel/plugin-proposal-decorators": "7.12.1", - "@babel/plugin-proposal-export-namespace-from": "7.12.1", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-transform-flow-strip-types": "7.12.10", - "@babel/plugin-transform-runtime": "7.12.10", - "@babel/preset-react": "7.12.10", - "@babel/runtime": "7.12.5", - "@commitlint/cli": "11.0.0", - "@commitlint/config-conventional": "11.0.0", - "@types/jest": "^26.0.19", - "@types/node": "^14.14.14", - "@types/react": "^17.0.0", - "@typescript-eslint/eslint-plugin": "^4.10.0", - "@typescript-eslint/parser": "^4.10.0", + "@babel/core": "7.13.1", + "@babel/plugin-proposal-class-properties": "7.13.0", + "@babel/plugin-proposal-decorators": "7.13.5", + "@babel/plugin-proposal-export-namespace-from": "7.12.13", + "@babel/plugin-proposal-object-rest-spread": "7.13.0", + "@babel/plugin-transform-flow-strip-types": "7.13.0", + "@babel/plugin-transform-runtime": "7.13.6", + "@babel/preset-react": "7.12.13", + "@babel/runtime": "7.13.6", + "@commitlint/cli": "12.0.0", + "@commitlint/config-conventional": "12.0.0", + "@types/jest": "^26.0.20", + "@types/node": "^14.14.31", + "@types/react": "^17.0.2", + "@typescript-eslint/eslint-plugin": "^4.15.2", + "@typescript-eslint/parser": "^4.15.2", "babel-eslint": "10.1.0", "babel-plugin-inline-import": "^3.0.0", "babel-plugin-module-resolver": "4.1.0", "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "1.15.5", - "eslint": "7.15.0", + "enzyme-adapter-react-16": "1.15.6", + "eslint": "7.20.0", "eslint-config-airbnb": "18.2.1", "eslint-config-standard": "16.0.2", "eslint-config-standard-react": "11.0.1", "eslint-plugin-babel": "5.3.1", "eslint-plugin-import": "2.22.1", - "eslint-plugin-jest": "24.1.3", + "eslint-plugin-jest": "24.1.5", "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "4.2.1", - "eslint-plugin-react": "7.21.5", + "eslint-plugin-promise": "4.3.1", + "eslint-plugin-react": "7.22.0", "eslint-plugin-standard": "5.0.0", - "get-dev-paths": "^0.1.1", + "get-dev-paths": "^0.2.0", "husky": "4.3.6", "jest": "26.6.3", "jest-enzyme": "^7.1.2", "jest-react-native": "^18.0.0", - "metro-react-native-babel-preset": "0.64.0", + "metro-react-native-babel-preset": "0.65.1", "mock-async-storage": "^2.2.0", "react-dom": "^17.0.1", "react-test-renderer": "17.0.1", - "typescript": "^4.1.3" + "typescript": "^4.1.5" } } diff --git a/yarn.lock b/yarn.lock index df381ba..ad9dd93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,25 +2,32 @@ # yarn lockfile v1 -"@apollo/client@^3.3.6": - version "3.3.6" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.6.tgz#f359646308167f38d5bc498dfc2344c888400093" - integrity sha512-XSm/STyNS8aHdDigLLACKNMHwI0qaQmEHWHtTP+jHe/E1wZRnn66VZMMgwKLy2V4uHISHfmiZ4KpUKDPeJAKqg== +"@apollo/client@^3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.11.tgz#125051405e83dc899d471d43b79fd6045d92a802" + integrity sha512-54+D5FB6RJlQ+g37f432gaexnyvDsG5X6L9VO5kqN54HJlbF8hCf/8CXtAQEHCWodAwZhy6kOLp2RM96829q3A== dependencies: "@graphql-typed-document-node/core" "^3.0.0" "@types/zen-observable" "^0.8.0" "@wry/context" "^0.5.2" "@wry/equality" "^0.3.0" fast-json-stable-stringify "^2.0.0" - graphql-tag "^2.11.0" + graphql-tag "^2.12.0" hoist-non-react-statics "^3.3.2" - optimism "^0.13.1" + optimism "^0.14.0" prop-types "^15.7.2" symbol-observable "^2.0.0" ts-invariant "^0.6.0" tslib "^1.10.0" zen-observable "^0.8.14" +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -28,25 +35,38 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/core@7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" - integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.10" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.10" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.10" - "@babel/types" "^7.12.10" +"@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/compat-data@^7.13.0": + version "7.13.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.6.tgz#11972d07db4c2317afdbf41d6feb3a730301ef4e" + integrity sha512-VhgqKOWYVm7lQXlvbJnWOzwfAQATd2nV52koT0HZ/LdDH0m4DUDwkKYsH+IwpXb+bKPyBJzawA4I6nBKqZcpQw== + +"@babel/core@7.13.1": + version "7.13.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.1.tgz#7ddd027176debe40f13bb88bac0c21218c5b1ecf" + integrity sha512-FzeKfFBG2rmFtGiiMdXZPFt/5R5DXubVi82uYhjGX4Msf+pgYQMCFIqFXZWs5vbIYbf14VeBIgdGI03CDOOM1w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.0" + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helpers" "^7.13.0" + "@babel/parser" "^7.13.0" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" lodash "^4.17.19" - semver "^5.4.1" + semver "7.0.0" source-map "^0.5.0" "@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.7.5": @@ -80,21 +100,12 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.10.tgz#2b188fc329fb8e4f762181703beffc0fe6df3460" - integrity sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww== +"@babel/generator@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.0.tgz#bd00d4394ca22f220390c56a0b5b85568ec1ec0c" + integrity sha512-zBZfgvBB/ywjx0Rgc2+BwoH/3H+lDtlgD4hBOpEv5LxRnYsm/753iRuLepqnYlynpjC3AdQxtxsoeHJoEEwOAw== dependencies: - "@babel/types" "^7.12.10" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" - integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== - dependencies: - "@babel/types" "^7.12.5" + "@babel/types" "^7.13.0" jsesc "^2.5.1" source-map "^0.5.0" @@ -105,12 +116,12 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-annotate-as-pure@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" - integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ== +"@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== dependencies: - "@babel/types" "^7.12.10" + "@babel/types" "^7.12.13" "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": version "7.10.4" @@ -129,24 +140,6 @@ "@babel/helper-module-imports" "^7.10.4" "@babel/types" "^7.10.5" -"@babel/helper-builder-react-jsx-experimental@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.10.tgz#a58cb96a793dc0fcd5c9ed3bb36d62fdc60534c2" - integrity sha512-3Kcr2LGpL7CTRDTTYm1bzeor9qZbxbvU2AxsLA6mUG9gYarSfIKMK0UlU+azLWI+s0+BH768bwyaziWB2NOJlQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.10" - "@babel/helper-module-imports" "^7.12.5" - "@babel/types" "^7.12.10" - -"@babel/helper-builder-react-jsx-experimental@^7.12.4": - version "7.12.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.12.4.tgz#55fc1ead5242caa0ca2875dcb8eed6d311e50f48" - integrity sha512-AjEa0jrQqNk7eDQOo0pTfUOwQBMF+xVqrausQwT9/rTKy0g04ggFNaJpaE09IQMn9yExluigWMJcj0WC7bq+Og== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-module-imports" "^7.12.1" - "@babel/types" "^7.12.1" - "@babel/helper-builder-react-jsx@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" @@ -155,6 +148,16 @@ "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-compilation-targets@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.0.tgz#c9cf29b82a76fd637f0faa35544c4ace60a155a1" + integrity sha512-SOWD0JK9+MMIhTQiUVd4ng8f3NXhPVQvTv7D3UN4wbp/6cAHnB2EmMaU1zZA2Hh1gwme+THBrVSqTFxHczTh0Q== + dependencies: + "@babel/compat-data" "^7.13.0" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "7.0.0" + "@babel/helper-create-class-features-plugin@^7.10.4", "@babel/helper-create-class-features-plugin@^7.10.5": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" @@ -167,16 +170,16 @@ "@babel/helper-replace-supers" "^7.10.4" "@babel/helper-split-export-declaration" "^7.10.4" -"@babel/helper-create-class-features-plugin@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" - integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== +"@babel/helper-create-class-features-plugin@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.0.tgz#28d04ad9cfbd1ed1d8b988c9ea7b945263365846" + integrity sha512-twwzhthM4/+6o9766AW2ZBHpIHPSGrPGk1+WfHiu13u/lBnggXGNYCpeAyVfNwGDKfkhEDp+WOD/xafoJ2iLjA== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-create-regexp-features-plugin@^7.10.4": version "7.10.4" @@ -196,6 +199,20 @@ "@babel/types" "^7.10.5" lodash "^4.17.19" +"@babel/helper-define-polyfill-provider@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.2.tgz#619f01afe1deda460676c25c463b42eaefdb71a2" + integrity sha512-hWeolZJivTNGHXHzJjQz/NwDaG4mGXf22ZroOP8bQYgvHNzaQ5tylsVbAcAS2oDjXBwpu8qH2I/654QFS2rDpw== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + "@babel/helper-explode-assignable-expression@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" @@ -213,6 +230,15 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-get-function-arity@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" @@ -220,6 +246,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz#172f56e7a63e78112f3a04055f24365af702e7ee" @@ -227,12 +260,12 @@ dependencies: "@babel/types" "^7.10.5" -"@babel/helper-member-expression-to-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" - integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ== +"@babel/helper-member-expression-to-functions@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" + integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.13.0" "@babel/helper-module-imports@^7.10.4": version "7.10.4" @@ -241,12 +274,12 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" - integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== +"@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== dependencies: - "@babel/types" "^7.12.5" + "@babel/types" "^7.12.13" "@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5": version "7.10.5" @@ -261,19 +294,19 @@ "@babel/types" "^7.10.5" lodash "^4.17.19" -"@babel/helper-module-transforms@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" - integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== - dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-simple-access" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/helper-validator-identifier" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" +"@babel/helper-module-transforms@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" + integrity sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" lodash "^4.17.19" "@babel/helper-optimise-call-expression@^7.10.4": @@ -283,11 +316,23 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== + "@babel/helper-regex@^7.10.4": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" @@ -316,15 +361,15 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-replace-supers@^7.12.1": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" - integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA== +"@babel/helper-replace-supers@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" + integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" "@babel/helper-simple-access@^7.10.4": version "7.10.4" @@ -334,12 +379,12 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helper-simple-access@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" - integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.13" "@babel/helper-split-export-declaration@^7.10.4": version "7.10.4" @@ -348,18 +393,28 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.12.13" "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + "@babel/helper-wrap-function@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" @@ -379,14 +434,14 @@ "@babel/traverse" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/helpers@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" - integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== +"@babel/helpers@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.0.tgz#7647ae57377b4f0408bf4f8a7af01c42e41badc0" + integrity sha512-aan1MeFPxFacZeSz6Ld7YZo5aPuqnKlD7+HZY75xQsueczFccP9A7V05+oe0XpLwHK3oLorPe9eaAUljL7WEaQ== dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" "@babel/highlight@^7.10.4": version "7.10.4" @@ -397,25 +452,24 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.10.5", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0": version "7.10.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== -"@babel/parser@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.10.tgz#824600d59e96aea26a5a2af5a9d812af05c3ae81" - integrity sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA== - -"@babel/parser@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" - integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== - -"@babel/parser@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" - integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== +"@babel/parser@^7.12.13", "@babel/parser@^7.13.0": + version "7.13.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.4.tgz#340211b0da94a351a6f10e63671fa727333d13ab" + integrity sha512-uvoOulWHhI+0+1f9L4BoozY7U5cIkZ9PgJqvb041d6vypgUmtVPG4vmGm4pSggjl8BELzvHyUeJSUyEMY6b+qA== "@babel/plugin-external-helpers@^7.0.0": version "7.10.4" @@ -424,13 +478,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-class-properties@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" - integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== +"@babel/plugin-proposal-class-properties@7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" + integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-proposal-class-properties@^7.0.0": version "7.10.4" @@ -440,14 +494,14 @@ "@babel/helper-create-class-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-decorators@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz#59271439fed4145456c41067450543aee332d15f" - integrity sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ== +"@babel/plugin-proposal-decorators@7.13.5": + version "7.13.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.5.tgz#d28071457a5ba8ee1394b23e38d5dcf32ea20ef7" + integrity sha512-i0GDfVNuoapwiheevUOuSW67mInqJ8qw7uWfpjNVeHMn143kXblEy/bmL9AdZ/0yf/4BMQeWXezK0tQIvNPqag== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-decorators" "^7.12.1" + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-decorators" "^7.12.13" "@babel/plugin-proposal-export-default-from@^7.0.0": version "7.10.4" @@ -457,12 +511,12 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-export-default-from" "^7.10.4" -"@babel/plugin-proposal-export-namespace-from@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" - integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== +"@babel/plugin-proposal-export-namespace-from@7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": @@ -473,14 +527,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== +"@babel/plugin-proposal-object-rest-spread@7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.0.tgz#8f19ad247bb96bd5ad2d4107e6eddfe0a789937b" + integrity sha512-B4qphdSTp0nLsWcuei07JPKeZej4+Hd22MdnulJXQa1nCcGSBlk8FiqenGERaPZ+PuYhz4Li2Wjc8yfJvHgUMw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.13.0" "@babel/plugin-proposal-object-rest-spread@^7.0.0": version "7.10.4" @@ -528,12 +582,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-decorators@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz#81a8b535b284476c41be6de06853a8802b98c5dd" - integrity sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w== +"@babel/plugin-syntax-decorators@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" + integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-dynamic-import@^7.0.0": version "7.8.3" @@ -563,12 +617,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-flow@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz#a77670d9abe6d63e8acadf4c31bb1eb5a506bbdd" - integrity sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA== +"@babel/plugin-syntax-flow@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86" + integrity sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -591,12 +645,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-jsx@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== +"@babel/plugin-syntax-jsx@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" + integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -720,13 +774,13 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-flow-strip-types@7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.10.tgz#d85e30ecfa68093825773b7b857e5085bbd32c95" - integrity sha512-0ti12wLTLeUIzu9U7kjqIn4MyOL7+Wibc7avsHhj4o1l5C0ATs8p2IMHrVYjm9t9wzhfEO6S3kxax0Rpdo8LTg== +"@babel/plugin-transform-flow-strip-types@7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz#58177a48c209971e8234e99906cb6bd1122addd3" + integrity sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-flow" "^7.12.1" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-flow" "^7.12.13" "@babel/plugin-transform-flow-strip-types@^7.0.0": version "7.10.4" @@ -798,12 +852,12 @@ "@babel/helper-get-function-arity" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-parameters@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" - integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== +"@babel/plugin-transform-parameters@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" + integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-property-literals@^7.0.0": version "7.10.4" @@ -819,21 +873,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-display-name@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" - integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== +"@babel/plugin-transform-react-display-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" + integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-react-jsx-development@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.7.tgz#4c2a647de79c7e2b16bfe4540677ba3121e82a08" - integrity sha512-Rs3ETtMtR3VLXFeYRChle5SsP/P9Jp/6dsewBQfokDSzKJThlsuFcnzLTDRALiUmTC48ej19YD9uN1mupEeEDg== +"@babel/plugin-transform-react-jsx-development@^7.12.12": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" + integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.12.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.12.1" + "@babel/plugin-transform-react-jsx" "^7.12.17" "@babel/plugin-transform-react-jsx-self@^7.0.0": version "7.10.4" @@ -861,15 +913,16 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.10.tgz#a7af3097c73479123594c8c8fe39545abebd44e3" - integrity sha512-MM7/BC8QdHXM7Qc1wdnuk73R4gbuOpfrSUgfV/nODGc86sPY1tgmY2M9E9uAnf2e4DOIp8aKGWqgZfQxnTNGuw== +"@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz#dd2c1299f5e26de584939892de3cfc1807a38f24" + integrity sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw== dependencies: - "@babel/helper-builder-react-jsx" "^7.10.4" - "@babel/helper-builder-react-jsx-experimental" "^7.12.10" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.12.1" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-jsx" "^7.12.13" + "@babel/types" "^7.12.17" "@babel/plugin-transform-react-pure-annotations@^7.12.1": version "7.12.1" @@ -886,14 +939,17 @@ dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-runtime@7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz#af0fded4e846c4b37078e8e5d06deac6cd848562" - integrity sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA== +"@babel/plugin-transform-runtime@7.13.6": + version "7.13.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.6.tgz#c11c806f023d2065bbcc9b751702f4008245951c" + integrity sha512-QsTomUTIeOdYrNsOMJRSp2QzGvB1KYD4ePCC8Mei2SuoHScncYS3h1E9PR5gDL7buJmcqIHrWyH6B5GZMgDrRg== dependencies: - "@babel/helper-module-imports" "^7.12.5" - "@babel/helper-plugin-utils" "^7.10.4" - semver "^5.5.1" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-polyfill-corejs2 "^0.1.4" + babel-plugin-polyfill-corejs3 "^0.1.3" + babel-plugin-polyfill-regenerator "^0.1.2" + semver "7.0.0" "@babel/plugin-transform-runtime@^7.0.0": version "7.10.5" @@ -952,15 +1008,15 @@ "@babel/helper-create-regexp-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/preset-react@7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.10.tgz#4fed65f296cbb0f5fb09de6be8cddc85cc909be9" - integrity sha512-vtQNjaHRl4DUpp+t+g4wvTHsLQuye+n0H/wsXIZRn69oz/fvNC7gQ4IK73zGJBaxvHoxElDvnYCthMcT7uzFoQ== +"@babel/preset-react@7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz#5f911b2eb24277fa686820d5bd81cad9a0602a0a" + integrity sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-display-name" "^7.12.1" - "@babel/plugin-transform-react-jsx" "^7.12.10" - "@babel/plugin-transform-react-jsx-development" "^7.12.7" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-react-display-name" "^7.12.13" + "@babel/plugin-transform-react-jsx" "^7.12.13" + "@babel/plugin-transform-react-jsx-development" "^7.12.12" "@babel/plugin-transform-react-pure-annotations" "^7.12.1" "@babel/register@^7.0.0": @@ -974,10 +1030,10 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== +"@babel/runtime@7.13.6": + version "7.13.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.6.tgz#86e0fad6cbb46a680e21c1aa4748717a058d345a" + integrity sha512-Y/DEVhSQ91u27rxq7D0EH/sewS6+x06p/MgO1VppbDHMzYXLZrAR5cFjCom78e9RUw1BQAq6qJg6fXc/ep7glA== dependencies: regenerator-runtime "^0.13.4" @@ -988,13 +1044,6 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.11.2": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" - integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/template@^7.0.0", "@babel/template@^7.10.4", "@babel/template@^7.3.3", "@babel/template@^7.4.0": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" @@ -1004,14 +1053,14 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/template@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" - integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.10.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0": version "7.10.5" @@ -1028,32 +1077,17 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" - integrity sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.5" - "@babel/types" "^7.12.5" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.10.tgz#2d1f4041e8bf42ea099e5b2dc48d6a594c00017a" - integrity sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.10" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.10" - "@babel/types" "^7.12.10" +"@babel/traverse@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" + integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.0" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.13.0" + "@babel/types" "^7.13.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" @@ -1067,39 +1101,12 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== +"@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" + integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.1", "@babel/types@^7.12.5": - version "7.12.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" - integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.10.tgz#7965e4a7260b26f09c56bcfcb0498af1f6d9b260" - integrity sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" - integrity sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.12.11" lodash "^4.17.19" to-fast-properties "^2.0.0" @@ -1116,141 +1123,143 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@commitlint/cli@11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-11.0.0.tgz#698199bc52afed50aa28169237758fa14a67b5d3" - integrity sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g== - dependencies: - "@babel/runtime" "^7.11.2" - "@commitlint/format" "^11.0.0" - "@commitlint/lint" "^11.0.0" - "@commitlint/load" "^11.0.0" - "@commitlint/read" "^11.0.0" - chalk "4.1.0" - core-js "^3.6.1" +"@commitlint/cli@12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-12.0.0.tgz#bd389db0718aa4a7dfb515ea890776223ea0c60f" + integrity sha512-9jxKu6PmBUeQIbSD7olsv8wSqFnFsGwKMN9sL5T1d5YZDCocFMgfeyDGtOwuiATsox7Mje+NucQ4zU1y0530Dw== + dependencies: + "@commitlint/format" "^12.0.0" + "@commitlint/lint" "^12.0.0" + "@commitlint/load" "^12.0.0" + "@commitlint/read" "^12.0.0" + "@commitlint/types" "^12.0.0" get-stdin "8.0.0" lodash "^4.17.19" resolve-from "5.0.0" resolve-global "1.0.0" - yargs "^15.1.0" + yargs "^16.0.0" -"@commitlint/config-conventional@11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz#3fa300a1b639273946de3c3f15e1cda518333422" - integrity sha512-SNDRsb5gLuDd2PL83yCOQX6pE7gevC79UPFx+GLbLfw6jGnnbO9/tlL76MLD8MOViqGbo7ZicjChO9Gn+7tHhA== +"@commitlint/config-conventional@12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-12.0.0.tgz#3244957b87b92dc2f4feb46059cdeb950783198f" + integrity sha512-zjTeCBlHEP0syW6QedRSxOiafYeuOol9vIXZ89uhKMhyejaKxdAnS3SBMN4fYiSFChsZEl+VshJeZDtUFkCd7Q== dependencies: conventional-changelog-conventionalcommits "^4.3.1" -"@commitlint/ensure@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-11.0.0.tgz#3e796b968ab5b72bc6f8a6040076406306c987fb" - integrity sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug== +"@commitlint/ensure@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-12.0.0.tgz#a019bd4f4a2ea81ca3883d5f9c13bf70e786ff7f" + integrity sha512-xTPjd2cw8WOLtcrp5C3S+GtmGzA+TJjlNwqgYP61jmitLiDsTs69qNcysR9vPTyIjA1EQio4iff1bpAoilTbcg== dependencies: - "@commitlint/types" "^11.0.0" + "@commitlint/types" "^12.0.0" lodash "^4.17.19" -"@commitlint/execute-rule@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz#3ed60ab7a33019e58d90e2d891b75d7df77b4b4d" - integrity sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ== +"@commitlint/execute-rule@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-12.0.0.tgz#4469e0c606f523d6b92e395b0fdb0701e7aa6334" + integrity sha512-X9vZDKdyOz8MNDZqJN39K9UbjQmMsyQ74d1lUaw0QuCE4jOesmynYkLc4Y4MWKqq9ElWdjswZyLMyOgm3kAMrg== -"@commitlint/format@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-11.0.0.tgz#ac47b0b9ca46540c0082c721b290794e67bdc51b" - integrity sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg== +"@commitlint/format@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-12.0.0.tgz#d364c631aa35aa84f32a8afa8218a0da9f7a2ba6" + integrity sha512-otQHHx1KtT7UlO8igYeqxfatVFni6T8Nq8OPhwUHGrp8VYMorFSKUWrVpDtPtTAzRBj7e/ZtxCUOWck9Lwm7ug== dependencies: - "@commitlint/types" "^11.0.0" + "@commitlint/types" "^12.0.0" chalk "^4.0.0" -"@commitlint/is-ignored@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz#7b803eda56276dbe7fec51eb1510676198468f39" - integrity sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg== - dependencies: - "@commitlint/types" "^11.0.0" - semver "7.3.2" - -"@commitlint/lint@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-11.0.0.tgz#01e062cd1b0e7c3d756aa2c246462e0b6a3348a4" - integrity sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ== - dependencies: - "@commitlint/is-ignored" "^11.0.0" - "@commitlint/parse" "^11.0.0" - "@commitlint/rules" "^11.0.0" - "@commitlint/types" "^11.0.0" - -"@commitlint/load@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-11.0.0.tgz#f736562f0ffa7e773f8808fea93319042ee18211" - integrity sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg== - dependencies: - "@commitlint/execute-rule" "^11.0.0" - "@commitlint/resolve-extends" "^11.0.0" - "@commitlint/types" "^11.0.0" - chalk "4.1.0" +"@commitlint/is-ignored@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-12.0.0.tgz#94ec9a2995f7fb35bb197c755796fa0eafa2ae09" + integrity sha512-jo1/ee0Ly8ySG+FvAWPFq2Bt4Xdx7tyDDnwuclDw1yatv9Tu7CVSN4ae9FNiU2dVLzqIoIxCFwu9YMaMmnT+Lg== + dependencies: + "@commitlint/types" "^12.0.0" + semver "7.3.4" + +"@commitlint/lint@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-12.0.0.tgz#6c05432beeb45202eaecbf0366807397d46ad984" + integrity sha512-/qPhiMBoAiaBmirxQKEf8iRy2B/PvU7xgNfRI4Gy5X9hx3xRwzZHVDTs6YjTZVRCD/9i6C8ZDMUuEM5Fk0pRyQ== + dependencies: + "@commitlint/is-ignored" "^12.0.0" + "@commitlint/parse" "^12.0.0" + "@commitlint/rules" "^12.0.0" + "@commitlint/types" "^12.0.0" + +"@commitlint/load@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-12.0.0.tgz#d0cd58bd6c3f5184ae542b6fbcdea37c5c671e32" + integrity sha512-B7rwRGWE3j+4dWsLD4s82fIbIJP1xGOJYfAvKDWOa/FnAb8s8ZQOK8HHuDC8BD/MU3Ierl8KJMfzGiO63d1rlA== + dependencies: + "@commitlint/execute-rule" "^12.0.0" + "@commitlint/resolve-extends" "^12.0.0" + "@commitlint/types" "^12.0.0" + chalk "^4.0.0" cosmiconfig "^7.0.0" lodash "^4.17.19" resolve-from "^5.0.0" -"@commitlint/message@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-11.0.0.tgz#83554c3cbbc884fd07b473593bc3e94bcaa3ee05" - integrity sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA== +"@commitlint/message@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-12.0.0.tgz#37587f487961e89e13ef0fe90ba66ca91b901a1e" + integrity sha512-jSyL6Po/IsYin6OGoeazcUDkxTYW4l83c2HiUoBKLYgvzMLyCy5jrW/ijKXK6hC/9A0nY00Zdi4iY7pA0gNSuA== -"@commitlint/parse@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-11.0.0.tgz#d18b08cf67c35d02115207d7009306a2e8e7c901" - integrity sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A== +"@commitlint/parse@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-12.0.0.tgz#e4d1ba1333c6c41ad9d1c1d2469b7c378ed36a52" + integrity sha512-CcSNSwQlKTJtnPPaGlKrClV4wOPUKH5fZ2AE+M+QQlTcp5IchgASzpqwPjMaeeP5FwnBiDZ98AtV9ZqqkKy2kg== dependencies: - conventional-changelog-angular "^5.0.0" + "@commitlint/types" "^12.0.0" + conventional-changelog-angular "^5.0.11" conventional-commits-parser "^3.0.0" -"@commitlint/read@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-11.0.0.tgz#f24240548c63587bba139fa5a364cab926077016" - integrity sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g== +"@commitlint/read@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-12.0.0.tgz#556894663614b1a22156673250e517be18f657c6" + integrity sha512-xOply23eCsbIvqXMkrjrxhryClBu6rRPhEVxahihhcNQ2x9SskHTlEr3o6BljqCWfIxNNZL9s2TVqkOjEmkskw== dependencies: - "@commitlint/top-level" "^11.0.0" + "@commitlint/top-level" "^12.0.0" + "@commitlint/types" "^12.0.0" fs-extra "^9.0.0" git-raw-commits "^2.0.0" -"@commitlint/resolve-extends@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz#158ecbe27d4a2a51d426111a01478e216fbb1036" - integrity sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw== +"@commitlint/resolve-extends@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-12.0.0.tgz#78b5c53c9b3ab496095b5ff612a5e6693f32250c" + integrity sha512-5i0ZieVFzXuRqyYxnoEJ7InYyXQC/K98nF75Ro6wVQqpmzi01/KHYwo8uCcy1Q+rPB48FSmCB84br0t5Ulr/KA== dependencies: import-fresh "^3.0.0" lodash "^4.17.19" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-11.0.0.tgz#bdb310cc6fc55c9f8d7d917a22b69055c535c375" - integrity sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA== +"@commitlint/rules@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-12.0.0.tgz#81bfb00adbd9a4c876be40f30eaf8dd5938a5a41" + integrity sha512-VO9UqtivXRMko7GpgUOkKSixWuihKxJYmLBrcdw5TcPD8Ott0wgFGWE65n67wTfikW7aLZLzGiybuopZHIdP/w== dependencies: - "@commitlint/ensure" "^11.0.0" - "@commitlint/message" "^11.0.0" - "@commitlint/to-lines" "^11.0.0" - "@commitlint/types" "^11.0.0" + "@commitlint/ensure" "^12.0.0" + "@commitlint/message" "^12.0.0" + "@commitlint/to-lines" "^12.0.0" + "@commitlint/types" "^12.0.0" -"@commitlint/to-lines@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-11.0.0.tgz#86dea151c10eea41e39ea96fa4de07839258a7fe" - integrity sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw== +"@commitlint/to-lines@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-12.0.0.tgz#b015bf50ae4e652e8254c145329072723a88e070" + integrity sha512-hRZQTDkBUA7eDDlvbRLrXl/HRK3yA6Cbnd+TvxDc79MlsMH5affLtDfdJICE8SSkN2AFxIzHcSysBPxJvSvcKQ== -"@commitlint/top-level@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-11.0.0.tgz#bb2d1b6e5ed3be56874633b59e1f7de118c32783" - integrity sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA== +"@commitlint/top-level@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-12.0.0.tgz#9076da970d3c44df3a83051405f4e6841a35cc37" + integrity sha512-Y7UfYZyi0q+jj0Yh81HVtTvstupVh6b+a7eUnSvmAWyDdMRfVBoE2hjuT6DY3W2xv1xuJ4DUHJu64BUr6FOkMQ== dependencies: find-up "^5.0.0" -"@commitlint/types@^11.0.0": - version "11.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" - integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== +"@commitlint/types@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-12.0.0.tgz#c7f27b87e3ceac08a9b8a6f200054709c2a64271" + integrity sha512-ADW/GEwDdgf7ppNq+S2T8J6XgATi2yndXddu+ZV8wlHFpL1DhjPbuPA9RYLnJcp44xQSe/cEV7a7Z43Ryy1S9Q== + dependencies: + chalk "^4.0.0" "@egjs/hammerjs@^2.0.17": version "2.0.17" @@ -1259,10 +1268,10 @@ dependencies: "@types/hammerjs" "^2.0.36" -"@eslint/eslintrc@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" - integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== +"@eslint/eslintrc@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" + integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -1271,7 +1280,7 @@ ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" - lodash "^4.17.19" + lodash "^4.17.20" minimatch "^3.0.4" strip-json-comments "^3.1.1" @@ -1738,47 +1747,47 @@ resolved "https://registry.yarnpkg.com/@react-native-community/masked-view/-/masked-view-0.1.10.tgz#5dda643e19e587793bc2034dd9bf7398ad43d401" integrity sha512-rk4sWFsmtOw8oyx8SD3KSvawwaK7gRBSEIy2TAwURyGt+3TizssXP1r8nx3zY+R7v2vYYHXZ+k2/GULAT/bcaQ== -"@react-native-community/netinfo@5.9.9": - version "5.9.9" - resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-5.9.9.tgz#5e022637f5e08bd74bf94a0c3315748acd4589f9" - integrity sha512-Gp0XV4BgabvzkL4Dp6JAsA2l9LcmgBAq3erCLdvRZmEFz7guCWTogQWVfFtl+IbU0uqfwfo9fm2+mQiwdudLCw== +"@react-native-community/netinfo@6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-6.0.0.tgz#2a4d7190b508dd0c2293656c9c1aa068f6f60a71" + integrity sha512-Z9M8VGcF2IZVOo2x+oUStvpCW/8HjIRi4+iQCu5n+PhC7OqCQX58KYAzdBr///alIfRXiu6oMb+lK+rXQH1FvQ== "@react-native-community/slider@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@react-native-community/slider/-/slider-3.0.3.tgz#830167fd757ba70ac638747ba3169b2dbae60330" integrity sha512-8IeHfDwJ9/CTUwFs6x90VlobV3BfuPgNLjTgC6dRZovfCWigaZwVNIFFJnHBakK3pW2xErAPwhdvNR4JeNoYbw== -"@react-navigation/core@^5.14.4": - version "5.14.4" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-5.14.4.tgz#f63a2cd214bddbd25e1181f9335c32dfc3b6460f" - integrity sha512-MzZU9PO1a/6f9KdN04dC/E4BNl6M1Ba0Tb4sQdl/32y0hM2ToxlrKcERnTLWGFIbQV+9ZV1GTrp3mlGS6U9Jpw== +"@react-navigation/core@^5.15.2": + version "5.15.2" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-5.15.2.tgz#6aa374c7bcb6ffcaac8e2a7f8bdb2f9aba469b31" + integrity sha512-jNSP0FMu1N6Pa1Slsy8b/JbmlTAXcVeXVwnxrEMVGWeiNqUVYl+tx1FuQAqi3q1m4cg9ygXkGsgLgRmnXAEC8g== dependencies: - "@react-navigation/routers" "^5.6.2" + "@react-navigation/routers" "^5.7.2" escape-string-regexp "^4.0.0" nanoid "^3.1.15" query-string "^6.13.6" react-is "^16.13.0" -"@react-navigation/native@5.8.10": - version "5.8.10" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-5.8.10.tgz#3fe806abff9efb085bcf595212803dd05a1347ca" - integrity sha512-OUgD1o+y7PwmhRIRqQxN0SQvVU/SHic/ek/qMvBZX8nu5/WlBNxmNRMHVxONgHlG3AQZh27NUs9ynntL7ek1zQ== +"@react-navigation/native@5.9.3": + version "5.9.3" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-5.9.3.tgz#3859f439adc9a744b79a98fbc7606bdd459574d5" + integrity sha512-xaRlCDRVuFGxHsP/IetwLdNvLJwIJBYCUIx/ufWs6QkT9Q0EB0DtKzXCItuHydjMEVPd1Cy7lfjUlSM6hZ6Q3Q== dependencies: - "@react-navigation/core" "^5.14.4" + "@react-navigation/core" "^5.15.2" escape-string-regexp "^4.0.0" nanoid "^3.1.15" -"@react-navigation/routers@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-5.6.2.tgz#accc008c3b777f74d998e16cb2ea8e4c1fe8d9aa" - integrity sha512-XBcDKXS5s4MaHFufN44LtbXqFDH/nUHfHjbwG85fP3k772oRyPRgbnUb2mbw5MFGqORla9T7uymR6Gh6uwIwVw== +"@react-navigation/routers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-5.7.2.tgz#069d0a707b30ba2e27a32b6482531d0ff7317136" + integrity sha512-BxNSMLHpU+oS37Xok0ql6rc9U7IC8aUD4+U5ZPbjDJ0pwzZxGGh0YOEBzfV4k/Ig3cbPdvVWbc1C9HHbCVr2oQ== dependencies: nanoid "^3.1.15" -"@react-navigation/stack@5.12.8": - version "5.12.8" - resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-5.12.8.tgz#31e54e05d8a3ffaaa3e39a1a9b7969f8316a35bf" - integrity sha512-wUJFbU0v606RBXOUxHToCXJNmiwxtFYhN2TFvjxCZ3PJU+OWWx8HTmn99pT3rVH4Ax2cfO5BDUy9v+r74ZrIWw== +"@react-navigation/stack@5.14.3": + version "5.14.3" + resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-5.14.3.tgz#3d15fcd2cf8d0d2a1248686565c6a85e2d8e1c55" + integrity sha512-7rHc13DHsYP7l7GcgBcLEyX2/IAuCcRZ1Iu3MtOZSayjvFXxBBYKFKw0OyY9NxOfZUdLl3Q3mLiUHVFZkHMcuA== dependencies: color "^3.1.3" react-native-iphone-x-helper "^1.3.0" @@ -1881,10 +1890,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^26.0.19": - version "26.0.19" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.19.tgz#e6fa1e3def5842ec85045bd5210e9bb8289de790" - integrity sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ== +"@types/jest@^26.0.20": + version "26.0.20" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.20.tgz#cd2f2702ecf69e86b586e1f5223a60e454056307" + integrity sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA== dependencies: jest-diff "^26.0.0" pretty-format "^26.0.0" @@ -1914,10 +1923,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.24.tgz#b0f86f58564fa02a28b68f8b55d4cdec42e3b9d6" integrity sha512-btt/oNOiDWcSuI721MdL8VQGnjsKjlTMdrKyTcLCKeQp/n4AAMFJ961wMbp+09y8WuGPClDEv07RIItdXKIXAA== -"@types/node@^14.14.14": - version "14.14.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz#f7fd5f3cc8521301119f63910f0fb965c7d761ae" - integrity sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ== +"@types/node@^14.14.31": + version "14.14.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.31.tgz#72286bd33d137aa0d152d47ec7c1762563d34055" + integrity sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1954,10 +1963,10 @@ "@types/prop-types" "*" csstype "^2.2.0" -"@types/react@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.0.tgz#5af3eb7fad2807092f0046a1302b7823e27919b8" - integrity sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw== +"@types/react@^17.0.2": + version "17.0.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.2.tgz#3de24c4efef902dd9795a49c75f760cbe4f7a5a8" + integrity sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA== dependencies: "@types/prop-types" "*" csstype "^3.0.2" @@ -2001,28 +2010,29 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== -"@typescript-eslint/eslint-plugin@^4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.10.0.tgz#19ed3baf4bc4232c5a7fcd32eaca75c3a5baf9f3" - integrity sha512-h6/V46o6aXpKRlarP1AiJEXuCJ7cMQdlpfMDrcllIgX3dFkLwEBTXAoNP98ZoOmqd1xvymMVRAI4e7yVvlzWEg== +"@typescript-eslint/eslint-plugin@^4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.2.tgz#981b26b4076c62a5a55873fbef3fe98f83360c61" + integrity sha512-uiQQeu9tWl3f1+oK0yoAv9lt/KXO24iafxgQTkIYO/kitruILGx3uH+QtIAHqxFV+yIsdnJH+alel9KuE3J15Q== dependencies: - "@typescript-eslint/experimental-utils" "4.10.0" - "@typescript-eslint/scope-manager" "4.10.0" + "@typescript-eslint/experimental-utils" "4.15.2" + "@typescript-eslint/scope-manager" "4.15.2" debug "^4.1.1" functional-red-black-tree "^1.0.1" + lodash "^4.17.15" regexpp "^3.0.0" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.10.0.tgz#dbf5d0f89802d5feaf7d11e5b32df29bbc2f3a0e" - integrity sha512-opX+7ai1sdWBOIoBgpVJrH5e89ra1KoLrJTz0UtWAa4IekkKmqDosk5r6xqRaNJfCXEfteW4HXQAwMdx+jjEmw== +"@typescript-eslint/experimental-utils@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.2.tgz#5efd12355bd5b535e1831282e6cf465b9a71cf36" + integrity sha512-Fxoshw8+R5X3/Vmqwsjc8nRO/7iTysRtDqx6rlfLZ7HbT8TZhPeQqbPjTyk2RheH3L8afumecTQnUc9EeXxohQ== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.10.0" - "@typescript-eslint/types" "4.10.0" - "@typescript-eslint/typescript-estree" "4.10.0" + "@typescript-eslint/scope-manager" "4.15.2" + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/typescript-estree" "4.15.2" eslint-scope "^5.0.0" eslint-utils "^2.0.0" @@ -2038,23 +2048,23 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.10.0.tgz#1a622b0847b765b2d8f0ede6f0cdd85f03d76031" - integrity sha512-amBvUUGBMadzCW6c/qaZmfr3t9PyevcSWw7hY2FuevdZVp5QPw/K76VSQ5Sw3BxlgYCHZcK6DjIhSZK0PQNsQg== +"@typescript-eslint/parser@^4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.15.2.tgz#c804474321ef76a3955aec03664808f0d6e7872e" + integrity sha512-SHeF8xbsC6z2FKXsaTb1tBCf0QZsjJ94H6Bo51Y1aVEZ4XAefaw5ZAilMoDPlGghe+qtq7XdTiDlGfVTOmvA+Q== dependencies: - "@typescript-eslint/scope-manager" "4.10.0" - "@typescript-eslint/types" "4.10.0" - "@typescript-eslint/typescript-estree" "4.10.0" + "@typescript-eslint/scope-manager" "4.15.2" + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/typescript-estree" "4.15.2" debug "^4.1.1" -"@typescript-eslint/scope-manager@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.10.0.tgz#dbd7e1fc63d7363e3aaff742a6f2b8afdbac9d27" - integrity sha512-WAPVw35P+fcnOa8DEic0tQUhoJJsgt+g6DEcz257G7vHFMwmag58EfowdVbiNcdfcV27EFR0tUBVXkDoIvfisQ== +"@typescript-eslint/scope-manager@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.15.2.tgz#5725bda656995960ae1d004bfd1cd70320f37f4f" + integrity sha512-Zm0tf/MSKuX6aeJmuXexgdVyxT9/oJJhaCkijv0DvJVT3ui4zY6XYd6iwIo/8GEZGy43cd7w1rFMiCLHbRzAPQ== dependencies: - "@typescript-eslint/types" "4.10.0" - "@typescript-eslint/visitor-keys" "4.10.0" + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/visitor-keys" "4.15.2" "@typescript-eslint/scope-manager@4.2.0": version "4.2.0" @@ -2064,27 +2074,26 @@ "@typescript-eslint/types" "4.2.0" "@typescript-eslint/visitor-keys" "4.2.0" -"@typescript-eslint/types@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.10.0.tgz#12f983750ebad867f0c806e705c1953cd6415789" - integrity sha512-+dt5w1+Lqyd7wIPMa4XhJxUuE8+YF+vxQ6zxHyhLGHJjHiunPf0wSV8LtQwkpmAsRi1lEOoOIR30FG5S2HS33g== +"@typescript-eslint/types@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.15.2.tgz#04acf3a2dc8001a88985291744241e732ef22c60" + integrity sha512-r7lW7HFkAarfUylJ2tKndyO9njwSyoy6cpfDKWPX6/ctZA+QyaYscAHXVAfJqtnY6aaTwDYrOhp+ginlbc7HfQ== "@typescript-eslint/types@4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.2.0.tgz#6f6b094329e72040f173123832397c7c0b910fc8" integrity sha512-xkv5nIsxfI/Di9eVwN+G9reWl7Me9R5jpzmZUch58uQ7g0/hHVuGUbbn4NcxcM5y/R4wuJIIEPKPDb5l4Fdmwg== -"@typescript-eslint/typescript-estree@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.10.0.tgz#1e62e45fd57866afd42daf5e9fb6bd4e8dbcfa75" - integrity sha512-mGK0YRp9TOk6ZqZ98F++bW6X5kMTzCRROJkGXH62d2azhghmq+1LNLylkGe6uGUOQzD452NOAEth5VAF6PDo5g== +"@typescript-eslint/typescript-estree@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.2.tgz#c2f7a1e94f3428d229d5ecff3ead6581ee9b62fa" + integrity sha512-cGR8C2g5SPtHTQvAymEODeqx90pJHadWsgTtx6GbnTWKqsg7yp6Eaya9nFzUd4KrKhxdYTTFBiYeTPQaz/l8bw== dependencies: - "@typescript-eslint/types" "4.10.0" - "@typescript-eslint/visitor-keys" "4.10.0" + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/visitor-keys" "4.15.2" debug "^4.1.1" globby "^11.0.1" is-glob "^4.0.1" - lodash "^4.17.15" semver "^7.3.2" tsutils "^3.17.1" @@ -2102,12 +2111,12 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/visitor-keys@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.10.0.tgz#9478822329a9bc8ebcc80623d7f79a01da5ee451" - integrity sha512-hPyz5qmDMuZWFtHZkjcCpkAKHX8vdu1G3YsCLEd25ryZgnJfj6FQuJ5/O7R+dB1ueszilJmAFMtlU4CA6se3Jg== +"@typescript-eslint/visitor-keys@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.2.tgz#3d1c7979ce75bf6acf9691109bd0d6b5706192b9" + integrity sha512-TME1VgSb7wTwgENN5KVj4Nqg25hP8DisXxNBojM4Nn31rYaNDIocNm5cmjOFfh42n7NVERxWrDFoETO/76ePyg== dependencies: - "@typescript-eslint/types" "4.10.0" + "@typescript-eslint/types" "4.15.2" eslint-visitor-keys "^2.0.0" "@typescript-eslint/visitor-keys@4.2.0": @@ -2137,6 +2146,13 @@ dependencies: tslib "^1.9.3" +"@wry/trie@^0.2.1": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.2.2.tgz#99f20f0fcbbcda17006069b155c826cbabfc402f" + integrity sha512-OxqBB39x6MfHaa2HpMiRMfhuUnQTddD32Ko020eBeJXq87ivX6xnSSnzKHVbA21p7iqBASz8n/07b6W5wW1BVQ== + dependencies: + tslib "^1.14.1" + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -2241,7 +2257,7 @@ airbnb-prop-types@^2.16.0: prop-types-exact "^1.2.0" react-is "^16.13.1" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: +ajv@^6.10.0, ajv@^6.5.5: version "6.12.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== @@ -2261,6 +2277,16 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^7.0.2: + version "7.1.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.1.tgz#1e6b37a454021fa9941713f38b952fc1c8d32a84" + integrity sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + anser@^1.4.9: version "1.4.9" resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" @@ -2527,6 +2553,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -2646,6 +2677,30 @@ babel-plugin-module-resolver@4.1.0: reselect "^4.0.0" resolve "^1.13.1" +babel-plugin-polyfill-corejs2@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.5.tgz#8fc4779965311393594a1b9ad3adefab3860c8fe" + integrity sha512-5IzdFIjYWqlOFVr/hMYUpc+5fbfuvJTAISwIY58jhH++ZtawtNlcJnxAixlk8ahVwHCz1ipW/kpXYliEBp66wg== + dependencies: + "@babel/compat-data" "^7.13.0" + "@babel/helper-define-polyfill-provider" "^0.1.2" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.4.tgz#2ae290200e953bade30907b7a3bebcb696e6c59d" + integrity sha512-ysSzFn/qM8bvcDAn4mC7pKk85Y5dVaoa9h4u0mHxOEpDzabsseONhUpR7kHxpUinfj1bjU7mUZqD23rMZBoeSg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.2" + core-js-compat "^3.8.1" + +babel-plugin-polyfill-regenerator@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.3.tgz#350f857225fc640ae1ec78d1536afcbb457db841" + integrity sha512-hRjTJQiOYt/wBKEc+8V8p9OJ9799blAJcuKzn1JXh3pApHoWl1Emxh2BHc6MC7Qt6bbr3uDpNxaYQnATLIudEg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.2" + babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: version "7.0.0-beta.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" @@ -2817,6 +2872,17 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browserslist@^4.14.5, browserslist@^4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -2862,6 +2928,14 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.0" +call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -2905,6 +2979,11 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== +caniuse-lite@^1.0.30001181: + version "1.0.30001191" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz#bacb432b6701f690c8c5f7c680166b9a9f0843d9" + integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -2917,14 +2996,6 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@4.1.0, chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2942,6 +3013,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -3024,6 +3103,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -3092,7 +3180,7 @@ color@^3.1.3: color-convert "^1.9.1" color-string "^1.5.4" -colorette@^1.0.7: +colorette@^1.0.7, colorette@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== @@ -3197,10 +3285,10 @@ contains-path@^0.1.0: resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= -conventional-changelog-angular@^5.0.0: - version "5.0.11" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz#99a3ca16e4a5305e0c2c2fae3ef74fd7631fc3fb" - integrity sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw== +conventional-changelog-angular@^5.0.11: + version "5.0.12" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" + integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== dependencies: compare-func "^2.0.0" q "^1.5.1" @@ -3239,16 +3327,19 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-js-compat@^3.8.1: + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.0.tgz#29da39385f16b71e1915565aa0385c4e0963ad56" + integrity sha512-YK6fwFjCOKWwGnjFUR3c544YsnA/7DoLL0ysncuOJ4pwbriAtOpvM2bygdlcXbvQCQZ7bBU9CL4t7tGl7ETRpQ== + dependencies: + browserslist "^4.16.3" + semver "7.0.0" + core-js@^2.2.2, core-js@^2.4.1: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.6.1: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" - integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -3642,6 +3733,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.3.649: + version "1.3.672" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.672.tgz#3a6e335016dab4bc584d5292adc4f98f54541f6a" + integrity sha512-gFQe7HBb0lbOMqK2GAS5/1F+B0IMdYiAgB9OT/w1F4M7lgJK2aNOMNOM622aEax+nS1cTMytkiT0uMOkbtFmHw== + emittery@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" @@ -3698,30 +3794,31 @@ envinfo@^7.7.2: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc" integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA== -enzyme-adapter-react-16@1.15.5: - version "1.15.5" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.5.tgz#7a6f0093d3edd2f7025b36e7fbf290695473ee04" - integrity sha512-33yUJGT1nHFQlbVI5qdo5Pfqvu/h4qPwi1o0a6ZZsjpiqq92a3HjynDhwd1IeED+Su60HDWV8mxJqkTnLYdGkw== +enzyme-adapter-react-16@1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz#fd677a658d62661ac5afd7f7f541f141f8085901" + integrity sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g== dependencies: - enzyme-adapter-utils "^1.13.1" + enzyme-adapter-utils "^1.14.0" enzyme-shallow-equal "^1.0.4" has "^1.0.3" - object.assign "^4.1.0" - object.values "^1.1.1" + object.assign "^4.1.2" + object.values "^1.1.2" prop-types "^15.7.2" react-is "^16.13.1" react-test-renderer "^16.0.0-0" semver "^5.7.0" -enzyme-adapter-utils@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.1.tgz#59c1b734b0927543e3d8dc477299ec957feb312d" - integrity sha512-5A9MXXgmh/Tkvee3bL/9RCAAgleHqFnsurTYCbymecO4ohvtNO5zqIhHxV370t7nJAwaCfkgtffarKpC0GPt0g== +enzyme-adapter-utils@^1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz#afbb0485e8033aa50c744efb5f5711e64fbf1ad0" + integrity sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg== dependencies: airbnb-prop-types "^2.16.0" - function.prototype.name "^1.1.2" - object.assign "^4.1.0" - object.fromentries "^2.0.2" + function.prototype.name "^1.1.3" + has "^1.0.3" + object.assign "^4.1.2" + object.fromentries "^2.0.3" prop-types "^15.7.2" semver "^5.7.1" @@ -3817,6 +3914,26 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstrac string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" +es-abstract@^1.18.0-next.2: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.1" + is-regex "^1.1.1" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -3826,6 +3943,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -3936,10 +4058,10 @@ eslint-plugin-import@2.22.1: resolve "^1.17.0" tsconfig-paths "^3.9.0" -eslint-plugin-jest@24.1.3: - version "24.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.3.tgz#fa3db864f06c5623ff43485ca6c0e8fc5fe8ba0c" - integrity sha512-dNGGjzuEzCE3d5EPZQ/QGtmlMotqnYWD/QpCZ1UuZlrMAdhG5rldh0N0haCvhGnUkSeuORS5VNROwF9Hrgn3Lg== +eslint-plugin-jest@24.1.5: + version "24.1.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.5.tgz#1e866a9f0deac587d0a3d5d7cefe99815a580de2" + integrity sha512-FIP3lwC8EzEG+rOs1y96cOJmMVpdFNreoDJv29B5vIupVssRi8zrSY3QadogT0K3h1Y8TMxJ6ZSAzYUmFCp2hg== dependencies: "@typescript-eslint/experimental-utils" "^4.0.1" @@ -3955,15 +4077,15 @@ eslint-plugin-node@11.1.0: resolve "^1.10.1" semver "^6.1.0" -eslint-plugin-promise@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" - integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== +eslint-plugin-promise@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45" + integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== -eslint-plugin-react@7.21.5: - version "7.21.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz#50b21a412b9574bfe05b21db176e8b7b3b15bff3" - integrity sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g== +eslint-plugin-react@7.22.0: + version "7.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" + integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== dependencies: array-includes "^3.1.1" array.prototype.flatmap "^1.2.3" @@ -4020,13 +4142,13 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.15.0: - version "7.15.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.15.0.tgz#eb155fb8ed0865fcf5d903f76be2e5b6cd7e0bc7" - integrity sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA== +eslint@7.20.0: + version "7.20.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.20.0.tgz#db07c4ca4eda2e2316e7aa57ac7fc91ec550bdc7" + integrity sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.2.2" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.3.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -4037,7 +4159,7 @@ eslint@7.15.0: eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" - esquery "^1.2.0" + esquery "^1.4.0" esutils "^2.0.2" file-entry-cache "^6.0.0" functional-red-black-tree "^1.0.1" @@ -4050,7 +4172,7 @@ eslint@7.15.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.19" + lodash "^4.17.20" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -4059,7 +4181,7 @@ eslint@7.15.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^5.2.3" + table "^6.0.4" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -4086,10 +4208,10 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" @@ -4558,6 +4680,16 @@ function.prototype.name@^1.1.2: es-abstract "^1.17.0-next.1" functions-have-names "^1.2.0" +function.prototype.name@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.4.tgz#e4ea839b9d3672ae99d0efd9f38d9191c5eaac83" + integrity sha512-iqy1pIotY/RmhdFZygSSlW0wko2yxkSCKqsuv4pr8QESohpYyG/Z7B/XXvPRKTJS//960rgguE5mSRUsDdaJrQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + functions-have-names "^1.2.2" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -4568,20 +4700,30 @@ functions-have-names@^1.2.0: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.1.tgz#a981ac397fa0c9964551402cdc5533d7a4d52f91" integrity sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA== +functions-have-names@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.2.tgz#98d93991c39da9361f8e50b337c4f6e41f120e21" + integrity sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA== + gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== -get-caller-file@^2.0.1: +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-dev-paths@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/get-dev-paths/-/get-dev-paths-0.1.1.tgz#b9386bd5b9eb08f1d815631c90c804696a7223a0" - integrity sha512-DiDMz2fD7Il3t+KrMoEj4OjHH7BOwbUFkPFBRCEyiwCOFfhymK0HEqYBz4aaG1jYz8RF4JBy9R6YObN46qyI1Q== +get-dev-paths@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/get-dev-paths/-/get-dev-paths-0.2.0.tgz#afa7244c659ba7f46c38708f43bf5630d68c59b0" + integrity sha512-DqRTfx5itL0AH+A3SVGfCyOu4SN8w8P9cYiZLQeY6nNk/UBFHXdaiIzaaPt/5a1ssv96XFchh5Go2UVq74vWbQ== dependencies: realpath-native "^1.0.2" type-error "^1.0.3" @@ -4595,6 +4737,15 @@ get-intrinsic@^1.0.0: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -4697,15 +4848,22 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -graphql-tag@2.11.0, graphql-tag@^2.11.0: +graphql-tag@2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.11.0.tgz#1deb53a01c46a7eb401d6cb59dec86fa1cccbffd" integrity sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA== -graphql@15.4.0: - version "15.4.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.4.0.tgz#e459dea1150da5a106486ba7276518b5295a4347" - integrity sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA== +graphql-tag@^2.12.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.1.tgz#b065ef885e4800e4afd0842811b718a205f4aa58" + integrity sha512-LPewEE1vzGkHnCO8zdOGogKsHHBdtpGyihow1UuMwp6RnZa0lAS7NcbvltLOuo4pi5diQCPASAXZkQq44ffixA== + dependencies: + tslib "^1.14.1" + +graphql@15.5.0: + version "15.5.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.0.tgz#39d19494dbe69d1ea719915b578bf920344a69d5" + integrity sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA== growly@^1.3.0: version "1.3.0" @@ -5057,6 +5215,11 @@ is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.0: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== +is-callable@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -5071,6 +5234,13 @@ is-core-module@^2.1.0: dependencies: has "^1.0.3" +is-core-module@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -5157,6 +5327,11 @@ is-glob@^4.0.0, is-glob@^4.0.1: dependencies: is-extglob "^2.1.1" +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + is-number-object@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" @@ -5208,6 +5383,14 @@ is-regex@^1.0.5, is-regex@^1.1.0: dependencies: has-symbols "^1.0.1" +is-regex@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -5979,6 +6162,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -6224,6 +6412,11 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.escape@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" @@ -6321,6 +6514,11 @@ lodash@^4.15.0, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.3.0 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -6367,6 +6565,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -6646,10 +6851,10 @@ metro-react-native-babel-preset@0.59.0: "@babel/template" "^7.0.0" react-refresh "^0.4.0" -metro-react-native-babel-preset@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz#76861408681dfda3c1d962eb31a8994918c976f8" - integrity sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ== +metro-react-native-babel-preset@0.65.1: + version "0.65.1" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.65.1.tgz#5064a5a676cf505543672533e868be8e1c44c282" + integrity sha512-F5DdoPZiiIbuDRhxf+8drCm6GQCXQ1rKxDYfSdWvtl9wQaRHpUqh0/4p2XnzGFDH1gWVoVfjTb0v9T1eLRaL5A== dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" @@ -6664,6 +6869,7 @@ metro-react-native-babel-preset@0.64.0: "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.0.0" "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" "@babel/plugin-transform-block-scoping" "^7.0.0" "@babel/plugin-transform-classes" "^7.0.0" "@babel/plugin-transform-computed-properties" "^7.0.0" @@ -7062,6 +7268,11 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" +node-releases@^1.1.70: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + node-stream-zip@^1.9.1: version "1.11.2" resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.11.2.tgz#5d0124b80e2942afd7f5853a36ceb0d65c1d9e77" @@ -7154,6 +7365,11 @@ object-inspect@^1.7.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + object-is@^1.0.2, object-is@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" @@ -7213,6 +7429,16 @@ object.fromentries@^2.0.2: function-bind "^1.1.1" has "^1.0.3" +object.fromentries@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" + integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has "^1.0.3" + object.getownpropertydescriptors@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" @@ -7238,6 +7464,16 @@ object.values@^1.1.1: function-bind "^1.1.1" has "^1.0.3" +object.values@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" + integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + has "^1.0.3" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -7283,12 +7519,13 @@ opencollective-postinstall@^2.0.2: resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== -optimism@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.13.1.tgz#df2e6102c973f870d6071712fffe4866bb240384" - integrity sha512-16RRVYZe8ODcUqpabpY7Gb91vCAbdhn8FHjlUb2Hqnjjow1j8Z1dlppds+yAsLbreNTVylLC+tNX6DuC2vt3Kw== +optimism@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.14.0.tgz#256fb079a3428585b40a3a8462f907e0abd2fc49" + integrity sha512-ygbNt8n4DOCVpkwiLF+IrKKeNHOjtr9aXLWGP9HNJGoblSGsnVbJLstcH6/nE9Xy5ZQtlkSioFQNnthmENW6FQ== dependencies: "@wry/context" "^0.5.2" + "@wry/trie" "^0.2.1" optionator@^0.8.1: version "0.8.3" @@ -7816,10 +8053,10 @@ react-native-animatable@1.3.3: dependencies: prop-types "^15.7.2" -react-native-device-info@7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-7.3.1.tgz#6c4b0120d57872a2f7534332323306b386828a3d" - integrity sha512-RQP3etbmXsOlcaxHeHNug68nRli02S9iGC7TbaXpkvyyevIuRogfnrI71sWtqmlT91kdpYAOYKmNfRL9LOSKVw== +react-native-device-info@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-8.0.1.tgz#23a038ab39a9fe3ea8963feb366361ee7c03a2a1" + integrity sha512-5fIcrEfxsyIJ0HZ/pHd+DeYwC81wi5tupFkPSASYXz/7QhatF8W0W6qR+YlvI6gJVSFNgQKgrPrh18RGMgbZdg== react-native-fit-image@^1.5.2: version "1.5.5" @@ -7902,10 +8139,10 @@ react-native-safe-modules@^1.0.0: dependencies: dedent "^0.6.0" -react-native-screens@2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.16.1.tgz#b105a127378d90018a46daf0c2f6518fca60c06f" - integrity sha512-WZ7m0sBDVaHbBnlHxwQnUlI6KNfQKHq+Unfw+VBuAlnSXvT+aw6Bb/K2bUlHzBgvrPjwY3Spc7ZERFuTwRLLwg== +react-native-screens@2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.17.1.tgz#c3c0ac750af48741c5b1635511e6af2a27b74309" + integrity sha512-B4gD5e4csvlVwlhf+RNqjQZ9mHTwe/iL3rXondgZxnKz4oW0QAmtLnLRKOrYVxoaJaF9Fy7jhjo//24/472APQ== react-native-splash-screen@3.2.0: version "3.2.0" @@ -7917,10 +8154,10 @@ react-native-static-server@0.5.0: resolved "https://registry.yarnpkg.com/react-native-static-server/-/react-native-static-server-0.5.0.tgz#4b396082bfe7dfdbba6fe7d7de894de5ba4ebadb" integrity sha512-RGteckPoBZq48p9Y8V67bjZGPxLHKkEOAffLSUJiGC7hkx+H+zuekqCR+04F30NuWB7y+nb8N7Qld2RGjX5DNg== -react-native-vector-icons@7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/react-native-vector-icons/-/react-native-vector-icons-7.1.0.tgz#145487d617b2a81d395d2cf64e6e065fcab3a454" - integrity sha512-V2a1zJ4i+kS8O4j183gIwX14St9AxxXabxwYpFBgRhvr2NDXyFcjHDEAgrOYYlt2W57e20aN1tBDU/I+wn9WtQ== +react-native-vector-icons@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/react-native-vector-icons/-/react-native-vector-icons-8.1.0.tgz#e8ee2b17bc4d9f636da1c6f67feee8e2a850c3d8" + integrity sha512-sHIdBB6Y0dHaot2fMXgy5J/hhCn5YuyN7SKDNFgPzL8KA1oF2/v7mgYMavnK7LIIs2dJoGnDANKf61dsU+TZlg== dependencies: lodash.frompairs "^4.0.1" lodash.isequal "^4.5.0" @@ -7929,7 +8166,7 @@ react-native-vector-icons@7.1.0: lodash.pick "^4.4.0" lodash.template "^4.5.0" prop-types "^15.7.2" - yargs "^15.0.2" + yargs "^16.1.1" react-native@0.63.4: version "0.63.4" @@ -8251,6 +8488,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -8309,6 +8551,14 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.1 dependencies: path-parse "^1.0.6" +resolve@^1.14.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + resolve@^1.18.1: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" @@ -8483,16 +8733,28 @@ semver-regex@^2.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.3.2, semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.0, semver@^6.3.0: +semver@7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.2.1, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -8645,7 +8907,7 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.0.0, slice-ansi@^2.1.0: +slice-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== @@ -8654,6 +8916,15 @@ slice-ansi@^2.0.0, slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -8903,6 +9174,14 @@ string.prototype.trimend@^1.0.1: define-properties "^1.1.3" es-abstract "^1.17.5" +string.prototype.trimend@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + string.prototype.trimstart@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" @@ -8911,6 +9190,14 @@ string.prototype.trimstart@^1.0.1: define-properties "^1.1.3" es-abstract "^1.17.5" +string.prototype.trimstart@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -9043,15 +9330,15 @@ symbol-tree@^3.2.2, symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +table@^6.0.4: + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" temp@0.8.3: version "0.8.3" @@ -9253,6 +9540,11 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@^1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tsutils@^3.17.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" @@ -9333,10 +9625,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" - integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== +typescript@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" + integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== ua-parser-js@^0.7.18: version "0.7.21" @@ -9664,6 +9956,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -9774,11 +10075,21 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" @@ -9800,6 +10111,11 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2: + version "20.2.6" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.6.tgz#69f920addf61aafc0b8b89002f5d66e28f2d8b20" + integrity sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA== + yargs@^14.2.0: version "14.2.3" resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" @@ -9817,7 +10133,7 @@ yargs@^14.2.0: y18n "^4.0.0" yargs-parser "^15.0.1" -yargs@^15.0.2, yargs@^15.1.0, yargs@^15.4.1: +yargs@^15.1.0, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -9834,6 +10150,19 @@ yargs@^15.0.2, yargs@^15.1.0, yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.0.0, yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + zen-observable@^0.8.14: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"