Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6440c1ac7b | ||
|
|
6c0a277397 | ||
|
|
080a664d4f | ||
|
|
ae6a99ce6d | ||
|
|
b14f546525 | ||
|
|
2b8e78a076 | ||
|
|
4a345699a8 | ||
|
|
eaef9be7db | ||
|
|
8049a25cce | ||
|
|
7403ab986b | ||
|
|
d8e9f8f4c6 | ||
|
|
fa05935017 | ||
|
|
2de5cc8e6c | ||
|
|
24d484ca25 | ||
|
|
a7b24cf4eb | ||
|
|
eaa1402173 | ||
|
|
1edeb00631 | ||
|
|
d422c1ff1e | ||
|
|
28b330ad4c | ||
|
|
a867513212 | ||
|
|
14a6341fae |
138
Gemfile.lock
138
Gemfile.lock
@@ -2,61 +2,74 @@ GEM
|
|||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
CFPropertyList (3.0.3)
|
CFPropertyList (3.0.3)
|
||||||
addressable (2.7.0)
|
addressable (2.8.0)
|
||||||
public_suffix (>= 2.0.2, < 5.0)
|
public_suffix (>= 2.0.2, < 5.0)
|
||||||
artifactory (3.0.15)
|
artifactory (3.0.15)
|
||||||
atomos (0.1.3)
|
atomos (0.1.3)
|
||||||
aws-eventstream (1.1.0)
|
aws-eventstream (1.1.1)
|
||||||
aws-partitions (1.426.0)
|
aws-partitions (1.488.0)
|
||||||
aws-sdk-core (3.112.0)
|
aws-sdk-core (3.119.0)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
aws-partitions (~> 1, >= 1.239.0)
|
aws-partitions (~> 1, >= 1.239.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
jmespath (~> 1.0)
|
jmespath (~> 1.0)
|
||||||
aws-sdk-kms (1.42.0)
|
aws-sdk-kms (1.46.0)
|
||||||
aws-sdk-core (~> 3, >= 3.112.0)
|
aws-sdk-core (~> 3, >= 3.119.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sdk-s3 (1.88.0)
|
aws-sdk-s3 (1.99.0)
|
||||||
aws-sdk-core (~> 3, >= 3.112.0)
|
aws-sdk-core (~> 3, >= 3.119.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sigv4 (1.2.2)
|
aws-sigv4 (1.2.4)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
babosa (1.0.4)
|
babosa (1.0.4)
|
||||||
claide (1.0.3)
|
claide (1.0.3)
|
||||||
colored (1.2)
|
colored (1.2)
|
||||||
colored2 (3.1.2)
|
colored2 (3.1.2)
|
||||||
commander-fastlane (4.4.6)
|
commander (4.6.0)
|
||||||
highline (~> 1.7.2)
|
highline (~> 2.0.0)
|
||||||
declarative (0.0.20)
|
declarative (0.0.20)
|
||||||
declarative-option (0.1.0)
|
digest-crc (0.6.4)
|
||||||
digest-crc (0.6.3)
|
|
||||||
rake (>= 12.0.0, < 14.0.0)
|
rake (>= 12.0.0, < 14.0.0)
|
||||||
domain_name (0.5.20190701)
|
domain_name (0.5.20190701)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
dotenv (2.7.6)
|
dotenv (2.7.6)
|
||||||
emoji_regex (3.2.1)
|
emoji_regex (3.2.2)
|
||||||
excon (0.79.0)
|
excon (0.85.0)
|
||||||
faraday (1.3.0)
|
faraday (1.7.0)
|
||||||
|
faraday-em_http (~> 1.0)
|
||||||
|
faraday-em_synchrony (~> 1.0)
|
||||||
|
faraday-excon (~> 1.1)
|
||||||
|
faraday-httpclient (~> 1.0.1)
|
||||||
faraday-net_http (~> 1.0)
|
faraday-net_http (~> 1.0)
|
||||||
|
faraday-net_http_persistent (~> 1.1)
|
||||||
|
faraday-patron (~> 1.0)
|
||||||
|
faraday-rack (~> 1.0)
|
||||||
multipart-post (>= 1.2, < 3)
|
multipart-post (>= 1.2, < 3)
|
||||||
ruby2_keywords
|
ruby2_keywords (>= 0.0.4)
|
||||||
faraday-cookie_jar (0.0.7)
|
faraday-cookie_jar (0.0.7)
|
||||||
faraday (>= 0.8.0)
|
faraday (>= 0.8.0)
|
||||||
http-cookie (~> 1.0.0)
|
http-cookie (~> 1.0.0)
|
||||||
|
faraday-em_http (1.0.0)
|
||||||
|
faraday-em_synchrony (1.0.0)
|
||||||
|
faraday-excon (1.1.0)
|
||||||
|
faraday-httpclient (1.0.1)
|
||||||
faraday-net_http (1.0.1)
|
faraday-net_http (1.0.1)
|
||||||
faraday_middleware (1.0.0)
|
faraday-net_http_persistent (1.2.0)
|
||||||
|
faraday-patron (1.0.0)
|
||||||
|
faraday-rack (1.0.0)
|
||||||
|
faraday_middleware (1.1.0)
|
||||||
faraday (~> 1.0)
|
faraday (~> 1.0)
|
||||||
fastimage (2.2.2)
|
fastimage (2.2.5)
|
||||||
fastlane (2.174.0)
|
fastlane (2.191.0)
|
||||||
CFPropertyList (>= 2.3, < 4.0.0)
|
CFPropertyList (>= 2.3, < 4.0.0)
|
||||||
addressable (>= 2.3, < 3.0.0)
|
addressable (>= 2.8, < 3.0.0)
|
||||||
artifactory (~> 3.0)
|
artifactory (~> 3.0)
|
||||||
aws-sdk-s3 (~> 1.0)
|
aws-sdk-s3 (~> 1.0)
|
||||||
babosa (>= 1.0.3, < 2.0.0)
|
babosa (>= 1.0.3, < 2.0.0)
|
||||||
bundler (>= 1.12.0, < 3.0.0)
|
bundler (>= 1.12.0, < 3.0.0)
|
||||||
colored
|
colored
|
||||||
commander-fastlane (>= 4.4.6, < 5.0.0)
|
commander (~> 4.6)
|
||||||
dotenv (>= 2.1.1, < 3.0.0)
|
dotenv (>= 2.1.1, < 3.0.0)
|
||||||
emoji_regex (>= 0.1, < 4.0)
|
emoji_regex (>= 0.1, < 4.0)
|
||||||
excon (>= 0.71.0, < 1.0.0)
|
excon (>= 0.71.0, < 1.0.0)
|
||||||
@@ -65,18 +78,19 @@ GEM
|
|||||||
faraday_middleware (~> 1.0)
|
faraday_middleware (~> 1.0)
|
||||||
fastimage (>= 2.1.0, < 3.0.0)
|
fastimage (>= 2.1.0, < 3.0.0)
|
||||||
gh_inspector (>= 1.1.2, < 2.0.0)
|
gh_inspector (>= 1.1.2, < 2.0.0)
|
||||||
google-api-client (>= 0.37.0, < 0.39.0)
|
google-apis-androidpublisher_v3 (~> 0.3)
|
||||||
google-cloud-storage (>= 1.15.0, < 2.0.0)
|
google-apis-playcustomapp_v1 (~> 0.1)
|
||||||
highline (>= 1.7.2, < 2.0.0)
|
google-cloud-storage (~> 1.31)
|
||||||
|
highline (~> 2.0)
|
||||||
json (< 3.0.0)
|
json (< 3.0.0)
|
||||||
jwt (>= 2.1.0, < 3)
|
jwt (>= 2.1.0, < 3)
|
||||||
mini_magick (>= 4.9.4, < 5.0.0)
|
mini_magick (>= 4.9.4, < 5.0.0)
|
||||||
multipart-post (~> 2.0.0)
|
multipart-post (~> 2.0.0)
|
||||||
|
naturally (~> 2.2)
|
||||||
plist (>= 3.1.0, < 4.0.0)
|
plist (>= 3.1.0, < 4.0.0)
|
||||||
rubyzip (>= 2.0.0, < 3.0.0)
|
rubyzip (>= 2.0.0, < 3.0.0)
|
||||||
security (= 0.1.3)
|
security (= 0.1.3)
|
||||||
simctl (~> 1.6.3)
|
simctl (~> 1.6.3)
|
||||||
slack-notifier (>= 2.0.0, < 3.0.0)
|
|
||||||
terminal-notifier (>= 2.0.0, < 3.0.0)
|
terminal-notifier (>= 2.0.0, < 3.0.0)
|
||||||
terminal-table (>= 1.4.5, < 2.0.0)
|
terminal-table (>= 1.4.5, < 2.0.0)
|
||||||
tty-screen (>= 0.6.3, < 1.0.0)
|
tty-screen (>= 0.6.3, < 1.0.0)
|
||||||
@@ -85,61 +99,56 @@ GEM
|
|||||||
xcodeproj (>= 1.13.0, < 2.0.0)
|
xcodeproj (>= 1.13.0, < 2.0.0)
|
||||||
xcpretty (~> 0.3.0)
|
xcpretty (~> 0.3.0)
|
||||||
xcpretty-travis-formatter (>= 0.0.3)
|
xcpretty-travis-formatter (>= 0.0.3)
|
||||||
fastlane-plugin-sentry (1.8.0)
|
fastlane-plugin-sentry (1.8.1)
|
||||||
gh_inspector (1.1.3)
|
gh_inspector (1.1.3)
|
||||||
google-api-client (0.38.0)
|
google-apis-androidpublisher_v3 (0.10.0)
|
||||||
|
google-apis-core (>= 0.4, < 2.a)
|
||||||
|
google-apis-core (0.4.1)
|
||||||
addressable (~> 2.5, >= 2.5.1)
|
addressable (~> 2.5, >= 2.5.1)
|
||||||
googleauth (~> 0.9)
|
googleauth (>= 0.16.2, < 2.a)
|
||||||
httpclient (>= 2.8.1, < 3.0)
|
httpclient (>= 2.8.1, < 3.a)
|
||||||
mini_mime (~> 1.0)
|
mini_mime (~> 1.0)
|
||||||
representable (~> 3.0)
|
representable (~> 3.0)
|
||||||
retriable (>= 2.0, < 4.0)
|
retriable (>= 2.0, < 4.a)
|
||||||
signet (~> 0.12)
|
|
||||||
google-apis-core (0.2.1)
|
|
||||||
addressable (~> 2.5, >= 2.5.1)
|
|
||||||
googleauth (~> 0.14)
|
|
||||||
httpclient (>= 2.8.1, < 3.0)
|
|
||||||
mini_mime (~> 1.0)
|
|
||||||
representable (~> 3.0)
|
|
||||||
retriable (>= 2.0, < 4.0)
|
|
||||||
rexml
|
rexml
|
||||||
signet (~> 0.14)
|
|
||||||
webrick
|
webrick
|
||||||
google-apis-iamcredentials_v1 (0.1.0)
|
google-apis-iamcredentials_v1 (0.6.0)
|
||||||
google-apis-core (~> 0.1)
|
google-apis-core (>= 0.4, < 2.a)
|
||||||
google-apis-storage_v1 (0.2.0)
|
google-apis-playcustomapp_v1 (0.5.0)
|
||||||
google-apis-core (~> 0.1)
|
google-apis-core (>= 0.4, < 2.a)
|
||||||
google-cloud-core (1.5.0)
|
google-apis-storage_v1 (0.6.0)
|
||||||
|
google-apis-core (>= 0.4, < 2.a)
|
||||||
|
google-cloud-core (1.6.0)
|
||||||
google-cloud-env (~> 1.0)
|
google-cloud-env (~> 1.0)
|
||||||
google-cloud-errors (~> 1.0)
|
google-cloud-errors (~> 1.0)
|
||||||
google-cloud-env (1.4.0)
|
google-cloud-env (1.5.0)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
faraday (>= 0.17.3, < 2.0)
|
||||||
google-cloud-errors (1.0.1)
|
google-cloud-errors (1.1.0)
|
||||||
google-cloud-storage (1.30.0)
|
google-cloud-storage (1.34.1)
|
||||||
addressable (~> 2.5)
|
addressable (~> 2.5)
|
||||||
digest-crc (~> 0.4)
|
digest-crc (~> 0.4)
|
||||||
google-apis-iamcredentials_v1 (~> 0.1)
|
google-apis-iamcredentials_v1 (~> 0.1)
|
||||||
google-apis-storage_v1 (~> 0.1)
|
google-apis-storage_v1 (~> 0.1)
|
||||||
google-cloud-core (~> 1.2)
|
google-cloud-core (~> 1.6)
|
||||||
googleauth (~> 0.9)
|
googleauth (>= 0.16.2, < 2.a)
|
||||||
mini_mime (~> 1.0)
|
mini_mime (~> 1.0)
|
||||||
googleauth (0.15.1)
|
googleauth (0.17.0)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
faraday (>= 0.17.3, < 2.0)
|
||||||
jwt (>= 1.4, < 3.0)
|
jwt (>= 1.4, < 3.0)
|
||||||
memoist (~> 0.16)
|
memoist (~> 0.16)
|
||||||
multi_json (~> 1.11)
|
multi_json (~> 1.11)
|
||||||
os (>= 0.9, < 2.0)
|
os (>= 0.9, < 2.0)
|
||||||
signet (~> 0.14)
|
signet (~> 0.14)
|
||||||
highline (1.7.10)
|
highline (2.0.3)
|
||||||
http-cookie (1.0.3)
|
http-cookie (1.0.4)
|
||||||
domain_name (~> 0.5)
|
domain_name (~> 0.5)
|
||||||
httpclient (2.8.3)
|
httpclient (2.8.3)
|
||||||
jmespath (1.4.0)
|
jmespath (1.4.0)
|
||||||
json (2.5.1)
|
json (2.5.1)
|
||||||
jwt (2.2.2)
|
jwt (2.2.3)
|
||||||
memoist (0.16.2)
|
memoist (0.16.2)
|
||||||
mini_magick (4.11.0)
|
mini_magick (4.11.0)
|
||||||
mini_mime (1.0.2)
|
mini_mime (1.1.0)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multipart-post (2.0.0)
|
multipart-post (2.0.0)
|
||||||
nanaimo (0.3.0)
|
nanaimo (0.3.0)
|
||||||
@@ -147,18 +156,18 @@ GEM
|
|||||||
os (1.1.1)
|
os (1.1.1)
|
||||||
plist (3.6.0)
|
plist (3.6.0)
|
||||||
public_suffix (4.0.6)
|
public_suffix (4.0.6)
|
||||||
rake (13.0.3)
|
rake (13.0.6)
|
||||||
representable (3.0.4)
|
representable (3.1.1)
|
||||||
declarative (< 0.1.0)
|
declarative (< 0.1.0)
|
||||||
declarative-option (< 0.2.0)
|
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||||
uber (< 0.2.0)
|
uber (< 0.2.0)
|
||||||
retriable (3.1.2)
|
retriable (3.1.2)
|
||||||
rexml (3.2.4)
|
rexml (3.2.5)
|
||||||
rouge (2.0.7)
|
rouge (2.0.7)
|
||||||
ruby2_keywords (0.0.4)
|
ruby2_keywords (0.0.5)
|
||||||
rubyzip (2.3.0)
|
rubyzip (2.3.2)
|
||||||
security (0.1.3)
|
security (0.1.3)
|
||||||
signet (0.14.1)
|
signet (0.15.0)
|
||||||
addressable (~> 2.3)
|
addressable (~> 2.3)
|
||||||
faraday (>= 0.17.3, < 2.0)
|
faraday (>= 0.17.3, < 2.0)
|
||||||
jwt (>= 1.5, < 3.0)
|
jwt (>= 1.5, < 3.0)
|
||||||
@@ -166,10 +175,10 @@ GEM
|
|||||||
simctl (1.6.8)
|
simctl (1.6.8)
|
||||||
CFPropertyList
|
CFPropertyList
|
||||||
naturally
|
naturally
|
||||||
slack-notifier (2.3.2)
|
|
||||||
terminal-notifier (2.0.0)
|
terminal-notifier (2.0.0)
|
||||||
terminal-table (1.8.0)
|
terminal-table (1.8.0)
|
||||||
unicode-display_width (~> 1.1, >= 1.1.1)
|
unicode-display_width (~> 1.1, >= 1.1.1)
|
||||||
|
trailblazer-option (0.1.1)
|
||||||
tty-cursor (0.7.1)
|
tty-cursor (0.7.1)
|
||||||
tty-screen (0.8.1)
|
tty-screen (0.8.1)
|
||||||
tty-spinner (0.9.3)
|
tty-spinner (0.9.3)
|
||||||
@@ -181,12 +190,13 @@ GEM
|
|||||||
unicode-display_width (1.7.0)
|
unicode-display_width (1.7.0)
|
||||||
webrick (1.7.0)
|
webrick (1.7.0)
|
||||||
word_wrap (1.0.0)
|
word_wrap (1.0.0)
|
||||||
xcodeproj (1.19.0)
|
xcodeproj (1.21.0)
|
||||||
CFPropertyList (>= 2.3.3, < 4.0)
|
CFPropertyList (>= 2.3.3, < 4.0)
|
||||||
atomos (~> 0.1.3)
|
atomos (~> 0.1.3)
|
||||||
claide (>= 1.0.2, < 2.0)
|
claide (>= 1.0.2, < 2.0)
|
||||||
colored2 (~> 3.1)
|
colored2 (~> 3.1)
|
||||||
nanaimo (~> 0.3.0)
|
nanaimo (~> 0.3.0)
|
||||||
|
rexml (~> 3.2.4)
|
||||||
xcpretty (0.3.0)
|
xcpretty (0.3.0)
|
||||||
rouge (~> 2.0.7)
|
rouge (~> 2.0.7)
|
||||||
xcpretty-travis-formatter (1.0.1)
|
xcpretty-travis-formatter (1.0.1)
|
||||||
|
|||||||
@@ -122,16 +122,16 @@ def jscFlavor = 'org.webkit:android-jsc:+'
|
|||||||
*/
|
*/
|
||||||
def enableHermes = project.ext.react.get("enableHermes", false);
|
def enableHermes = project.ext.react.get("enableHermes", false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Architectures to build native code for in debug.
|
||||||
|
*/
|
||||||
|
def nativeArchitectures = project.getProperties().get("reactNativeDebugArchitectures")
|
||||||
|
|
||||||
android {
|
android {
|
||||||
ndkVersion rootProject.ext.ndkVersion
|
ndkVersion rootProject.ext.ndkVersion
|
||||||
|
|
||||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "com.jellyfinaudioplayer"
|
applicationId "com.jellyfinaudioplayer"
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
@@ -159,6 +159,11 @@ android {
|
|||||||
buildTypes {
|
buildTypes {
|
||||||
debug {
|
debug {
|
||||||
signingConfig signingConfigs.debug
|
signingConfig signingConfigs.debug
|
||||||
|
if (nativeArchitectures) {
|
||||||
|
ndk {
|
||||||
|
abiFilters nativeArchitectures.split(',')
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
release {
|
release {
|
||||||
// Caution! In production, you need to generate your own keystore file.
|
// Caution! In production, you need to generate your own keystore file.
|
||||||
@@ -217,7 +222,7 @@ dependencies {
|
|||||||
// Run this once to be able to run the application with BUCK
|
// Run this once to be able to run the application with BUCK
|
||||||
// puts all compile dependencies into folder libs for BUCK to use
|
// puts all compile dependencies into folder libs for BUCK to use
|
||||||
task copyDownloadableDepsToLibs(type: Copy) {
|
task copyDownloadableDepsToLibs(type: Copy) {
|
||||||
from configurations.compile
|
from configurations.implementation
|
||||||
into 'libs'
|
into 'libs'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.jellyfinaudioplayer;
|
package com.jellyfinaudioplayer;
|
||||||
|
|
||||||
import com.facebook.react.ReactActivity;
|
import com.facebook.react.ReactActivity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
public class MainActivity extends ReactActivity {
|
public class MainActivity extends ReactActivity {
|
||||||
|
|
||||||
@@ -12,4 +13,9 @@ public class MainActivity extends ReactActivity {
|
|||||||
protected String getMainComponentName() {
|
protected String getMainComponentName() {
|
||||||
return "JellyfinAudioPlayer";
|
return "JellyfinAudioPlayer";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,18 +2,18 @@
|
|||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
ext {
|
ext {
|
||||||
buildToolsVersion = "29.0.3"
|
buildToolsVersion = "30.0.2"
|
||||||
minSdkVersion = 21
|
minSdkVersion = 21
|
||||||
compileSdkVersion = 29
|
compileSdkVersion = 30
|
||||||
targetSdkVersion = 29
|
targetSdkVersion = 30
|
||||||
ndkVersion = "20.1.5948944"
|
ndkVersion = "21.4.7075529"
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath("com.android.tools.build:gradle:4.1.0")
|
classpath("com.android.tools.build:gradle:4.2.2")
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
@@ -22,6 +22,7 @@ buildscript {
|
|||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
maven {
|
maven {
|
||||||
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
|
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
|
||||||
|
|||||||
@@ -25,4 +25,4 @@ android.useAndroidX=true
|
|||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
|
|
||||||
# Version of flipper SDK to use with React Native
|
# Version of flipper SDK to use with React Native
|
||||||
FLIPPER_VERSION=0.75.1
|
FLIPPER_VERSION=0.99.0
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@@ -38,6 +38,6 @@ Generate beta build
|
|||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run.
|
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
|
||||||
More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
|
More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
|
||||||
The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
|
The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
|
||||||
|
|||||||
2
index.js
2
index.js
@@ -5,7 +5,9 @@ import App from './src/components/App';
|
|||||||
import { name as appName } from './app.json';
|
import { name as appName } from './app.json';
|
||||||
import PlaybackService from './src/utility/PlaybackService';
|
import PlaybackService from './src/utility/PlaybackService';
|
||||||
import { setupSentry } from 'utility/Sentry';
|
import { setupSentry } from 'utility/Sentry';
|
||||||
|
import { enableScreens } from 'react-native-screens';
|
||||||
|
|
||||||
setupSentry();
|
setupSentry();
|
||||||
|
enableScreens();
|
||||||
AppRegistry.registerComponent(appName, () => App);
|
AppRegistry.registerComponent(appName, () => App);
|
||||||
TrackPlayer.registerPlaybackService(() => PlaybackService);
|
TrackPlayer.registerPlaybackService(() => PlaybackService);
|
||||||
@@ -312,10 +312,12 @@
|
|||||||
);
|
);
|
||||||
inputPaths = (
|
inputPaths = (
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-JellyfinAudioPlayer-JellyfinAudioPlayerTests/Pods-JellyfinAudioPlayer-JellyfinAudioPlayerTests-frameworks.sh",
|
"${PODS_ROOT}/Target Support Files/Pods-JellyfinAudioPlayer-JellyfinAudioPlayerTests/Pods-JellyfinAudioPlayer-JellyfinAudioPlayerTests-frameworks.sh",
|
||||||
"${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework/OpenSSL",
|
"${PODS_XCFRAMEWORKS_BUILD_DIR}/Flipper-DoubleConversion/double-conversion.framework/double-conversion",
|
||||||
|
"${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL",
|
||||||
);
|
);
|
||||||
name = "[CP] Embed Pods Frameworks";
|
name = "[CP] Embed Pods Frameworks";
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
|
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/double-conversion.framework",
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
|
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -410,10 +412,12 @@
|
|||||||
);
|
);
|
||||||
inputPaths = (
|
inputPaths = (
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-JellyfinAudioPlayer/Pods-JellyfinAudioPlayer-frameworks.sh",
|
"${PODS_ROOT}/Target Support Files/Pods-JellyfinAudioPlayer/Pods-JellyfinAudioPlayer-frameworks.sh",
|
||||||
"${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL/OpenSSL.framework/OpenSSL",
|
"${PODS_XCFRAMEWORKS_BUILD_DIR}/Flipper-DoubleConversion/double-conversion.framework/double-conversion",
|
||||||
|
"${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL",
|
||||||
);
|
);
|
||||||
name = "[CP] Embed Pods Frameworks";
|
name = "[CP] Embed Pods Frameworks";
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
|
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/double-conversion.framework",
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
|
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework",
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -542,7 +546,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 12;
|
CURRENT_PROJECT_VERSION = 19;
|
||||||
DEVELOPMENT_TEAM = 238P3C58WC;
|
DEVELOPMENT_TEAM = 238P3C58WC;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
@@ -573,7 +577,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 12;
|
CURRENT_PROJECT_VERSION = 19;
|
||||||
DEVELOPMENT_TEAM = 238P3C58WC;
|
DEVELOPMENT_TEAM = 238P3C58WC;
|
||||||
INFOPLIST_FILE = JellyfinAudioPlayer/Info.plist;
|
INFOPLIST_FILE = JellyfinAudioPlayer/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
@@ -641,7 +645,7 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
|
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
|
||||||
LIBRARY_SEARCH_PATHS = (
|
LIBRARY_SEARCH_PATHS = (
|
||||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
||||||
@@ -697,7 +701,7 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
|
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
|
||||||
LIBRARY_SEARCH_PATHS = (
|
LIBRARY_SEARCH_PATHS = (
|
||||||
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
|
||||||
|
|||||||
@@ -21,19 +21,13 @@
|
|||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>12</string>
|
<string>19</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSAppTransportSecurity</key>
|
<key>NSAppTransportSecurity</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSExceptionDomains</key>
|
<key>NSAllowsArbitraryLoads</key>
|
||||||
<dict>
|
<true/>
|
||||||
<key>localhost</key>
|
|
||||||
<dict>
|
|
||||||
<key>NSExceptionAllowsInsecureHTTPLoads</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
<key>NSLocationWhenInUseUsageDescription</key>
|
<key>NSLocationWhenInUseUsageDescription</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
|
|||||||
@@ -19,6 +19,6 @@
|
|||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>12</string>
|
<string>19</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
platform :ios, '10.0'
|
platform :ios, '11.0'
|
||||||
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
|
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
|
||||||
require_relative '../node_modules/react-native/scripts/react_native_pods'
|
require_relative '../node_modules/react-native/scripts/react_native_pods'
|
||||||
|
|
||||||
|
|||||||
800
ios/Podfile.lock
800
ios/Podfile.lock
@@ -1,353 +1,376 @@
|
|||||||
PODS:
|
PODS:
|
||||||
- boost-for-react-native (1.63.0)
|
- boost (1.76.0)
|
||||||
- CocoaAsyncSocket (7.6.5)
|
- CocoaAsyncSocket (7.6.5)
|
||||||
- DoubleConversion (1.1.6)
|
- DoubleConversion (1.1.6)
|
||||||
- FBLazyVector (0.64.0)
|
- FBLazyVector (0.66.1)
|
||||||
- FBReactNativeSpec (0.64.0):
|
- FBReactNativeSpec (0.66.1):
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- RCTRequired (= 0.64.0)
|
- RCTRequired (= 0.66.1)
|
||||||
- RCTTypeSafety (= 0.64.0)
|
- RCTTypeSafety (= 0.66.1)
|
||||||
- React-Core (= 0.64.0)
|
- React-Core (= 0.66.1)
|
||||||
- React-jsi (= 0.64.0)
|
- React-jsi (= 0.66.1)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.0)
|
- ReactCommon/turbomodule/core (= 0.66.1)
|
||||||
- Flipper (0.75.1):
|
- Flipper (0.99.0):
|
||||||
- Flipper-Folly (~> 2.5)
|
- Flipper-Folly (~> 2.6)
|
||||||
- Flipper-RSocket (~> 1.3)
|
- Flipper-RSocket (~> 1.4)
|
||||||
- Flipper-DoubleConversion (1.1.7)
|
- Flipper-Boost-iOSX (1.76.0.1.11)
|
||||||
- Flipper-Folly (2.5.1):
|
- Flipper-DoubleConversion (3.1.7)
|
||||||
- boost-for-react-native
|
- Flipper-Fmt (7.1.7)
|
||||||
|
- Flipper-Folly (2.6.7):
|
||||||
|
- Flipper-Boost-iOSX
|
||||||
- Flipper-DoubleConversion
|
- Flipper-DoubleConversion
|
||||||
|
- Flipper-Fmt (= 7.1.7)
|
||||||
- Flipper-Glog
|
- Flipper-Glog
|
||||||
- libevent (~> 2.1.12)
|
- libevent (~> 2.1.12)
|
||||||
- OpenSSL-Universal (= 1.1.180)
|
- OpenSSL-Universal (= 1.1.180)
|
||||||
- Flipper-Glog (0.3.6)
|
- Flipper-Glog (0.3.6)
|
||||||
- Flipper-PeerTalk (0.0.4)
|
- Flipper-PeerTalk (0.0.4)
|
||||||
- Flipper-RSocket (1.3.0):
|
- Flipper-RSocket (1.4.3):
|
||||||
- Flipper-Folly (~> 2.5)
|
- Flipper-Folly (~> 2.6)
|
||||||
- FlipperKit (0.75.1):
|
- FlipperKit (0.99.0):
|
||||||
- FlipperKit/Core (= 0.75.1)
|
- FlipperKit/Core (= 0.99.0)
|
||||||
- FlipperKit/Core (0.75.1):
|
- FlipperKit/Core (0.99.0):
|
||||||
- Flipper (~> 0.75.1)
|
- Flipper (~> 0.99.0)
|
||||||
- FlipperKit/CppBridge
|
- FlipperKit/CppBridge
|
||||||
- FlipperKit/FBCxxFollyDynamicConvert
|
- FlipperKit/FBCxxFollyDynamicConvert
|
||||||
- FlipperKit/FBDefines
|
- FlipperKit/FBDefines
|
||||||
- FlipperKit/FKPortForwarding
|
- FlipperKit/FKPortForwarding
|
||||||
- FlipperKit/CppBridge (0.75.1):
|
- FlipperKit/CppBridge (0.99.0):
|
||||||
- Flipper (~> 0.75.1)
|
- Flipper (~> 0.99.0)
|
||||||
- FlipperKit/FBCxxFollyDynamicConvert (0.75.1):
|
- FlipperKit/FBCxxFollyDynamicConvert (0.99.0):
|
||||||
- Flipper-Folly (~> 2.5)
|
- Flipper-Folly (~> 2.6)
|
||||||
- FlipperKit/FBDefines (0.75.1)
|
- FlipperKit/FBDefines (0.99.0)
|
||||||
- FlipperKit/FKPortForwarding (0.75.1):
|
- FlipperKit/FKPortForwarding (0.99.0):
|
||||||
- CocoaAsyncSocket (~> 7.6)
|
- CocoaAsyncSocket (~> 7.6)
|
||||||
- Flipper-PeerTalk (~> 0.0.4)
|
- Flipper-PeerTalk (~> 0.0.4)
|
||||||
- FlipperKit/FlipperKitHighlightOverlay (0.75.1)
|
- FlipperKit/FlipperKitHighlightOverlay (0.99.0)
|
||||||
- FlipperKit/FlipperKitLayoutPlugin (0.75.1):
|
- FlipperKit/FlipperKitLayoutHelpers (0.99.0):
|
||||||
- FlipperKit/Core
|
- FlipperKit/Core
|
||||||
- FlipperKit/FlipperKitHighlightOverlay
|
- FlipperKit/FlipperKitHighlightOverlay
|
||||||
- FlipperKit/FlipperKitLayoutTextSearchable
|
- FlipperKit/FlipperKitLayoutTextSearchable
|
||||||
|
- FlipperKit/FlipperKitLayoutIOSDescriptors (0.99.0):
|
||||||
|
- FlipperKit/Core
|
||||||
|
- FlipperKit/FlipperKitHighlightOverlay
|
||||||
|
- FlipperKit/FlipperKitLayoutHelpers
|
||||||
- YogaKit (~> 1.18)
|
- YogaKit (~> 1.18)
|
||||||
- FlipperKit/FlipperKitLayoutTextSearchable (0.75.1)
|
- FlipperKit/FlipperKitLayoutPlugin (0.99.0):
|
||||||
- FlipperKit/FlipperKitNetworkPlugin (0.75.1):
|
|
||||||
- FlipperKit/Core
|
- FlipperKit/Core
|
||||||
- FlipperKit/FlipperKitReactPlugin (0.75.1):
|
- FlipperKit/FlipperKitHighlightOverlay
|
||||||
|
- FlipperKit/FlipperKitLayoutHelpers
|
||||||
|
- FlipperKit/FlipperKitLayoutIOSDescriptors
|
||||||
|
- FlipperKit/FlipperKitLayoutTextSearchable
|
||||||
|
- YogaKit (~> 1.18)
|
||||||
|
- FlipperKit/FlipperKitLayoutTextSearchable (0.99.0)
|
||||||
|
- FlipperKit/FlipperKitNetworkPlugin (0.99.0):
|
||||||
- FlipperKit/Core
|
- FlipperKit/Core
|
||||||
- FlipperKit/FlipperKitUserDefaultsPlugin (0.75.1):
|
- FlipperKit/FlipperKitReactPlugin (0.99.0):
|
||||||
- FlipperKit/Core
|
- FlipperKit/Core
|
||||||
- FlipperKit/SKIOSNetworkPlugin (0.75.1):
|
- FlipperKit/FlipperKitUserDefaultsPlugin (0.99.0):
|
||||||
|
- FlipperKit/Core
|
||||||
|
- FlipperKit/SKIOSNetworkPlugin (0.99.0):
|
||||||
- FlipperKit/Core
|
- FlipperKit/Core
|
||||||
- FlipperKit/FlipperKitNetworkPlugin
|
- FlipperKit/FlipperKitNetworkPlugin
|
||||||
|
- fmt (6.2.1)
|
||||||
- glog (0.3.5)
|
- glog (0.3.5)
|
||||||
- libevent (2.1.12)
|
- libevent (2.1.12)
|
||||||
- libwebp (1.1.0):
|
- libwebp (1.2.1):
|
||||||
- libwebp/demux (= 1.1.0)
|
- libwebp/demux (= 1.2.1)
|
||||||
- libwebp/mux (= 1.1.0)
|
- libwebp/mux (= 1.2.1)
|
||||||
- libwebp/webp (= 1.1.0)
|
- libwebp/webp (= 1.2.1)
|
||||||
- libwebp/demux (1.1.0):
|
- libwebp/demux (1.2.1):
|
||||||
- libwebp/webp
|
- libwebp/webp
|
||||||
- libwebp/mux (1.1.0):
|
- libwebp/mux (1.2.1):
|
||||||
- libwebp/demux
|
- libwebp/demux
|
||||||
- libwebp/webp (1.1.0)
|
- libwebp/webp (1.2.1)
|
||||||
- OpenSSL-Universal (1.1.180)
|
- OpenSSL-Universal (1.1.180)
|
||||||
- RCT-Folly (2020.01.13.00):
|
- RCT-Folly (2021.06.28.00-v2):
|
||||||
- boost-for-react-native
|
- boost
|
||||||
|
- DoubleConversion
|
||||||
|
- fmt (~> 6.2.1)
|
||||||
|
- glog
|
||||||
|
- RCT-Folly/Default (= 2021.06.28.00-v2)
|
||||||
|
- RCT-Folly/Default (2021.06.28.00-v2):
|
||||||
|
- boost
|
||||||
|
- DoubleConversion
|
||||||
|
- fmt (~> 6.2.1)
|
||||||
|
- glog
|
||||||
|
- RCTRequired (0.66.1)
|
||||||
|
- RCTTypeSafety (0.66.1):
|
||||||
|
- FBLazyVector (= 0.66.1)
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- RCTRequired (= 0.66.1)
|
||||||
|
- React-Core (= 0.66.1)
|
||||||
|
- React (0.66.1):
|
||||||
|
- React-Core (= 0.66.1)
|
||||||
|
- React-Core/DevSupport (= 0.66.1)
|
||||||
|
- React-Core/RCTWebSocket (= 0.66.1)
|
||||||
|
- React-RCTActionSheet (= 0.66.1)
|
||||||
|
- React-RCTAnimation (= 0.66.1)
|
||||||
|
- React-RCTBlob (= 0.66.1)
|
||||||
|
- React-RCTImage (= 0.66.1)
|
||||||
|
- React-RCTLinking (= 0.66.1)
|
||||||
|
- React-RCTNetwork (= 0.66.1)
|
||||||
|
- React-RCTSettings (= 0.66.1)
|
||||||
|
- React-RCTText (= 0.66.1)
|
||||||
|
- React-RCTVibration (= 0.66.1)
|
||||||
|
- React-callinvoker (0.66.1)
|
||||||
|
- React-Core (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default (= 0.66.1)
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/CoreModulesHeaders (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/Default (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/DevSupport (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default (= 0.66.1)
|
||||||
|
- React-Core/RCTWebSocket (= 0.66.1)
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-jsinspector (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/RCTActionSheetHeaders (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/RCTAnimationHeaders (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/RCTBlobHeaders (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/RCTImageHeaders (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/RCTLinkingHeaders (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/RCTNetworkHeaders (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/RCTSettingsHeaders (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/RCTTextHeaders (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/RCTVibrationHeaders (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-Core/RCTWebSocket (0.66.1):
|
||||||
|
- glog
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- React-Core/Default (= 0.66.1)
|
||||||
|
- React-cxxreact (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsiexecutor (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- Yoga
|
||||||
|
- React-CoreModules (0.66.1):
|
||||||
|
- FBReactNativeSpec (= 0.66.1)
|
||||||
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
|
- RCTTypeSafety (= 0.66.1)
|
||||||
|
- React-Core/CoreModulesHeaders (= 0.66.1)
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-RCTImage (= 0.66.1)
|
||||||
|
- ReactCommon/turbomodule/core (= 0.66.1)
|
||||||
|
- React-cxxreact (0.66.1):
|
||||||
|
- boost (= 1.76.0)
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly/Default (= 2020.01.13.00)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- RCT-Folly/Default (2020.01.13.00):
|
- React-callinvoker (= 0.66.1)
|
||||||
- boost-for-react-native
|
- React-jsi (= 0.66.1)
|
||||||
|
- React-jsinspector (= 0.66.1)
|
||||||
|
- React-logger (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
|
- React-runtimeexecutor (= 0.66.1)
|
||||||
|
- React-jsi (0.66.1):
|
||||||
|
- boost (= 1.76.0)
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- RCTRequired (0.64.0)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- RCTTypeSafety (0.64.0):
|
- React-jsi/Default (= 0.66.1)
|
||||||
- FBLazyVector (= 0.64.0)
|
- React-jsi/Default (0.66.1):
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- boost (= 1.76.0)
|
||||||
- RCTRequired (= 0.64.0)
|
|
||||||
- React-Core (= 0.64.0)
|
|
||||||
- React (0.64.0):
|
|
||||||
- React-Core (= 0.64.0)
|
|
||||||
- React-Core/DevSupport (= 0.64.0)
|
|
||||||
- React-Core/RCTWebSocket (= 0.64.0)
|
|
||||||
- React-RCTActionSheet (= 0.64.0)
|
|
||||||
- React-RCTAnimation (= 0.64.0)
|
|
||||||
- React-RCTBlob (= 0.64.0)
|
|
||||||
- React-RCTImage (= 0.64.0)
|
|
||||||
- React-RCTLinking (= 0.64.0)
|
|
||||||
- React-RCTNetwork (= 0.64.0)
|
|
||||||
- React-RCTSettings (= 0.64.0)
|
|
||||||
- React-RCTText (= 0.64.0)
|
|
||||||
- React-RCTVibration (= 0.64.0)
|
|
||||||
- React-callinvoker (0.64.0)
|
|
||||||
- React-Core (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default (= 0.64.0)
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/CoreModulesHeaders (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/Default (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/DevSupport (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default (= 0.64.0)
|
|
||||||
- React-Core/RCTWebSocket (= 0.64.0)
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-jsinspector (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/RCTActionSheetHeaders (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/RCTAnimationHeaders (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/RCTBlobHeaders (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/RCTImageHeaders (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/RCTLinkingHeaders (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/RCTNetworkHeaders (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/RCTSettingsHeaders (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/RCTTextHeaders (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/RCTVibrationHeaders (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-Core/RCTWebSocket (0.64.0):
|
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-Core/Default (= 0.64.0)
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsiexecutor (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- Yoga
|
|
||||||
- React-CoreModules (0.64.0):
|
|
||||||
- FBReactNativeSpec (= 0.64.0)
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- RCTTypeSafety (= 0.64.0)
|
|
||||||
- React-Core/CoreModulesHeaders (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-RCTImage (= 0.64.0)
|
|
||||||
- ReactCommon/turbomodule/core (= 0.64.0)
|
|
||||||
- React-cxxreact (0.64.0):
|
|
||||||
- boost-for-react-native (= 1.63.0)
|
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- React-callinvoker (= 0.64.0)
|
- React-jsiexecutor (0.66.1):
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-jsinspector (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- React-runtimeexecutor (= 0.64.0)
|
|
||||||
- React-jsi (0.64.0):
|
|
||||||
- boost-for-react-native (= 1.63.0)
|
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- React-jsi/Default (= 0.64.0)
|
- React-cxxreact (= 0.66.1)
|
||||||
- React-jsi/Default (0.64.0):
|
- React-jsi (= 0.66.1)
|
||||||
- boost-for-react-native (= 1.63.0)
|
- React-perflogger (= 0.66.1)
|
||||||
- DoubleConversion
|
- React-jsinspector (0.66.1)
|
||||||
|
- React-logger (0.66.1):
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- react-native-airplay-button (1.1.0):
|
||||||
- React-jsiexecutor (0.64.0):
|
- React-Core
|
||||||
- DoubleConversion
|
- react-native-safe-area-context (3.3.2):
|
||||||
- glog
|
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
|
||||||
- React-cxxreact (= 0.64.0)
|
|
||||||
- React-jsi (= 0.64.0)
|
|
||||||
- React-perflogger (= 0.64.0)
|
|
||||||
- React-jsinspector (0.64.0)
|
|
||||||
- react-native-safe-area-context (3.2.0):
|
|
||||||
- React-Core
|
- React-Core
|
||||||
- react-native-slider (3.0.3):
|
- react-native-slider (3.0.3):
|
||||||
- React
|
- React
|
||||||
- react-native-track-player (1.2.3):
|
- react-native-track-player (1.2.7):
|
||||||
- React
|
|
||||||
- react-native-webview (11.2.3):
|
|
||||||
- React-Core
|
- React-Core
|
||||||
- React-perflogger (0.64.0)
|
- react-native-webview (11.14.1):
|
||||||
- React-RCTActionSheet (0.64.0):
|
- React-Core
|
||||||
- React-Core/RCTActionSheetHeaders (= 0.64.0)
|
- React-perflogger (0.66.1)
|
||||||
- React-RCTAnimation (0.64.0):
|
- React-RCTActionSheet (0.66.1):
|
||||||
- FBReactNativeSpec (= 0.64.0)
|
- React-Core/RCTActionSheetHeaders (= 0.66.1)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- React-RCTAnimation (0.66.1):
|
||||||
- RCTTypeSafety (= 0.64.0)
|
- FBReactNativeSpec (= 0.66.1)
|
||||||
- React-Core/RCTAnimationHeaders (= 0.64.0)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- React-jsi (= 0.64.0)
|
- RCTTypeSafety (= 0.66.1)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.0)
|
- React-Core/RCTAnimationHeaders (= 0.66.1)
|
||||||
- React-RCTBlob (0.64.0):
|
- React-jsi (= 0.66.1)
|
||||||
- FBReactNativeSpec (= 0.64.0)
|
- ReactCommon/turbomodule/core (= 0.66.1)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- React-RCTBlob (0.66.1):
|
||||||
- React-Core/RCTBlobHeaders (= 0.64.0)
|
- FBReactNativeSpec (= 0.66.1)
|
||||||
- React-Core/RCTWebSocket (= 0.64.0)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- React-jsi (= 0.64.0)
|
- React-Core/RCTBlobHeaders (= 0.66.1)
|
||||||
- React-RCTNetwork (= 0.64.0)
|
- React-Core/RCTWebSocket (= 0.66.1)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.0)
|
- React-jsi (= 0.66.1)
|
||||||
- React-RCTImage (0.64.0):
|
- React-RCTNetwork (= 0.66.1)
|
||||||
- FBReactNativeSpec (= 0.64.0)
|
- ReactCommon/turbomodule/core (= 0.66.1)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- React-RCTImage (0.66.1):
|
||||||
- RCTTypeSafety (= 0.64.0)
|
- FBReactNativeSpec (= 0.66.1)
|
||||||
- React-Core/RCTImageHeaders (= 0.64.0)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- React-jsi (= 0.64.0)
|
- RCTTypeSafety (= 0.66.1)
|
||||||
- React-RCTNetwork (= 0.64.0)
|
- React-Core/RCTImageHeaders (= 0.66.1)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.0)
|
- React-jsi (= 0.66.1)
|
||||||
- React-RCTLinking (0.64.0):
|
- React-RCTNetwork (= 0.66.1)
|
||||||
- FBReactNativeSpec (= 0.64.0)
|
- ReactCommon/turbomodule/core (= 0.66.1)
|
||||||
- React-Core/RCTLinkingHeaders (= 0.64.0)
|
- React-RCTLinking (0.66.1):
|
||||||
- React-jsi (= 0.64.0)
|
- FBReactNativeSpec (= 0.66.1)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.0)
|
- React-Core/RCTLinkingHeaders (= 0.66.1)
|
||||||
- React-RCTNetwork (0.64.0):
|
- React-jsi (= 0.66.1)
|
||||||
- FBReactNativeSpec (= 0.64.0)
|
- ReactCommon/turbomodule/core (= 0.66.1)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- React-RCTNetwork (0.66.1):
|
||||||
- RCTTypeSafety (= 0.64.0)
|
- FBReactNativeSpec (= 0.66.1)
|
||||||
- React-Core/RCTNetworkHeaders (= 0.64.0)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- React-jsi (= 0.64.0)
|
- RCTTypeSafety (= 0.66.1)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.0)
|
- React-Core/RCTNetworkHeaders (= 0.66.1)
|
||||||
- React-RCTSettings (0.64.0):
|
- React-jsi (= 0.66.1)
|
||||||
- FBReactNativeSpec (= 0.64.0)
|
- ReactCommon/turbomodule/core (= 0.66.1)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- React-RCTSettings (0.66.1):
|
||||||
- RCTTypeSafety (= 0.64.0)
|
- FBReactNativeSpec (= 0.66.1)
|
||||||
- React-Core/RCTSettingsHeaders (= 0.64.0)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- React-jsi (= 0.64.0)
|
- RCTTypeSafety (= 0.66.1)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.0)
|
- React-Core/RCTSettingsHeaders (= 0.66.1)
|
||||||
- React-RCTText (0.64.0):
|
- React-jsi (= 0.66.1)
|
||||||
- React-Core/RCTTextHeaders (= 0.64.0)
|
- ReactCommon/turbomodule/core (= 0.66.1)
|
||||||
- React-RCTVibration (0.64.0):
|
- React-RCTText (0.66.1):
|
||||||
- FBReactNativeSpec (= 0.64.0)
|
- React-Core/RCTTextHeaders (= 0.66.1)
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- React-RCTVibration (0.66.1):
|
||||||
- React-Core/RCTVibrationHeaders (= 0.64.0)
|
- FBReactNativeSpec (= 0.66.1)
|
||||||
- React-jsi (= 0.64.0)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- ReactCommon/turbomodule/core (= 0.64.0)
|
- React-Core/RCTVibrationHeaders (= 0.66.1)
|
||||||
- React-runtimeexecutor (0.64.0):
|
- React-jsi (= 0.66.1)
|
||||||
- React-jsi (= 0.64.0)
|
- ReactCommon/turbomodule/core (= 0.66.1)
|
||||||
- ReactCommon/turbomodule/core (0.64.0):
|
- React-runtimeexecutor (0.66.1):
|
||||||
|
- React-jsi (= 0.66.1)
|
||||||
|
- ReactCommon/turbomodule/core (0.66.1):
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- glog
|
- glog
|
||||||
- RCT-Folly (= 2020.01.13.00)
|
- RCT-Folly (= 2021.06.28.00-v2)
|
||||||
- React-callinvoker (= 0.64.0)
|
- React-callinvoker (= 0.66.1)
|
||||||
- React-Core (= 0.64.0)
|
- React-Core (= 0.66.1)
|
||||||
- React-cxxreact (= 0.64.0)
|
- React-cxxreact (= 0.66.1)
|
||||||
- React-jsi (= 0.64.0)
|
- React-jsi (= 0.66.1)
|
||||||
- React-perflogger (= 0.64.0)
|
- React-logger (= 0.66.1)
|
||||||
|
- React-perflogger (= 0.66.1)
|
||||||
- RNCAsyncStorage (1.12.1):
|
- RNCAsyncStorage (1.12.1):
|
||||||
- React-Core
|
- React-Core
|
||||||
- RNCMaskedView (0.1.10):
|
- RNCMaskedView (0.1.11):
|
||||||
- React
|
- React
|
||||||
- RNCPicker (1.8.1):
|
- RNCPicker (1.8.1):
|
||||||
- React-Core
|
- React-Core
|
||||||
- RNFastImage (8.3.4):
|
- RNFastImage (8.5.11):
|
||||||
- React-Core
|
- React-Core
|
||||||
- SDWebImage (~> 5.8)
|
- SDWebImage (~> 5.11.1)
|
||||||
- SDWebImageWebPCoder (~> 0.6.1)
|
- SDWebImageWebPCoder (~> 0.8.4)
|
||||||
- RNGestureHandler (1.10.3):
|
- RNGestureHandler (1.10.3):
|
||||||
- React-Core
|
- React-Core
|
||||||
- RNLocalize (2.0.2):
|
- RNLocalize (2.1.5):
|
||||||
- React-Core
|
- React-Core
|
||||||
- RNReanimated (2.0.0):
|
- RNReanimated (2.2.3):
|
||||||
- DoubleConversion
|
- DoubleConversion
|
||||||
- FBLazyVector
|
- FBLazyVector
|
||||||
- FBReactNativeSpec
|
- FBReactNativeSpec
|
||||||
@@ -376,49 +399,53 @@ PODS:
|
|||||||
- React-RCTVibration
|
- React-RCTVibration
|
||||||
- ReactCommon/turbomodule/core
|
- ReactCommon/turbomodule/core
|
||||||
- Yoga
|
- Yoga
|
||||||
- RNScreens (2.18.1):
|
- RNScreens (3.8.0):
|
||||||
- React-Core
|
- React-Core
|
||||||
- RNSentry (2.3.0):
|
- React-RCTImage
|
||||||
|
- RNSentry (2.6.2):
|
||||||
- React-Core
|
- React-Core
|
||||||
- Sentry (= 6.1.4)
|
- Sentry (= 7.1.4)
|
||||||
- RNSVG (12.1.0):
|
- RNSVG (12.2.0):
|
||||||
- React
|
- React-Core
|
||||||
- SDWebImage (5.10.4):
|
- SDWebImage (5.11.1):
|
||||||
- SDWebImage/Core (= 5.10.4)
|
- SDWebImage/Core (= 5.11.1)
|
||||||
- SDWebImage/Core (5.10.4)
|
- SDWebImage/Core (5.11.1)
|
||||||
- SDWebImageWebPCoder (0.6.1):
|
- SDWebImageWebPCoder (0.8.4):
|
||||||
- libwebp (~> 1.0)
|
- libwebp (~> 1.0)
|
||||||
- SDWebImage/Core (~> 5.7)
|
- SDWebImage/Core (~> 5.10)
|
||||||
- Sentry (6.1.4):
|
- Sentry (7.1.4):
|
||||||
- Sentry/Core (= 6.1.4)
|
- Sentry/Core (= 7.1.4)
|
||||||
- Sentry/Core (6.1.4)
|
- Sentry/Core (7.1.4)
|
||||||
- Yoga (1.14.0)
|
- Yoga (1.14.0)
|
||||||
- YogaKit (1.18.1):
|
- YogaKit (1.18.1):
|
||||||
- Yoga (~> 1.14)
|
- Yoga (~> 1.14)
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
|
- boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
|
||||||
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
||||||
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
||||||
- FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`)
|
- FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`)
|
||||||
- Flipper (~> 0.75.1)
|
- Flipper (= 0.99.0)
|
||||||
- Flipper-DoubleConversion (= 1.1.7)
|
- Flipper-Boost-iOSX (= 1.76.0.1.11)
|
||||||
- Flipper-Folly (~> 2.5)
|
- Flipper-DoubleConversion (= 3.1.7)
|
||||||
|
- Flipper-Fmt (= 7.1.7)
|
||||||
|
- Flipper-Folly (= 2.6.7)
|
||||||
- Flipper-Glog (= 0.3.6)
|
- Flipper-Glog (= 0.3.6)
|
||||||
- Flipper-PeerTalk (~> 0.0.4)
|
- Flipper-PeerTalk (= 0.0.4)
|
||||||
- Flipper-RSocket (~> 1.3)
|
- Flipper-RSocket (= 1.4.3)
|
||||||
- FlipperKit (~> 0.75.1)
|
- FlipperKit (= 0.99.0)
|
||||||
- FlipperKit/Core (~> 0.75.1)
|
- FlipperKit/Core (= 0.99.0)
|
||||||
- FlipperKit/CppBridge (~> 0.75.1)
|
- FlipperKit/CppBridge (= 0.99.0)
|
||||||
- FlipperKit/FBCxxFollyDynamicConvert (~> 0.75.1)
|
- FlipperKit/FBCxxFollyDynamicConvert (= 0.99.0)
|
||||||
- FlipperKit/FBDefines (~> 0.75.1)
|
- FlipperKit/FBDefines (= 0.99.0)
|
||||||
- FlipperKit/FKPortForwarding (~> 0.75.1)
|
- FlipperKit/FKPortForwarding (= 0.99.0)
|
||||||
- FlipperKit/FlipperKitHighlightOverlay (~> 0.75.1)
|
- FlipperKit/FlipperKitHighlightOverlay (= 0.99.0)
|
||||||
- FlipperKit/FlipperKitLayoutPlugin (~> 0.75.1)
|
- FlipperKit/FlipperKitLayoutPlugin (= 0.99.0)
|
||||||
- FlipperKit/FlipperKitLayoutTextSearchable (~> 0.75.1)
|
- FlipperKit/FlipperKitLayoutTextSearchable (= 0.99.0)
|
||||||
- FlipperKit/FlipperKitNetworkPlugin (~> 0.75.1)
|
- FlipperKit/FlipperKitNetworkPlugin (= 0.99.0)
|
||||||
- FlipperKit/FlipperKitReactPlugin (~> 0.75.1)
|
- FlipperKit/FlipperKitReactPlugin (= 0.99.0)
|
||||||
- FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.75.1)
|
- FlipperKit/FlipperKitUserDefaultsPlugin (= 0.99.0)
|
||||||
- FlipperKit/SKIOSNetworkPlugin (~> 0.75.1)
|
- FlipperKit/SKIOSNetworkPlugin (= 0.99.0)
|
||||||
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
||||||
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
||||||
- RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
|
- RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
|
||||||
@@ -433,6 +460,8 @@ DEPENDENCIES:
|
|||||||
- React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
|
- React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
|
||||||
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
|
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
|
||||||
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
|
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
|
||||||
|
- React-logger (from `../node_modules/react-native/ReactCommon/logger`)
|
||||||
|
- react-native-airplay-button (from `../node_modules/react-native-airplay-button`)
|
||||||
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
|
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
|
||||||
- "react-native-slider (from `../node_modules/@react-native-community/slider`)"
|
- "react-native-slider (from `../node_modules/@react-native-community/slider`)"
|
||||||
- react-native-track-player (from `../node_modules/react-native-track-player`)
|
- react-native-track-player (from `../node_modules/react-native-track-player`)
|
||||||
@@ -463,15 +492,17 @@ DEPENDENCIES:
|
|||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
trunk:
|
trunk:
|
||||||
- boost-for-react-native
|
|
||||||
- CocoaAsyncSocket
|
- CocoaAsyncSocket
|
||||||
- Flipper
|
- Flipper
|
||||||
|
- Flipper-Boost-iOSX
|
||||||
- Flipper-DoubleConversion
|
- Flipper-DoubleConversion
|
||||||
|
- Flipper-Fmt
|
||||||
- Flipper-Folly
|
- Flipper-Folly
|
||||||
- Flipper-Glog
|
- Flipper-Glog
|
||||||
- Flipper-PeerTalk
|
- Flipper-PeerTalk
|
||||||
- Flipper-RSocket
|
- Flipper-RSocket
|
||||||
- FlipperKit
|
- FlipperKit
|
||||||
|
- fmt
|
||||||
- libevent
|
- libevent
|
||||||
- libwebp
|
- libwebp
|
||||||
- OpenSSL-Universal
|
- OpenSSL-Universal
|
||||||
@@ -481,6 +512,8 @@ SPEC REPOS:
|
|||||||
- YogaKit
|
- YogaKit
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
|
boost:
|
||||||
|
:podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
|
||||||
DoubleConversion:
|
DoubleConversion:
|
||||||
:podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
|
:podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
|
||||||
FBLazyVector:
|
FBLazyVector:
|
||||||
@@ -511,6 +544,10 @@ EXTERNAL SOURCES:
|
|||||||
:path: "../node_modules/react-native/ReactCommon/jsiexecutor"
|
:path: "../node_modules/react-native/ReactCommon/jsiexecutor"
|
||||||
React-jsinspector:
|
React-jsinspector:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsinspector"
|
:path: "../node_modules/react-native/ReactCommon/jsinspector"
|
||||||
|
React-logger:
|
||||||
|
:path: "../node_modules/react-native/ReactCommon/logger"
|
||||||
|
react-native-airplay-button:
|
||||||
|
:path: "../node_modules/react-native-airplay-button"
|
||||||
react-native-safe-area-context:
|
react-native-safe-area-context:
|
||||||
:path: "../node_modules/react-native-safe-area-context"
|
:path: "../node_modules/react-native-safe-area-context"
|
||||||
react-native-slider:
|
react-native-slider:
|
||||||
@@ -567,65 +604,70 @@ EXTERNAL SOURCES:
|
|||||||
:path: "../node_modules/react-native/ReactCommon/yoga"
|
:path: "../node_modules/react-native/ReactCommon/yoga"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
|
boost: a7c83b31436843459a1961bfd74b96033dc77234
|
||||||
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
|
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
|
||||||
DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de
|
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
|
||||||
FBLazyVector: 49cbe4b43e445b06bf29199b6ad2057649e4c8f5
|
FBLazyVector: 500821d196c3d1bd10e7e828bc93ce075234080f
|
||||||
FBReactNativeSpec: a9de79cf8f9e07689882cfd8d40269cf531a82e9
|
FBReactNativeSpec: 74c869e2cffa2ffec685cd1bac6788c021da6005
|
||||||
Flipper: d3da1aa199aad94455ae725e9f3aa43f3ec17021
|
Flipper: 30e8eeeed6abdc98edaf32af0cda2f198be4b733
|
||||||
Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41
|
Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c
|
||||||
Flipper-Folly: f7a3caafbd74bda4827954fd7a6e000e36355489
|
Flipper-DoubleConversion: 57ffbe81ef95306cc9e69c4aa3aeeeeb58a6a28c
|
||||||
|
Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b
|
||||||
|
Flipper-Folly: 83af37379faa69497529e414bd43fbfc7cae259a
|
||||||
Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6
|
Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6
|
||||||
Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
|
Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
|
||||||
Flipper-RSocket: 602921fee03edacf18f5d6f3d3594ba477f456e5
|
Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541
|
||||||
FlipperKit: 8a20b5c5fcf9436cac58551dc049867247f64b00
|
FlipperKit: d8d346844eca5d9120c17d441a2f38596e8ed2b9
|
||||||
glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62
|
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
|
||||||
|
glog: 5337263514dd6f09803962437687240c5dc39aa4
|
||||||
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
|
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
|
||||||
libwebp: 946cb3063cea9236285f7e9a8505d806d30e07f3
|
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
|
||||||
OpenSSL-Universal: 1aa4f6a6ee7256b83db99ec1ccdaa80d10f9af9b
|
OpenSSL-Universal: 1aa4f6a6ee7256b83db99ec1ccdaa80d10f9af9b
|
||||||
RCT-Folly: ec7a233ccc97cc556cf7237f0db1ff65b986f27c
|
RCT-Folly: a21c126816d8025b547704b777a2ba552f3d9fa9
|
||||||
RCTRequired: 2f8cb5b7533219bf4218a045f92768129cf7050a
|
RCTRequired: 3cc065b52aa18db729268b9bd78a2feffb4d0f91
|
||||||
RCTTypeSafety: 512728b73549e72ad7330b92f3d42936f2a4de5b
|
RCTTypeSafety: 3c4fc37d5dea452d2ef17324db5504ec2f05083a
|
||||||
React: 98eac01574128a790f0bbbafe2d1a8607291ac24
|
React: 4a00720816c52a213424442954acb7e4b724804a
|
||||||
React-callinvoker: def3f7fae16192df68d9b69fd4bbb59092ee36bc
|
React-callinvoker: 911fc6570538f3bb5c61edf9dc907c1beb4355bf
|
||||||
React-Core: 70a52aa5dbe9b83befae82038451a7df9fd54c5a
|
React-Core: e134d3a5d7b2a1a731589be776e20dbb14868f27
|
||||||
React-CoreModules: 052edef46117862e2570eb3a0f06d81c61d2c4b8
|
React-CoreModules: 2f8588b2aa47e7fef27125c8eaaabda963b3ac62
|
||||||
React-cxxreact: c1dc71b30653cfb4770efdafcbdc0ad6d388baab
|
React-cxxreact: 8f1382538cad0cc8b8eafca6d66268828e353bea
|
||||||
React-jsi: 74341196d9547cbcbcfa4b3bbbf03af56431d5a1
|
React-jsi: 9fe1854d2c0486216acebd5db3c38b4ccb23ca0b
|
||||||
React-jsiexecutor: 06a9c77b56902ae7ffcdd7a4905f664adc5d237b
|
React-jsiexecutor: db2f6e22a534d466fc0e34e622df47d9d20bab2f
|
||||||
React-jsinspector: 0ae35a37b20d5e031eb020a69cc5afdbd6406301
|
React-jsinspector: 8c0517dee5e8c70cd6c3066f20213ff7ce54f176
|
||||||
react-native-safe-area-context: e471852c5ed67eea4b10c5d9d43c1cebae3b231d
|
React-logger: bfddd3418dc1d45b77b822958f3e31422e2c179b
|
||||||
|
react-native-airplay-button: 517a0248e8d8e744a42250f67bead5175a774ece
|
||||||
|
react-native-safe-area-context: 5cf05f49df9d17261e40e518481f2e334c6cd4b5
|
||||||
react-native-slider: b733e17fdd31186707146debf1f04b5d94aa1a93
|
react-native-slider: b733e17fdd31186707146debf1f04b5d94aa1a93
|
||||||
react-native-track-player: ba2416753b58f3cdf9db5a07daa65876d659f925
|
react-native-track-player: 878d6c66e4ae3a69f6a534c57c6c34a42e9b033f
|
||||||
react-native-webview: 36561eaf7508e67f72d8c959b713bac841f3652e
|
react-native-webview: 16054e7a26009b7d5944a18e19f450e26bd4c969
|
||||||
React-perflogger: 9c547d8f06b9bf00cb447f2b75e8d7f19b7e02af
|
React-perflogger: fcac6090a80e3d967791b4c7f1b1a017f9d4a398
|
||||||
React-RCTActionSheet: 3080b6e12e0e1a5b313c8c0050699b5c794a1b11
|
React-RCTActionSheet: caf5913d9f9e605f5467206cf9d1caa6d47d7ad6
|
||||||
React-RCTAnimation: 3f96f21a497ae7dabf4d2f150ee43f906aaf516f
|
React-RCTAnimation: 6539e3bf594f6a529cd861985ba6548286ae1ead
|
||||||
React-RCTBlob: 283b8e5025e7f954176bc48164f846909002f3ed
|
React-RCTBlob: 6e2e999d28b15fd03ed533f164ce33e0fcde571a
|
||||||
React-RCTImage: 5088a484faac78f2d877e1b79125d3bb1ea94a16
|
React-RCTImage: c6bbb10eedb6b840c4474f2108b864173b83de15
|
||||||
React-RCTLinking: 5e8fbb3e9a8bc2e4e3eb15b1eb8bda5fcac27b8c
|
React-RCTLinking: 8fda9bb8fdb104e78110a903a9a77754318c7d11
|
||||||
React-RCTNetwork: 38ec277217b1e841d5e6a1fa78da65b9212ccb28
|
React-RCTNetwork: 2b26daad93830501cf14aab03eac04e304f942d3
|
||||||
React-RCTSettings: 242d6e692108c3de4f3bb74b7586a8799e9ab070
|
React-RCTSettings: 89c0dcee7adb706c749383596f57c1e882a27843
|
||||||
React-RCTText: 8746736ac8eb5a4a74719aa695b7a236a93a83d2
|
React-RCTText: 71734fce8e6cb854daeb4a5eec182c303ea58473
|
||||||
React-RCTVibration: 0fd6b21751a33cb72fce1a4a33ab9678416d307a
|
React-RCTVibration: 6600b5eed7c0fda4a433fa1198d1cb2690151791
|
||||||
React-runtimeexecutor: cad74a1eaa53ee6e7a3620231939d8fe2c6afcf0
|
React-runtimeexecutor: 33a949a51bec5f8a3c9e8d8092deb259600d761e
|
||||||
ReactCommon: cfe2b7fd20e0dbd2d1185cd7d8f99633fbc5ff05
|
ReactCommon: 620442811dc6f707b4bf5e3b27d4f19c12d5a821
|
||||||
RNCAsyncStorage: cb9a623793918c6699586281f0b51cbc38f046f9
|
RNCAsyncStorage: cb9a623793918c6699586281f0b51cbc38f046f9
|
||||||
RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459
|
RNCMaskedView: f127cd9652acfa31b91dcff613e07ba18b774db6
|
||||||
RNCPicker: 914b557e20b3b8317b084aca9ff4b4edb95f61e4
|
RNCPicker: 914b557e20b3b8317b084aca9ff4b4edb95f61e4
|
||||||
RNFastImage: d4870d58f5936111c56218dbd7fcfc18e65b58ff
|
RNFastImage: 1f2cab428712a4baaf78d6169eaec7f622556dd7
|
||||||
RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211
|
RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211
|
||||||
RNLocalize: 47e22ef8c36df1d572e42a87c8ae22e3fcf551dd
|
RNLocalize: 13a971fd888f2933504a745983f781dc52feeab6
|
||||||
RNReanimated: 64f6c5789f82818c07ba3c71864b73619cb23c76
|
RNReanimated: b04ef2a4f0cb61b062bbcf033f84a9e470f4f60b
|
||||||
RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d
|
RNScreens: 6e1ea5787989f92b0671049b808aef64fa1ef98c
|
||||||
RNSentry: 4f6907f9a4a41058988ebaa17666e9a402b50ff2
|
RNSentry: 68644ef607b780551cc555f084869764f2566652
|
||||||
RNSVG: ce9d996113475209013317e48b05c21ee988d42e
|
RNSVG: 4ecc2e8f38b6ebe7889909570c26f3abe8059767
|
||||||
SDWebImage: c666b97e1fa9c64b4909816a903322018f0a9c84
|
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
|
||||||
SDWebImageWebPCoder: d0dac55073088d24b2ac1b191a71a8f8d0adac21
|
SDWebImageWebPCoder: f93010f3f6c031e2f8fb3081ca4ee6966c539815
|
||||||
Sentry: 9d055e2de30a77685e86b219acf02e59b82091fc
|
Sentry: 1d3eb1a25f8c5333c88dd5603904a6d461cd9fcf
|
||||||
Yoga: 8c8436d4171c87504c648ae23b1d81242bdf3bbf
|
Yoga: 2b4a01651f42a32f82e6cef3830a3ba48088237f
|
||||||
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
|
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
|
||||||
|
|
||||||
PODFILE CHECKSUM: d99c1202f98b3f7477b6a86c9226010b36143469
|
PODFILE CHECKSUM: 640720093b3030dd16ab5dd407cf5fd8c4f7f7c8
|
||||||
|
|
||||||
COCOAPODS: 1.10.1
|
COCOAPODS: 1.11.2
|
||||||
|
|||||||
5654
package-lock.json
generated
5654
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
82
package.json
82
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "JellyfinAudioPlayer",
|
"name": "JellyfinAudioPlayer",
|
||||||
"version": "0.0.1",
|
"version": "0.1.5",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -13,63 +13,63 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@react-native-community/async-storage": "^1.12.1",
|
"@react-native-community/async-storage": "^1.12.1",
|
||||||
"@react-native-community/masked-view": "^0.1.10",
|
"@react-native-community/masked-view": "^0.1.11",
|
||||||
"@react-native-community/picker": "^1.8.1",
|
"@react-native-community/picker": "^1.8.1",
|
||||||
"@react-native-community/slider": "^3.0.3",
|
"@react-native-community/slider": "^3.0.3",
|
||||||
"@react-navigation/bottom-tabs": "^5.11.8",
|
"@react-navigation/bottom-tabs": "^5.11.15",
|
||||||
"@react-navigation/native": "^5.9.3",
|
"@react-navigation/native": "^5.9.8",
|
||||||
"@react-navigation/stack": "^5.14.3",
|
"@react-navigation/stack": "^5.14.9",
|
||||||
"@reduxjs/toolkit": "^1.5.0",
|
"@reduxjs/toolkit": "^1.6.2",
|
||||||
"@sentry/react-native": "^2.3.0",
|
"@sentry/react-native": "^2.6.2",
|
||||||
"@types/lodash": "^4.14.168",
|
"@types/lodash": "^4.14.176",
|
||||||
"date-fns": "^2.19.0",
|
"date-fns": "^2.25.0",
|
||||||
"fuse.js": "^6.4.6",
|
"fuse.js": "^6.4.6",
|
||||||
"i18n-js": "^3.8.0",
|
"i18n-js": "^3.8.0",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"react": "17.0.1",
|
"react": "^17.0.2",
|
||||||
"react-native": "0.64.0",
|
"react-native": "^0.66.1",
|
||||||
"react-native-airplay-button": "^1.0.4",
|
"react-native-airplay-button": "^1.1.0",
|
||||||
"react-native-collapsible": "^1.5.3",
|
"react-native-collapsible": "^1.6.0",
|
||||||
"react-native-dotenv": "^2.5.1",
|
"react-native-dotenv": "^2.6.2",
|
||||||
"react-native-fast-image": "^8.3.4",
|
"react-native-fast-image": "^8.5.11",
|
||||||
"react-native-gesture-handler": "^1.10.3",
|
"react-native-gesture-handler": "^1.10.3",
|
||||||
"react-native-localize": "^2.0.2",
|
"react-native-localize": "^2.1.5",
|
||||||
"react-native-reanimated": "^2.0.0",
|
"react-native-reanimated": "^2.2.3",
|
||||||
"react-native-safe-area-context": "^3.2.0",
|
"react-native-safe-area-context": "^3.3.2",
|
||||||
"react-native-screens": "^2.18.1",
|
"react-native-screens": "^3.8.0",
|
||||||
"react-native-svg": "^12.1.0",
|
"react-native-svg": "^12.2.0",
|
||||||
"react-native-svg-transformer": "^0.14.3",
|
"react-native-svg-transformer": "^0.14.3",
|
||||||
"react-native-track-player": "^1.2.6",
|
"react-native-track-player": "^1.2.7",
|
||||||
"react-native-webview": "^11.3.1",
|
"react-native-webview": "^11.14.1",
|
||||||
"react-redux": "^7.2.2",
|
"react-redux": "^7.2.6",
|
||||||
"redux": "^4.0.5",
|
"redux": "^4.1.1",
|
||||||
"redux-logger": "^3.0.6",
|
"redux-logger": "^3.0.6",
|
||||||
"redux-persist": "^6.0.0",
|
"redux-persist": "^6.0.0",
|
||||||
"styled-components": "^5.2.1"
|
"styled-components": "^5.3.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.13.10",
|
"@babel/core": "^7.15.8",
|
||||||
"@babel/runtime": "^7.13.10",
|
"@babel/runtime": "^7.15.4",
|
||||||
"@react-native-community/eslint-config": "^2.0.0",
|
"@react-native-community/eslint-config": "^2.0.0",
|
||||||
"@sentry/cli": "^1.63.1",
|
"@sentry/cli": "^1.70.1",
|
||||||
"@types/i18n-js": "^3.8.0",
|
"@types/i18n-js": "^3.8.2",
|
||||||
"@types/jest": "^26.0.21",
|
"@types/jest": "^26.0.24",
|
||||||
"@types/react-native": "^0.64.0",
|
"@types/react-native": "^0.66.1",
|
||||||
"@types/react-redux": "^7.1.16",
|
"@types/react-redux": "^7.1.20",
|
||||||
"@types/react-test-renderer": "^17.0.1",
|
"@types/react-test-renderer": "^17.0.1",
|
||||||
"@types/redux-logger": "^3.0.8",
|
"@types/redux-logger": "^3.0.9",
|
||||||
"@types/styled-components": "^5.1.9",
|
"@types/styled-components": "^5.1.15",
|
||||||
"@types/styled-components-react-native": "^5.1.1",
|
"@types/styled-components-react-native": "^5.1.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.18.0",
|
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
||||||
"@typescript-eslint/parser": "^4.18.0",
|
"@typescript-eslint/parser": "^4.33.0",
|
||||||
"babel-jest": "^26.6.3",
|
"babel-jest": "^26.6.3",
|
||||||
"babel-plugin-module-resolver": "^4.1.0",
|
"babel-plugin-module-resolver": "^4.1.0",
|
||||||
"eslint": "^7.22.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-plugin-react-hooks": "^4.2.0",
|
"eslint-plugin-react-hooks": "^4.2.0",
|
||||||
"jest": "^26.6.3",
|
"jest": "^26.6.3",
|
||||||
"metro-react-native-babel-preset": "^0.65.2",
|
"metro-react-native-babel-preset": "^0.66.2",
|
||||||
"react-test-renderer": "^17.0.1",
|
"react-test-renderer": "^17.0.2",
|
||||||
"typescript": "^4.2.3"
|
"typescript": "^4.4.4"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"preset": "react-native",
|
"preset": "react-native",
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ import {
|
|||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import { useColorScheme } from 'react-native';
|
import { useColorScheme } from 'react-native';
|
||||||
import { ColorSchemeContext, themes } from './Colors';
|
import { ColorSchemeContext, themes } from './Colors';
|
||||||
import ErrorReportingAlert from 'utility/ErrorReportingAlert';
|
// import ErrorReportingAlert from 'utility/ErrorReportingAlert';
|
||||||
|
import PlayerStateUpdater from './PlayerStateUpdater';
|
||||||
|
|
||||||
export default function App(): JSX.Element {
|
export default function App(): JSX.Element {
|
||||||
const colorScheme = useColorScheme();
|
const colorScheme = useColorScheme();
|
||||||
@@ -41,6 +42,7 @@ export default function App(): JSX.Element {
|
|||||||
<ColorSchemeContext.Provider value={theme}>
|
<ColorSchemeContext.Provider value={theme}>
|
||||||
<NavigationContainer theme={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
|
<NavigationContainer theme={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
|
||||||
<Routes />
|
<Routes />
|
||||||
|
<PlayerStateUpdater />
|
||||||
</NavigationContainer>
|
</NavigationContainer>
|
||||||
</ColorSchemeContext.Provider>
|
</ColorSchemeContext.Provider>
|
||||||
</PersistGate>
|
</PersistGate>
|
||||||
|
|||||||
@@ -13,21 +13,14 @@ interface ButtonProps extends PressableProps {
|
|||||||
style?: ViewProps['style'];
|
style?: ViewProps['style'];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface PressableStyleProps {
|
|
||||||
active: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
const BaseButton = styled.Pressable<PressableStyleProps>`
|
const BaseButton = styled.Pressable`
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
|
|
||||||
${props => props.active && css`
|
|
||||||
background-color: ${THEME_COLOR};
|
|
||||||
`}
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const ButtonText = styled.Text<{ active?: boolean }>`
|
const ButtonText = styled.Text<{ active?: boolean }>`
|
||||||
@@ -51,8 +44,10 @@ export default function Button(props: ButtonProps) {
|
|||||||
{...rest}
|
{...rest}
|
||||||
onPressIn={handlePressIn}
|
onPressIn={handlePressIn}
|
||||||
onPressOut={handlePressOut}
|
onPressOut={handlePressOut}
|
||||||
active={isPressed}
|
style={[
|
||||||
style={[ defaultStyles.button, props.style ]}
|
props.style,
|
||||||
|
{ backgroundColor: isPressed ? THEME_COLOR : defaultStyles.button.backgroundColor }
|
||||||
|
]}
|
||||||
>
|
>
|
||||||
{Icon &&
|
{Icon &&
|
||||||
<Icon
|
<Icon
|
||||||
|
|||||||
54
src/components/PlayerStateUpdater.ts
Normal file
54
src/components/PlayerStateUpdater.ts
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import { useCallback, useEffect } from 'react';
|
||||||
|
import TrackPlayer, { TrackPlayerEvents } from 'react-native-track-player';
|
||||||
|
import { shallowEqual, useDispatch } from 'react-redux';
|
||||||
|
import { useTypedSelector } from 'store';
|
||||||
|
import player from 'store/player';
|
||||||
|
|
||||||
|
function PlayerStateUpdater() {
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
const trackId = useTypedSelector(state => state.player.currentTrack?.id, shallowEqual);
|
||||||
|
|
||||||
|
const handleUpdate = useCallback(async () => {
|
||||||
|
const currentTrackId = await TrackPlayer.getCurrentTrack();
|
||||||
|
|
||||||
|
// GUARD: Only retrieve new track if it is different from the one we
|
||||||
|
// have currently in state.
|
||||||
|
if (currentTrackId === trackId){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// GUARD: Only fetch current track if there is a current track
|
||||||
|
if (!currentTrackId) {
|
||||||
|
dispatch(player.actions.setCurrentTrack(undefined));
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it is different, retrieve the track and save it
|
||||||
|
try {
|
||||||
|
const currentTrack = await TrackPlayer.getTrack(currentTrackId);
|
||||||
|
dispatch(player.actions.setCurrentTrack(currentTrack));
|
||||||
|
} catch {
|
||||||
|
// Due to the async nature, a track might be removed at the
|
||||||
|
// point when we try to retrieve it. If this happens, we'll just
|
||||||
|
// smother the error and wait for a new track update to
|
||||||
|
// finish.
|
||||||
|
}
|
||||||
|
}, [trackId, dispatch]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
function handler() {
|
||||||
|
handleUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
handler();
|
||||||
|
|
||||||
|
const subscription = TrackPlayer.addEventListener(TrackPlayerEvents.PLAYBACK_TRACK_CHANGED, handler);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
subscription.remove();
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PlayerStateUpdater;
|
||||||
@@ -9,6 +9,7 @@ const localeGetters: Record<string, () => object> = {
|
|||||||
nl: () => require('./lang/nl/locale.json'),
|
nl: () => require('./lang/nl/locale.json'),
|
||||||
es: () => require('./lang/es/locale.json'),
|
es: () => require('./lang/es/locale.json'),
|
||||||
zh: () => require('./lang/zh/locale.json'),
|
zh: () => require('./lang/zh/locale.json'),
|
||||||
|
ja: () => require('./lang/ja/locale.json'),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Have RNLocalize pick the best locale from the languages on offer
|
// Have RNLocalize pick the best locale from the languages on offer
|
||||||
|
|||||||
@@ -38,5 +38,6 @@
|
|||||||
"enable-error-reporting-description": "This helps improve the app experience by sending crash and error reports to us.",
|
"enable-error-reporting-description": "This helps improve the app experience by sending crash and error reports to us.",
|
||||||
"enable": "Enable",
|
"enable": "Enable",
|
||||||
"disable": "Disable",
|
"disable": "Disable",
|
||||||
"more-info": "More Info"
|
"more-info": "More Info",
|
||||||
|
"track": "Track"
|
||||||
}
|
}
|
||||||
43
src/localisation/lang/ja/locale.json
Normal file
43
src/localisation/lang/ja/locale.json
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"play-next": "再生する",
|
||||||
|
"play-album": "アルバムを再生する",
|
||||||
|
"queue": "再生リスト",
|
||||||
|
"add-to-queue": "再生リストに追加",
|
||||||
|
"clear-queue": "再生リストをクリア",
|
||||||
|
"no-results": "結果なし",
|
||||||
|
"album": "アルバム",
|
||||||
|
"albums": "アルバム",
|
||||||
|
"all-albums": "すべてのアルバム",
|
||||||
|
"search": "検索",
|
||||||
|
"music": "音楽",
|
||||||
|
"now-playing": "再生中",
|
||||||
|
"onboarding-welcome": "ようこそ。",
|
||||||
|
"onboarding-intro": "Jellyfin Audio Player は、どこからでも音楽ライブラリをストリーミングすることができます。バックグラウンド・オーディオやキャスティングを完全にサポートします。",
|
||||||
|
"onboarding-cta": "始めるためには、Jellyfin サーバーが必要です。下のボタンをクリックして、Jellyfin サーバーのアドレスを入力し、ログインしてください。",
|
||||||
|
"set-jellyfin-server": "Jellyfin サーバ を設定",
|
||||||
|
"set-jellyfin-server-instruction": "Jellyfin サーバの URL を入力してください。プロトコルとポートを必ず含めてください。",
|
||||||
|
"settings": "設定",
|
||||||
|
"jellyfin-library": "Jellyfin ライブライ",
|
||||||
|
"jellyfin-server-url": "Jellyfin サーバの URL",
|
||||||
|
"jellyfin-access-token": "Jellyfin アクセストークン",
|
||||||
|
"jellyfin-user-id": "Jellyfin ユーザ ID",
|
||||||
|
"setting-cache": "キャッシュ",
|
||||||
|
"setting-cache-description": "Jellyfinライブラリをアップデートしたにもかかわらず、アプリがキャッシュされたアセットを保持している場合、このボタンを使って強制的にキャッシュをクリアすることができます。これにより、アプリはライブラリを最初から取得するようになります。",
|
||||||
|
"reset-cache": "キャッシュをリセット",
|
||||||
|
"recent-albums": "最近のアルバム",
|
||||||
|
"error-reporting": "エラー報告",
|
||||||
|
"error-reporting-description": "このアプリを使用中に、エラーの可能性があります。これらのエラーを報告することで、よりセキュアで安定したアプリ体験を実現することができます。",
|
||||||
|
"error-reporting-rationale": "エラーレポートを有効にすると、エラーが発生するたびにレポートが自動的に作成され、デバイス、バージョン、特定のエラーなど、デバッグに役立つ情報とともにサーバーに送信されます。",
|
||||||
|
"why-use-tracking": "なぜトラッキングを使うか?",
|
||||||
|
"why-use-tracking-description": "トラッキングは、奇妙なエッジケースや見落としを報告することで、このアプリの開発を促進します。これにより、アプリの安定性と堅牢性が向上し、すべての人のアプリ体験が向上します。",
|
||||||
|
"what-data-is-gathered": "どのデータが集まりますか?",
|
||||||
|
"what-data-is-gathered-description": "エラー、デバイスタイプ、OSバージョン、アプリバージョン、デバイスIDが記録されます。いかなるエラー報告においても、アプリケーションの状態は送信されません。デバイスIDは、デバイスの設定でリセット可能な一意のハッシュであり、この識別子から個人情報を推測することはできません。",
|
||||||
|
"where-is-data-stored": "データはどこに保存されていますか?",
|
||||||
|
"where-is-data-stored-description": "Sentryサービスは、私たち自身のインフラでセルフホストされています。当社以外の誰も、サーバー、データベース、アプリケーション、データログにアクセスすることはできません。このインフラはEUでホストされています。",
|
||||||
|
"enable-error-reporting": "エラー報告を有効にしますか?",
|
||||||
|
"enable-error-reporting-description": "これは、クラッシュやエラーのレポートを送信することで、アプリを改善に役立ちます。",
|
||||||
|
"enable": "有効する",
|
||||||
|
"disable": "無効する",
|
||||||
|
"more-info": "詳しくは",
|
||||||
|
"track": "追跡"
|
||||||
|
}
|
||||||
@@ -12,9 +12,9 @@
|
|||||||
"music": "Muziek",
|
"music": "Muziek",
|
||||||
"now-playing": "Nu spelend",
|
"now-playing": "Nu spelend",
|
||||||
"onboarding-welcome": "Welkom!",
|
"onboarding-welcome": "Welkom!",
|
||||||
"onboarding-intro": "Jellyfin Audio Player maakt het mogelijk om van waar dan ook je muziek te streamen, met volledige support voor achtegroundaudio en casting.",
|
"onboarding-intro": "Jellyfin Audio Player maakt het mogelijk om van waar dan ook je muziek te streamen, met volledige support voor achtergroundaudio en casting.",
|
||||||
"onboarding-cta": "Om te starten moet je een Jellyfin server hebben. Klik de onderstaande knop om het adres van je Jellyfin server in te vullen en er in te loggen.",
|
"onboarding-cta": "Om te starten moet je een Jellyfin server hebben. Klik de onderstaande knop om het adres van je Jellyfin server in te vullen en er in te loggen.",
|
||||||
"set-jellyfin-server": "Kies Jellyfin Server in",
|
"set-jellyfin-server": "Stel Jellyfin Server in",
|
||||||
"set-jellyfin-server-instruction": "Vul alsjeblieft je Jellyfin server URL in. Voeg ook het protocol en de poort toe",
|
"set-jellyfin-server-instruction": "Vul alsjeblieft je Jellyfin server URL in. Voeg ook het protocol en de poort toe",
|
||||||
"settings": "Instellingen",
|
"settings": "Instellingen",
|
||||||
"jellyfin-library": "Jellyfin Bibliotheek",
|
"jellyfin-library": "Jellyfin Bibliotheek",
|
||||||
|
|||||||
@@ -37,4 +37,5 @@ export type LocaleKeys = 'play-next'
|
|||||||
| 'enable-error-reporting-description'
|
| 'enable-error-reporting-description'
|
||||||
| 'enable'
|
| 'enable'
|
||||||
| 'disable'
|
| 'disable'
|
||||||
| 'more-info'
|
| 'more-info'
|
||||||
|
| 'track'
|
||||||
@@ -80,7 +80,7 @@ const Album: React.FC = () => {
|
|||||||
const refresh = useCallback(() => { dispatch(fetchTracksByAlbum(id)); }, [id, dispatch]);
|
const refresh = useCallback(() => { dispatch(fetchTracksByAlbum(id)); }, [id, dispatch]);
|
||||||
const selectTrack = useCallback(async (trackId) => {
|
const selectTrack = useCallback(async (trackId) => {
|
||||||
const tracks = await playAlbum(id, false);
|
const tracks = await playAlbum(id, false);
|
||||||
|
|
||||||
if (tracks) {
|
if (tracks) {
|
||||||
const track = tracks.find((t) => t.id.startsWith(trackId));
|
const track = tracks.find((t) => t.id.startsWith(trackId));
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import React, { useState, useEffect, useRef, useCallback } from 'react';
|
import React, { useState, useEffect, useRef, useCallback } from 'react';
|
||||||
import Input from 'components/Input';
|
import Input from 'components/Input';
|
||||||
import { Text, View } from 'react-native';
|
import { ActivityIndicator, Text, View } from 'react-native';
|
||||||
import styled from 'styled-components/native';
|
import styled from 'styled-components/native';
|
||||||
import { useTypedSelector } from 'store';
|
import { useAppDispatch, useTypedSelector } from 'store';
|
||||||
import Fuse from 'fuse.js';
|
import Fuse from 'fuse.js';
|
||||||
import { Album } from 'store/music/types';
|
import { Album, AlbumTrack } from 'store/music/types';
|
||||||
import { FlatList } from 'react-native-gesture-handler';
|
import { FlatList } from 'react-native-gesture-handler';
|
||||||
import TouchableHandler from 'components/TouchableHandler';
|
import TouchableHandler from 'components/TouchableHandler';
|
||||||
import { useNavigation } from '@react-navigation/native';
|
import { useNavigation } from '@react-navigation/native';
|
||||||
@@ -13,9 +13,21 @@ import { NavigationProp } from '../types';
|
|||||||
import FastImage from 'react-native-fast-image';
|
import FastImage from 'react-native-fast-image';
|
||||||
import { t } from '@localisation';
|
import { t } from '@localisation';
|
||||||
import useDefaultStyles from 'components/Colors';
|
import useDefaultStyles from 'components/Colors';
|
||||||
|
import { searchAndFetchAlbums } from 'store/music/actions';
|
||||||
|
import { debounce } from 'lodash';
|
||||||
|
|
||||||
const Container = styled.View`
|
const Container = styled.View`
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
|
position: relative;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const Loading = styled.View`
|
||||||
|
position: absolute;
|
||||||
|
right: 32px;
|
||||||
|
top: 0;
|
||||||
|
height: 100%;
|
||||||
|
flex: 1;
|
||||||
|
justify-content: center;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const AlbumImage = styled(FastImage)`
|
const AlbumImage = styled(FastImage)`
|
||||||
@@ -46,18 +58,39 @@ const fuseOptions = {
|
|||||||
includeScore: true,
|
includeScore: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type AudioResult = {
|
||||||
|
type: 'Audio',
|
||||||
|
id: string;
|
||||||
|
album: string;
|
||||||
|
name: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type AlbumResult = {
|
||||||
|
type: 'AlbumArtist',
|
||||||
|
id: string;
|
||||||
|
album: undefined;
|
||||||
|
name: undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
type CombinedResults = (AudioResult | AlbumResult)[];
|
||||||
|
|
||||||
export default function Search() {
|
export default function Search() {
|
||||||
const defaultStyles = useDefaultStyles();
|
const defaultStyles = useDefaultStyles();
|
||||||
|
|
||||||
// Prepare state
|
// Prepare state
|
||||||
|
const [fuseIsReady, setFuseReady] = useState(false);
|
||||||
const [searchTerm, setSearchTerm] = useState('');
|
const [searchTerm, setSearchTerm] = useState('');
|
||||||
const albums = useTypedSelector(state => state.music.albums.entities);
|
const albums = useTypedSelector(state => state.music.albums.entities);
|
||||||
const [results, setResults] = useState<Fuse.FuseResult<Album>[]>([]);
|
const [fuseResults, setFuseResults] = useState<CombinedResults>([]);
|
||||||
const fuse = useRef<Fuse<Album, typeof fuseOptions>>();
|
const [jellyfinResults, setJellyfinResults] = useState<CombinedResults>([]);
|
||||||
|
|
||||||
|
const [isLoading, setLoading] = useState(false);
|
||||||
|
const fuse = useRef<Fuse<Album>>();
|
||||||
|
|
||||||
// Prepare helpers
|
// Prepare helpers
|
||||||
const navigation = useNavigation<NavigationProp>();
|
const navigation = useNavigation<NavigationProp>();
|
||||||
const getImage = useGetImage();
|
const getImage = useGetImage();
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Since it is impractical to have a global fuse variable, we need to
|
* Since it is impractical to have a global fuse variable, we need to
|
||||||
@@ -68,21 +101,89 @@ export default function Search() {
|
|||||||
*/
|
*/
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fuse.current = new Fuse(Object.values(albums) as Album[], fuseOptions);
|
fuse.current = new Fuse(Object.values(albums) as Album[], fuseOptions);
|
||||||
}, [albums]);
|
setFuseReady(true);
|
||||||
|
}, [albums, setFuseReady]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function retrieves search results from Jellyfin. It is a seperate
|
||||||
|
* callback, so that we can make sure it is properly debounced and doesn't
|
||||||
|
* cause execessive jank in the interface.
|
||||||
|
*/
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
const fetchJellyfinResults = useCallback(debounce(async (searchTerm: string, currentResults: CombinedResults) => {
|
||||||
|
// First, query the Jellyfin API
|
||||||
|
const { payload } = await dispatch(searchAndFetchAlbums({ term: searchTerm }));
|
||||||
|
|
||||||
|
// Convert the current results to album ids
|
||||||
|
const albumIds = currentResults.map(item => item.id);
|
||||||
|
|
||||||
|
// Parse the result in correct typescript form
|
||||||
|
const results = (payload as { results: (Album | AlbumTrack)[] }).results;
|
||||||
|
|
||||||
|
// Filter any results that are already displayed
|
||||||
|
const items = results.filter(item => (
|
||||||
|
!(item.Type === 'MusicAlbum' && albumIds.includes(item.Id))
|
||||||
|
// Then convert the results to proper result form
|
||||||
|
)).map((item) => ({
|
||||||
|
type: item.Type,
|
||||||
|
id: item.Id,
|
||||||
|
album: item.Type === 'Audio'
|
||||||
|
? item.AlbumId
|
||||||
|
: undefined,
|
||||||
|
name: item.Type === 'Audio'
|
||||||
|
? item.Name
|
||||||
|
: undefined,
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Lastly, we'll merge the two and assign them to the state
|
||||||
|
setJellyfinResults([...items] as CombinedResults);
|
||||||
|
|
||||||
|
// Loading is now complete
|
||||||
|
setLoading(false);
|
||||||
|
}, 50), [dispatch, setJellyfinResults]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whenever the search term changes, we gather results from Fuse and assign
|
* Whenever the search term changes, we gather results from Fuse and assign
|
||||||
* them to state
|
* them to state
|
||||||
*/
|
*/
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// GUARD: In some extraordinary cases, Fuse might not be presented since
|
if (!searchTerm) {
|
||||||
// it is assigned via refs. In this case, we can't handle any searching.
|
|
||||||
if (!fuse.current) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setResults(fuse.current.search(searchTerm));
|
const retrieveResults = async () => {
|
||||||
}, [searchTerm, setResults, fuse]);
|
// GUARD: In some extraordinary cases, Fuse might not be presented since
|
||||||
|
// it is assigned via refs. In this case, we can't handle any searching.
|
||||||
|
if (!fuse.current) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// First set the immediate results from fuse
|
||||||
|
const fuseResults = fuse.current.search(searchTerm);
|
||||||
|
const albums: AlbumResult[] = fuseResults
|
||||||
|
.map(({ item }) => ({
|
||||||
|
id: item.Id,
|
||||||
|
type: 'AlbumArtist',
|
||||||
|
album: undefined,
|
||||||
|
name: undefined,
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Assign the preliminary results
|
||||||
|
setFuseResults(albums);
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
// Wrap the call in a try/catch block so that we catch any
|
||||||
|
// network issues in search and just use local search if the
|
||||||
|
// network is unavailable
|
||||||
|
fetchJellyfinResults(searchTerm, albums);
|
||||||
|
} catch {
|
||||||
|
// Reset the loading indicator if the network fails
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
retrieveResults();
|
||||||
|
}, [searchTerm, setFuseResults, setLoading, fuse, fetchJellyfinResults]);
|
||||||
|
|
||||||
// Handlers
|
// Handlers
|
||||||
const selectAlbum = useCallback((id: string) =>
|
const selectAlbum = useCallback((id: string) =>
|
||||||
@@ -92,35 +193,59 @@ export default function Search() {
|
|||||||
const HeaderComponent = React.useMemo(() => (
|
const HeaderComponent = React.useMemo(() => (
|
||||||
<Container>
|
<Container>
|
||||||
<Input value={searchTerm} onChangeText={setSearchTerm} style={defaultStyles.input} placeholder={t('search') + '...'} />
|
<Input value={searchTerm} onChangeText={setSearchTerm} style={defaultStyles.input} placeholder={t('search') + '...'} />
|
||||||
{(searchTerm.length && !results.length) ? <Text style={{ textAlign: 'center' }}>{t('no-results')}</Text> : null}
|
{isLoading && <Loading><ActivityIndicator /></Loading>}
|
||||||
</Container>
|
</Container>
|
||||||
), [searchTerm, results, setSearchTerm, defaultStyles]);
|
), [searchTerm, setSearchTerm, defaultStyles, isLoading]);
|
||||||
|
|
||||||
|
const FooterComponent = React.useMemo(() => (
|
||||||
|
<Container>
|
||||||
|
{(searchTerm.length && !jellyfinResults.length && !fuseResults.length && !isLoading)
|
||||||
|
? <Text style={{ textAlign: 'center' }}>{t('no-results')}</Text>
|
||||||
|
: null}
|
||||||
|
</Container>
|
||||||
|
), [searchTerm, jellyfinResults, fuseResults, isLoading]);
|
||||||
|
|
||||||
// GUARD: We cannot search for stuff unless Fuse is loaded with results.
|
// GUARD: We cannot search for stuff unless Fuse is loaded with results.
|
||||||
// Therefore we delay rendering to when we are certain it's there.
|
// Therefore we delay rendering to when we are certain it's there.
|
||||||
if (!fuse.current) {
|
if (!fuseIsReady) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FlatList
|
<>
|
||||||
data={results}
|
<FlatList
|
||||||
renderItem={({ item: { item: album } }) =>(
|
style={{ flex: 1 }}
|
||||||
<TouchableHandler id={album.Id} onPress={selectAlbum}>
|
data={[...jellyfinResults, ...fuseResults]}
|
||||||
<SearchResult style={defaultStyles.border}>
|
renderItem={({ item: { id, type, album: trackAlbum, name: trackName } }: { item: AlbumResult | AudioResult }) => {
|
||||||
<AlbumImage source={{ uri: getImage(album.Id) }} />
|
const album = albums[trackAlbum || id];
|
||||||
<View>
|
|
||||||
<Text numberOfLines={1} ellipsizeMode="tail" style={defaultStyles.text}>
|
// GUARD: If the album cannot be found in the store, we
|
||||||
{album.Name} - {album.AlbumArtist}
|
// cannot display it.
|
||||||
</Text>
|
if (!album) {
|
||||||
<HalfOpacity style={defaultStyles.text}>{t('album')}</HalfOpacity>
|
return null;
|
||||||
</View>
|
}
|
||||||
</SearchResult>
|
|
||||||
</TouchableHandler>
|
return (
|
||||||
)}
|
<TouchableHandler id={album.Id} onPress={selectAlbum}>
|
||||||
keyExtractor={(item) => item.refIndex.toString()}
|
<SearchResult style={defaultStyles.border}>
|
||||||
ListHeaderComponent={HeaderComponent}
|
<AlbumImage source={{ uri: getImage(album.Id) }} />
|
||||||
extraData={searchTerm}
|
<View>
|
||||||
/>
|
<Text numberOfLines={1} ellipsizeMode="tail" style={defaultStyles.text}>
|
||||||
|
{trackName || album.Name} - {album.AlbumArtist}
|
||||||
|
</Text>
|
||||||
|
<HalfOpacity style={defaultStyles.text}>
|
||||||
|
{type === 'AlbumArtist' ? t('album'): t('track')}
|
||||||
|
</HalfOpacity>
|
||||||
|
</View>
|
||||||
|
</SearchResult>
|
||||||
|
</TouchableHandler>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
keyExtractor={(item) => item.id}
|
||||||
|
ListHeaderComponent={HeaderComponent}
|
||||||
|
ListFooterComponent={FooterComponent}
|
||||||
|
extraData={[searchTerm, albums]}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1,70 +1,5 @@
|
|||||||
import { StackNavigationProp } from '@react-navigation/stack';
|
import { StackNavigationProp } from '@react-navigation/stack';
|
||||||
|
import { Album } from 'store/music/types';
|
||||||
export interface UserData {
|
|
||||||
PlaybackPositionTicks: number;
|
|
||||||
PlayCount: number;
|
|
||||||
IsFavorite: boolean;
|
|
||||||
Played: boolean;
|
|
||||||
Key: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ArtistItem {
|
|
||||||
Name: string;
|
|
||||||
Id: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AlbumArtist {
|
|
||||||
Name: string;
|
|
||||||
Id: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ImageTags {
|
|
||||||
Primary: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Album {
|
|
||||||
Name: string;
|
|
||||||
ServerId: string;
|
|
||||||
Id: string;
|
|
||||||
SortName: string;
|
|
||||||
RunTimeTicks: number;
|
|
||||||
ProductionYear: number;
|
|
||||||
IsFolder: boolean;
|
|
||||||
Type: string;
|
|
||||||
UserData: UserData;
|
|
||||||
PrimaryImageAspectRatio: number;
|
|
||||||
Artists: string[];
|
|
||||||
ArtistItems: ArtistItem[];
|
|
||||||
AlbumArtist: string;
|
|
||||||
AlbumArtists: AlbumArtist[];
|
|
||||||
ImageTags: ImageTags;
|
|
||||||
BackdropImageTags: any[];
|
|
||||||
LocationType: string;
|
|
||||||
DateCreated: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AlbumTrack {
|
|
||||||
Name: string;
|
|
||||||
ServerId: string;
|
|
||||||
Id: string;
|
|
||||||
RunTimeTicks: number;
|
|
||||||
ProductionYear: number;
|
|
||||||
IndexNumber: number;
|
|
||||||
IsFolder: boolean;
|
|
||||||
Type: string;
|
|
||||||
UserData: UserData;
|
|
||||||
Artists: string[];
|
|
||||||
ArtistItems: ArtistItem[];
|
|
||||||
Album: string;
|
|
||||||
AlbumId: string;
|
|
||||||
AlbumPrimaryImageTag: string;
|
|
||||||
AlbumArtist: string;
|
|
||||||
AlbumArtists: AlbumArtist[];
|
|
||||||
ImageTags: ImageTags;
|
|
||||||
BackdropImageTags: any[];
|
|
||||||
LocationType: string;
|
|
||||||
MediaType: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type StackParams = {
|
export type StackParams = {
|
||||||
Albums: undefined;
|
Albums: undefined;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { configureStore, getDefaultMiddleware, combineReducers } from '@reduxjs/toolkit';
|
import { configureStore, getDefaultMiddleware, combineReducers } from '@reduxjs/toolkit';
|
||||||
import { useSelector, TypedUseSelectorHook } from 'react-redux';
|
import { useSelector, TypedUseSelectorHook, useDispatch } from 'react-redux';
|
||||||
import AsyncStorage from '@react-native-community/async-storage';
|
import AsyncStorage from '@react-native-community/async-storage';
|
||||||
import { persistStore, persistReducer, PersistConfig } from 'redux-persist';
|
import { persistStore, persistReducer, PersistConfig } from 'redux-persist';
|
||||||
import autoMergeLevel2 from 'redux-persist/es/stateReconciler/autoMergeLevel2';
|
import autoMergeLevel2 from 'redux-persist/es/stateReconciler/autoMergeLevel2';
|
||||||
@@ -34,6 +34,7 @@ export type AppState = ReturnType<typeof reducers>;
|
|||||||
export type AppDispatch = typeof store.dispatch;
|
export type AppDispatch = typeof store.dispatch;
|
||||||
export type AsyncThunkAPI = { state: AppState, dispatch: AppDispatch };
|
export type AsyncThunkAPI = { state: AppState, dispatch: AppDispatch };
|
||||||
export const useTypedSelector: TypedUseSelectorHook<AppState> = useSelector;
|
export const useTypedSelector: TypedUseSelectorHook<AppState> = useSelector;
|
||||||
|
export const useAppDispatch = () => useDispatch<AppDispatch>();
|
||||||
|
|
||||||
export const persistedStore = persistStore(store);
|
export const persistedStore = persistStore(store);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { createAsyncThunk, createEntityAdapter } from '@reduxjs/toolkit';
|
import { createAsyncThunk, createEntityAdapter } from '@reduxjs/toolkit';
|
||||||
import { Album, AlbumTrack } from './types';
|
import { Album, AlbumTrack } from './types';
|
||||||
import { AsyncThunkAPI } from '..';
|
import { AsyncThunkAPI } from '..';
|
||||||
import { retrieveAlbums, retrieveAlbumTracks, retrieveRecentAlbums } from 'utility/JellyfinApi';
|
import { retrieveAllAlbums, retrieveAlbumTracks, retrieveRecentAlbums, searchItem, retrieveAlbum } from 'utility/JellyfinApi';
|
||||||
|
|
||||||
export const albumAdapter = createEntityAdapter<Album>({
|
export const albumAdapter = createEntityAdapter<Album>({
|
||||||
selectId: album => album.Id,
|
selectId: album => album.Id,
|
||||||
@@ -15,7 +15,7 @@ export const fetchAllAlbums = createAsyncThunk<Album[], undefined, AsyncThunkAPI
|
|||||||
'/albums/all',
|
'/albums/all',
|
||||||
async (empty, thunkAPI) => {
|
async (empty, thunkAPI) => {
|
||||||
const credentials = thunkAPI.getState().settings.jellyfin;
|
const credentials = thunkAPI.getState().settings.jellyfin;
|
||||||
return retrieveAlbums(credentials) as Promise<Album[]>;
|
return retrieveAllAlbums(credentials) as Promise<Album[]>;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -44,4 +44,36 @@ export const fetchTracksByAlbum = createAsyncThunk<AlbumTrack[], string, AsyncTh
|
|||||||
const credentials = thunkAPI.getState().settings.jellyfin;
|
const credentials = thunkAPI.getState().settings.jellyfin;
|
||||||
return retrieveAlbumTracks(ItemId, credentials) as Promise<AlbumTrack[]>;
|
return retrieveAlbumTracks(ItemId, credentials) as Promise<AlbumTrack[]>;
|
||||||
}
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
type SearchAndFetchResults = {
|
||||||
|
albums: Album[];
|
||||||
|
results: (Album | AlbumTrack)[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const searchAndFetchAlbums = createAsyncThunk<
|
||||||
|
SearchAndFetchResults,
|
||||||
|
{ term: string, limit?: number },
|
||||||
|
AsyncThunkAPI
|
||||||
|
>(
|
||||||
|
'/search',
|
||||||
|
async ({ term, limit = 24 }, thunkAPI) => {
|
||||||
|
const state = thunkAPI.getState();
|
||||||
|
const results = await searchItem(state.settings.jellyfin, term, limit);
|
||||||
|
|
||||||
|
const albums = await Promise.all(results.filter((item) => (
|
||||||
|
!state.music.albums.ids.includes(item.Type === 'MusicAlbum' ? item.Id : item.AlbumId)
|
||||||
|
)).map(async (item) => {
|
||||||
|
if (item.Type === 'MusicAlbum') {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retrieveAlbum(state.settings.jellyfin, item.AlbumId);
|
||||||
|
}));
|
||||||
|
|
||||||
|
return {
|
||||||
|
albums,
|
||||||
|
results
|
||||||
|
};
|
||||||
|
}
|
||||||
);
|
);
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { fetchAllAlbums, albumAdapter, fetchTracksByAlbum, trackAdapter, fetchRecentAlbums } from './actions';
|
import { fetchAllAlbums, albumAdapter, fetchTracksByAlbum, trackAdapter, fetchRecentAlbums, searchAndFetchAlbums } from './actions';
|
||||||
import { createSlice, Dictionary, EntityId } from '@reduxjs/toolkit';
|
import { createSlice, Dictionary, EntityId } from '@reduxjs/toolkit';
|
||||||
import { Album, AlbumTrack } from './types';
|
import { Album, AlbumTrack } from './types';
|
||||||
import { setJellyfinCredentials } from 'store/settings/actions';
|
import { setJellyfinCredentials } from 'store/settings/actions';
|
||||||
@@ -77,6 +77,12 @@ const music = createSlice({
|
|||||||
builder.addCase(fetchTracksByAlbum.pending, (state) => { state.tracks.isLoading = true; });
|
builder.addCase(fetchTracksByAlbum.pending, (state) => { state.tracks.isLoading = true; });
|
||||||
builder.addCase(fetchTracksByAlbum.rejected, (state) => { state.tracks.isLoading = false; });
|
builder.addCase(fetchTracksByAlbum.rejected, (state) => { state.tracks.isLoading = false; });
|
||||||
|
|
||||||
|
builder.addCase(searchAndFetchAlbums.pending, (state) => { state.albums.isLoading = true; });
|
||||||
|
builder.addCase(searchAndFetchAlbums.fulfilled, (state, { payload }) => {
|
||||||
|
albumAdapter.upsertMany(state.albums, payload.albums);
|
||||||
|
state.albums.isLoading = false;
|
||||||
|
});
|
||||||
|
|
||||||
// Reset any caches we have when a new server is set
|
// Reset any caches we have when a new server is set
|
||||||
builder.addCase(setJellyfinCredentials, () => initialState);
|
builder.addCase(setJellyfinCredentials, () => initialState);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export interface Album {
|
|||||||
RunTimeTicks: number;
|
RunTimeTicks: number;
|
||||||
ProductionYear: number;
|
ProductionYear: number;
|
||||||
IsFolder: boolean;
|
IsFolder: boolean;
|
||||||
Type: string;
|
Type: 'MusicAlbum';
|
||||||
UserData: UserData;
|
UserData: UserData;
|
||||||
PrimaryImageAspectRatio: number;
|
PrimaryImageAspectRatio: number;
|
||||||
Artists: string[];
|
Artists: string[];
|
||||||
@@ -53,7 +53,7 @@ export interface AlbumTrack {
|
|||||||
ProductionYear: number;
|
ProductionYear: number;
|
||||||
IndexNumber: number;
|
IndexNumber: number;
|
||||||
IsFolder: boolean;
|
IsFolder: boolean;
|
||||||
Type: string;
|
Type: 'Audio';
|
||||||
UserData: UserData;
|
UserData: UserData;
|
||||||
Artists: string[];
|
Artists: string[];
|
||||||
ArtistItems: ArtistItem[];
|
ArtistItems: ArtistItem[];
|
||||||
|
|||||||
@@ -1,10 +1,26 @@
|
|||||||
import { createSlice } from '@reduxjs/toolkit';
|
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
||||||
|
import { Track } from 'react-native-track-player';
|
||||||
|
|
||||||
|
interface State {
|
||||||
|
addedTrackCount: number,
|
||||||
|
currentTrack: Track | undefined,
|
||||||
|
}
|
||||||
|
|
||||||
|
const initialState: State = {
|
||||||
|
addedTrackCount: 0,
|
||||||
|
currentTrack: undefined,
|
||||||
|
};
|
||||||
|
|
||||||
const player = createSlice({
|
const player = createSlice({
|
||||||
name: 'player',
|
name: 'player',
|
||||||
initialState: 0,
|
initialState,
|
||||||
reducers: {
|
reducers: {
|
||||||
addNewTrackToPlayer: (state) => state + 1,
|
addNewTrackToPlayer: (state) => {
|
||||||
|
state.addedTrackCount += 1;
|
||||||
|
},
|
||||||
|
setCurrentTrack: (state, action: PayloadAction<Track | undefined>) => {
|
||||||
|
state.currentTrack = action.payload;
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Track } from 'react-native-track-player';
|
import { Track } from 'react-native-track-player';
|
||||||
import { AppState, useTypedSelector } from 'store';
|
import { AppState, useTypedSelector } from 'store';
|
||||||
import { AlbumTrack } from 'store/music/types';
|
import { Album, AlbumTrack } from 'store/music/types';
|
||||||
|
|
||||||
type Credentials = AppState['settings']['jellyfin'];
|
type Credentials = AppState['settings']['jellyfin'];
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ const albumParams = new URLSearchParams(albumOptions).toString();
|
|||||||
/**
|
/**
|
||||||
* Retrieve all albums that are available on the Jellyfin server
|
* Retrieve all albums that are available on the Jellyfin server
|
||||||
*/
|
*/
|
||||||
export async function retrieveAlbums(credentials: Credentials) {
|
export async function retrieveAllAlbums(credentials: Credentials) {
|
||||||
const config = generateConfig(credentials);
|
const config = generateConfig(credentials);
|
||||||
const albums = await fetch(`${credentials?.uri}/Users/${credentials?.user_id}/Items?${albumParams}`, config)
|
const albums = await fetch(`${credentials?.uri}/Users/${credentials?.user_id}/Items?${albumParams}`, config)
|
||||||
.then(response => response.json());
|
.then(response => response.json());
|
||||||
@@ -78,6 +78,15 @@ export async function retrieveAlbums(credentials: Credentials) {
|
|||||||
return albums.Items;
|
return albums.Items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a single album
|
||||||
|
*/
|
||||||
|
export async function retrieveAlbum(credentials: Credentials, id: string): Promise<Album> {
|
||||||
|
const config = generateConfig(credentials);
|
||||||
|
return fetch(`${credentials?.uri}/Users/${credentials?.user_id}/Items/${id}`, config)
|
||||||
|
.then(response => response.json());
|
||||||
|
}
|
||||||
|
|
||||||
const latestAlbumsOptions = {
|
const latestAlbumsOptions = {
|
||||||
IncludeItemTypes: 'MusicAlbum',
|
IncludeItemTypes: 'MusicAlbum',
|
||||||
Fields: 'DateCreated',
|
Fields: 'DateCreated',
|
||||||
@@ -122,11 +131,66 @@ export async function retrieveAlbumTracks(ItemId: string, credentials: Credentia
|
|||||||
return album.Items;
|
return album.Items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve an image URL for a given ItemId
|
||||||
|
*/
|
||||||
export function getImage(ItemId: string, credentials: Credentials): string {
|
export function getImage(ItemId: string, credentials: Credentials): string {
|
||||||
return encodeURI(`${credentials?.uri}/Items/${ItemId}/Images/Primary?format=jpeg`);
|
return encodeURI(`${credentials?.uri}/Items/${ItemId}/Images/Primary?format=jpeg`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a hook that can convert ItemIds to image URLs
|
||||||
|
*/
|
||||||
export function useGetImage() {
|
export function useGetImage() {
|
||||||
const credentials = useTypedSelector((state) => state.settings.jellyfin);
|
const credentials = useTypedSelector((state) => state.settings.jellyfin);
|
||||||
return (ItemId: string) => getImage(ItemId, credentials);
|
return (ItemId: string) => getImage(ItemId, credentials);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const trackParams = {
|
||||||
|
SortBy: 'AlbumArtist,SortName',
|
||||||
|
SortOrder: 'Ascending',
|
||||||
|
IncludeItemTypes: 'Audio',
|
||||||
|
Recursive: 'true',
|
||||||
|
Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo,DateCreated',
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve all possible tracks that can be found in Jellyfin
|
||||||
|
*/
|
||||||
|
export async function retrieveAllTracks(credentials: Credentials) {
|
||||||
|
const config = generateConfig(credentials);
|
||||||
|
const tracks = await fetch(`${credentials?.uri}/Users/${credentials?.user_id}/Items?${trackParams}`, config)
|
||||||
|
.then(response => response.json());
|
||||||
|
|
||||||
|
return tracks.Items;
|
||||||
|
}
|
||||||
|
|
||||||
|
const searchParams = {
|
||||||
|
IncludeItemTypes: 'Audio,MusicAlbum',
|
||||||
|
SortBy: 'Album,SortName',
|
||||||
|
SortOrder: 'Ascending',
|
||||||
|
Recursive: 'true',
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remotely search the Jellyfin library for a particular search term
|
||||||
|
*/
|
||||||
|
export async function searchItem(
|
||||||
|
credentials: Credentials,
|
||||||
|
term: string, limit = 24
|
||||||
|
): Promise<(Album | AlbumTrack)[]> {
|
||||||
|
const config = generateConfig(credentials);
|
||||||
|
|
||||||
|
const params = new URLSearchParams({
|
||||||
|
...searchParams,
|
||||||
|
SearchTerm: term,
|
||||||
|
Limit: limit.toString(),
|
||||||
|
}).toString();
|
||||||
|
|
||||||
|
const results = await fetch(`${credentials?.uri}/Users/${credentials?.user_id}/Items?${params}`, config)
|
||||||
|
.then(response => response.json());
|
||||||
|
|
||||||
|
return results.Items;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,42 +1,15 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { Track } from 'react-native-track-player';
|
||||||
import TrackPlayer, { usePlaybackState, Track } from 'react-native-track-player';
|
import { useTypedSelector } from 'store';
|
||||||
|
|
||||||
|
const idEqual = (left: Track | undefined, right: Track | undefined) => {
|
||||||
|
return left?.id === right?.id;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This hook retrieves the current playing track from TrackPlayer
|
* This hook retrieves the current playing track from TrackPlayer
|
||||||
*/
|
*/
|
||||||
export default function useCurrentTrack(): Track | undefined {
|
export default function useCurrentTrack(): Track | undefined {
|
||||||
const state = usePlaybackState();
|
const track = useTypedSelector(state => state.player.currentTrack, idEqual);
|
||||||
const [track, setTrack] = useState<Track>();
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const fetchTrack = async () => {
|
|
||||||
const currentTrackId = await TrackPlayer.getCurrentTrack();
|
|
||||||
|
|
||||||
// GUARD: Only fetch current track if there is a current track
|
|
||||||
if (!currentTrackId) {
|
|
||||||
setTrack(undefined);
|
|
||||||
}
|
|
||||||
|
|
||||||
// GUARD: Only retrieve new track if it is different from the one we
|
|
||||||
// have currently in state.
|
|
||||||
if (currentTrackId === track?.id){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If it is different, retrieve the track and save it
|
|
||||||
try {
|
|
||||||
const currentTrack = await TrackPlayer.getTrack(currentTrackId);
|
|
||||||
setTrack(currentTrack);
|
|
||||||
} catch {
|
|
||||||
// Due to the async nature, a track might be removed at the
|
|
||||||
// point when we try to retrieve it. If this happens, we'll just
|
|
||||||
// smother the error and wait for a new track update to
|
|
||||||
// finish.
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
fetchTrack();
|
|
||||||
}, [state, track, setTrack]);
|
|
||||||
|
|
||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
@@ -8,7 +8,7 @@ import { useTypedSelector } from 'store';
|
|||||||
export default function useQueue(): Track[] {
|
export default function useQueue(): Track[] {
|
||||||
const state = usePlaybackState();
|
const state = usePlaybackState();
|
||||||
const [queue, setQueue] = useState<Track[]>([]);
|
const [queue, setQueue] = useState<Track[]>([]);
|
||||||
const addedTrackCount = useTypedSelector(state => state.player);
|
const addedTrackCount = useTypedSelector(state => state.player.addedTrackCount);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
TrackPlayer.getQueue().then(setQueue);
|
TrackPlayer.getQueue().then(setQueue);
|
||||||
|
|||||||
Reference in New Issue
Block a user