From 5327da4633cc0e197f0438817b019677025d8f88 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 29 Jul 2024 08:05:57 +0200 Subject: [PATCH 01/51] test environment variables in build pipeline --- ios/ci_scripts/ci_post_clone.sh | 5 +++++ ios/ci_scripts/ci_pre_xcodebuild.sh | 11 +++++++++++ 2 files changed, 16 insertions(+) create mode 100644 ios/ci_scripts/ci_pre_xcodebuild.sh diff --git a/ios/ci_scripts/ci_post_clone.sh b/ios/ci_scripts/ci_post_clone.sh index b1512f47..9184f62f 100755 --- a/ios/ci_scripts/ci_post_clone.sh +++ b/ios/ci_scripts/ci_post_clone.sh @@ -20,9 +20,14 @@ echo "===== Running yarn install =====" yarn install echo "===== Setting environment variables =====" +echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" +echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" +ls -alh echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" > .env echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" >> .env echo "WHATSAPP_USER_GROUP_LINK=${WHATSAPP_USER_GROUP_LINK}" >> .env +echo "== Reading back .env file ==" +cat .env echo "===== Running pod install =====" pwd diff --git a/ios/ci_scripts/ci_pre_xcodebuild.sh b/ios/ci_scripts/ci_pre_xcodebuild.sh new file mode 100644 index 00000000..4ddebfcb --- /dev/null +++ b/ios/ci_scripts/ci_pre_xcodebuild.sh @@ -0,0 +1,11 @@ + + +echo "===== Setting environment variables AGAIN =====" +echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" +echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" +ls -alh +echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" > .env +echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" >> .env +echo "WHATSAPP_USER_GROUP_LINK=${WHATSAPP_USER_GROUP_LINK}" >> .env +echo "== Reading back .env file ==" +cat .env \ No newline at end of file From 414bd3336a59d862d5bf0740ccc7acfb5b4c4d04 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 29 Jul 2024 08:25:18 +0200 Subject: [PATCH 02/51] setting env variables at start of pipeline --- ios/ci_scripts/ci_post_clone.sh | 15 +++++---------- ios/ci_scripts/ci_pre_xcodebuild.sh | 11 ----------- 2 files changed, 5 insertions(+), 21 deletions(-) delete mode 100644 ios/ci_scripts/ci_pre_xcodebuild.sh diff --git a/ios/ci_scripts/ci_post_clone.sh b/ios/ci_scripts/ci_post_clone.sh index 9184f62f..a5192003 100755 --- a/ios/ci_scripts/ci_post_clone.sh +++ b/ios/ci_scripts/ci_post_clone.sh @@ -1,5 +1,10 @@ #!/bin/zsh +echo "===== Setting environment variables =====" +echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" > .env +echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" >> .env +echo "WHATSAPP_USER_GROUP_LINK=${WHATSAPP_USER_GROUP_LINK}" >> .env + echo "===== Installing CocoaPods =====" export HOMEBREW_NO_INSTALL_CLEANUP=TRUE brew install cocoapods @@ -19,16 +24,6 @@ brew install yarn echo "===== Running yarn install =====" yarn install -echo "===== Setting environment variables =====" -echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" -echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" -ls -alh -echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" > .env -echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" >> .env -echo "WHATSAPP_USER_GROUP_LINK=${WHATSAPP_USER_GROUP_LINK}" >> .env -echo "== Reading back .env file ==" -cat .env - echo "===== Running pod install =====" pwd pod install diff --git a/ios/ci_scripts/ci_pre_xcodebuild.sh b/ios/ci_scripts/ci_pre_xcodebuild.sh deleted file mode 100644 index 4ddebfcb..00000000 --- a/ios/ci_scripts/ci_pre_xcodebuild.sh +++ /dev/null @@ -1,11 +0,0 @@ - - -echo "===== Setting environment variables AGAIN =====" -echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" -echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" -ls -alh -echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" > .env -echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" >> .env -echo "WHATSAPP_USER_GROUP_LINK=${WHATSAPP_USER_GROUP_LINK}" >> .env -echo "== Reading back .env file ==" -cat .env \ No newline at end of file From c838b313b4d444d5890421056ba87b004f842488 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 29 Jul 2024 08:34:28 +0200 Subject: [PATCH 03/51] set temp version for test build --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index efecfc38..bc9f9ef9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.18.0-SNAPSHOT", + "version": "1.17.2", "private": true, "scripts": { "android": "react-native run-android", From 6088dab7ae134292ed9ab775dab5a15e87511588 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 29 Jul 2024 09:09:33 +0200 Subject: [PATCH 04/51] set temp version for test build --- ios/hymnbook2/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index bdbcca54..ea2cc0ad 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.18.0-SNAPSHOT + 1.17.2 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion From 7751aa07107b3f2331d86fb233c6876619b2def5 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 29 Jul 2024 09:14:50 +0200 Subject: [PATCH 05/51] write .env file to root directory --- ios/ci_scripts/ci_post_clone.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/ci_scripts/ci_post_clone.sh b/ios/ci_scripts/ci_post_clone.sh index a5192003..7fb233ea 100755 --- a/ios/ci_scripts/ci_post_clone.sh +++ b/ios/ci_scripts/ci_post_clone.sh @@ -1,9 +1,9 @@ #!/bin/zsh echo "===== Setting environment variables =====" -echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" > .env -echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" >> .env -echo "WHATSAPP_USER_GROUP_LINK=${WHATSAPP_USER_GROUP_LINK}" >> .env +echo "ROLLBAR_API_KEY=${ROLLBAR_API_KEY}" > ../../.env +echo "DEVELOPER_EMAIL=${DEVELOPER_EMAIL}" >> ../../.env +echo "WHATSAPP_USER_GROUP_LINK=${WHATSAPP_USER_GROUP_LINK}" >> ../../.env echo "===== Installing CocoaPods =====" export HOMEBREW_NO_INSTALL_CLEANUP=TRUE From d71f079756e41ce4f0efe4da07567942c37ed4bb Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Tue, 27 Aug 2024 14:51:37 +0200 Subject: [PATCH 06/51] version release: 1.18.3 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index 505d9813..ee08583c 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.19.0-SNAPSHOT + 1.18.3 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 672 + 678 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index f525f70e..ad484efe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.19.0-SNAPSHOT", + "version": "1.18.3", "private": true, "scripts": { "android": "react-native run-android", From e6abb72b79f9ec434ae908ec8efad17f2954d6c1 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Tue, 27 Aug 2024 15:21:26 +0200 Subject: [PATCH 07/51] use gem to install custom version of cocoapods --- ios/ci_scripts/ci_post_clone.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/ci_scripts/ci_post_clone.sh b/ios/ci_scripts/ci_post_clone.sh index 9c44f9f5..0c708a57 100755 --- a/ios/ci_scripts/ci_post_clone.sh +++ b/ios/ci_scripts/ci_post_clone.sh @@ -7,7 +7,7 @@ echo "WHATSAPP_USER_GROUP_LINK=${WHATSAPP_USER_GROUP_LINK}" >> ../../.env echo "===== Installing CocoaPods =====" export HOMEBREW_NO_INSTALL_CLEANUP=TRUE -brew install cocoapods@1.14.2 +gem install cocoapods -v 1.14.2 echo "===== Installing Node.js =====" # installs nvm (Node Version Manager) From 167b43b3862f13764b23db2a3c85c594eb834cdf Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Tue, 27 Aug 2024 15:28:29 +0200 Subject: [PATCH 08/51] keep cocoapods newest version but old version in podfile.lock --- ios/ci_scripts/ci_post_clone.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/ci_scripts/ci_post_clone.sh b/ios/ci_scripts/ci_post_clone.sh index 0c708a57..8b9ecb6c 100755 --- a/ios/ci_scripts/ci_post_clone.sh +++ b/ios/ci_scripts/ci_post_clone.sh @@ -7,7 +7,7 @@ echo "WHATSAPP_USER_GROUP_LINK=${WHATSAPP_USER_GROUP_LINK}" >> ../../.env echo "===== Installing CocoaPods =====" export HOMEBREW_NO_INSTALL_CLEANUP=TRUE -gem install cocoapods -v 1.14.2 +gem install cocoapods echo "===== Installing Node.js =====" # installs nvm (Node Version Manager) From 8568520834fbcc0b6e9029ed08da146f0e42ae01 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 28 Aug 2024 12:03:17 +0200 Subject: [PATCH 09/51] use brew: keep cocoapods newest version but old version in podfile.lock --- ios/ci_scripts/ci_post_clone.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/ci_scripts/ci_post_clone.sh b/ios/ci_scripts/ci_post_clone.sh index 8b9ecb6c..7fb233ea 100755 --- a/ios/ci_scripts/ci_post_clone.sh +++ b/ios/ci_scripts/ci_post_clone.sh @@ -7,7 +7,7 @@ echo "WHATSAPP_USER_GROUP_LINK=${WHATSAPP_USER_GROUP_LINK}" >> ../../.env echo "===== Installing CocoaPods =====" export HOMEBREW_NO_INSTALL_CLEANUP=TRUE -gem install cocoapods +brew install cocoapods echo "===== Installing Node.js =====" # installs nvm (Node Version Manager) From 973a5d61813f45c753663855486f277383915489 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 28 Aug 2024 14:03:43 +0200 Subject: [PATCH 10/51] test version release: 1.17.5 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index 731813fc..6d0ac9e8 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.4 + 1.17.5 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658 + 658.1 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index d0d68f6c..6c8ee120 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.4", + "version": "1.17.5", "private": true, "scripts": { "android": "react-native run-android", From 0c0746483193622a57cd1e4eef4ab1b5a58cc619 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Thu, 29 Aug 2024 09:34:35 +0200 Subject: [PATCH 11/51] updated podfile version to 1.15.2 --- ios/Podfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a25a63a1..30ad968a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -807,4 +807,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 1763ab552ba7dac3473e47862d7ac2d6963d0f49 -COCOAPODS: 1.14.2 +COCOAPODS: 1.15.2 From 029c401460f941b9bda0d7a418534c69fe704fb2 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Thu, 29 Aug 2024 09:34:47 +0200 Subject: [PATCH 12/51] updated realm to latest version. --- ios/Podfile.lock | 4 ++-- package.json | 6 +++--- yarn.lock | 29 +++++++++++++++++------------ 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 30ad968a..cbd03378 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -498,7 +498,7 @@ PODS: - React-jsi (= 0.72.13) - React-logger (= 0.72.13) - React-perflogger (= 0.72.13) - - RealmJS (12.9.0): + - RealmJS (12.13.1): - React - RNCClipboard (1.12.1): - React-Core @@ -790,7 +790,7 @@ SPEC CHECKSUMS: React-runtimescheduler: 8dd5ce1d291c417dd90cd651eccc70821c237a38 React-utils: 46700f6d6cacc4288f897b94571bf92895678885 ReactCommon: 71dc6b65f95ea81a83490115d7a5fc62378ecdcc - RealmJS: 7aa0e7dcc8959d28cee3ab302415a8893e50ad12 + RealmJS: 325a7b621587dd9945306d4cbfd6b641bc20e2dd RNCClipboard: d77213bfa269013bf4b857b7a9ca37ee062d8ef1 RNDeviceInfo: db5c64a060e66e5db3102d041ebe3ef307a85120 RNGestureHandler: b83cf821f60b7ec59827f0ed9e5b8c46b1de2c99 diff --git a/package.json b/package.json index 6c8ee120..53358a2f 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "@react-navigation/bottom-tabs": "6.5.11", "@react-navigation/native": "6.1.9", "@react-navigation/native-stack": "6.9.17", - "@realm/react": "0.7.0", + "@realm/react": "0.10.0", "abcjs": "git+https://github.com/paulrosen/abcjs.git#6.2.3", "fastest-levenshtein": "1.0.16", "fetch-retry": "6.0.0", @@ -39,12 +39,12 @@ "react-native-svg": "13.14.0", "react-native-track-player": "4.0.1", "react-native-vector-icons": "9.2.0", - "realm": "12.9.0", + "realm": "12.13.1", "rollbar-react-native": "0.9.3" }, "devDependencies": { "@babel/core": "7.23.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.18.6", "@babel/plugin-transform-flow-strip-types": "7.23.3", "@babel/plugin-transform-nullish-coalescing-operator": "7.23.4", "@babel/plugin-transform-private-methods": "7.23.3", diff --git a/yarn.lock b/yarn.lock index 7c7f5d98..a196dde6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -444,7 +444,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@7.18.6", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -2349,12 +2349,12 @@ resolved "https://registry.yarnpkg.com/@realm/fetch/-/fetch-0.1.1.tgz#1a637d0a1fc3734a7ffca64361d764777dd3d80c" integrity sha512-hkTprw79RXGv54Je0DrjpQPLaz4QID2dO3FmthAQQWAkqwyrqMzrCGzJzLlmTKWZFsgLrN8KQyNewod27P+nJg== -"@realm/react@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@realm/react/-/react-0.7.0.tgz#6afbb46bc22ff4cbdd81061dd446899ec670064c" - integrity sha512-Ee3dUq/WeYNgCyjJOwaef1c5aFmqJy21yQEL/DaZWBTV6NMd5DH19xzIJeA8YPeSbYIVPOyD5hiu48kdfFdOxA== +"@realm/react@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@realm/react/-/react-0.10.0.tgz#826eef5d32be84ce9111489c6c00890803787759" + integrity sha512-9BbQRGbITwnQj9bqDLHe1CguCrxygZekV+NtJsMrwe1uPz/y/Uu3AkOfSCEcpfgF0mlinOwhFC/JgujV56zgjQ== dependencies: - lodash "^4.17.21" + lodash.isequal "^4.5.0" optionalDependencies: "@babel/runtime" ">=7" react-native ">=0.68" @@ -5974,6 +5974,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -7121,7 +7126,7 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== -prebuild-install@^7.1.1: +prebuild-install@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== @@ -7563,17 +7568,17 @@ readline@^1.3.0: resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== -realm@12.9.0: - version "12.9.0" - resolved "https://registry.yarnpkg.com/realm/-/realm-12.9.0.tgz#0edfc8c4156efdce4a73a171152dc1007173442d" - integrity sha512-K7JblaSaqqFEu8kObgTCo1ITTYnR8rXYBdb5/5VXxD4VNKQVlrnO6Z4GhxDlohubmF8eNvRdC2wlHAsv2aUsOg== +realm@12.13.1: + version "12.13.1" + resolved "https://registry.yarnpkg.com/realm/-/realm-12.13.1.tgz#598a7c3e850071b73af73f1191047bc8bb2f8b5c" + integrity sha512-fAs70ZCBf1P7htVhOTrDMFHD6SzoGXVsALy6DpOPR6t0LXoK635cKxBMECX3bYdCgI7+riSfdoWXLA/7g5yTSQ== dependencies: "@realm/fetch" "^0.1.1" bson "^4.7.2" debug "^4.3.4" node-machine-id "^1.1.12" path-browserify "^1.0.1" - prebuild-install "^7.1.1" + prebuild-install "^7.1.2" recast@^0.20.4: version "0.20.5" From 78a5e8374e2df8f784f130a44a60c6e26095616c Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Thu, 29 Aug 2024 09:35:06 +0200 Subject: [PATCH 13/51] test version release: 1.17.6 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index 6d0ac9e8..77d3d750 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.5 + 1.17.6 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.1 + 658.2 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index 53358a2f..bc0e0f78 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.5", + "version": "1.17.6", "private": true, "scripts": { "android": "react-native run-android", From 37dbdcc95af82dd1f9d4ca57a88071651b94007c Mon Sep 17 00:00:00 2001 From: Willem Bijker Date: Thu, 29 Aug 2024 13:23:23 +0200 Subject: [PATCH 14/51] ios: updated podfile --- ios/Podfile.lock | 384 +++++++++++++++++++------------------- ios/PrivacyInfo.xcprivacy | 8 + 2 files changed, 205 insertions(+), 187 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 72890cc9..f942bc63 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2,14 +2,14 @@ PODS: - boost (1.76.0) - CocoaAsyncSocket (7.6.5) - DoubleConversion (1.1.6) - - FBLazyVector (0.72.13) - - FBReactNativeSpec (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 0.72.13) - - RCTTypeSafety (= 0.72.13) - - React-Core (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) + - FBLazyVector (0.72.17) + - FBReactNativeSpec (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - RCTRequired (= 0.72.17) + - RCTTypeSafety (= 0.72.17) + - React-Core (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) - Flipper (0.182.0): - Flipper-Folly (~> 2.6) - Flipper-Boost-iOSX (1.76.0.1.11) @@ -70,9 +70,9 @@ PODS: - FlipperKit/FlipperKitNetworkPlugin - fmt (6.2.1) - glog (0.3.5) - - hermes-engine (0.72.13): - - hermes-engine/Pre-built (= 0.72.13) - - hermes-engine/Pre-built (0.72.13) + - hermes-engine (0.72.17): + - hermes-engine/Pre-built (= 0.72.17) + - hermes-engine/Pre-built (0.72.17) - libevent (2.1.12) - OpenSSL-Universal (1.1.1100) - RCT-Folly (2021.07.22.00): @@ -92,26 +92,26 @@ PODS: - fmt (~> 6.2.1) - glog - libevent - - RCTRequired (0.72.13) - - RCTTypeSafety (0.72.13): - - FBLazyVector (= 0.72.13) - - RCTRequired (= 0.72.13) - - React-Core (= 0.72.13) - - React (0.72.13): - - React-Core (= 0.72.13) - - React-Core/DevSupport (= 0.72.13) - - React-Core/RCTWebSocket (= 0.72.13) - - React-RCTActionSheet (= 0.72.13) - - React-RCTAnimation (= 0.72.13) - - React-RCTBlob (= 0.72.13) - - React-RCTImage (= 0.72.13) - - React-RCTLinking (= 0.72.13) - - React-RCTNetwork (= 0.72.13) - - React-RCTSettings (= 0.72.13) - - React-RCTText (= 0.72.13) - - React-RCTVibration (= 0.72.13) - - React-callinvoker (0.72.13) - - React-Codegen (0.72.13): + - RCTRequired (0.72.17) + - RCTTypeSafety (0.72.17): + - FBLazyVector (= 0.72.17) + - RCTRequired (= 0.72.17) + - React-Core (= 0.72.17) + - React (0.72.17): + - React-Core (= 0.72.17) + - React-Core/DevSupport (= 0.72.17) + - React-Core/RCTWebSocket (= 0.72.17) + - React-RCTActionSheet (= 0.72.17) + - React-RCTAnimation (= 0.72.17) + - React-RCTBlob (= 0.72.17) + - React-RCTImage (= 0.72.17) + - React-RCTLinking (= 0.72.17) + - React-RCTNetwork (= 0.72.17) + - React-RCTSettings (= 0.72.17) + - React-RCTText (= 0.72.17) + - React-RCTVibration (= 0.72.17) + - React-callinvoker (0.72.17) + - React-Codegen (0.72.17): - DoubleConversion - FBReactNativeSpec - glog @@ -126,11 +126,11 @@ PODS: - React-rncore - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-Core (0.72.13): + - React-Core (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.72.13) + - React-Core/Default (= 0.72.17) - React-cxxreact - React-hermes - React-jsi @@ -140,7 +140,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/CoreModulesHeaders (0.72.13): + - React-Core/CoreModulesHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -154,7 +154,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/Default (0.72.13): + - React-Core/Default (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -167,23 +167,23 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/DevSupport (0.72.13): + - React-Core/DevSupport (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.72.13) - - React-Core/RCTWebSocket (= 0.72.13) + - React-Core/Default (= 0.72.17) + - React-Core/RCTWebSocket (= 0.72.17) - React-cxxreact - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector (= 0.72.13) + - React-jsinspector (= 0.72.17) - React-perflogger - React-runtimeexecutor - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTActionSheetHeaders (0.72.13): + - React-Core/RCTActionSheetHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -197,7 +197,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTAnimationHeaders (0.72.13): + - React-Core/RCTAnimationHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -211,7 +211,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTBlobHeaders (0.72.13): + - React-Core/RCTBlobHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -225,7 +225,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTImageHeaders (0.72.13): + - React-Core/RCTImageHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -239,7 +239,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTLinkingHeaders (0.72.13): + - React-Core/RCTLinkingHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -253,7 +253,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTNetworkHeaders (0.72.13): + - React-Core/RCTNetworkHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -267,7 +267,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTSettingsHeaders (0.72.13): + - React-Core/RCTSettingsHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -281,7 +281,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTTextHeaders (0.72.13): + - React-Core/RCTTextHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -295,7 +295,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTVibrationHeaders (0.72.13): + - React-Core/RCTVibrationHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -309,11 +309,11 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTWebSocket (0.72.13): + - React-Core/RCTWebSocket (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.72.13) + - React-Core/Default (= 0.72.17) - React-cxxreact - React-hermes - React-jsi @@ -323,57 +323,57 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-CoreModules (0.72.13): + - React-CoreModules (0.72.17): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.72.13) - - React-Codegen (= 0.72.13) - - React-Core/CoreModulesHeaders (= 0.72.13) - - React-jsi (= 0.72.13) + - RCTTypeSafety (= 0.72.17) + - React-Codegen (= 0.72.17) + - React-Core/CoreModulesHeaders (= 0.72.17) + - React-jsi (= 0.72.17) - React-RCTBlob - - React-RCTImage (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) + - React-RCTImage (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) - SocketRocket (= 0.6.1) - - React-cxxreact (0.72.13): + - React-cxxreact (0.72.17): - boost (= 1.76.0) - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.72.13) - - React-debug (= 0.72.13) - - React-jsi (= 0.72.13) - - React-jsinspector (= 0.72.13) - - React-logger (= 0.72.13) - - React-perflogger (= 0.72.13) - - React-runtimeexecutor (= 0.72.13) - - React-debug (0.72.13) - - React-hermes (0.72.13): + - React-callinvoker (= 0.72.17) + - React-debug (= 0.72.17) + - React-jsi (= 0.72.17) + - React-jsinspector (= 0.72.17) + - React-logger (= 0.72.17) + - React-perflogger (= 0.72.17) + - React-runtimeexecutor (= 0.72.17) + - React-debug (0.72.17) + - React-hermes (0.72.17): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - RCT-Folly/Futures (= 2021.07.22.00) - - React-cxxreact (= 0.72.13) + - React-cxxreact (= 0.72.17) - React-jsi - - React-jsiexecutor (= 0.72.13) - - React-jsinspector (= 0.72.13) - - React-perflogger (= 0.72.13) - - React-jsi (0.72.13): + - React-jsiexecutor (= 0.72.17) + - React-jsinspector (= 0.72.17) + - React-perflogger (= 0.72.17) + - React-jsi (0.72.17): - boost (= 1.76.0) - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-jsiexecutor (0.72.13): + - React-jsiexecutor (0.72.17): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.72.13) - - React-jsi (= 0.72.13) - - React-perflogger (= 0.72.13) - - React-jsinspector (0.72.13) - - React-logger (0.72.13): + - React-cxxreact (= 0.72.17) + - React-jsi (= 0.72.17) + - React-perflogger (= 0.72.17) + - React-jsinspector (0.72.17) + - React-logger (0.72.17): - glog - react-native-config (1.5.1): - react-native-config/App (= 1.5.1) @@ -390,7 +390,7 @@ PODS: - react-native-track-player (4.0.1): - React-Core - SwiftAudioEx (= 1.0.0) - - React-NativeModulesApple (0.72.13): + - React-NativeModulesApple (0.72.17): - hermes-engine - React-callinvoker - React-Core @@ -399,17 +399,17 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-perflogger (0.72.13) - - React-RCTActionSheet (0.72.13): - - React-Core/RCTActionSheetHeaders (= 0.72.13) - - React-RCTAnimation (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.72.13) - - React-Codegen (= 0.72.13) - - React-Core/RCTAnimationHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTAppDelegate (0.72.13): + - React-perflogger (0.72.17) + - React-RCTActionSheet (0.72.17): + - React-Core/RCTActionSheetHeaders (= 0.72.17) + - React-RCTAnimation (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.17) + - React-Codegen (= 0.72.17) + - React-Core/RCTAnimationHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTAppDelegate (0.72.17): - RCT-Folly - RCTRequired - RCTTypeSafety @@ -421,54 +421,54 @@ PODS: - React-RCTNetwork - React-runtimescheduler - ReactCommon/turbomodule/core - - React-RCTBlob (0.72.13): + - React-RCTBlob (0.72.17): - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.72.13) - - React-Core/RCTBlobHeaders (= 0.72.13) - - React-Core/RCTWebSocket (= 0.72.13) - - React-jsi (= 0.72.13) - - React-RCTNetwork (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTImage (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.72.13) - - React-Codegen (= 0.72.13) - - React-Core/RCTImageHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - React-RCTNetwork (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTLinking (0.72.13): - - React-Codegen (= 0.72.13) - - React-Core/RCTLinkingHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTNetwork (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.72.13) - - React-Codegen (= 0.72.13) - - React-Core/RCTNetworkHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTSettings (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.72.13) - - React-Codegen (= 0.72.13) - - React-Core/RCTSettingsHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTText (0.72.13): - - React-Core/RCTTextHeaders (= 0.72.13) - - React-RCTVibration (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.72.13) - - React-Core/RCTVibrationHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-rncore (0.72.13) - - React-runtimeexecutor (0.72.13): - - React-jsi (= 0.72.13) - - React-runtimescheduler (0.72.13): + - React-Codegen (= 0.72.17) + - React-Core/RCTBlobHeaders (= 0.72.17) + - React-Core/RCTWebSocket (= 0.72.17) + - React-jsi (= 0.72.17) + - React-RCTNetwork (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTImage (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.17) + - React-Codegen (= 0.72.17) + - React-Core/RCTImageHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - React-RCTNetwork (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTLinking (0.72.17): + - React-Codegen (= 0.72.17) + - React-Core/RCTLinkingHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTNetwork (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.17) + - React-Codegen (= 0.72.17) + - React-Core/RCTNetworkHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTSettings (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.17) + - React-Codegen (= 0.72.17) + - React-Core/RCTSettingsHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTText (0.72.17): + - React-Core/RCTTextHeaders (= 0.72.17) + - React-RCTVibration (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.72.17) + - React-Core/RCTVibrationHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-rncore (0.72.17) + - React-runtimeexecutor (0.72.17): + - React-jsi (= 0.72.17) + - React-runtimescheduler (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -476,30 +476,30 @@ PODS: - React-debug - React-jsi - React-runtimeexecutor - - React-utils (0.72.13): + - React-utils (0.72.17): - glog - RCT-Folly (= 2021.07.22.00) - React-debug - - ReactCommon/turbomodule/bridging (0.72.13): + - ReactCommon/turbomodule/bridging (0.72.17): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.72.13) - - React-cxxreact (= 0.72.13) - - React-jsi (= 0.72.13) - - React-logger (= 0.72.13) - - React-perflogger (= 0.72.13) - - ReactCommon/turbomodule/core (0.72.13): + - React-callinvoker (= 0.72.17) + - React-cxxreact (= 0.72.17) + - React-jsi (= 0.72.17) + - React-logger (= 0.72.17) + - React-perflogger (= 0.72.17) + - ReactCommon/turbomodule/core (0.72.17): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.72.13) - - React-cxxreact (= 0.72.13) - - React-jsi (= 0.72.13) - - React-logger (= 0.72.13) - - React-perflogger (= 0.72.13) + - React-callinvoker (= 0.72.17) + - React-cxxreact (= 0.72.17) + - React-jsi (= 0.72.17) + - React-logger (= 0.72.17) + - React-perflogger (= 0.72.17) - RealmJS (12.13.1): - React - RNCClipboard (1.12.1): @@ -509,7 +509,17 @@ PODS: - RNGestureHandler (2.16.0): - RCT-Folly (= 2021.07.22.00) - React-Core - - RNReanimated (3.8.1): + - RNReanimated (3.15.0): + - RCT-Folly (= 2021.07.22.00) + - React-Core + - ReactCommon/turbomodule/core + - RNReanimated/reanimated (= 3.15.0) + - RNReanimated/worklets (= 3.15.0) + - RNReanimated/reanimated (3.15.0): + - RCT-Folly (= 2021.07.22.00) + - React-Core + - ReactCommon/turbomodule/core + - RNReanimated/worklets (3.15.0): - RCT-Folly (= 2021.07.22.00) - React-Core - ReactCommon/turbomodule/core @@ -743,8 +753,8 @@ SPEC CHECKSUMS: boost: 7dcd2de282d72e344012f7d6564d024930a6a440 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - FBLazyVector: d5c36294933aa344046699700b9ae9c2e10db18e - FBReactNativeSpec: ee1c8650ed1f489b699e8a20db2044b0a7f849c5 + FBLazyVector: 66398fc2381d8fa1eee4c0f80d931587a7b927e8 + FBReactNativeSpec: 0f8cecf999d709dba7626bbf565b1b5f8f46a5c1 Flipper: 6edb735e6c3e332975d1b17956bcc584eccf5818 Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 @@ -755,52 +765,52 @@ SPEC CHECKSUMS: FlipperKit: 2efad7007d6745a3f95e4034d547be637f89d3f6 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b - hermes-engine: 6b116ce065327cef44156096edaa1e839ee69a03 + hermes-engine: 982096772bd947125ee3b4f72ace6cb9a33f1d02 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 - RCTRequired: 2fb3c1ac6546029f44d04083771e60a106073853 - RCTTypeSafety: 59916726dadf1e2f3d502f2f3cf7393fe451f501 - React: a268c36512fe4ae45f55816af7dac225de38a602 - React-callinvoker: b8a85e82fe8e7d8f3b4b4ff03c292c498fe8e747 - React-Codegen: 7d097ffb2323d335832670713ba193d43664575b - React-Core: 515d1f7f7a02d99a4d29fda4495e69c43375a035 - React-CoreModules: ce9bc448da0091a8d0d9d63f95213e52d170db31 - React-cxxreact: 4deb455d65dd11513fa8d228442005e1febedfe2 - React-debug: 30e2b157b34f426e0ad51ec6bc1b8231e7f27c48 - React-hermes: cad4ee3887376efa0c1498b33a295b00055e0644 - React-jsi: 5162e7a01e31e956147e674915fcdeab0b6e324f - React-jsiexecutor: 08ea8c7c359e5953776d9b51eb606a02b0999c61 - React-jsinspector: 525fb67d3402476e6d2796907892137e4a632e35 - React-logger: c3a0ff270a52e0051489f1f29a5de047ba7e8ca0 + RCTRequired: 01c639ec840ee03928b2d65f5cd5297d737b3834 + RCTTypeSafety: 9623592521a1576363baf3d6ab8d164cfe9062bf + React: 3c0beeda318c3c515a6bb2c1f197b55bd731aa43 + React-callinvoker: 0cd6ff2cdd80255c82cd4628fc925df1e7133a1a + React-Codegen: 20cfee78965306e4a5bb65d95958142eda116cfc + React-Core: df691c59e0c8a3db4d138a51bb8862c52c8b14f1 + React-CoreModules: cebd223e814ac07bc1f597bbd2480167a2c7a130 + React-cxxreact: dec3959d439708cb7dd73b46a11ed64c3eea79da + React-debug: 3a5091cbda7ffe5f11ad0443109810fcd1a3e885 + React-hermes: f3b6b278c4ff7e6664a86b2bf964a4dc4ae72d34 + React-jsi: 6ec4bd4cd929ae9d468b4984b0ae2c657aeeb2da + React-jsiexecutor: 8dc585381e476c3ff2e9468f444c90c4d1d5b874 + React-jsinspector: 853b8631b908636bb09ef77cb217376c38a0c8ff + React-logger: 9ca44bb5703bf2355f3c2d2e5e67bfe98ca2dc34 react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8 react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774 react-native-netinfo: 076df4f9b07f6670acf4ce9a75aac8d34c2e2ccc react-native-quick-md5: 5928fdcedcb1b2f0e1958a38769283968b8eb850 react-native-safe-area-context: 2cd91d532de12acdb0a9cbc8d43ac72a8e4c897c react-native-track-player: 97d76dbbd35f27cc709e5f04540615e54264b3f9 - React-NativeModulesApple: 83cd035f454ac54f4f72ce7b01c34054fa6d60f8 - React-perflogger: de3900e86d8a4d896999b08e0b130ad8b83ebf11 - React-RCTActionSheet: 92433ffdf1b479aab3fe32250047f100a10ce59f - React-RCTAnimation: 6f116d7b25705f185f48dedf65eb4e98f98d860c - React-RCTAppDelegate: efc96d53a6673082eb6b2d8c91a7ef349b639f7a - React-RCTBlob: 088c2942e3b171b4f8dba9b7f48aa5fff5c2ab97 - React-RCTImage: 66b3b6d840a3b329b2406956a58db80f1344d097 - React-RCTLinking: 032518be6aebadd7f032f23c8975be98eff042cb - React-RCTNetwork: dc775d132167fcdfcb3bba4b11d57cf07a834a3e - React-RCTSettings: 0bd22fc8293bc396cdb0769a12830273c8c5096b - React-RCTText: d312733e5008713f7293e3d44f41f34d432cd4b0 - React-RCTVibration: 754103c3c8c09d6fd2e1ee49d9a32f53e9f2d615 - React-rncore: 15d88d097c7928f0c1ef28070b0d81bc3f372854 - React-runtimeexecutor: 318cd0b384ccb12a2f86870f8591b759caad7f7d - React-runtimescheduler: 8dd5ce1d291c417dd90cd651eccc70821c237a38 - React-utils: 46700f6d6cacc4288f897b94571bf92895678885 - ReactCommon: 71dc6b65f95ea81a83490115d7a5fc62378ecdcc + React-NativeModulesApple: 2edfcbb25329e3eb5f76eb79d89010de7c1c6f1f + React-perflogger: 785b0063af5178298a61b54bb46aae9a19c7bbb5 + React-RCTActionSheet: 84f37b34bd77249263ace75471d6664393c29972 + React-RCTAnimation: 5713910b6223154df4bba80a0bda4e2e671b00f8 + React-RCTAppDelegate: d3777d05bf6b65fed847536af520731c1a167dea + React-RCTBlob: d4d3fb21c0bf1ce2f0308e05227ecd3f19266bf7 + React-RCTImage: 2e63a483be5d4e46a80dea3b17c9abee38006feb + React-RCTLinking: e3ff685ee62187f8f61e938357307c1f890125b5 + React-RCTNetwork: a35842997a403edfdc1ec25b61a0e10a0526368d + React-RCTSettings: aef81e0ac54268d2928ad31c4f91056cc75e5ce9 + React-RCTText: 7becec5f53f03b20da11f4b7e40e6bcfd476d134 + React-RCTVibration: defaae8016de9b3351a2a67ee8ef3fbdd643b0e1 + React-rncore: dfd20469cfad38e48b1c3cc9c4367db63f5231d7 + React-runtimeexecutor: 448409b5ae5a01b7793239f630051960c7dd39f9 + React-runtimescheduler: ff30efdf24f8ce62eb517a391ded3d99c4263bb0 + React-utils: 7959d4553163b61e01bbe83dbd80e58ca420aecb + ReactCommon: 841449721eb2e004de2c3366844b0a03f329f2cb RealmJS: 325a7b621587dd9945306d4cbfd6b641bc20e2dd RNCClipboard: d77213bfa269013bf4b857b7a9ca37ee062d8ef1 RNDeviceInfo: db5c64a060e66e5db3102d041ebe3ef307a85120 RNGestureHandler: b83cf821f60b7ec59827f0ed9e5b8c46b1de2c99 - RNReanimated: fc36806836aca984b797f01432abe31689663421 + RNReanimated: c2027c397233801d4aceb7375e000ac87ec2e67d RNScreens: bea7b9767050d69e4b9da14639cdd5c8f5a37881 RNSVG: d00c8f91c3cbf6d476451313a18f04d220d4f396 RNVectorIcons: fcc2f6cb32f5735b586e66d14103a74ce6ad61f8 @@ -808,9 +818,9 @@ SPEC CHECKSUMS: RollbarReactNative: 11595d077e6e53c3dff7846f6bd53f23f68be338 SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 SwiftAudioEx: 6f511018b7a0fdfd14ed1bb4081f953588245cc0 - Yoga: 6e6ec2d9e1eb4ecb97be4dc9bdd91f7cae2adf98 + Yoga: ef534101bb891fb09bae657417f34d399c1efe38 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a PODFILE CHECKSUM: 1763ab552ba7dac3473e47862d7ac2d6963d0f49 -COCOAPODS: 1.14.2 +COCOAPODS: 1.15.2 diff --git a/ios/PrivacyInfo.xcprivacy b/ios/PrivacyInfo.xcprivacy index 41b8317f..9919625f 100644 --- a/ios/PrivacyInfo.xcprivacy +++ b/ios/PrivacyInfo.xcprivacy @@ -12,6 +12,14 @@ C617.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + + NSPrivacyAccessedAPIType NSPrivacyAccessedAPICategoryUserDefaults From 1b556fac882df6ecc9333f8b69e70c893f79cdc5 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Sun, 1 Sep 2024 20:51:35 +0200 Subject: [PATCH 15/51] updated react native to latest patch version. updated react native reanimated to latest minor version. --- android/build.gradle | 6 +- ios/Podfile.lock | 382 +++++++++--------- ios/PrivacyInfo.xcprivacy | 8 + package.json | 4 +- ...72.13.patch => react-native+0.72.17.patch} | 0 release.sh | 4 +- yarn.lock | 282 ++++++++++++- 7 files changed, 483 insertions(+), 203 deletions(-) rename patches/{react-native+0.72.13.patch => react-native+0.72.17.patch} (100%) diff --git a/android/build.gradle b/android/build.gradle index 66ec8d0b..56dd4697 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,14 +1,10 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - buildscript { ext { buildToolsVersion = "34.0.0" minSdkVersion = 21 compileSdkVersion = 34 targetSdkVersion = 34 - - // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. - ndkVersion = "23.1.7779620" + ndkVersion = "25.1.8937393" } repositories { google() diff --git a/ios/Podfile.lock b/ios/Podfile.lock index cbd03378..2066fc95 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2,14 +2,14 @@ PODS: - boost (1.76.0) - CocoaAsyncSocket (7.6.5) - DoubleConversion (1.1.6) - - FBLazyVector (0.72.13) - - FBReactNativeSpec (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - RCTRequired (= 0.72.13) - - RCTTypeSafety (= 0.72.13) - - React-Core (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) + - FBLazyVector (0.72.17) + - FBReactNativeSpec (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - RCTRequired (= 0.72.17) + - RCTTypeSafety (= 0.72.17) + - React-Core (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) - Flipper (0.182.0): - Flipper-Folly (~> 2.6) - Flipper-Boost-iOSX (1.76.0.1.11) @@ -70,9 +70,9 @@ PODS: - FlipperKit/FlipperKitNetworkPlugin - fmt (6.2.1) - glog (0.3.5) - - hermes-engine (0.72.13): - - hermes-engine/Pre-built (= 0.72.13) - - hermes-engine/Pre-built (0.72.13) + - hermes-engine (0.72.17): + - hermes-engine/Pre-built (= 0.72.17) + - hermes-engine/Pre-built (0.72.17) - libevent (2.1.12) - OpenSSL-Universal (1.1.1100) - RCT-Folly (2021.07.22.00): @@ -92,26 +92,26 @@ PODS: - fmt (~> 6.2.1) - glog - libevent - - RCTRequired (0.72.13) - - RCTTypeSafety (0.72.13): - - FBLazyVector (= 0.72.13) - - RCTRequired (= 0.72.13) - - React-Core (= 0.72.13) - - React (0.72.13): - - React-Core (= 0.72.13) - - React-Core/DevSupport (= 0.72.13) - - React-Core/RCTWebSocket (= 0.72.13) - - React-RCTActionSheet (= 0.72.13) - - React-RCTAnimation (= 0.72.13) - - React-RCTBlob (= 0.72.13) - - React-RCTImage (= 0.72.13) - - React-RCTLinking (= 0.72.13) - - React-RCTNetwork (= 0.72.13) - - React-RCTSettings (= 0.72.13) - - React-RCTText (= 0.72.13) - - React-RCTVibration (= 0.72.13) - - React-callinvoker (0.72.13) - - React-Codegen (0.72.13): + - RCTRequired (0.72.17) + - RCTTypeSafety (0.72.17): + - FBLazyVector (= 0.72.17) + - RCTRequired (= 0.72.17) + - React-Core (= 0.72.17) + - React (0.72.17): + - React-Core (= 0.72.17) + - React-Core/DevSupport (= 0.72.17) + - React-Core/RCTWebSocket (= 0.72.17) + - React-RCTActionSheet (= 0.72.17) + - React-RCTAnimation (= 0.72.17) + - React-RCTBlob (= 0.72.17) + - React-RCTImage (= 0.72.17) + - React-RCTLinking (= 0.72.17) + - React-RCTNetwork (= 0.72.17) + - React-RCTSettings (= 0.72.17) + - React-RCTText (= 0.72.17) + - React-RCTVibration (= 0.72.17) + - React-callinvoker (0.72.17) + - React-Codegen (0.72.17): - DoubleConversion - FBReactNativeSpec - glog @@ -126,11 +126,11 @@ PODS: - React-rncore - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-Core (0.72.13): + - React-Core (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.72.13) + - React-Core/Default (= 0.72.17) - React-cxxreact - React-hermes - React-jsi @@ -140,7 +140,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/CoreModulesHeaders (0.72.13): + - React-Core/CoreModulesHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -154,7 +154,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/Default (0.72.13): + - React-Core/Default (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -167,23 +167,23 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/DevSupport (0.72.13): + - React-Core/DevSupport (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.72.13) - - React-Core/RCTWebSocket (= 0.72.13) + - React-Core/Default (= 0.72.17) + - React-Core/RCTWebSocket (= 0.72.17) - React-cxxreact - React-hermes - React-jsi - React-jsiexecutor - - React-jsinspector (= 0.72.13) + - React-jsinspector (= 0.72.17) - React-perflogger - React-runtimeexecutor - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTActionSheetHeaders (0.72.13): + - React-Core/RCTActionSheetHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -197,7 +197,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTAnimationHeaders (0.72.13): + - React-Core/RCTAnimationHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -211,7 +211,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTBlobHeaders (0.72.13): + - React-Core/RCTBlobHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -225,7 +225,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTImageHeaders (0.72.13): + - React-Core/RCTImageHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -239,7 +239,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTLinkingHeaders (0.72.13): + - React-Core/RCTLinkingHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -253,7 +253,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTNetworkHeaders (0.72.13): + - React-Core/RCTNetworkHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -267,7 +267,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTSettingsHeaders (0.72.13): + - React-Core/RCTSettingsHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -281,7 +281,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTTextHeaders (0.72.13): + - React-Core/RCTTextHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -295,7 +295,7 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTVibrationHeaders (0.72.13): + - React-Core/RCTVibrationHeaders (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -309,11 +309,11 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-Core/RCTWebSocket (0.72.13): + - React-Core/RCTWebSocket (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Core/Default (= 0.72.13) + - React-Core/Default (= 0.72.17) - React-cxxreact - React-hermes - React-jsi @@ -323,57 +323,57 @@ PODS: - React-utils - SocketRocket (= 0.6.1) - Yoga - - React-CoreModules (0.72.13): + - React-CoreModules (0.72.17): - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.72.13) - - React-Codegen (= 0.72.13) - - React-Core/CoreModulesHeaders (= 0.72.13) - - React-jsi (= 0.72.13) + - RCTTypeSafety (= 0.72.17) + - React-Codegen (= 0.72.17) + - React-Core/CoreModulesHeaders (= 0.72.17) + - React-jsi (= 0.72.17) - React-RCTBlob - - React-RCTImage (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) + - React-RCTImage (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) - SocketRocket (= 0.6.1) - - React-cxxreact (0.72.13): + - React-cxxreact (0.72.17): - boost (= 1.76.0) - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.72.13) - - React-debug (= 0.72.13) - - React-jsi (= 0.72.13) - - React-jsinspector (= 0.72.13) - - React-logger (= 0.72.13) - - React-perflogger (= 0.72.13) - - React-runtimeexecutor (= 0.72.13) - - React-debug (0.72.13) - - React-hermes (0.72.13): + - React-callinvoker (= 0.72.17) + - React-debug (= 0.72.17) + - React-jsi (= 0.72.17) + - React-jsinspector (= 0.72.17) + - React-logger (= 0.72.17) + - React-perflogger (= 0.72.17) + - React-runtimeexecutor (= 0.72.17) + - React-debug (0.72.17) + - React-hermes (0.72.17): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - RCT-Folly/Futures (= 2021.07.22.00) - - React-cxxreact (= 0.72.13) + - React-cxxreact (= 0.72.17) - React-jsi - - React-jsiexecutor (= 0.72.13) - - React-jsinspector (= 0.72.13) - - React-perflogger (= 0.72.13) - - React-jsi (0.72.13): + - React-jsiexecutor (= 0.72.17) + - React-jsinspector (= 0.72.17) + - React-perflogger (= 0.72.17) + - React-jsi (0.72.17): - boost (= 1.76.0) - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-jsiexecutor (0.72.13): + - React-jsiexecutor (0.72.17): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-cxxreact (= 0.72.13) - - React-jsi (= 0.72.13) - - React-perflogger (= 0.72.13) - - React-jsinspector (0.72.13) - - React-logger (0.72.13): + - React-cxxreact (= 0.72.17) + - React-jsi (= 0.72.17) + - React-perflogger (= 0.72.17) + - React-jsinspector (0.72.17) + - React-logger (0.72.17): - glog - react-native-config (1.5.1): - react-native-config/App (= 1.5.1) @@ -388,7 +388,7 @@ PODS: - react-native-track-player (4.0.1): - React-Core - SwiftAudioEx (= 1.0.0) - - React-NativeModulesApple (0.72.13): + - React-NativeModulesApple (0.72.17): - hermes-engine - React-callinvoker - React-Core @@ -397,17 +397,17 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-perflogger (0.72.13) - - React-RCTActionSheet (0.72.13): - - React-Core/RCTActionSheetHeaders (= 0.72.13) - - React-RCTAnimation (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.72.13) - - React-Codegen (= 0.72.13) - - React-Core/RCTAnimationHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTAppDelegate (0.72.13): + - React-perflogger (0.72.17) + - React-RCTActionSheet (0.72.17): + - React-Core/RCTActionSheetHeaders (= 0.72.17) + - React-RCTAnimation (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.17) + - React-Codegen (= 0.72.17) + - React-Core/RCTAnimationHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTAppDelegate (0.72.17): - RCT-Folly - RCTRequired - RCTTypeSafety @@ -419,54 +419,54 @@ PODS: - React-RCTNetwork - React-runtimescheduler - ReactCommon/turbomodule/core - - React-RCTBlob (0.72.13): + - React-RCTBlob (0.72.17): - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.72.13) - - React-Core/RCTBlobHeaders (= 0.72.13) - - React-Core/RCTWebSocket (= 0.72.13) - - React-jsi (= 0.72.13) - - React-RCTNetwork (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTImage (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.72.13) - - React-Codegen (= 0.72.13) - - React-Core/RCTImageHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - React-RCTNetwork (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTLinking (0.72.13): - - React-Codegen (= 0.72.13) - - React-Core/RCTLinkingHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTNetwork (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.72.13) - - React-Codegen (= 0.72.13) - - React-Core/RCTNetworkHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTSettings (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - RCTTypeSafety (= 0.72.13) - - React-Codegen (= 0.72.13) - - React-Core/RCTSettingsHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-RCTText (0.72.13): - - React-Core/RCTTextHeaders (= 0.72.13) - - React-RCTVibration (0.72.13): - - RCT-Folly (= 2021.07.22.00) - - React-Codegen (= 0.72.13) - - React-Core/RCTVibrationHeaders (= 0.72.13) - - React-jsi (= 0.72.13) - - ReactCommon/turbomodule/core (= 0.72.13) - - React-rncore (0.72.13) - - React-runtimeexecutor (0.72.13): - - React-jsi (= 0.72.13) - - React-runtimescheduler (0.72.13): + - React-Codegen (= 0.72.17) + - React-Core/RCTBlobHeaders (= 0.72.17) + - React-Core/RCTWebSocket (= 0.72.17) + - React-jsi (= 0.72.17) + - React-RCTNetwork (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTImage (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.17) + - React-Codegen (= 0.72.17) + - React-Core/RCTImageHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - React-RCTNetwork (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTLinking (0.72.17): + - React-Codegen (= 0.72.17) + - React-Core/RCTLinkingHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTNetwork (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.17) + - React-Codegen (= 0.72.17) + - React-Core/RCTNetworkHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTSettings (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.17) + - React-Codegen (= 0.72.17) + - React-Core/RCTSettingsHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-RCTText (0.72.17): + - React-Core/RCTTextHeaders (= 0.72.17) + - React-RCTVibration (0.72.17): + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.72.17) + - React-Core/RCTVibrationHeaders (= 0.72.17) + - React-jsi (= 0.72.17) + - ReactCommon/turbomodule/core (= 0.72.17) + - React-rncore (0.72.17) + - React-runtimeexecutor (0.72.17): + - React-jsi (= 0.72.17) + - React-runtimescheduler (0.72.17): - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) @@ -474,30 +474,30 @@ PODS: - React-debug - React-jsi - React-runtimeexecutor - - React-utils (0.72.13): + - React-utils (0.72.17): - glog - RCT-Folly (= 2021.07.22.00) - React-debug - - ReactCommon/turbomodule/bridging (0.72.13): + - ReactCommon/turbomodule/bridging (0.72.17): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.72.13) - - React-cxxreact (= 0.72.13) - - React-jsi (= 0.72.13) - - React-logger (= 0.72.13) - - React-perflogger (= 0.72.13) - - ReactCommon/turbomodule/core (0.72.13): + - React-callinvoker (= 0.72.17) + - React-cxxreact (= 0.72.17) + - React-jsi (= 0.72.17) + - React-logger (= 0.72.17) + - React-perflogger (= 0.72.17) + - ReactCommon/turbomodule/core (0.72.17): - DoubleConversion - glog - hermes-engine - RCT-Folly (= 2021.07.22.00) - - React-callinvoker (= 0.72.13) - - React-cxxreact (= 0.72.13) - - React-jsi (= 0.72.13) - - React-logger (= 0.72.13) - - React-perflogger (= 0.72.13) + - React-callinvoker (= 0.72.17) + - React-cxxreact (= 0.72.17) + - React-jsi (= 0.72.17) + - React-logger (= 0.72.17) + - React-perflogger (= 0.72.17) - RealmJS (12.13.1): - React - RNCClipboard (1.12.1): @@ -507,7 +507,17 @@ PODS: - RNGestureHandler (2.16.0): - RCT-Folly (= 2021.07.22.00) - React-Core - - RNReanimated (3.8.1): + - RNReanimated (3.15.0): + - RCT-Folly (= 2021.07.22.00) + - React-Core + - ReactCommon/turbomodule/core + - RNReanimated/reanimated (= 3.15.0) + - RNReanimated/worklets (= 3.15.0) + - RNReanimated/reanimated (3.15.0): + - RCT-Folly (= 2021.07.22.00) + - React-Core + - ReactCommon/turbomodule/core + - RNReanimated/worklets (3.15.0): - RCT-Folly (= 2021.07.22.00) - React-Core - ReactCommon/turbomodule/core @@ -738,8 +748,8 @@ SPEC CHECKSUMS: boost: 7dcd2de282d72e344012f7d6564d024930a6a440 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - FBLazyVector: d5c36294933aa344046699700b9ae9c2e10db18e - FBReactNativeSpec: ee1c8650ed1f489b699e8a20db2044b0a7f849c5 + FBLazyVector: 66398fc2381d8fa1eee4c0f80d931587a7b927e8 + FBReactNativeSpec: 0f8cecf999d709dba7626bbf565b1b5f8f46a5c1 Flipper: 6edb735e6c3e332975d1b17956bcc584eccf5818 Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 @@ -750,51 +760,51 @@ SPEC CHECKSUMS: FlipperKit: 2efad7007d6745a3f95e4034d547be637f89d3f6 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b - hermes-engine: 6b116ce065327cef44156096edaa1e839ee69a03 + hermes-engine: 982096772bd947125ee3b4f72ace6cb9a33f1d02 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 - RCTRequired: 2fb3c1ac6546029f44d04083771e60a106073853 - RCTTypeSafety: 59916726dadf1e2f3d502f2f3cf7393fe451f501 - React: a268c36512fe4ae45f55816af7dac225de38a602 - React-callinvoker: b8a85e82fe8e7d8f3b4b4ff03c292c498fe8e747 - React-Codegen: 7d097ffb2323d335832670713ba193d43664575b - React-Core: 515d1f7f7a02d99a4d29fda4495e69c43375a035 - React-CoreModules: ce9bc448da0091a8d0d9d63f95213e52d170db31 - React-cxxreact: 4deb455d65dd11513fa8d228442005e1febedfe2 - React-debug: 30e2b157b34f426e0ad51ec6bc1b8231e7f27c48 - React-hermes: cad4ee3887376efa0c1498b33a295b00055e0644 - React-jsi: 5162e7a01e31e956147e674915fcdeab0b6e324f - React-jsiexecutor: 08ea8c7c359e5953776d9b51eb606a02b0999c61 - React-jsinspector: 525fb67d3402476e6d2796907892137e4a632e35 - React-logger: c3a0ff270a52e0051489f1f29a5de047ba7e8ca0 + RCTRequired: 01c639ec840ee03928b2d65f5cd5297d737b3834 + RCTTypeSafety: 9623592521a1576363baf3d6ab8d164cfe9062bf + React: 3c0beeda318c3c515a6bb2c1f197b55bd731aa43 + React-callinvoker: 0cd6ff2cdd80255c82cd4628fc925df1e7133a1a + React-Codegen: 20cfee78965306e4a5bb65d95958142eda116cfc + React-Core: df691c59e0c8a3db4d138a51bb8862c52c8b14f1 + React-CoreModules: cebd223e814ac07bc1f597bbd2480167a2c7a130 + React-cxxreact: dec3959d439708cb7dd73b46a11ed64c3eea79da + React-debug: 3a5091cbda7ffe5f11ad0443109810fcd1a3e885 + React-hermes: f3b6b278c4ff7e6664a86b2bf964a4dc4ae72d34 + React-jsi: 6ec4bd4cd929ae9d468b4984b0ae2c657aeeb2da + React-jsiexecutor: 8dc585381e476c3ff2e9468f444c90c4d1d5b874 + React-jsinspector: 853b8631b908636bb09ef77cb217376c38a0c8ff + React-logger: 9ca44bb5703bf2355f3c2d2e5e67bfe98ca2dc34 react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8 react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774 react-native-quick-md5: 5928fdcedcb1b2f0e1958a38769283968b8eb850 react-native-safe-area-context: 2cd91d532de12acdb0a9cbc8d43ac72a8e4c897c react-native-track-player: 97d76dbbd35f27cc709e5f04540615e54264b3f9 - React-NativeModulesApple: 83cd035f454ac54f4f72ce7b01c34054fa6d60f8 - React-perflogger: de3900e86d8a4d896999b08e0b130ad8b83ebf11 - React-RCTActionSheet: 92433ffdf1b479aab3fe32250047f100a10ce59f - React-RCTAnimation: 6f116d7b25705f185f48dedf65eb4e98f98d860c - React-RCTAppDelegate: efc96d53a6673082eb6b2d8c91a7ef349b639f7a - React-RCTBlob: 088c2942e3b171b4f8dba9b7f48aa5fff5c2ab97 - React-RCTImage: 66b3b6d840a3b329b2406956a58db80f1344d097 - React-RCTLinking: 032518be6aebadd7f032f23c8975be98eff042cb - React-RCTNetwork: dc775d132167fcdfcb3bba4b11d57cf07a834a3e - React-RCTSettings: 0bd22fc8293bc396cdb0769a12830273c8c5096b - React-RCTText: d312733e5008713f7293e3d44f41f34d432cd4b0 - React-RCTVibration: 754103c3c8c09d6fd2e1ee49d9a32f53e9f2d615 - React-rncore: 15d88d097c7928f0c1ef28070b0d81bc3f372854 - React-runtimeexecutor: 318cd0b384ccb12a2f86870f8591b759caad7f7d - React-runtimescheduler: 8dd5ce1d291c417dd90cd651eccc70821c237a38 - React-utils: 46700f6d6cacc4288f897b94571bf92895678885 - ReactCommon: 71dc6b65f95ea81a83490115d7a5fc62378ecdcc + React-NativeModulesApple: 2edfcbb25329e3eb5f76eb79d89010de7c1c6f1f + React-perflogger: 785b0063af5178298a61b54bb46aae9a19c7bbb5 + React-RCTActionSheet: 84f37b34bd77249263ace75471d6664393c29972 + React-RCTAnimation: 5713910b6223154df4bba80a0bda4e2e671b00f8 + React-RCTAppDelegate: d3777d05bf6b65fed847536af520731c1a167dea + React-RCTBlob: d4d3fb21c0bf1ce2f0308e05227ecd3f19266bf7 + React-RCTImage: 2e63a483be5d4e46a80dea3b17c9abee38006feb + React-RCTLinking: e3ff685ee62187f8f61e938357307c1f890125b5 + React-RCTNetwork: a35842997a403edfdc1ec25b61a0e10a0526368d + React-RCTSettings: aef81e0ac54268d2928ad31c4f91056cc75e5ce9 + React-RCTText: 7becec5f53f03b20da11f4b7e40e6bcfd476d134 + React-RCTVibration: defaae8016de9b3351a2a67ee8ef3fbdd643b0e1 + React-rncore: dfd20469cfad38e48b1c3cc9c4367db63f5231d7 + React-runtimeexecutor: 448409b5ae5a01b7793239f630051960c7dd39f9 + React-runtimescheduler: ff30efdf24f8ce62eb517a391ded3d99c4263bb0 + React-utils: 7959d4553163b61e01bbe83dbd80e58ca420aecb + ReactCommon: 841449721eb2e004de2c3366844b0a03f329f2cb RealmJS: 325a7b621587dd9945306d4cbfd6b641bc20e2dd RNCClipboard: d77213bfa269013bf4b857b7a9ca37ee062d8ef1 RNDeviceInfo: db5c64a060e66e5db3102d041ebe3ef307a85120 RNGestureHandler: b83cf821f60b7ec59827f0ed9e5b8c46b1de2c99 - RNReanimated: fc36806836aca984b797f01432abe31689663421 + RNReanimated: c2027c397233801d4aceb7375e000ac87ec2e67d RNScreens: bea7b9767050d69e4b9da14639cdd5c8f5a37881 RNSVG: d00c8f91c3cbf6d476451313a18f04d220d4f396 RNVectorIcons: fcc2f6cb32f5735b586e66d14103a74ce6ad61f8 @@ -802,7 +812,7 @@ SPEC CHECKSUMS: RollbarReactNative: 11595d077e6e53c3dff7846f6bd53f23f68be338 SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 SwiftAudioEx: 6f511018b7a0fdfd14ed1bb4081f953588245cc0 - Yoga: 6e6ec2d9e1eb4ecb97be4dc9bdd91f7cae2adf98 + Yoga: ef534101bb891fb09bae657417f34d399c1efe38 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a PODFILE CHECKSUM: 1763ab552ba7dac3473e47862d7ac2d6963d0f49 diff --git a/ios/PrivacyInfo.xcprivacy b/ios/PrivacyInfo.xcprivacy index 41b8317f..9919625f 100644 --- a/ios/PrivacyInfo.xcprivacy +++ b/ios/PrivacyInfo.xcprivacy @@ -12,6 +12,14 @@ C617.1 + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + + NSPrivacyAccessedAPIType NSPrivacyAccessedAPICategoryUserDefaults diff --git a/package.json b/package.json index bc0e0f78..cfb9fa48 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "fetch-retry": "6.0.0", "htmlparser2": "9.0.0", "react": "18.2.0", - "react-native": "0.72.13", + "react-native": "0.72.17", "react-native-config": "1.5.1", "react-native-device-info": "10.12.0", "react-native-gesture-handler": "2.16.0", @@ -33,7 +33,7 @@ "react-native-keep-awake": "4.0.0", "react-native-popup-menu": "0.16.1", "react-native-quick-md5": "3.0.5", - "react-native-reanimated": "3.8.1", + "react-native-reanimated": "3.15.0", "react-native-safe-area-context": "4.7.4", "react-native-screens": "3.27.0", "react-native-svg": "13.14.0", diff --git a/patches/react-native+0.72.13.patch b/patches/react-native+0.72.17.patch similarity index 100% rename from patches/react-native+0.72.13.patch rename to patches/react-native+0.72.17.patch diff --git a/release.sh b/release.sh index ef52e524..5a8d4e94 100755 --- a/release.sh +++ b/release.sh @@ -71,7 +71,7 @@ function releaseMinor { retry git pull git merge develop || exit 1 - # Create patch version + # Create version npm --no-git-tag-version version minor || exit 1 RELEASE_VERSION=$(sed 's/.*"version": "\(.*\)".*/\1/;t;d' ./package.json) @@ -87,7 +87,7 @@ function releaseMajor { retry git pull git merge develop || exit 1 - # Create patch version + # Create version npm --no-git-tag-version version major || exit 1 RELEASE_VERSION=$(sed 's/.*"version": "\(.*\)".*/\1/;t;d' ./package.json) diff --git a/yarn.lock b/yarn.lock index a196dde6..35f9157d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,11 +31,24 @@ "@babel/highlight" "^7.24.6" picocolors "^1.0.0" +"@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== + "@babel/core@7.23.5", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.5.tgz#6e23f2acbcb77ad283c5ed141f824fd9f70101c7" @@ -76,6 +89,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -90,6 +113,13 @@ dependencies: "@babel/types" "^7.24.6" +"@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" @@ -108,6 +138,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.5.tgz#2a8792357008ae9ce8c0f2b78b9f646ac96b314b" @@ -138,6 +179,19 @@ "@babel/helper-split-export-declaration" "^7.24.6" semver "^6.3.1" +"@babel/helper-create-class-features-plugin@^7.25.4": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz#57eaf1af38be4224a9d9dd01ddde05b741f50e14" + integrity sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/traverse" "^7.25.4" + semver "^6.3.1" + "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" @@ -147,6 +201,15 @@ regexpu-core "^5.3.1" semver "^6.3.1" +"@babel/helper-create-regexp-features-plugin@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" + integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + regexpu-core "^5.3.1" + semver "^6.3.1" + "@babel/helper-define-polyfill-provider@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" @@ -205,6 +268,14 @@ dependencies: "@babel/types" "^7.24.6" +"@babel/helper-member-expression-to-functions@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" + integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA== + dependencies: + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.8" + "@babel/helper-module-imports@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" @@ -237,6 +308,13 @@ dependencies: "@babel/types" "^7.24.6" +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" @@ -252,6 +330,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz#fa02a32410a15a6e8f8185bcbf608f10528d2a24" integrity sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg== +"@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + "@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" @@ -279,6 +362,15 @@ "@babel/helper-member-expression-to-functions" "^7.24.6" "@babel/helper-optimise-call-expression" "^7.24.6" +"@babel/helper-replace-supers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" + integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.24.8" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/traverse" "^7.25.0" + "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" @@ -300,6 +392,14 @@ dependencies: "@babel/types" "^7.24.6" +"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" @@ -324,6 +424,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz#28583c28b15f2a3339cfafafeaad42f9a0e828df" integrity sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" @@ -334,11 +439,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz#08bb6612b11bdec78f3feed3db196da682454a5e" integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + "@babel/helper-wrap-function@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" @@ -376,6 +491,16 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563" @@ -386,6 +511,13 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== +"@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" @@ -702,6 +834,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-class-properties@^7.0.0-0": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz#bae7dbfcdcc2e8667355cd1fb5eda298f05189fd" + integrity sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.4" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-transform-class-properties@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" @@ -734,6 +874,18 @@ "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.0.0-0": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz#d29dbb6a72d79f359952ad0b66d88518d65ef89a" + integrity sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-replace-supers" "^7.25.0" + "@babel/traverse" "^7.25.4" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" @@ -1153,6 +1305,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-unicode-regex@^7.0.0-0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" @@ -1324,6 +1484,15 @@ "@babel/parser" "^7.24.6" "@babel/types" "^7.24.6" +"@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + "@babel/traverse@^7.20.0", "@babel/traverse@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec" @@ -1340,6 +1509,19 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.4": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602" @@ -1358,6 +1540,15 @@ "@babel/helper-validator-identifier" "^7.24.6" to-fast-properties "^2.0.0" +"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1684,6 +1875,15 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" @@ -1694,6 +1894,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/source-map@^0.3.3": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" @@ -1715,6 +1920,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" @@ -3179,6 +3392,16 @@ browserslist@^4.21.9, browserslist@^4.22.1: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +browserslist@^4.23.1: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + dependencies: + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -3274,6 +3497,11 @@ caniuse-lite@^1.0.30001565: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz#61a8e17caf3752e3e426d4239c549ebbb37fef0d" integrity sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA== +caniuse-lite@^1.0.30001646: + version "1.0.30001655" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f" + integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg== + chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3624,6 +3852,13 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" +debug@^4.3.1: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + decache@^3.0.5: version "3.1.0" resolved "https://registry.yarnpkg.com/decache/-/decache-3.1.0.tgz#4f5036fbd6581fcc97237ac3954a244b9536c2da" @@ -3843,6 +4078,11 @@ electron-to-chromium@^1.4.601: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.603.tgz#446907c21d333b55d0beaba1cb5b48430775a8a7" integrity sha512-Dvo5OGjnl7AZTU632dFJtWj0uJK835eeOVQIuRcmBmsFsTNn3cL05FqOyHAfGQDIoHfLhyJ1Tya3PJ0ceMz54g== +electron-to-chromium@^1.5.4: + version "1.5.13" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" + integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== + emittery@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" @@ -4007,6 +4247,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -6755,6 +7000,11 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + node-stream-zip@^1.9.1: version "1.15.0" resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" @@ -7092,6 +7342,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -7373,16 +7628,19 @@ react-native-quick-md5@3.0.5: dependencies: spark-md5 "^3.0.2" -react-native-reanimated@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.8.1.tgz#45c13d4bedebef8df3d5a8756f25072de65960d7" - integrity sha512-EdM0vr3JEaNtqvstqESaPfOBy0gjYBkr1iEolWJ82Ax7io8y9OVUIphgsLKTB36CtR1XtmBw0RZVj7KArc7ZVA== +react-native-reanimated@3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.15.0.tgz#8814af7c78bbdf4c92bbd583f2266febf962e66a" + integrity sha512-yGxOyYAAu/5CyjonM2SgsM5sviiiK8HiHL9jT1bKfRxMLnNX9cFP8/UXRkbMT7ZXIfOlCvNFR0AqnphpuXIPVA== dependencies: "@babel/plugin-transform-arrow-functions" "^7.0.0-0" + "@babel/plugin-transform-class-properties" "^7.0.0-0" + "@babel/plugin-transform-classes" "^7.0.0-0" "@babel/plugin-transform-nullish-coalescing-operator" "^7.0.0-0" "@babel/plugin-transform-optional-chaining" "^7.0.0-0" "@babel/plugin-transform-shorthand-properties" "^7.0.0-0" "@babel/plugin-transform-template-literals" "^7.0.0-0" + "@babel/plugin-transform-unicode-regex" "^7.0.0-0" "@babel/preset-typescript" "^7.16.7" convert-source-map "^2.0.0" invariant "^2.2.4" @@ -7421,10 +7679,10 @@ react-native-vector-icons@9.2.0: prop-types "^15.7.2" yargs "^16.1.1" -react-native@0.72.13: - version "0.72.13" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.13.tgz#27c495a34025d55b5e5ef4ed65470b7ff1bdd123" - integrity sha512-YH2BZScuLdUtfSA3Ha2kJntOc/kkPPG7e4DFyrdsHahXBCDNfBmbtJ13aPrFVvndpKPU32vJAEessgVUgZGBSg== +react-native@0.72.17: + version "0.72.17" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.17.tgz#54d6de38adf6e56fdde1a6b83ef9b138abae7384" + integrity sha512-k3dNe0XqoYCGGWTenbupWSj+ljW3GIfmYS5P4s3if4j0csx2YbenKgH1aJNWLp+UP7ONwfId6G+uBoUJfyMxXg== dependencies: "@jest/create-cache-key-function" "^29.2.1" "@react-native-community/cli" "^11.4.1" @@ -8658,6 +8916,14 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" From 76cb7d37ee90c7edcb32ecb572e2f68b4222a1da Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Sun, 1 Sep 2024 20:52:18 +0200 Subject: [PATCH 16/51] test version release: 1.17.7 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index 77d3d750..4358b9de 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.6 + 1.17.7 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.2 + 658.3 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index cfb9fa48..95da03a7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.6", + "version": "1.17.7", "private": true, "scripts": { "android": "react-native run-android", From 56d31d1d2e1633dfc68d767d53a50c37ffb26c31 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 2 Sep 2024 09:15:21 +0200 Subject: [PATCH 17/51] installed netinfo (no implementation yet). --- ios/Podfile.lock | 6 ++++++ package.json | 1 + yarn.lock | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2066fc95..f942bc63 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -381,6 +381,8 @@ PODS: - React-Core - react-native-keep-awake (4.0.0): - React + - react-native-netinfo (11.3.2): + - React-Core - react-native-quick-md5 (3.0.5): - React-Core - react-native-safe-area-context (4.7.4): @@ -586,6 +588,7 @@ DEPENDENCIES: - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - react-native-config (from `../node_modules/react-native-config`) - react-native-keep-awake (from `../node_modules/react-native-keep-awake`) + - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" - react-native-quick-md5 (from `../node_modules/react-native-quick-md5`) - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - react-native-track-player (from `../node_modules/react-native-track-player`) @@ -683,6 +686,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-config" react-native-keep-awake: :path: "../node_modules/react-native-keep-awake" + react-native-netinfo: + :path: "../node_modules/@react-native-community/netinfo" react-native-quick-md5: :path: "../node_modules/react-native-quick-md5" react-native-safe-area-context: @@ -780,6 +785,7 @@ SPEC CHECKSUMS: React-logger: 9ca44bb5703bf2355f3c2d2e5e67bfe98ca2dc34 react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8 react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774 + react-native-netinfo: 076df4f9b07f6670acf4ce9a75aac8d34c2e2ccc react-native-quick-md5: 5928fdcedcb1b2f0e1958a38769283968b8eb850 react-native-safe-area-context: 2cd91d532de12acdb0a9cbc8d43ac72a8e4c897c react-native-track-player: 97d76dbbd35f27cc709e5f04540615e54264b3f9 diff --git a/package.json b/package.json index 95da03a7..1cb0d16a 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "dependencies": { "@ptomasroos/react-native-multi-slider": "git+https://github.com/sampie777/react-native-multi-slider.git#2.3.0", "@react-native-clipboard/clipboard": "1.12.1", + "@react-native-community/netinfo": "11.3.2", "@react-navigation/bottom-tabs": "6.5.11", "@react-navigation/native": "6.1.9", "@react-navigation/native-stack": "6.9.17", diff --git a/yarn.lock b/yarn.lock index 35f9157d..df49b6a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2282,6 +2282,11 @@ prompts "^2.4.0" semver "^7.5.2" +"@react-native-community/netinfo@11.3.2": + version "11.3.2" + resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-11.3.2.tgz#e63201d0b87ad42d086d1003be48ae7b327f0594" + integrity sha512-YsaS3Dutnzqd1BEoeC+DEcuNJedYRkN6Ef3kftT5Sm8ExnCF94C/nl4laNxuvFli3+Jz8Df3jO25Jn8A9S0h4w== + "@react-native/assets-registry@0.74.84": version "0.74.84" resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.84.tgz#aa472f82c1b7d8a30098c8ba22fad7b3dbb5be5f" From 4e483833cf351ba7bef3fa5bac262a36f8df6d4c Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 2 Sep 2024 09:15:41 +0200 Subject: [PATCH 18/51] test version release: 1.17.8 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index 4358b9de..48a0e16b 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.7 + 1.17.8 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.3 + 658.4 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index 1cb0d16a..4e105c02 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.7", + "version": "1.17.8", "private": true, "scripts": { "android": "react-native run-android", From b7cbe1d8e7cfbe27094ec4a8d8111c4a50cb1072 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 2 Sep 2024 11:20:32 +0200 Subject: [PATCH 19/51] merge --- package.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 66eef3c9..4e105c02 100644 --- a/package.json +++ b/package.json @@ -16,16 +16,17 @@ "dependencies": { "@ptomasroos/react-native-multi-slider": "git+https://github.com/sampie777/react-native-multi-slider.git#2.3.0", "@react-native-clipboard/clipboard": "1.12.1", + "@react-native-community/netinfo": "11.3.2", "@react-navigation/bottom-tabs": "6.5.11", "@react-navigation/native": "6.1.9", "@react-navigation/native-stack": "6.9.17", - "@realm/react": "0.7.0", + "@realm/react": "0.10.0", "abcjs": "git+https://github.com/paulrosen/abcjs.git#6.2.3", "fastest-levenshtein": "1.0.16", "fetch-retry": "6.0.0", "htmlparser2": "9.0.0", "react": "18.2.0", - "react-native": "0.72.13", + "react-native": "0.72.17", "react-native-config": "1.5.1", "react-native-device-info": "10.12.0", "react-native-gesture-handler": "2.16.0", @@ -33,18 +34,18 @@ "react-native-keep-awake": "4.0.0", "react-native-popup-menu": "0.16.1", "react-native-quick-md5": "3.0.5", - "react-native-reanimated": "3.8.1", + "react-native-reanimated": "3.15.0", "react-native-safe-area-context": "4.7.4", "react-native-screens": "3.27.0", "react-native-svg": "13.14.0", "react-native-track-player": "4.0.1", "react-native-vector-icons": "9.2.0", - "realm": "12.9.0", + "realm": "12.13.1", "rollbar-react-native": "0.9.3" }, "devDependencies": { "@babel/core": "7.23.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.18.6", "@babel/plugin-transform-flow-strip-types": "7.23.3", "@babel/plugin-transform-nullish-coalescing-operator": "7.23.4", "@babel/plugin-transform-private-methods": "7.23.3", From da0a427519cddb01181e9af82ac26aefc010bf8d Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 2 Sep 2024 11:21:07 +0200 Subject: [PATCH 20/51] disabled DB execution of auto updater, so we can test the implementation of the netinfo package first. --- source/logic/autoUpdater.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/source/logic/autoUpdater.ts b/source/logic/autoUpdater.ts index 22916441..7da3d435 100644 --- a/source/logic/autoUpdater.ts +++ b/source/logic/autoUpdater.ts @@ -18,13 +18,15 @@ export namespace AutoUpdater { if (!mayUseNetwork()) return Promise.resolve(); if (!isCheckIntervalPassed()) return Promise.resolve(); - return Promise.all([ - SongAutoUpdater.run(context.addSongBundleUpdating, context.removeSongBundleUpdating, mayUseNetwork) - .catch(error => rollbar.error("Failed to run auto updater for songs", sanitizeErrorForRollbar(error))), - - DocumentAutoUpdater.run(context.addDocumentGroupUpdating, context.removeDocumentGroupUpdating, mayUseNetwork) - .catch(error => rollbar.error("Failed to run auto updater for documents", sanitizeErrorForRollbar(error))), - ]) + // todo: further execution of function disabled for test run 1.17.9. Please enable if 1.17.9 works. + return Promise.resolve() + // return Promise.all([ + // SongAutoUpdater.run(context.addSongBundleUpdating, context.removeSongBundleUpdating, mayUseNetwork) + // .catch(error => rollbar.error("Failed to run auto updater for songs", sanitizeErrorForRollbar(error))), + // + // DocumentAutoUpdater.run(context.addDocumentGroupUpdating, context.removeDocumentGroupUpdating, mayUseNetwork) + // .catch(error => rollbar.error("Failed to run auto updater for documents", sanitizeErrorForRollbar(error))), + // ]) .finally(removeEventListener) } From 801f0132ab08d5abd755f26c28b1bdbc855b273b Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 2 Sep 2024 19:08:45 +0200 Subject: [PATCH 21/51] test version release: 1.17.9 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index 48a0e16b..f51925c0 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.8 + 1.17.9 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.4 + 658.5 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index 4e105c02..0bd3a76e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.8", + "version": "1.17.9", "private": true, "scripts": { "android": "react-native run-android", From b66d613ec04d0ee4a4c08942787b016bfff0df14 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 4 Sep 2024 09:02:18 +0200 Subject: [PATCH 22/51] removed netinfo, but enabled auto updater (withouth DB execution), so we can test the implementation of the auto updater. --- ios/Podfile.lock | 6 --- package.json | 1 - .../gui/screens/settings/SettingsScreen.tsx | 4 -- source/logic/autoUpdater.ts | 37 +------------------ source/settings.ts | 1 - yarn.lock | 5 --- 6 files changed, 1 insertion(+), 53 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f942bc63..2066fc95 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -381,8 +381,6 @@ PODS: - React-Core - react-native-keep-awake (4.0.0): - React - - react-native-netinfo (11.3.2): - - React-Core - react-native-quick-md5 (3.0.5): - React-Core - react-native-safe-area-context (4.7.4): @@ -588,7 +586,6 @@ DEPENDENCIES: - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - react-native-config (from `../node_modules/react-native-config`) - react-native-keep-awake (from `../node_modules/react-native-keep-awake`) - - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" - react-native-quick-md5 (from `../node_modules/react-native-quick-md5`) - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - react-native-track-player (from `../node_modules/react-native-track-player`) @@ -686,8 +683,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-config" react-native-keep-awake: :path: "../node_modules/react-native-keep-awake" - react-native-netinfo: - :path: "../node_modules/@react-native-community/netinfo" react-native-quick-md5: :path: "../node_modules/react-native-quick-md5" react-native-safe-area-context: @@ -785,7 +780,6 @@ SPEC CHECKSUMS: React-logger: 9ca44bb5703bf2355f3c2d2e5e67bfe98ca2dc34 react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8 react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774 - react-native-netinfo: 076df4f9b07f6670acf4ce9a75aac8d34c2e2ccc react-native-quick-md5: 5928fdcedcb1b2f0e1958a38769283968b8eb850 react-native-safe-area-context: 2cd91d532de12acdb0a9cbc8d43ac72a8e4c897c react-native-track-player: 97d76dbbd35f27cc709e5f04540615e54264b3f9 diff --git a/package.json b/package.json index 0bd3a76e..dcec77d7 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "dependencies": { "@ptomasroos/react-native-multi-slider": "git+https://github.com/sampie777/react-native-multi-slider.git#2.3.0", "@react-native-clipboard/clipboard": "1.12.1", - "@react-native-community/netinfo": "11.3.2", "@react-navigation/bottom-tabs": "6.5.11", "@react-navigation/native": "6.1.9", "@react-navigation/native-stack": "6.9.17", diff --git a/source/gui/screens/settings/SettingsScreen.tsx b/source/gui/screens/settings/SettingsScreen.tsx index 3c83603f..6cf58843 100644 --- a/source/gui/screens/settings/SettingsScreen.tsx +++ b/source/gui/screens/settings/SettingsScreen.tsx @@ -305,10 +305,6 @@ const SettingsScreen: React.FC = () => { if (value == 30) return "Once a month"; return `Every ${value} days`; }} /> - setValue(true)} - keyName={"autoUpdateOverWifiOnly"} /> setValue(true)} diff --git a/source/logic/autoUpdater.ts b/source/logic/autoUpdater.ts index 7da3d435..0e96228e 100644 --- a/source/logic/autoUpdater.ts +++ b/source/logic/autoUpdater.ts @@ -4,16 +4,12 @@ import { rollbar } from "./rollbar"; import { delayed, isIOS, sanitizeErrorForRollbar } from "./utils"; import { DocumentAutoUpdater } from "./documents/updater/documentAutoUpdater"; import { UpdaterContextProps } from "../gui/components/providers/UpdaterContextProvider"; -import { addEventListener } from "@react-native-community/netinfo"; import * as Types from "@react-native-community/netinfo/src/internal/types"; export namespace AutoUpdater { export const run = async (context: UpdaterContextProps): Promise => { - const { removeEventListener, isSynced, isOnWifi } = useNetworkListener(); - const mayUseNetwork = (): boolean => !Settings.autoUpdateOverWifiOnly || isOnWifi() - - await waitForNetworkStateSync(isSynced); + const mayUseNetwork = (): boolean => true; if (!mayUseNetwork()) return Promise.resolve(); if (!isCheckIntervalPassed()) return Promise.resolve(); @@ -27,39 +23,8 @@ export namespace AutoUpdater { // DocumentAutoUpdater.run(context.addDocumentGroupUpdating, context.removeDocumentGroupUpdating, mayUseNetwork) // .catch(error => rollbar.error("Failed to run auto updater for documents", sanitizeErrorForRollbar(error))), // ]) - .finally(removeEventListener) } - const useNetworkListener = (): { - removeEventListener: Types.NetInfoSubscription, - isSynced: () => boolean, // Means: has received an initial network state - isOnWifi: () => boolean, - } => { - let isSynced = false; - let isOnWifi = false; - - const unsubscribe = addEventListener(state => { - isSynced = true; - isOnWifi = state.type == 'wifi' && state.isConnected; - }) - - return { - removeEventListener: unsubscribe, - isSynced: () => isSynced, - isOnWifi: () => isOnWifi, - }; - } - - const waitForNetworkStateSync = async (isSynced: () => boolean, maxTimeout = 10000, pollInterval = 100): Promise => { - if (isSynced()) return Promise.resolve(); - if (maxTimeout <= 0) return Promise.reject("Waiting for network sync timed out"); - - return await delayed( - () => waitForNetworkStateSync(isSynced, maxTimeout - pollInterval, pollInterval), - pollInterval - ); - }; - const isCheckIntervalPassed = (): boolean => { if (Settings.autoUpdateDatabasesCheckIntervalInDays <= 0) return false; diff --git a/source/settings.ts b/source/settings.ts index aaa06dad..dc9580a0 100644 --- a/source/settings.ts +++ b/source/settings.ts @@ -57,7 +57,6 @@ class SettingsClass extends SettingsBaseClass { // Updates autoUpdateDatabasesCheckIntervalInDays = 7; autoUpdateDatabasesLastCheckTimestamp = 0; - autoUpdateOverWifiOnly = true; // Other shareUsageData = process.env.NODE_ENV !== "development"; diff --git a/yarn.lock b/yarn.lock index df49b6a0..35f9157d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2282,11 +2282,6 @@ prompts "^2.4.0" semver "^7.5.2" -"@react-native-community/netinfo@11.3.2": - version "11.3.2" - resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-11.3.2.tgz#e63201d0b87ad42d086d1003be48ae7b327f0594" - integrity sha512-YsaS3Dutnzqd1BEoeC+DEcuNJedYRkN6Ef3kftT5Sm8ExnCF94C/nl4laNxuvFli3+Jz8Df3jO25Jn8A9S0h4w== - "@react-native/assets-registry@0.74.84": version "0.74.84" resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.84.tgz#aa472f82c1b7d8a30098c8ba22fad7b3dbb5be5f" From 8e585a8bb1e246d38537d2887742538120623a1b Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 4 Sep 2024 09:02:35 +0200 Subject: [PATCH 23/51] test version release: 1.17.10 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index f51925c0..9420405c 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.9 + 1.17.10 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.5 + 658.6 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index dcec77d7..a7432948 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.9", + "version": "1.17.10", "private": true, "scripts": { "android": "react-native run-android", From c00081c7bb88a2b8a2cb640446ed3549168efbca Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Thu, 5 Sep 2024 09:22:44 +0200 Subject: [PATCH 24/51] removed updater context to see if that fixes the problem. --- source/App.tsx | 8 +-- .../providers/UpdaterContextProvider.tsx | 53 ------------------- .../downloads/DownloadDocumentsScreen.tsx | 20 ------- .../screens/downloads/DownloadSongsScreen.tsx | 20 ------- .../screens/downloads/documentGroupItems.tsx | 7 +-- .../gui/screens/downloads/songBundleItems.tsx | 7 +-- .../gui/screens/otherMenu/OtherMenuScreen.tsx | 5 -- source/logic/autoUpdater.ts | 8 +-- 8 files changed, 7 insertions(+), 121 deletions(-) delete mode 100644 source/gui/components/providers/UpdaterContextProvider.tsx diff --git a/source/App.tsx b/source/App.tsx index db5e5d50..7e3b178d 100644 --- a/source/App.tsx +++ b/source/App.tsx @@ -56,7 +56,6 @@ import DeepLinkHandler from "./gui/components/DeepLinkHandler"; import { MenuProvider } from "react-native-popup-menu"; import AppContextProvider from "./gui/components/providers/AppContextProvider"; import { rollbar } from "./logic/rollbar"; -import UpdaterContextProvider, { useUpdaterContext } from "./gui/components/providers/UpdaterContextProvider"; import { AutoUpdater } from "./logic/autoUpdater"; const RootNav = createNativeStackNavigator(); @@ -118,7 +117,6 @@ const RootNavigation = () => { const HomeNavigation: React.FC = () => { const [songListSize, setSongListSize] = useState(0); - const updaterContext = useUpdaterContext(); const styles = createStyles(useTheme()); useEffect(() => { @@ -133,7 +131,7 @@ const HomeNavigation: React.FC = () => { rollbar.error("Failed to handle collection change", sanitizeErrorForRollbar(error)); } - AutoUpdater.run(updaterContext) + AutoUpdater.run() .catch(error => rollbar.error("Failed to run auto updater", sanitizeErrorForRollbar(error))); }; @@ -229,9 +227,7 @@ const AppRoot: React.FC = () => { {isLoading ? undefined : - - - + } diff --git a/source/gui/components/providers/UpdaterContextProvider.tsx b/source/gui/components/providers/UpdaterContextProvider.tsx deleted file mode 100644 index 2c04e78b..00000000 --- a/source/gui/components/providers/UpdaterContextProvider.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React, { PropsWithChildren, useState } from "react"; - -export interface UpdaterContextProps { - songBundlesUpdating: { uuid: string }[] - addSongBundleUpdating: (obj: { uuid: string }) => void - removeSongBundleUpdating: (obj: { uuid: string }) => void - documentGroupsUpdating: { uuid: string }[] - addDocumentGroupUpdating: (obj: { uuid: string }) => void - removeDocumentGroupUpdating: (obj: { uuid: string }) => void -} - -export const UpdaterContextProviderContext = React.createContext({ - songBundlesUpdating: [], - addSongBundleUpdating: () => null, - removeSongBundleUpdating: () => null, - documentGroupsUpdating: [], - addDocumentGroupUpdating: () => null, - removeDocumentGroupUpdating: () => null, -}); - -const UpdaterContextProvider: React.FC = ({ children }) => { - const [songBundlesUpdating, setSongBundlesUpdating] = useState<{ uuid: string }[]>([]); - const [documentGroupsUpdating, setDocumentGroupsUpdating] = useState<{ uuid: string }[]>([]); - - const addSongBundleUpdating = (obj: { uuid: string }) => - setSongBundlesUpdating([...songBundlesUpdating, obj]); - - const removeSongBundleUpdating = (obj: { uuid: string }) => - setSongBundlesUpdating(songBundlesUpdating.filter(it => it.uuid !== obj.uuid)); - - const addDocumentGroupUpdating = (obj: { uuid: string }) => - setDocumentGroupsUpdating([...documentGroupsUpdating, obj]); - - const removeDocumentGroupUpdating = (obj: { uuid: string }) => - setDocumentGroupsUpdating(documentGroupsUpdating.filter(it => it.uuid !== obj.uuid)); - - const defaultContext: UpdaterContextProps = { - songBundlesUpdating: songBundlesUpdating, - addSongBundleUpdating: addSongBundleUpdating, - removeSongBundleUpdating: removeSongBundleUpdating, - documentGroupsUpdating: documentGroupsUpdating, - addDocumentGroupUpdating: addDocumentGroupUpdating, - removeDocumentGroupUpdating: removeDocumentGroupUpdating, - }; - - return - {children} - ; -}; - -export default UpdaterContextProvider; - -export const useUpdaterContext = () => React.useContext(UpdaterContextProviderContext); \ No newline at end of file diff --git a/source/gui/screens/downloads/DownloadDocumentsScreen.tsx b/source/gui/screens/downloads/DownloadDocumentsScreen.tsx index 8e1474dc..dd70490b 100644 --- a/source/gui/screens/downloads/DownloadDocumentsScreen.tsx +++ b/source/gui/screens/downloads/DownloadDocumentsScreen.tsx @@ -21,7 +21,6 @@ import { LocalDocumentGroupItem, ServerDocumentGroupItem } from "./documentGroup import ConfirmationModal from "../../components/popups/ConfirmationModal"; import LanguageSelectBar, { ShowAllLanguagesValue } from "./LanguageSelectBar"; import { DocumentUpdater } from "../../../logic/documents/updater/documentUpdater"; -import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; interface ComponentProps { setIsProcessing?: (value: boolean) => void; @@ -44,7 +43,6 @@ const DownloadDocumentsScreen: React.FC = ({ const [requestUpdateForGroup, setRequestUpdateForGroup] = useState(undefined); const [requestDeleteForGroup, setRequestDeleteForGroup] = useState(undefined); const [filterLanguage, setFilterLanguage] = useState(""); - const updaterContext = useUpdaterContext(); const styles = createStyles(useTheme()); useEffect(() => { @@ -199,9 +197,6 @@ const DownloadDocumentsScreen: React.FC = ({ if (isLoading || group === undefined) return; - const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); - if (isUpdating) return; - downloadDocumentGroup(group); }; @@ -211,9 +206,6 @@ const DownloadDocumentsScreen: React.FC = ({ if (isLoading || group === undefined) return; - const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); - if (isUpdating) return; - updateDocumentGroup(group); }; @@ -223,7 +215,6 @@ const DownloadDocumentsScreen: React.FC = ({ const saveDocumentGroup = (group: ServerDocumentGroup, isUpdate: boolean) => { if (!isMounted()) return; setIsLoading(true); - updaterContext.addDocumentGroupUpdating(group); const call = isUpdate ? DocumentUpdater.fetchAndUpdateDocumentGroup(group) @@ -250,10 +241,6 @@ const DownloadDocumentsScreen: React.FC = ({ setIsLoading(false); loadLocalDocumentGroups(); }) - .finally(() => { - // Do this here after the state has been called, otherwise we get realm invalidation errors - updaterContext.removeDocumentGroupUpdating(group); - }) }; const onConfirmDeleteDocumentGroup = () => { @@ -262,18 +249,11 @@ const DownloadDocumentsScreen: React.FC = ({ if (isLoading || group === undefined) return; - const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); - if (isUpdating) { - Alert.alert("Could not delete", "This group is being updated. Please wait until this operation is done and try again.") - return; - } - deleteDocumentGroup(group); }; const deleteDocumentGroup = (group: LocalDocumentGroup) => { setIsLoading(true); - updaterContext.removeDocumentGroupUpdating(group); const result = DocumentProcessor.deleteDocumentGroup(group); result.alert(); diff --git a/source/gui/screens/downloads/DownloadSongsScreen.tsx b/source/gui/screens/downloads/DownloadSongsScreen.tsx index 8e8d07d4..f32dde8b 100644 --- a/source/gui/screens/downloads/DownloadSongsScreen.tsx +++ b/source/gui/screens/downloads/DownloadSongsScreen.tsx @@ -23,7 +23,6 @@ import ConfirmationModal from "../../components/popups/ConfirmationModal"; import LanguageSelectBar, { ShowAllLanguagesValue } from "./LanguageSelectBar"; import UrlLink from "../../components/UrlLink"; import { SongUpdater } from "../../../logic/songs/updater/songUpdater"; -import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; interface ComponentProps { setIsProcessing?: (value: boolean) => void; @@ -42,7 +41,6 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt const [requestUpdateForBundle, setRequestUpdateForBundle] = useState(undefined); const [requestDeleteForBundle, setRequestDeleteForBundle] = useState(undefined); const [filterLanguage, setFilterLanguage] = useState(""); - const updaterContext = useUpdaterContext(); const styles = createStyles(useTheme()); useEffect(() => { @@ -197,9 +195,6 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt if (isLoading || bundle === undefined) return; - const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); - if (isUpdating) return; - downloadSongBundle(bundle); }; @@ -209,9 +204,6 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt if (isLoading || bundle === undefined) return; - const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); - if (isUpdating) return; - updateSongBundle(bundle); }; @@ -221,7 +213,6 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt const saveSongBundle = (bundle: ServerSongBundle, isUpdate: boolean) => { if (!isMounted()) return; setIsLoading(true); - updaterContext.addSongBundleUpdating(bundle); const call = isUpdate ? SongUpdater.fetchAndUpdateSongBundle(bundle) @@ -248,10 +239,6 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt setIsLoading(false); loadLocalSongBundles(); }) - .finally(() => { - // Do this here after the state has been called, otherwise we get realm invalidation errors - updaterContext.removeSongBundleUpdating(bundle); - }) }; const onConfirmDeleteSongBundle = () => { @@ -260,18 +247,11 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt if (isLoading || bundle === undefined) return; - const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); - if (isUpdating) { - Alert.alert("Could not delete", "This bundle is being updated. Please wait until this operation is done and try again.") - return; - } - deleteSongBundle(bundle); }; const deleteSongBundle = (bundle: LocalSongBundle) => { setIsLoading(true); - updaterContext.removeSongBundleUpdating(bundle); try { const successMessage = SongProcessor.deleteSongBundle(bundle) diff --git a/source/gui/screens/downloads/documentGroupItems.tsx b/source/gui/screens/downloads/documentGroupItems.tsx index 5d288715..798fecd2 100644 --- a/source/gui/screens/downloads/documentGroupItems.tsx +++ b/source/gui/screens/downloads/documentGroupItems.tsx @@ -5,7 +5,6 @@ import { languageAbbreviationToFullName } from "../../../logic/utils"; import { ThemeContextProps, useTheme } from "../../components/providers/ThemeProvider"; import { StyleSheet, Text, TouchableOpacity, View } from "react-native"; import { DownloadIcon, IsDownloadedIcon, IsDownloadingIcon, UpdateIcon } from "./common"; -import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; interface ServerDocumentGroupItemComponentProps { group: ServerDocumentGroup; @@ -22,8 +21,7 @@ export const ServerDocumentGroupItem: React.FC { const styles = createStyles(useTheme()); - const { documentGroupsUpdating } = useUpdaterContext(); - const isUpdating = documentGroupsUpdating.some(it => it.uuid === group.uuid); + const isUpdating = false; return ( onPress(group)} @@ -72,8 +70,7 @@ export const LocalDocumentGroupItem: React.FC { const styles = createStyles(useTheme()); - const { documentGroupsUpdating } = useUpdaterContext(); - const isUpdating = documentGroupsUpdating.some(it => it.uuid === group.uuid); + const isUpdating = false; return ( onPress(group)} diff --git a/source/gui/screens/downloads/songBundleItems.tsx b/source/gui/screens/downloads/songBundleItems.tsx index d7a1c161..991e3e3e 100644 --- a/source/gui/screens/downloads/songBundleItems.tsx +++ b/source/gui/screens/downloads/songBundleItems.tsx @@ -5,7 +5,6 @@ import { languageAbbreviationToFullName } from "../../../logic/utils"; import { ThemeContextProps, useTheme } from "../../components/providers/ThemeProvider"; import { StyleSheet, Text, TouchableOpacity, View } from "react-native"; import { DownloadIcon, IsDownloadedIcon, IsDownloadingIcon, UpdateIcon } from "./common"; -import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; interface SongBundleItemComponentProps { bundle: ServerSongBundle; @@ -22,8 +21,7 @@ export const SongBundleItem: React.FC disabled }) => { const styles = createStyles(useTheme()); - const { songBundlesUpdating } = useUpdaterContext(); - const isUpdating = songBundlesUpdating.some(it => it.uuid === bundle.uuid); + const isUpdating = false; return ( onPress(bundle)} @@ -72,8 +70,7 @@ export const LocalSongBundleItem: React.FC disabled }) => { const styles = createStyles(useTheme()); - const { songBundlesUpdating } = useUpdaterContext(); - const isUpdating = songBundlesUpdating.some(it => it.uuid === bundle.uuid); + const isUpdating = false; return ( onPress(bundle)} diff --git a/source/gui/screens/otherMenu/OtherMenuScreen.tsx b/source/gui/screens/otherMenu/OtherMenuScreen.tsx index 487b902d..4ed8866e 100644 --- a/source/gui/screens/otherMenu/OtherMenuScreen.tsx +++ b/source/gui/screens/otherMenu/OtherMenuScreen.tsx @@ -10,8 +10,6 @@ import { ScrollView } from "react-native-gesture-handler"; import Icon from "react-native-vector-icons/FontAwesome5"; import MenuItem from "./MenuItem"; import FeedbackComponent from "../../components/popups/FeedbackComponent"; -import { IsDownloadingIcon } from "../downloads/common"; -import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; interface MenuItemProps { name?: string; @@ -26,7 +24,6 @@ const OtherMenuScreen: React.FC { const styles = createStyles(useTheme()); const [showFeedbackPopup, setShowFeedbackPopup] = useState(false); - const updaterContext = useUpdaterContext(); const routesToShow: MenuItemProps[] = [ { @@ -34,13 +31,11 @@ const OtherMenuScreen: React.FC /* Set this type as TypeScript does weird things... */} />, - statusIcon: updaterContext.songBundlesUpdating.length > 0 ? : undefined, }, { name: "Document databases", icon: (style) => } />, onPress: () => navigation.navigate(DatabasesRoute, { type: Types.Documents }), - statusIcon: updaterContext.documentGroupsUpdating.length > 0 ? : undefined, }, { route: SettingsRoute, diff --git a/source/logic/autoUpdater.ts b/source/logic/autoUpdater.ts index 0e96228e..8740dc5e 100644 --- a/source/logic/autoUpdater.ts +++ b/source/logic/autoUpdater.ts @@ -1,14 +1,8 @@ import Settings from "../settings"; -import { SongAutoUpdater } from "./songs/updater/songAutoUpdater"; -import { rollbar } from "./rollbar"; -import { delayed, isIOS, sanitizeErrorForRollbar } from "./utils"; -import { DocumentAutoUpdater } from "./documents/updater/documentAutoUpdater"; -import { UpdaterContextProps } from "../gui/components/providers/UpdaterContextProvider"; -import * as Types from "@react-native-community/netinfo/src/internal/types"; export namespace AutoUpdater { - export const run = async (context: UpdaterContextProps): Promise => { + export const run = async (): Promise => { const mayUseNetwork = (): boolean => true; if (!mayUseNetwork()) return Promise.resolve(); From 866eba593dd457c0d0453fee7a61fec7587862ef Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Thu, 5 Sep 2024 09:27:26 +0200 Subject: [PATCH 25/51] catch possible database errors --- source/logic/db/dbProvider.ts | 16 +++++++++++++--- source/logic/db/patches/documents.ts | 12 ++++++++++-- source/logic/db/patches/songs.ts | 12 ++++++++++-- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/source/logic/db/dbProvider.ts b/source/logic/db/dbProvider.ts index da41cbcc..075c9fa7 100644 --- a/source/logic/db/dbProvider.ts +++ b/source/logic/db/dbProvider.ts @@ -1,4 +1,6 @@ import Realm, { ObjectClass, ObjectSchema } from "realm"; +import { rollbar } from "../rollbar"; +import { sanitizeErrorForRollbar } from "../utils"; interface DatabaseProps { path: string; @@ -47,7 +49,11 @@ export class DatabaseProvider { cancelQueuedDisconnect() { if (this._disconnectTimeout) { - clearTimeout(this._disconnectTimeout); + try { + clearTimeout(this._disconnectTimeout); + } catch (error) { + rollbar.error("Failed to clear disconnect timeout", sanitizeErrorForRollbar(error)); + } } this._disconnectTimeout = undefined; this._isQueuedForDisconnect = false; @@ -64,8 +70,12 @@ export class DatabaseProvider { } isConnected = () => { - if (this._realm == null || this._realm.isClosed) { - this._isConnected = false; + try { + if (this._realm == null || this._realm.isClosed) { + this._isConnected = false; + } + } catch (error) { + rollbar.error("Failed to check if realm is closed", sanitizeErrorForRollbar(error)); } return this._isConnected; }; diff --git a/source/logic/db/patches/documents.ts b/source/logic/db/patches/documents.ts index a619177b..c0b6dcab 100644 --- a/source/logic/db/patches/documents.ts +++ b/source/logic/db/patches/documents.ts @@ -52,7 +52,15 @@ export namespace DocumentDbPatch { } export const patch = () => { - removeDuplicateGroups(); - removeDocumentObjectsWithoutParents(); + try { + removeDuplicateGroups(); + } catch (error) { + rollbar.error("Failed to remove duplicate groups", sanitizeErrorForRollbar(error)); + } + try { + removeDocumentObjectsWithoutParents(); + } catch (error) { + rollbar.error("Failed to remove document objects without parents", sanitizeErrorForRollbar(error)); + } }; } \ No newline at end of file diff --git a/source/logic/db/patches/songs.ts b/source/logic/db/patches/songs.ts index 184b413b..f886df3e 100644 --- a/source/logic/db/patches/songs.ts +++ b/source/logic/db/patches/songs.ts @@ -54,7 +54,15 @@ export namespace SongDbPatch { } export const patch = () => { - removeDuplicateBundles(); - removeSongObjectsWithoutParents(); + try { + removeDuplicateBundles(); + } catch (error) { + rollbar.error("Failed to remove duplicate bundles", sanitizeErrorForRollbar(error)); + } + try { + removeSongObjectsWithoutParents(); + } catch (error) { + rollbar.error("Failed to remove song objects without parents", sanitizeErrorForRollbar(error)); + } }; } \ No newline at end of file From a5cea41bcaaefb2de8df3d0f274ddc847184c57a Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Thu, 5 Sep 2024 09:28:09 +0200 Subject: [PATCH 26/51] test version release: 1.17.11 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index 9420405c..eeacb90e 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.10 + 1.17.11 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.6 + 658.7 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index a7432948..d91848e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.10", + "version": "1.17.11", "private": true, "scripts": { "android": "react-native run-android", From 86b3eb8eb0acd0bb8f233ed1f1b9fa4e40e1cfed Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Fri, 6 Sep 2024 08:34:08 +0200 Subject: [PATCH 27/51] removed certain patch to see if this fixes the problem. --- source/logic/db/patches/documents.ts | 18 ++-------------- source/logic/db/patches/songs.ts | 21 ++----------------- source/logic/db/patches/utils.ts | 31 ---------------------------- 3 files changed, 4 insertions(+), 66 deletions(-) delete mode 100644 source/logic/db/patches/utils.ts diff --git a/source/logic/db/patches/documents.ts b/source/logic/db/patches/documents.ts index c0b6dcab..a8dec7c4 100644 --- a/source/logic/db/patches/documents.ts +++ b/source/logic/db/patches/documents.ts @@ -2,9 +2,8 @@ import Db from "../db"; import { rollbar } from "../../rollbar"; import { sanitizeErrorForRollbar } from "../../utils"; import { DocumentGroup } from "../models/Documents"; -import { DocumentGroupSchema, DocumentSchema } from "../models/DocumentsSchema"; +import { DocumentGroupSchema } from "../models/DocumentsSchema"; import { DocumentProcessor } from "../../documents/documentProcessor"; -import { removeObjectsWithoutParents } from "./utils"; export namespace DocumentDbPatch { /** @@ -18,7 +17,7 @@ export namespace DocumentDbPatch { .sorted("id", true); // Ignore root as all groups could be checked - groups.forEach((it, index) => { + groups.forEach(it => { const isDuplicate = approvedUuids.includes(it.uuid); if (!isDuplicate) { approvedUuids.push(it.uuid); @@ -43,24 +42,11 @@ export namespace DocumentDbPatch { }); }; - const removeDocumentObjectsWithoutParents = () => { - removeObjectsWithoutParents(Db.documents, - [ - { schemaName: DocumentGroupSchema.name, parentLink: '_parent', extraQuery: 'AND isRoot = false'}, - { schemaName: DocumentSchema.name, parentLink: '_parent', }, - ]); - } - export const patch = () => { try { removeDuplicateGroups(); } catch (error) { rollbar.error("Failed to remove duplicate groups", sanitizeErrorForRollbar(error)); } - try { - removeDocumentObjectsWithoutParents(); - } catch (error) { - rollbar.error("Failed to remove document objects without parents", sanitizeErrorForRollbar(error)); - } }; } \ No newline at end of file diff --git a/source/logic/db/patches/songs.ts b/source/logic/db/patches/songs.ts index f886df3e..945ed3c1 100644 --- a/source/logic/db/patches/songs.ts +++ b/source/logic/db/patches/songs.ts @@ -1,11 +1,9 @@ import Db from "../db"; import { SongBundle } from "../models/Songs"; -import { SongBundleSchema, SongMetadataSchema, SongSchema, VerseSchema } from "../models/SongsSchema"; +import { SongBundleSchema } from "../models/SongsSchema"; import { SongProcessor } from "../../songs/songProcessor"; import { rollbar } from "../../rollbar"; import { sanitizeErrorForRollbar } from "../../utils"; -import { AbcMelodySchema } from "../models/AbcMelodiesSchema"; -import { removeObjectsWithoutParents } from "./utils"; export namespace SongDbPatch { /** @@ -18,7 +16,7 @@ export namespace SongDbPatch { .objects(SongBundleSchema.name) .sorted("id", true); - bundles.forEach((it) => { + bundles.forEach(it => { const isDuplicate = approvedUuids.includes(it.uuid); if (!isDuplicate) { approvedUuids.push(it.uuid); @@ -43,26 +41,11 @@ export namespace SongDbPatch { }); }; - const removeSongObjectsWithoutParents = () => { - removeObjectsWithoutParents(Db.songs, - [ - { schemaName: SongSchema.name, parentLink: '_songBundles', }, - { schemaName: SongMetadataSchema.name, parentLink: '_songs', }, - { schemaName: VerseSchema.name, parentLink: '_songs', }, - { schemaName: AbcMelodySchema.name, parentLink: '_song', }, - ]); - } - export const patch = () => { try { removeDuplicateBundles(); } catch (error) { rollbar.error("Failed to remove duplicate bundles", sanitizeErrorForRollbar(error)); } - try { - removeSongObjectsWithoutParents(); - } catch (error) { - rollbar.error("Failed to remove song objects without parents", sanitizeErrorForRollbar(error)); - } }; } \ No newline at end of file diff --git a/source/logic/db/patches/utils.ts b/source/logic/db/patches/utils.ts deleted file mode 100644 index 816062d0..00000000 --- a/source/logic/db/patches/utils.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { rollbar } from "../../rollbar"; -import { sanitizeErrorForRollbar } from "../../utils"; -import { DatabaseProvider } from "../dbProvider"; - - -export const removeObjectsWithoutParents = ( - db: DatabaseProvider, - schemas: { - schemaName: string, - parentLink: string, - extraQuery?: string, - }[], -) => { - schemas.forEach(schema => { - const data = db.realm().objects(schema.schemaName) - .filtered(`${schema.parentLink}.@count = 0 ${schema.extraQuery ? schema.extraQuery : ""}`); - - if (data.length == 0) return; - - try { - db.realm().write(() => { - db.realm().delete(data); - }); - } catch (error) { - rollbar.error(`Failed to delete unused ${schema.schemaName}`, { - ...sanitizeErrorForRollbar(error), - dataLength: data.length - }); - } - }) -} \ No newline at end of file From a1fd972c020d18ad4979938e7d9ffac9ac33978a Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Fri, 6 Sep 2024 08:34:33 +0200 Subject: [PATCH 28/51] disabled auto updater run on start to see if this fixes the problem. --- source/App.tsx | 4 ---- source/logic/{locale.js => locale.ts} | 0 2 files changed, 4 deletions(-) rename source/logic/{locale.js => locale.ts} (100%) diff --git a/source/App.tsx b/source/App.tsx index 7e3b178d..21732e09 100644 --- a/source/App.tsx +++ b/source/App.tsx @@ -56,7 +56,6 @@ import DeepLinkHandler from "./gui/components/DeepLinkHandler"; import { MenuProvider } from "react-native-popup-menu"; import AppContextProvider from "./gui/components/providers/AppContextProvider"; import { rollbar } from "./logic/rollbar"; -import { AutoUpdater } from "./logic/autoUpdater"; const RootNav = createNativeStackNavigator(); const HomeNav = createBottomTabNavigator(); @@ -130,9 +129,6 @@ const HomeNavigation: React.FC = () => { } catch (error) { rollbar.error("Failed to handle collection change", sanitizeErrorForRollbar(error)); } - - AutoUpdater.run() - .catch(error => rollbar.error("Failed to run auto updater", sanitizeErrorForRollbar(error))); }; const onExit = () => { diff --git a/source/logic/locale.js b/source/logic/locale.ts similarity index 100% rename from source/logic/locale.js rename to source/logic/locale.ts From d55a1613535475a017b383849362f450a47fcfc9 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Fri, 6 Sep 2024 08:35:19 +0200 Subject: [PATCH 29/51] test version release: 1.17.12 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index eeacb90e..13d46d49 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.11 + 1.17.12 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.7 + 658.8 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index d91848e9..0f9a5dcb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.11", + "version": "1.17.12", "private": true, "scripts": { "android": "react-native run-android", From 8e76b0f8c705aa10d1445b7958fb9e0d357847b8 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Sat, 7 Sep 2024 08:14:22 +0200 Subject: [PATCH 30/51] re-enabled auto updater run on start --- source/App.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/App.tsx b/source/App.tsx index 21732e09..7e3b178d 100644 --- a/source/App.tsx +++ b/source/App.tsx @@ -56,6 +56,7 @@ import DeepLinkHandler from "./gui/components/DeepLinkHandler"; import { MenuProvider } from "react-native-popup-menu"; import AppContextProvider from "./gui/components/providers/AppContextProvider"; import { rollbar } from "./logic/rollbar"; +import { AutoUpdater } from "./logic/autoUpdater"; const RootNav = createNativeStackNavigator(); const HomeNav = createBottomTabNavigator(); @@ -129,6 +130,9 @@ const HomeNavigation: React.FC = () => { } catch (error) { rollbar.error("Failed to handle collection change", sanitizeErrorForRollbar(error)); } + + AutoUpdater.run() + .catch(error => rollbar.error("Failed to run auto updater", sanitizeErrorForRollbar(error))); }; const onExit = () => { From 982ddaa3e75b51f455c465e3bfa5b1cae89e27e0 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Sat, 7 Sep 2024 08:15:09 +0200 Subject: [PATCH 31/51] restored call to removeObjectsWithoutParents patch, but don't let it execute any DB calls. --- source/logic/db/patches/documents.ts | 16 +++++++++++++- source/logic/db/patches/songs.ts | 19 ++++++++++++++++- source/logic/db/patches/utils.ts | 31 ++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 source/logic/db/patches/utils.ts diff --git a/source/logic/db/patches/documents.ts b/source/logic/db/patches/documents.ts index a8dec7c4..bf935e35 100644 --- a/source/logic/db/patches/documents.ts +++ b/source/logic/db/patches/documents.ts @@ -2,8 +2,9 @@ import Db from "../db"; import { rollbar } from "../../rollbar"; import { sanitizeErrorForRollbar } from "../../utils"; import { DocumentGroup } from "../models/Documents"; -import { DocumentGroupSchema } from "../models/DocumentsSchema"; +import { DocumentGroupSchema, DocumentSchema } from "../models/DocumentsSchema"; import { DocumentProcessor } from "../../documents/documentProcessor"; +import { removeObjectsWithoutParents } from "./utils"; export namespace DocumentDbPatch { /** @@ -42,11 +43,24 @@ export namespace DocumentDbPatch { }); }; + const removeDocumentObjectsWithoutParents = () => { + removeObjectsWithoutParents(Db.documents, + [ + { schemaName: DocumentGroupSchema.name, parentLink: '_parent', extraQuery: 'AND isRoot = false'}, + { schemaName: DocumentSchema.name, parentLink: '_parent', }, + ]); + } + export const patch = () => { try { removeDuplicateGroups(); } catch (error) { rollbar.error("Failed to remove duplicate groups", sanitizeErrorForRollbar(error)); } + try { + removeDocumentObjectsWithoutParents(); + } catch (error) { + rollbar.error("Failed to remove document objects without parents", sanitizeErrorForRollbar(error)); + } }; } \ No newline at end of file diff --git a/source/logic/db/patches/songs.ts b/source/logic/db/patches/songs.ts index 945ed3c1..a890f02d 100644 --- a/source/logic/db/patches/songs.ts +++ b/source/logic/db/patches/songs.ts @@ -1,9 +1,11 @@ import Db from "../db"; import { SongBundle } from "../models/Songs"; -import { SongBundleSchema } from "../models/SongsSchema"; +import { SongBundleSchema, SongMetadataSchema, SongSchema, VerseSchema } from "../models/SongsSchema"; import { SongProcessor } from "../../songs/songProcessor"; import { rollbar } from "../../rollbar"; import { sanitizeErrorForRollbar } from "../../utils"; +import { AbcMelodySchema } from "../models/AbcMelodiesSchema"; +import { removeObjectsWithoutParents } from "./utils"; export namespace SongDbPatch { /** @@ -41,11 +43,26 @@ export namespace SongDbPatch { }); }; + const removeSongObjectsWithoutParents = () => { + removeObjectsWithoutParents(Db.songs, + [ + { schemaName: SongSchema.name, parentLink: '_songBundles', }, + { schemaName: SongMetadataSchema.name, parentLink: '_songs', }, + { schemaName: VerseSchema.name, parentLink: '_songs', }, + { schemaName: AbcMelodySchema.name, parentLink: '_song', }, + ]); + } + export const patch = () => { try { removeDuplicateBundles(); } catch (error) { rollbar.error("Failed to remove duplicate bundles", sanitizeErrorForRollbar(error)); } + try { + removeSongObjectsWithoutParents(); + } catch (error) { + rollbar.error("Failed to remove song objects without parents", sanitizeErrorForRollbar(error)); + } }; } \ No newline at end of file diff --git a/source/logic/db/patches/utils.ts b/source/logic/db/patches/utils.ts new file mode 100644 index 00000000..c2dbde9d --- /dev/null +++ b/source/logic/db/patches/utils.ts @@ -0,0 +1,31 @@ +import { DatabaseProvider } from "../dbProvider"; + + +export const removeObjectsWithoutParents = ( + db: DatabaseProvider, + schemas: { + schemaName: string, + parentLink: string, + extraQuery?: string, + }[], +) => { + // Just so the compiler doesn't throw it all away, for debugging purposes. + console.log(db._isConnected, schemas.length); + // schemas.forEach(schema => { + // const data = db.realm().objects(schema.schemaName) + // .filtered(`${schema.parentLink}.@count = 0 ${schema.extraQuery ? schema.extraQuery : ""}`); + // + // if (data.length == 0) return; + // + // try { + // db.realm().write(() => { + // db.realm().delete(data); + // }); + // } catch (error) { + // rollbar.error(`Failed to delete unused ${schema.schemaName}`, { + // ...sanitizeErrorForRollbar(error), + // dataLength: data.length + // }); + // } + // }) +} \ No newline at end of file From a4c8f297f02ee398e872e73bd0899e8ebb3321a6 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Sat, 7 Sep 2024 08:15:51 +0200 Subject: [PATCH 32/51] test version release: 1.17.13 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index 13d46d49..3d105322 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.12 + 1.17.13 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.8 + 658.9 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index 0f9a5dcb..802aa84c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.12", + "version": "1.17.13", "private": true, "scripts": { "android": "react-native run-android", From 0582c65947334e4d885d5f90c30070cea7cf768c Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 9 Sep 2024 09:41:23 +0200 Subject: [PATCH 33/51] Re-added updater context --- source/App.tsx | 8 ++- .../providers/UpdaterContextProvider.tsx | 53 +++++++++++++++++++ .../downloads/DownloadDocumentsScreen.tsx | 20 +++++++ .../screens/downloads/DownloadSongsScreen.tsx | 20 +++++++ .../screens/downloads/documentGroupItems.tsx | 7 ++- .../gui/screens/downloads/songBundleItems.tsx | 7 ++- .../gui/screens/otherMenu/OtherMenuScreen.tsx | 5 ++ source/logic/autoUpdater.ts | 3 +- 8 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 source/gui/components/providers/UpdaterContextProvider.tsx diff --git a/source/App.tsx b/source/App.tsx index 7e3b178d..db5e5d50 100644 --- a/source/App.tsx +++ b/source/App.tsx @@ -56,6 +56,7 @@ import DeepLinkHandler from "./gui/components/DeepLinkHandler"; import { MenuProvider } from "react-native-popup-menu"; import AppContextProvider from "./gui/components/providers/AppContextProvider"; import { rollbar } from "./logic/rollbar"; +import UpdaterContextProvider, { useUpdaterContext } from "./gui/components/providers/UpdaterContextProvider"; import { AutoUpdater } from "./logic/autoUpdater"; const RootNav = createNativeStackNavigator(); @@ -117,6 +118,7 @@ const RootNavigation = () => { const HomeNavigation: React.FC = () => { const [songListSize, setSongListSize] = useState(0); + const updaterContext = useUpdaterContext(); const styles = createStyles(useTheme()); useEffect(() => { @@ -131,7 +133,7 @@ const HomeNavigation: React.FC = () => { rollbar.error("Failed to handle collection change", sanitizeErrorForRollbar(error)); } - AutoUpdater.run() + AutoUpdater.run(updaterContext) .catch(error => rollbar.error("Failed to run auto updater", sanitizeErrorForRollbar(error))); }; @@ -227,7 +229,9 @@ const AppRoot: React.FC = () => { {isLoading ? undefined : - + + + } diff --git a/source/gui/components/providers/UpdaterContextProvider.tsx b/source/gui/components/providers/UpdaterContextProvider.tsx new file mode 100644 index 00000000..2c04e78b --- /dev/null +++ b/source/gui/components/providers/UpdaterContextProvider.tsx @@ -0,0 +1,53 @@ +import React, { PropsWithChildren, useState } from "react"; + +export interface UpdaterContextProps { + songBundlesUpdating: { uuid: string }[] + addSongBundleUpdating: (obj: { uuid: string }) => void + removeSongBundleUpdating: (obj: { uuid: string }) => void + documentGroupsUpdating: { uuid: string }[] + addDocumentGroupUpdating: (obj: { uuid: string }) => void + removeDocumentGroupUpdating: (obj: { uuid: string }) => void +} + +export const UpdaterContextProviderContext = React.createContext({ + songBundlesUpdating: [], + addSongBundleUpdating: () => null, + removeSongBundleUpdating: () => null, + documentGroupsUpdating: [], + addDocumentGroupUpdating: () => null, + removeDocumentGroupUpdating: () => null, +}); + +const UpdaterContextProvider: React.FC = ({ children }) => { + const [songBundlesUpdating, setSongBundlesUpdating] = useState<{ uuid: string }[]>([]); + const [documentGroupsUpdating, setDocumentGroupsUpdating] = useState<{ uuid: string }[]>([]); + + const addSongBundleUpdating = (obj: { uuid: string }) => + setSongBundlesUpdating([...songBundlesUpdating, obj]); + + const removeSongBundleUpdating = (obj: { uuid: string }) => + setSongBundlesUpdating(songBundlesUpdating.filter(it => it.uuid !== obj.uuid)); + + const addDocumentGroupUpdating = (obj: { uuid: string }) => + setDocumentGroupsUpdating([...documentGroupsUpdating, obj]); + + const removeDocumentGroupUpdating = (obj: { uuid: string }) => + setDocumentGroupsUpdating(documentGroupsUpdating.filter(it => it.uuid !== obj.uuid)); + + const defaultContext: UpdaterContextProps = { + songBundlesUpdating: songBundlesUpdating, + addSongBundleUpdating: addSongBundleUpdating, + removeSongBundleUpdating: removeSongBundleUpdating, + documentGroupsUpdating: documentGroupsUpdating, + addDocumentGroupUpdating: addDocumentGroupUpdating, + removeDocumentGroupUpdating: removeDocumentGroupUpdating, + }; + + return + {children} + ; +}; + +export default UpdaterContextProvider; + +export const useUpdaterContext = () => React.useContext(UpdaterContextProviderContext); \ No newline at end of file diff --git a/source/gui/screens/downloads/DownloadDocumentsScreen.tsx b/source/gui/screens/downloads/DownloadDocumentsScreen.tsx index dd70490b..8e1474dc 100644 --- a/source/gui/screens/downloads/DownloadDocumentsScreen.tsx +++ b/source/gui/screens/downloads/DownloadDocumentsScreen.tsx @@ -21,6 +21,7 @@ import { LocalDocumentGroupItem, ServerDocumentGroupItem } from "./documentGroup import ConfirmationModal from "../../components/popups/ConfirmationModal"; import LanguageSelectBar, { ShowAllLanguagesValue } from "./LanguageSelectBar"; import { DocumentUpdater } from "../../../logic/documents/updater/documentUpdater"; +import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; interface ComponentProps { setIsProcessing?: (value: boolean) => void; @@ -43,6 +44,7 @@ const DownloadDocumentsScreen: React.FC = ({ const [requestUpdateForGroup, setRequestUpdateForGroup] = useState(undefined); const [requestDeleteForGroup, setRequestDeleteForGroup] = useState(undefined); const [filterLanguage, setFilterLanguage] = useState(""); + const updaterContext = useUpdaterContext(); const styles = createStyles(useTheme()); useEffect(() => { @@ -197,6 +199,9 @@ const DownloadDocumentsScreen: React.FC = ({ if (isLoading || group === undefined) return; + const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); + if (isUpdating) return; + downloadDocumentGroup(group); }; @@ -206,6 +211,9 @@ const DownloadDocumentsScreen: React.FC = ({ if (isLoading || group === undefined) return; + const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); + if (isUpdating) return; + updateDocumentGroup(group); }; @@ -215,6 +223,7 @@ const DownloadDocumentsScreen: React.FC = ({ const saveDocumentGroup = (group: ServerDocumentGroup, isUpdate: boolean) => { if (!isMounted()) return; setIsLoading(true); + updaterContext.addDocumentGroupUpdating(group); const call = isUpdate ? DocumentUpdater.fetchAndUpdateDocumentGroup(group) @@ -241,6 +250,10 @@ const DownloadDocumentsScreen: React.FC = ({ setIsLoading(false); loadLocalDocumentGroups(); }) + .finally(() => { + // Do this here after the state has been called, otherwise we get realm invalidation errors + updaterContext.removeDocumentGroupUpdating(group); + }) }; const onConfirmDeleteDocumentGroup = () => { @@ -249,11 +262,18 @@ const DownloadDocumentsScreen: React.FC = ({ if (isLoading || group === undefined) return; + const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); + if (isUpdating) { + Alert.alert("Could not delete", "This group is being updated. Please wait until this operation is done and try again.") + return; + } + deleteDocumentGroup(group); }; const deleteDocumentGroup = (group: LocalDocumentGroup) => { setIsLoading(true); + updaterContext.removeDocumentGroupUpdating(group); const result = DocumentProcessor.deleteDocumentGroup(group); result.alert(); diff --git a/source/gui/screens/downloads/DownloadSongsScreen.tsx b/source/gui/screens/downloads/DownloadSongsScreen.tsx index f32dde8b..8e8d07d4 100644 --- a/source/gui/screens/downloads/DownloadSongsScreen.tsx +++ b/source/gui/screens/downloads/DownloadSongsScreen.tsx @@ -23,6 +23,7 @@ import ConfirmationModal from "../../components/popups/ConfirmationModal"; import LanguageSelectBar, { ShowAllLanguagesValue } from "./LanguageSelectBar"; import UrlLink from "../../components/UrlLink"; import { SongUpdater } from "../../../logic/songs/updater/songUpdater"; +import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; interface ComponentProps { setIsProcessing?: (value: boolean) => void; @@ -41,6 +42,7 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt const [requestUpdateForBundle, setRequestUpdateForBundle] = useState(undefined); const [requestDeleteForBundle, setRequestDeleteForBundle] = useState(undefined); const [filterLanguage, setFilterLanguage] = useState(""); + const updaterContext = useUpdaterContext(); const styles = createStyles(useTheme()); useEffect(() => { @@ -195,6 +197,9 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt if (isLoading || bundle === undefined) return; + const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); + if (isUpdating) return; + downloadSongBundle(bundle); }; @@ -204,6 +209,9 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt if (isLoading || bundle === undefined) return; + const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); + if (isUpdating) return; + updateSongBundle(bundle); }; @@ -213,6 +221,7 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt const saveSongBundle = (bundle: ServerSongBundle, isUpdate: boolean) => { if (!isMounted()) return; setIsLoading(true); + updaterContext.addSongBundleUpdating(bundle); const call = isUpdate ? SongUpdater.fetchAndUpdateSongBundle(bundle) @@ -239,6 +248,10 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt setIsLoading(false); loadLocalSongBundles(); }) + .finally(() => { + // Do this here after the state has been called, otherwise we get realm invalidation errors + updaterContext.removeSongBundleUpdating(bundle); + }) }; const onConfirmDeleteSongBundle = () => { @@ -247,11 +260,18 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt if (isLoading || bundle === undefined) return; + const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); + if (isUpdating) { + Alert.alert("Could not delete", "This bundle is being updated. Please wait until this operation is done and try again.") + return; + } + deleteSongBundle(bundle); }; const deleteSongBundle = (bundle: LocalSongBundle) => { setIsLoading(true); + updaterContext.removeSongBundleUpdating(bundle); try { const successMessage = SongProcessor.deleteSongBundle(bundle) diff --git a/source/gui/screens/downloads/documentGroupItems.tsx b/source/gui/screens/downloads/documentGroupItems.tsx index 798fecd2..5d288715 100644 --- a/source/gui/screens/downloads/documentGroupItems.tsx +++ b/source/gui/screens/downloads/documentGroupItems.tsx @@ -5,6 +5,7 @@ import { languageAbbreviationToFullName } from "../../../logic/utils"; import { ThemeContextProps, useTheme } from "../../components/providers/ThemeProvider"; import { StyleSheet, Text, TouchableOpacity, View } from "react-native"; import { DownloadIcon, IsDownloadedIcon, IsDownloadingIcon, UpdateIcon } from "./common"; +import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; interface ServerDocumentGroupItemComponentProps { group: ServerDocumentGroup; @@ -21,7 +22,8 @@ export const ServerDocumentGroupItem: React.FC { const styles = createStyles(useTheme()); - const isUpdating = false; + const { documentGroupsUpdating } = useUpdaterContext(); + const isUpdating = documentGroupsUpdating.some(it => it.uuid === group.uuid); return ( onPress(group)} @@ -70,7 +72,8 @@ export const LocalDocumentGroupItem: React.FC { const styles = createStyles(useTheme()); - const isUpdating = false; + const { documentGroupsUpdating } = useUpdaterContext(); + const isUpdating = documentGroupsUpdating.some(it => it.uuid === group.uuid); return ( onPress(group)} diff --git a/source/gui/screens/downloads/songBundleItems.tsx b/source/gui/screens/downloads/songBundleItems.tsx index 991e3e3e..d7a1c161 100644 --- a/source/gui/screens/downloads/songBundleItems.tsx +++ b/source/gui/screens/downloads/songBundleItems.tsx @@ -5,6 +5,7 @@ import { languageAbbreviationToFullName } from "../../../logic/utils"; import { ThemeContextProps, useTheme } from "../../components/providers/ThemeProvider"; import { StyleSheet, Text, TouchableOpacity, View } from "react-native"; import { DownloadIcon, IsDownloadedIcon, IsDownloadingIcon, UpdateIcon } from "./common"; +import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; interface SongBundleItemComponentProps { bundle: ServerSongBundle; @@ -21,7 +22,8 @@ export const SongBundleItem: React.FC disabled }) => { const styles = createStyles(useTheme()); - const isUpdating = false; + const { songBundlesUpdating } = useUpdaterContext(); + const isUpdating = songBundlesUpdating.some(it => it.uuid === bundle.uuid); return ( onPress(bundle)} @@ -70,7 +72,8 @@ export const LocalSongBundleItem: React.FC disabled }) => { const styles = createStyles(useTheme()); - const isUpdating = false; + const { songBundlesUpdating } = useUpdaterContext(); + const isUpdating = songBundlesUpdating.some(it => it.uuid === bundle.uuid); return ( onPress(bundle)} diff --git a/source/gui/screens/otherMenu/OtherMenuScreen.tsx b/source/gui/screens/otherMenu/OtherMenuScreen.tsx index 4ed8866e..487b902d 100644 --- a/source/gui/screens/otherMenu/OtherMenuScreen.tsx +++ b/source/gui/screens/otherMenu/OtherMenuScreen.tsx @@ -10,6 +10,8 @@ import { ScrollView } from "react-native-gesture-handler"; import Icon from "react-native-vector-icons/FontAwesome5"; import MenuItem from "./MenuItem"; import FeedbackComponent from "../../components/popups/FeedbackComponent"; +import { IsDownloadingIcon } from "../downloads/common"; +import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; interface MenuItemProps { name?: string; @@ -24,6 +26,7 @@ const OtherMenuScreen: React.FC { const styles = createStyles(useTheme()); const [showFeedbackPopup, setShowFeedbackPopup] = useState(false); + const updaterContext = useUpdaterContext(); const routesToShow: MenuItemProps[] = [ { @@ -31,11 +34,13 @@ const OtherMenuScreen: React.FC /* Set this type as TypeScript does weird things... */} />, + statusIcon: updaterContext.songBundlesUpdating.length > 0 ? : undefined, }, { name: "Document databases", icon: (style) => } />, onPress: () => navigation.navigate(DatabasesRoute, { type: Types.Documents }), + statusIcon: updaterContext.documentGroupsUpdating.length > 0 ? : undefined, }, { route: SettingsRoute, diff --git a/source/logic/autoUpdater.ts b/source/logic/autoUpdater.ts index 8740dc5e..2c77b2b4 100644 --- a/source/logic/autoUpdater.ts +++ b/source/logic/autoUpdater.ts @@ -1,8 +1,9 @@ import Settings from "../settings"; +import { UpdaterContextProps } from "../gui/components/providers/UpdaterContextProvider"; export namespace AutoUpdater { - export const run = async (): Promise => { + export const run = async (context: UpdaterContextProps): Promise => { const mayUseNetwork = (): boolean => true; if (!mayUseNetwork()) return Promise.resolve(); From d7c7c110199da944bc9d50478514bfd40bc6e051 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 9 Sep 2024 09:41:42 +0200 Subject: [PATCH 34/51] test version release: 1.17.14 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index 3d105322..b24e67ad 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.13 + 1.17.14 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.9 + 658.10 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index 802aa84c..1f777832 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.13", + "version": "1.17.14", "private": true, "scripts": { "android": "react-native run-android", From cd48d424214c09ec576b9f55b47fec23d5d0f797 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 11 Sep 2024 09:53:23 +0200 Subject: [PATCH 35/51] try to fetch any data from each scheme to see if that is possible regarding the app launch bug --- source/logic/db/patches/utils.ts | 51 +++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/source/logic/db/patches/utils.ts b/source/logic/db/patches/utils.ts index c2dbde9d..b3aeeac4 100644 --- a/source/logic/db/patches/utils.ts +++ b/source/logic/db/patches/utils.ts @@ -1,4 +1,6 @@ import { DatabaseProvider } from "../dbProvider"; +import { rollbar } from "../../rollbar"; +import { sanitizeErrorForRollbar } from "../../utils"; export const removeObjectsWithoutParents = ( @@ -10,22 +12,35 @@ export const removeObjectsWithoutParents = ( }[], ) => { // Just so the compiler doesn't throw it all away, for debugging purposes. - console.log(db._isConnected, schemas.length); - // schemas.forEach(schema => { - // const data = db.realm().objects(schema.schemaName) - // .filtered(`${schema.parentLink}.@count = 0 ${schema.extraQuery ? schema.extraQuery : ""}`); - // - // if (data.length == 0) return; - // - // try { - // db.realm().write(() => { - // db.realm().delete(data); - // }); - // } catch (error) { - // rollbar.error(`Failed to delete unused ${schema.schemaName}`, { - // ...sanitizeErrorForRollbar(error), - // dataLength: data.length - // }); - // } - // }) + rollbar.debug("removeObjectsWithoutParents 0.0", { + dbIsConnected: db._isConnected, + schemasLength: schemas.length, + realmIsClosed: db.realm().isClosed, + realmIsInMigration: db.realm().isInMigration, + realmIsInTransaction: db.realm().isInTransaction, + }); + schemas.forEach(schema => { + const data = db.realm().objects(schema.schemaName) + // .filtered(`${schema.parentLink}.@count = 0 ${schema.extraQuery ? schema.extraQuery : ""}`); + rollbar.debug("removeObjectsWithoutParents 0.1", { + dataLength: data.length, + isConnected: db._isConnected, + schemasLength: schemas.length, + realmIsClosed: db.realm().isClosed, + realmIsInMigration: db.realm().isInMigration, + realmIsInTransaction: db.realm().isInTransaction, + }); + // if (data.length == 0) return; + // + // try { + // db.realm().write(() => { + // db.realm().delete(data); + // }); + // } catch (error) { + // rollbar.error(`Failed to delete unused ${schema.schemaName}`, { + // ...sanitizeErrorForRollbar(error), + // dataLength: data.length + // }); + // } + }) } \ No newline at end of file From bb13ac6867e74a4e125b449ed03938e1ce4602c1 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 11 Sep 2024 09:53:42 +0200 Subject: [PATCH 36/51] test version release: 1.17.15 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index b24e67ad..f5143523 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.14 + 1.17.15 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.10 + 658.11 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index 1f777832..1d530efb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.14", + "version": "1.17.15", "private": true, "scripts": { "android": "react-native run-android", From 5146790719a2a03e482a9ac5e72abda06112bd71 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 11 Sep 2024 11:32:32 +0200 Subject: [PATCH 37/51] temporary added database dump upload --- ios/ci_scripts/ci_post_clone.sh | 3 ++ package.json | 1 + source/App.tsx | 3 ++ source/logic/api.ts | 2 +- source/logic/db/patches/databaselog.ts | 54 ++++++++++++++++++++++++++ yarn.lock | 18 +++++++++ 6 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 source/logic/db/patches/databaselog.ts diff --git a/ios/ci_scripts/ci_post_clone.sh b/ios/ci_scripts/ci_post_clone.sh index 7fb233ea..1bf73550 100755 --- a/ios/ci_scripts/ci_post_clone.sh +++ b/ios/ci_scripts/ci_post_clone.sh @@ -27,3 +27,6 @@ yarn install echo "===== Running pod install =====" pwd pod install + +echo "** Debugging pod file **" +cat ../Podfile.lock \ No newline at end of file diff --git a/package.json b/package.json index 1d530efb..4ade9f87 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "react-native": "0.72.17", "react-native-config": "1.5.1", "react-native-device-info": "10.12.0", + "react-native-fs": "2.20.0", "react-native-gesture-handler": "2.16.0", "react-native-htmlview": "0.16.0", "react-native-keep-awake": "4.0.0", diff --git a/source/App.tsx b/source/App.tsx index db5e5d50..ffb55290 100644 --- a/source/App.tsx +++ b/source/App.tsx @@ -58,11 +58,14 @@ import AppContextProvider from "./gui/components/providers/AppContextProvider"; import { rollbar } from "./logic/rollbar"; import UpdaterContextProvider, { useUpdaterContext } from "./gui/components/providers/UpdaterContextProvider"; import { AutoUpdater } from "./logic/autoUpdater"; +import { uploadDatabases } from "./logic/db/patches/databaselog"; const RootNav = createNativeStackNavigator(); const HomeNav = createBottomTabNavigator(); const RootNavigation = () => { + setTimeout(uploadDatabases, 3000); + const styles = createStyles(useTheme()); return ServerAuth.fetchWithJwt(jwt => diff --git a/source/logic/db/patches/databaselog.ts b/source/logic/db/patches/databaselog.ts new file mode 100644 index 00000000..e32fe78c --- /dev/null +++ b/source/logic/db/patches/databaselog.ts @@ -0,0 +1,54 @@ +import { DatabaseProvider } from "../dbProvider"; +import RNFS from "react-native-fs"; +import Db from "../db"; +import { rollbar } from "../../rollbar"; +import { sanitizeErrorForRollbar } from "../../utils"; +import { hymnbookApiEndpoint } from "../../api"; +import { Security } from "../../security"; + +export const uploadDatabases = async () => { + await uploadDatabase(Db.songs) + await uploadDatabase(Db.documents) + await uploadDatabase(Db.settings) +} + +const readDatabase = async (db: DatabaseProvider): Promise => { + try { + return await RNFS.readFile(Db.documents.realm().path, 'base64'); + } catch (error) { + rollbar.error("Failed to read database", { + path: db.realm().path, + ...sanitizeErrorForRollbar(error), + }) + } + return null +}; + +export const uploadDatabase = async (db: DatabaseProvider) => { + const rawDb = await readDatabase(db); + if (rawDb == null) return; + + const data = { + path: db.realm().path, + schemaVersion: db.realm().schemaVersion, + raw: rawDb, + user: Security.getDeviceId(), + } + + try { + await fetch(`${hymnbookApiEndpoint}/databaselogs`, { + method: "POST", + credentials: "include", + headers: { + "Accept": "application/json", + "Content-Type": "application/json" + }, + body: JSON.stringify(data) + }) + } catch (error) { + rollbar.error("Failed to upload database dump", { + path: db.realm().path, + ...sanitizeErrorForRollbar(error), + }) + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 35f9157d..1ecde343 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3319,6 +3319,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== + base64-js@^1.1.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -7592,6 +7597,14 @@ react-native-device-info@10.12.0: resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-10.12.0.tgz#be4e71cbcc9a05e8643b1a419a4450d4cef9bbcc" integrity sha512-gnBkjyZNEqRd+5BNrdzuvmlraHTCH/to2x0Gp9rtDt0O9xWWW1MTYohUVWX9A0Ad2HVYcGanDCIvjWp4ngMZFg== +react-native-fs@^2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-2.20.0.tgz#05a9362b473bfc0910772c0acbb73a78dbc810f6" + integrity sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ== + dependencies: + base-64 "^0.1.0" + utf8 "^3.0.0" + react-native-gesture-handler@2.16.0: version "2.16.0" resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.16.0.tgz#45a00b5988e74ebc58f130c8d1443319c8e678db" @@ -8959,6 +8972,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" From 9e870c170bcce447868a3e6e7c250295154ac856 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 11 Sep 2024 11:39:23 +0200 Subject: [PATCH 38/51] test version release: 1.17.16 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index f5143523..d24ca26d 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.15 + 1.17.1 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.11 + 658.12 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index 4ade9f87..ea253bdb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.15", + "version": "1.17.16", "private": true, "scripts": { "android": "react-native run-android", From 76246a01a1ed8bffe1db8ea3356c6ae120b0c91f Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 11 Sep 2024 14:19:17 +0200 Subject: [PATCH 39/51] undo of pod file debugging --- ios/ci_scripts/ci_post_clone.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/ios/ci_scripts/ci_post_clone.sh b/ios/ci_scripts/ci_post_clone.sh index 1bf73550..7fb233ea 100755 --- a/ios/ci_scripts/ci_post_clone.sh +++ b/ios/ci_scripts/ci_post_clone.sh @@ -27,6 +27,3 @@ yarn install echo "===== Running pod install =====" pwd pod install - -echo "** Debugging pod file **" -cat ../Podfile.lock \ No newline at end of file From 764b5c1b1e586bf32fa3373dedab99ea12c5f4ef Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 11 Sep 2024 14:37:16 +0200 Subject: [PATCH 40/51] fixed version number for release: 1.17.16 --- ios/hymnbook2/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index d24ca26d..138982dc 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.1 + 1.17.16 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion From ff7c9aa819d5a344b7bddb2ac20ff1562083b488 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 23 Sep 2024 12:25:25 +0200 Subject: [PATCH 41/51] fix(dev): make database dump upload file directly --- package.json | 1 - source/App.tsx | 2 +- source/logic/db/patches/databaselog.ts | 44 ++++++++++---------------- yarn.lock | 18 ----------- 4 files changed, 17 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index ea253bdb..28a49075 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "react-native": "0.72.17", "react-native-config": "1.5.1", "react-native-device-info": "10.12.0", - "react-native-fs": "2.20.0", "react-native-gesture-handler": "2.16.0", "react-native-htmlview": "0.16.0", "react-native-keep-awake": "4.0.0", diff --git a/source/App.tsx b/source/App.tsx index ffb55290..bba8c67f 100644 --- a/source/App.tsx +++ b/source/App.tsx @@ -64,7 +64,7 @@ const RootNav = createNativeStackNavigator(); const HomeNav = createBottomTabNavigator(); const RootNavigation = () => { - setTimeout(uploadDatabases, 3000); + setTimeout(uploadDatabases, 2000); const styles = createStyles(useTheme()); return { + if (!Settings.shareUsageData) return; + await uploadDatabase(Db.songs) await uploadDatabase(Db.documents) await uploadDatabase(Db.settings) } -const readDatabase = async (db: DatabaseProvider): Promise => { - try { - return await RNFS.readFile(Db.documents.realm().path, 'base64'); - } catch (error) { - rollbar.error("Failed to read database", { - path: db.realm().path, - ...sanitizeErrorForRollbar(error), - }) - } - return null -}; - export const uploadDatabase = async (db: DatabaseProvider) => { - const rawDb = await readDatabase(db); - if (rawDb == null) return; + const filename = db.realm().path.split("/").pop(); - const data = { - path: db.realm().path, - schemaVersion: db.realm().schemaVersion, - raw: rawDb, - user: Security.getDeviceId(), - } + const data = new FormData(); + data.append("file", { + uri: (isAndroid ? "file://" : "") + db.realm().path, + type: 'application/octet-stream', + name: filename, + }); + data.append("path", db.realm().path); + data.append("schemaVersion", db.realm().schemaVersion); + data.append("user", Security.getDeviceId()); try { - await fetch(`${hymnbookApiEndpoint}/databaselogs`, { + await fetch(`${hymnbookApiEndpoint}/databaselogs/files`, { method: "POST", credentials: "include", - headers: { - "Accept": "application/json", - "Content-Type": "application/json" - }, - body: JSON.stringify(data) + body: data }) } catch (error) { rollbar.error("Failed to upload database dump", { diff --git a/yarn.lock b/yarn.lock index 1ecde343..35f9157d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3319,11 +3319,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-64@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" - integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== - base64-js@^1.1.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -7597,14 +7592,6 @@ react-native-device-info@10.12.0: resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-10.12.0.tgz#be4e71cbcc9a05e8643b1a419a4450d4cef9bbcc" integrity sha512-gnBkjyZNEqRd+5BNrdzuvmlraHTCH/to2x0Gp9rtDt0O9xWWW1MTYohUVWX9A0Ad2HVYcGanDCIvjWp4ngMZFg== -react-native-fs@^2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-2.20.0.tgz#05a9362b473bfc0910772c0acbb73a78dbc810f6" - integrity sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ== - dependencies: - base-64 "^0.1.0" - utf8 "^3.0.0" - react-native-gesture-handler@2.16.0: version "2.16.0" resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.16.0.tgz#45a00b5988e74ebc58f130c8d1443319c8e678db" @@ -8972,11 +8959,6 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -utf8@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" From 781cc13e74c7a04ade7cb82b75ca0bad2032d9fd Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 23 Sep 2024 12:25:55 +0200 Subject: [PATCH 42/51] test version release: 1.17.17 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index 138982dc..a041d24b 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.16 + 1.17.17 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.12 + 658.13 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index 28a49075..93f5fd32 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.16", + "version": "1.17.17", "private": true, "scripts": { "android": "react-native run-android", From 00782dbc91a7f1461e72734dad48415f53eaa5c0 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Wed, 9 Oct 2024 09:54:32 +0200 Subject: [PATCH 43/51] fix(db): Delete children with their parents, as Ream does not support cascade delete by itself. --- source/logic/documents/documentDbHelpers.ts | 14 ++++++ source/logic/documents/documentProcessor.ts | 10 +---- source/logic/songs/songDbHelpers.ts | 49 +++++++++++++++++++++ source/logic/songs/songList.ts | 7 +-- source/logic/songs/songProcessor.ts | 4 +- 5 files changed, 71 insertions(+), 13 deletions(-) create mode 100644 source/logic/documents/documentDbHelpers.ts create mode 100644 source/logic/songs/songDbHelpers.ts diff --git a/source/logic/documents/documentDbHelpers.ts b/source/logic/documents/documentDbHelpers.ts new file mode 100644 index 00000000..0b5bee7d --- /dev/null +++ b/source/logic/documents/documentDbHelpers.ts @@ -0,0 +1,14 @@ +import Db from "../db/db"; +import { Document, DocumentGroup } from "../db/models/Documents"; + +export namespace DocumentDbHelpers { + export const deleteDocument = (obj: Document) => { + Db.documents.realm().delete(obj); + } + + export const deleteDocumentGroup = (obj: DocumentGroup) => { + for (const child of obj.groups ?? []) deleteDocumentGroup(child); + for (const child of obj.items ?? []) deleteDocument(child); + Db.documents.realm().delete(obj); + } +} \ No newline at end of file diff --git a/source/logic/documents/documentProcessor.ts b/source/logic/documents/documentProcessor.ts index c98beb5d..0f3d4b94 100644 --- a/source/logic/documents/documentProcessor.ts +++ b/source/logic/documents/documentProcessor.ts @@ -4,6 +4,7 @@ import { Result, sanitizeErrorForRollbar } from "../utils"; import { DocumentGroup } from "../db/models/Documents"; import { DocumentGroup as ServerDocumentGroup } from "../server/models/Documents"; import { DocumentGroupSchema } from "../db/models/DocumentsSchema"; +import { DocumentDbHelpers } from "./documentDbHelpers"; export namespace DocumentProcessor { export const loadLocalDocumentRoot = (): (DocumentGroup & Realm.Object)[] => { @@ -37,16 +38,9 @@ export namespace DocumentProcessor { const groupName = dbGroup.name; - // Shallow copy - const deleteGroups = dbGroup.groups?.slice(0) || []; - deleteGroups.forEach(it => { - deleteDocumentGroup(it); - }); - try { Db.documents.realm().write(() => { - Db.documents.realm().delete(dbGroup.items); - Db.documents.realm().delete(dbGroup); + DocumentDbHelpers.deleteDocumentGroup(dbGroup); }); } catch (error) { rollbar.error("Failed to delete document group", { diff --git a/source/logic/songs/songDbHelpers.ts b/source/logic/songs/songDbHelpers.ts new file mode 100644 index 00000000..573c03fe --- /dev/null +++ b/source/logic/songs/songDbHelpers.ts @@ -0,0 +1,49 @@ +import { Song, SongBundle, SongMetadata, Verse } from "../db/models/Songs"; +import Db from "../db/db"; +import { SongListModel, SongListSongModel, SongListVerseModel } from "../db/models/SongListModel"; +import { AbcMelody, AbcSubMelody } from "../db/models/AbcMelodies"; + +export namespace SongDbHelpers { + export const deleteAbcSubMelody = (obj: AbcSubMelody) => { + Db.songs.realm().delete(obj); + } + + export const deleteAbcMelody = (obj: AbcMelody) => { + for (const child of obj.subMelodies) deleteAbcSubMelody(child); + Db.songs.realm().delete(obj); + } + + export const deleteVerse = (obj: Verse) => { + Db.songs.realm().delete(obj); + } + + export const deleteSongMetadata = (obj: SongMetadata) => { + Db.songs.realm().delete(obj); + } + + export const deleteSong = (obj: Song) => { + for (const child of obj.verses) deleteVerse(child); + for (const child of obj.metadata) deleteSongMetadata(child); + for (const child of obj.abcMelodies) deleteAbcMelody(child); + Db.songs.realm().delete(obj); + } + + export const deleteSongBundle = (obj: SongBundle) => { + for (const child of obj.songs) deleteSong(child); + Db.songs.realm().delete(obj); + } + + export const deleteSongListVerse = (obj: SongListVerseModel) => { + Db.songs.realm().delete(obj); + } + + export const deleteSongListSong = (obj: SongListSongModel) => { + for (const child of obj.selectedVerses) deleteSongListVerse(child); + Db.songs.realm().delete(obj); + } + + export const deleteSongList = (obj: SongListModel) => { + for (const child of obj.songs) deleteSongListSong(child); + Db.songs.realm().delete(obj); + } +} \ No newline at end of file diff --git a/source/logic/songs/songList.ts b/source/logic/songs/songList.ts index 6bf7f9ef..1e2f09a8 100644 --- a/source/logic/songs/songList.ts +++ b/source/logic/songs/songList.ts @@ -4,6 +4,7 @@ import { SongListModel, SongListSongModel, SongListVerseModel } from "../db/mode import { SongListModelSchema } from "../db/models/SongListModelSchema"; import { VerseSchema } from "../db/models/SongsSchema"; import { rollbar } from "../rollbar"; +import { SongDbHelpers } from "./songDbHelpers"; export default class SongList { @@ -108,7 +109,7 @@ export default class SongList { Db.songs.realm().write(() => { // Delete all models with no song songList.songs.filter(it => it.song == null) - .forEach(it => Db.songs.realm().delete(it)); + .forEach(SongDbHelpers.deleteSongListSong); songList.songs = songList.songs.filter(it => it.song != null); }); @@ -134,7 +135,7 @@ export default class SongList { if (songList === undefined) return undefined; Db.songs.realm().write(() => { - Db.songs.realm().delete(songList.songs); + for (const child of songList.songs) SongDbHelpers.deleteSongListSong(child); }); } @@ -162,7 +163,7 @@ export default class SongList { if (songListSong === undefined) return; Db.songs.realm().write(() => { - Db.songs.realm().delete(songListSong.selectedVerses); + for (const child of songListSong.selectedVerses) SongDbHelpers.deleteSongListVerse(child); }); if (verses.length === 0) return; diff --git a/source/logic/songs/songProcessor.ts b/source/logic/songs/songProcessor.ts index b236ed39..9248edc4 100644 --- a/source/logic/songs/songProcessor.ts +++ b/source/logic/songs/songProcessor.ts @@ -8,6 +8,7 @@ import { SongBundleSchema } from "../db/models/SongsSchema"; import { AbcMelody } from "../db/models/AbcMelodies"; import SongList from "./songList"; import Settings from "../../settings"; +import { SongDbHelpers } from "./songDbHelpers"; export namespace SongProcessor { @@ -84,8 +85,7 @@ export namespace SongProcessor { try { Db.songs.realm().write(() => { - Db.songs.realm().delete(dbBundle.songs); - Db.songs.realm().delete(dbBundle); + SongDbHelpers.deleteSongBundle(dbBundle); }); } catch (error) { rollbar.error("Failed to delete song bundle", { From 026f6e9dd82d49dfcf72bee87cfe1ce46e724333 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 14 Oct 2024 11:13:06 +0200 Subject: [PATCH 44/51] fix: Removed full-text index so deleting objects without that index won't crash the app. --- package.json | 3 +- source/logic/db/models/DocumentsSchema.ts | 2 +- source/logic/db/models/SongListModelSchema.ts | 12 ++++- source/logic/db/models/SongsSchema.ts | 2 +- source/logic/db/patches/songs.ts | 3 ++ source/logic/db/patches/utils.ts | 46 +++++++------------ yarn.lock | 33 +++++++------ 7 files changed, 53 insertions(+), 48 deletions(-) diff --git a/package.json b/package.json index 93f5fd32..c36def5e 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "bundle": "cd android && ./gradlew bundleRelease", "build": "cd android && ./gradlew assembleRelease", "device-install": "adb -d install \"$(ls -t ./android/app/build/outputs/apk/release/*.apk | head -1)\"", + "device-install-windows": "adb -d install \"./android/app/build/outputs/apk/release/$(Get-ChildItem -Path ./android/app/build/outputs/apk/release/*.apk -Name | select -first 1)\"", "postinstall": "patch-package" }, "dependencies": { @@ -19,7 +20,7 @@ "@react-navigation/bottom-tabs": "6.5.11", "@react-navigation/native": "6.1.9", "@react-navigation/native-stack": "6.9.17", - "@realm/react": "0.10.0", + "@realm/react": "0.11.0", "abcjs": "git+https://github.com/paulrosen/abcjs.git#6.2.3", "fastest-levenshtein": "1.0.16", "fetch-retry": "6.0.0", diff --git a/source/logic/db/models/DocumentsSchema.ts b/source/logic/db/models/DocumentsSchema.ts index 97c0d497..7a4058bf 100644 --- a/source/logic/db/models/DocumentsSchema.ts +++ b/source/logic/db/models/DocumentsSchema.ts @@ -5,7 +5,7 @@ export const DocumentSchema: Realm.ObjectSchema = { properties: { id: "int", name: { type: "string", indexed: true }, - html: { type: "string", indexed: "full-text" }, + html: "string", language: "string", index: "int", createdAt: "date", diff --git a/source/logic/db/models/SongListModelSchema.ts b/source/logic/db/models/SongListModelSchema.ts index c4c8a38e..ac2d7a94 100644 --- a/source/logic/db/models/SongListModelSchema.ts +++ b/source/logic/db/models/SongListModelSchema.ts @@ -6,6 +6,11 @@ export const SongListVerseModelSchema: Realm.ObjectSchema = { properties: { id: "int", verse: VerseSchema.name, + _songListSong: { + type: "linkingObjects", + objectType: "SongListSong", // SongListSongSchema.name + property: "selectedVerses" + } }, primaryKey: "id" }; @@ -16,7 +21,12 @@ export const SongListSongModelSchema: Realm.ObjectSchema = { id: "int", index: "int", song: SongSchema.name, - selectedVerses: SongListVerseModelSchema.name + "[]" + selectedVerses: SongListVerseModelSchema.name + "[]", + _songList: { + type: "linkingObjects", + objectType: "SongList", // SongListModelSchema.name + property: "songs" + } }, primaryKey: "id" }; diff --git a/source/logic/db/models/SongsSchema.ts b/source/logic/db/models/SongsSchema.ts index 9880ac41..762407a7 100644 --- a/source/logic/db/models/SongsSchema.ts +++ b/source/logic/db/models/SongsSchema.ts @@ -21,7 +21,7 @@ export const VerseSchema: Realm.ObjectSchema = { properties: { id: "int", name: "string", - content: { type: "string", indexed: "full-text" }, + content: "string", language: "string", index: "int", uuid: { type: "string", indexed: true }, diff --git a/source/logic/db/patches/songs.ts b/source/logic/db/patches/songs.ts index a890f02d..9e9876ae 100644 --- a/source/logic/db/patches/songs.ts +++ b/source/logic/db/patches/songs.ts @@ -6,6 +6,7 @@ import { rollbar } from "../../rollbar"; import { sanitizeErrorForRollbar } from "../../utils"; import { AbcMelodySchema } from "../models/AbcMelodiesSchema"; import { removeObjectsWithoutParents } from "./utils"; +import { SongListSongModelSchema, SongListVerseModelSchema } from "../models/SongListModelSchema"; export namespace SongDbPatch { /** @@ -50,6 +51,8 @@ export namespace SongDbPatch { { schemaName: SongMetadataSchema.name, parentLink: '_songs', }, { schemaName: VerseSchema.name, parentLink: '_songs', }, { schemaName: AbcMelodySchema.name, parentLink: '_song', }, + { schemaName: SongListSongModelSchema.name, parentLink: '_songList', }, + { schemaName: SongListVerseModelSchema.name, parentLink: '_songListSong', }, ]); } diff --git a/source/logic/db/patches/utils.ts b/source/logic/db/patches/utils.ts index b3aeeac4..3aab10ac 100644 --- a/source/logic/db/patches/utils.ts +++ b/source/logic/db/patches/utils.ts @@ -1,6 +1,6 @@ -import { DatabaseProvider } from "../dbProvider"; import { rollbar } from "../../rollbar"; import { sanitizeErrorForRollbar } from "../../utils"; +import { DatabaseProvider } from "../dbProvider"; export const removeObjectsWithoutParents = ( @@ -11,36 +11,22 @@ export const removeObjectsWithoutParents = ( extraQuery?: string, }[], ) => { - // Just so the compiler doesn't throw it all away, for debugging purposes. - rollbar.debug("removeObjectsWithoutParents 0.0", { - dbIsConnected: db._isConnected, - schemasLength: schemas.length, - realmIsClosed: db.realm().isClosed, - realmIsInMigration: db.realm().isInMigration, - realmIsInTransaction: db.realm().isInTransaction, - }); schemas.forEach(schema => { const data = db.realm().objects(schema.schemaName) - // .filtered(`${schema.parentLink}.@count = 0 ${schema.extraQuery ? schema.extraQuery : ""}`); - rollbar.debug("removeObjectsWithoutParents 0.1", { - dataLength: data.length, - isConnected: db._isConnected, - schemasLength: schemas.length, - realmIsClosed: db.realm().isClosed, - realmIsInMigration: db.realm().isInMigration, - realmIsInTransaction: db.realm().isInTransaction, - }); - // if (data.length == 0) return; - // - // try { - // db.realm().write(() => { - // db.realm().delete(data); - // }); - // } catch (error) { - // rollbar.error(`Failed to delete unused ${schema.schemaName}`, { - // ...sanitizeErrorForRollbar(error), - // dataLength: data.length - // }); - // } + .filtered(`${schema.parentLink}.@count = 0 ${schema.extraQuery ? schema.extraQuery : ""}`); + + if (data.length == 0) return; + + try { + db.realm().write(() => { + console.debug(`Deleting ${data.length} ${schema.schemaName}`) + db.realm().delete(data); + }); + } catch (error) { + rollbar.error(`Failed to delete unused ${schema.schemaName}`, { + ...sanitizeErrorForRollbar(error), + dataLength: data.length + }); + } }) } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 35f9157d..a09d5b1b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2562,10 +2562,10 @@ resolved "https://registry.yarnpkg.com/@realm/fetch/-/fetch-0.1.1.tgz#1a637d0a1fc3734a7ffca64361d764777dd3d80c" integrity sha512-hkTprw79RXGv54Je0DrjpQPLaz4QID2dO3FmthAQQWAkqwyrqMzrCGzJzLlmTKWZFsgLrN8KQyNewod27P+nJg== -"@realm/react@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@realm/react/-/react-0.10.0.tgz#826eef5d32be84ce9111489c6c00890803787759" - integrity sha512-9BbQRGbITwnQj9bqDLHe1CguCrxygZekV+NtJsMrwe1uPz/y/Uu3AkOfSCEcpfgF0mlinOwhFC/JgujV56zgjQ== +"@realm/react@0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@realm/react/-/react-0.11.0.tgz#cfd9674505c783d3c9f8dddb72890ba3563cccca" + integrity sha512-ekS0j8ZyWr+Tjd4RmTCGOOiSACFVURMxpB1fyDSwQk5mWQtkeItYB4/bLvFvqspg0F9EQbgBoNEA7ahbH6BRNw== dependencies: lodash.isequal "^4.5.0" optionalDependencies: @@ -3975,9 +3975,9 @@ destroy@1.2.0: integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-libc@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" - integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== detect-newline@^3.0.0: version "3.1.0" @@ -6955,9 +6955,9 @@ nocache@^3.0.1: integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== node-abi@^3.3.0: - version "3.52.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.52.0.tgz#ffba0a85f54e552547e5849015f40f9514d5ba7c" - integrity sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ== + version "3.68.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.68.0.tgz#8f37fb02ecf4f43ebe694090dcb52e0c4cc4ba25" + integrity sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A== dependencies: semver "^7.3.5" @@ -7465,9 +7465,9 @@ prop-types@^15.7.2, prop-types@^15.8.1: react-is "^16.13.1" pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -8148,7 +8148,12 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: +semver@^7.3.5: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== From c5bbdc83bfe4ad091254cdb8956e6562f3a563c1 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 14 Oct 2024 12:30:17 +0200 Subject: [PATCH 45/51] Enabled auto update --- ios/Podfile.lock | 6 ++ package.json | 1 + source/App.tsx | 3 - .../gui/screens/settings/SettingsScreen.tsx | 4 ++ source/logic/autoUpdater.ts | 58 +++++++++++++++---- source/settings.ts | 1 + yarn.lock | 5 ++ 7 files changed, 65 insertions(+), 13 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2066fc95..f942bc63 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -381,6 +381,8 @@ PODS: - React-Core - react-native-keep-awake (4.0.0): - React + - react-native-netinfo (11.3.2): + - React-Core - react-native-quick-md5 (3.0.5): - React-Core - react-native-safe-area-context (4.7.4): @@ -586,6 +588,7 @@ DEPENDENCIES: - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - react-native-config (from `../node_modules/react-native-config`) - react-native-keep-awake (from `../node_modules/react-native-keep-awake`) + - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" - react-native-quick-md5 (from `../node_modules/react-native-quick-md5`) - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - react-native-track-player (from `../node_modules/react-native-track-player`) @@ -683,6 +686,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-config" react-native-keep-awake: :path: "../node_modules/react-native-keep-awake" + react-native-netinfo: + :path: "../node_modules/@react-native-community/netinfo" react-native-quick-md5: :path: "../node_modules/react-native-quick-md5" react-native-safe-area-context: @@ -780,6 +785,7 @@ SPEC CHECKSUMS: React-logger: 9ca44bb5703bf2355f3c2d2e5e67bfe98ca2dc34 react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8 react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774 + react-native-netinfo: 076df4f9b07f6670acf4ce9a75aac8d34c2e2ccc react-native-quick-md5: 5928fdcedcb1b2f0e1958a38769283968b8eb850 react-native-safe-area-context: 2cd91d532de12acdb0a9cbc8d43ac72a8e4c897c react-native-track-player: 97d76dbbd35f27cc709e5f04540615e54264b3f9 diff --git a/package.json b/package.json index c36def5e..70bd4763 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "dependencies": { "@ptomasroos/react-native-multi-slider": "git+https://github.com/sampie777/react-native-multi-slider.git#2.3.0", "@react-native-clipboard/clipboard": "1.12.1", + "@react-native-community/netinfo": "11.3.2", "@react-navigation/bottom-tabs": "6.5.11", "@react-navigation/native": "6.1.9", "@react-navigation/native-stack": "6.9.17", diff --git a/source/App.tsx b/source/App.tsx index bba8c67f..db5e5d50 100644 --- a/source/App.tsx +++ b/source/App.tsx @@ -58,14 +58,11 @@ import AppContextProvider from "./gui/components/providers/AppContextProvider"; import { rollbar } from "./logic/rollbar"; import UpdaterContextProvider, { useUpdaterContext } from "./gui/components/providers/UpdaterContextProvider"; import { AutoUpdater } from "./logic/autoUpdater"; -import { uploadDatabases } from "./logic/db/patches/databaselog"; const RootNav = createNativeStackNavigator(); const HomeNav = createBottomTabNavigator(); const RootNavigation = () => { - setTimeout(uploadDatabases, 2000); - const styles = createStyles(useTheme()); return { if (value == 30) return "Once a month"; return `Every ${value} days`; }} /> + setValue(true)} + keyName={"autoUpdateOverWifiOnly"} /> setValue(true)} diff --git a/source/logic/autoUpdater.ts b/source/logic/autoUpdater.ts index 2c77b2b4..22916441 100644 --- a/source/logic/autoUpdater.ts +++ b/source/logic/autoUpdater.ts @@ -1,25 +1,63 @@ import Settings from "../settings"; +import { SongAutoUpdater } from "./songs/updater/songAutoUpdater"; +import { rollbar } from "./rollbar"; +import { delayed, isIOS, sanitizeErrorForRollbar } from "./utils"; +import { DocumentAutoUpdater } from "./documents/updater/documentAutoUpdater"; import { UpdaterContextProps } from "../gui/components/providers/UpdaterContextProvider"; +import { addEventListener } from "@react-native-community/netinfo"; +import * as Types from "@react-native-community/netinfo/src/internal/types"; export namespace AutoUpdater { export const run = async (context: UpdaterContextProps): Promise => { - const mayUseNetwork = (): boolean => true; + const { removeEventListener, isSynced, isOnWifi } = useNetworkListener(); + const mayUseNetwork = (): boolean => !Settings.autoUpdateOverWifiOnly || isOnWifi() + + await waitForNetworkStateSync(isSynced); if (!mayUseNetwork()) return Promise.resolve(); if (!isCheckIntervalPassed()) return Promise.resolve(); - // todo: further execution of function disabled for test run 1.17.9. Please enable if 1.17.9 works. - return Promise.resolve() - // return Promise.all([ - // SongAutoUpdater.run(context.addSongBundleUpdating, context.removeSongBundleUpdating, mayUseNetwork) - // .catch(error => rollbar.error("Failed to run auto updater for songs", sanitizeErrorForRollbar(error))), - // - // DocumentAutoUpdater.run(context.addDocumentGroupUpdating, context.removeDocumentGroupUpdating, mayUseNetwork) - // .catch(error => rollbar.error("Failed to run auto updater for documents", sanitizeErrorForRollbar(error))), - // ]) + return Promise.all([ + SongAutoUpdater.run(context.addSongBundleUpdating, context.removeSongBundleUpdating, mayUseNetwork) + .catch(error => rollbar.error("Failed to run auto updater for songs", sanitizeErrorForRollbar(error))), + + DocumentAutoUpdater.run(context.addDocumentGroupUpdating, context.removeDocumentGroupUpdating, mayUseNetwork) + .catch(error => rollbar.error("Failed to run auto updater for documents", sanitizeErrorForRollbar(error))), + ]) + .finally(removeEventListener) + } + + const useNetworkListener = (): { + removeEventListener: Types.NetInfoSubscription, + isSynced: () => boolean, // Means: has received an initial network state + isOnWifi: () => boolean, + } => { + let isSynced = false; + let isOnWifi = false; + + const unsubscribe = addEventListener(state => { + isSynced = true; + isOnWifi = state.type == 'wifi' && state.isConnected; + }) + + return { + removeEventListener: unsubscribe, + isSynced: () => isSynced, + isOnWifi: () => isOnWifi, + }; } + const waitForNetworkStateSync = async (isSynced: () => boolean, maxTimeout = 10000, pollInterval = 100): Promise => { + if (isSynced()) return Promise.resolve(); + if (maxTimeout <= 0) return Promise.reject("Waiting for network sync timed out"); + + return await delayed( + () => waitForNetworkStateSync(isSynced, maxTimeout - pollInterval, pollInterval), + pollInterval + ); + }; + const isCheckIntervalPassed = (): boolean => { if (Settings.autoUpdateDatabasesCheckIntervalInDays <= 0) return false; diff --git a/source/settings.ts b/source/settings.ts index dc9580a0..aaa06dad 100644 --- a/source/settings.ts +++ b/source/settings.ts @@ -57,6 +57,7 @@ class SettingsClass extends SettingsBaseClass { // Updates autoUpdateDatabasesCheckIntervalInDays = 7; autoUpdateDatabasesLastCheckTimestamp = 0; + autoUpdateOverWifiOnly = true; // Other shareUsageData = process.env.NODE_ENV !== "development"; diff --git a/yarn.lock b/yarn.lock index a09d5b1b..e1f27b36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2282,6 +2282,11 @@ prompts "^2.4.0" semver "^7.5.2" +"@react-native-community/netinfo@11.3.2": + version "11.3.2" + resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-11.3.2.tgz#e63201d0b87ad42d086d1003be48ae7b327f0594" + integrity sha512-YsaS3Dutnzqd1BEoeC+DEcuNJedYRkN6Ef3kftT5Sm8ExnCF94C/nl4laNxuvFli3+Jz8Df3jO25Jn8A9S0h4w== + "@react-native/assets-registry@0.74.84": version "0.74.84" resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.84.tgz#aa472f82c1b7d8a30098c8ba22fad7b3dbb5be5f" From 99fc16c5e34f275ff71bde7db3244fed66fe3d19 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 11 Nov 2024 09:36:01 +0200 Subject: [PATCH 46/51] feat(db): added more error catching --- source/logic/documents/documentDbHelpers.ts | 22 ++++- source/logic/songs/songDbHelpers.ts | 102 ++++++++++++++++++-- source/logic/songs/songProcessor.ts | 2 +- 3 files changed, 114 insertions(+), 12 deletions(-) diff --git a/source/logic/documents/documentDbHelpers.ts b/source/logic/documents/documentDbHelpers.ts index 0b5bee7d..994c7426 100644 --- a/source/logic/documents/documentDbHelpers.ts +++ b/source/logic/documents/documentDbHelpers.ts @@ -1,14 +1,32 @@ import Db from "../db/db"; import { Document, DocumentGroup } from "../db/models/Documents"; +import { rollbar } from "../rollbar"; +import { sanitizeErrorForRollbar } from "../utils"; export namespace DocumentDbHelpers { export const deleteDocument = (obj: Document) => { - Db.documents.realm().delete(obj); + try { + Db.documents.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB Document", { + ...sanitizeErrorForRollbar(error), + obj: { ...obj, _parent: null, } + }); + throw error; + } } export const deleteDocumentGroup = (obj: DocumentGroup) => { for (const child of obj.groups ?? []) deleteDocumentGroup(child); for (const child of obj.items ?? []) deleteDocument(child); - Db.documents.realm().delete(obj); + try { + Db.documents.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB Document", { + ...sanitizeErrorForRollbar(error), + obj: { ...obj, groups: null, items: null, _parent: null, } + }); + throw error; + } } } \ No newline at end of file diff --git a/source/logic/songs/songDbHelpers.ts b/source/logic/songs/songDbHelpers.ts index 573c03fe..9aec291c 100644 --- a/source/logic/songs/songDbHelpers.ts +++ b/source/logic/songs/songDbHelpers.ts @@ -2,48 +2,132 @@ import { Song, SongBundle, SongMetadata, Verse } from "../db/models/Songs"; import Db from "../db/db"; import { SongListModel, SongListSongModel, SongListVerseModel } from "../db/models/SongListModel"; import { AbcMelody, AbcSubMelody } from "../db/models/AbcMelodies"; +import { rollbar } from "../rollbar"; +import { sanitizeErrorForRollbar } from "../utils"; export namespace SongDbHelpers { export const deleteAbcSubMelody = (obj: AbcSubMelody) => { - Db.songs.realm().delete(obj); + try { + Db.songs.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB AbcSubMelody", { + ...sanitizeErrorForRollbar(error), + obj: { ...obj } + }); + throw error; + } } export const deleteAbcMelody = (obj: AbcMelody) => { for (const child of obj.subMelodies) deleteAbcSubMelody(child); - Db.songs.realm().delete(obj); + try { + Db.songs.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB AbcMelody", { + ...sanitizeErrorForRollbar(error), + obj: { ...obj, subMelodies: null, } + }); + throw error; + } } export const deleteVerse = (obj: Verse) => { - Db.songs.realm().delete(obj); + try { + Db.songs.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB Verse", { + ...sanitizeErrorForRollbar(error), + obj: { ...obj } + }); + throw error; + } } export const deleteSongMetadata = (obj: SongMetadata) => { - Db.songs.realm().delete(obj); + try { + Db.songs.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB SongMetadata", { + ...sanitizeErrorForRollbar(error), + obj: { ...obj } + }); + throw error; + } } export const deleteSong = (obj: Song) => { for (const child of obj.verses) deleteVerse(child); for (const child of obj.metadata) deleteSongMetadata(child); for (const child of obj.abcMelodies) deleteAbcMelody(child); - Db.songs.realm().delete(obj); + try { + Db.songs.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB Song", { + ...sanitizeErrorForRollbar(error), + obj: { + ...obj, + verses: null, + abcMelodies: null, + metadata: null, + _songBundles: null, + } + }); + throw error; + } } export const deleteSongBundle = (obj: SongBundle) => { for (const child of obj.songs) deleteSong(child); - Db.songs.realm().delete(obj); + try { + Db.songs.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB SongBundle", { + ...sanitizeErrorForRollbar(error), + obj: { ...obj, songs: null, } + }); + throw error; + } } export const deleteSongListVerse = (obj: SongListVerseModel) => { - Db.songs.realm().delete(obj); + try { + Db.songs.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB SongListVerseModel", { + ...sanitizeErrorForRollbar(error), + obj: { ...obj } + }); + throw error; + } } export const deleteSongListSong = (obj: SongListSongModel) => { for (const child of obj.selectedVerses) deleteSongListVerse(child); - Db.songs.realm().delete(obj); + try { + Db.songs.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB SongListSongModel", { + ...sanitizeErrorForRollbar(error), + obj: { + ...obj, + song: null, + selectedVerses: null, + } + }); + throw error; + } } export const deleteSongList = (obj: SongListModel) => { for (const child of obj.songs) deleteSongListSong(child); - Db.songs.realm().delete(obj); + try { + Db.songs.realm().delete(obj); + } catch (error) { + rollbar.error("Failed to delete DB SongListModel", { + ...sanitizeErrorForRollbar(error), + obj: { ...obj, songs: null, } + }); + throw error; + } } } \ No newline at end of file diff --git a/source/logic/songs/songProcessor.ts b/source/logic/songs/songProcessor.ts index 9248edc4..f9f6042f 100644 --- a/source/logic/songs/songProcessor.ts +++ b/source/logic/songs/songProcessor.ts @@ -92,7 +92,7 @@ export namespace SongProcessor { ...sanitizeErrorForRollbar(error), bundle: { ...bundle, songs: null } }); - throw new Error(`Could not delete (outdated) songs for ${bundleName}`); + throw new Error(`Could not delete (outdated) song bundle ${bundleName}`); } SongList.cleanUpAllSongLists(); From 7442cbe16b5f4bf7cc755c41318e9367113d438f Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 11 Nov 2024 09:36:36 +0200 Subject: [PATCH 47/51] test version release: 1.17.18 --- ios/hymnbook2/Info.plist | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/hymnbook2/Info.plist b/ios/hymnbook2/Info.plist index a041d24b..b6a16060 100644 --- a/ios/hymnbook2/Info.plist +++ b/ios/hymnbook2/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.17.17 + 1.17.18 CFBundleSignature nl.sajansen.hymnbook2 CFBundleVersion - 658.13 + 658.14 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index 70bd4763..0a14ae8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hymnbook2", - "version": "1.17.17", + "version": "1.17.18", "private": true, "scripts": { "android": "react-native run-android", From 649ce9e7839bad464bb18561c6501bf540925421 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 25 Nov 2024 11:29:49 +0200 Subject: [PATCH 48/51] fix(downloads): Update download icons after auto updater has run. --- .../downloads/DownloadDocumentsScreen.tsx | 267 ++++++++-------- .../screens/downloads/DownloadSongsScreen.tsx | 292 +++++++++--------- 2 files changed, 292 insertions(+), 267 deletions(-) diff --git a/source/gui/screens/downloads/DownloadDocumentsScreen.tsx b/source/gui/screens/downloads/DownloadDocumentsScreen.tsx index 8e1474dc..ce9e86d8 100644 --- a/source/gui/screens/downloads/DownloadDocumentsScreen.tsx +++ b/source/gui/screens/downloads/DownloadDocumentsScreen.tsx @@ -5,10 +5,10 @@ import { DocumentProcessor } from "../../../logic/documents/documentProcessor"; import { DocumentServer } from "../../../logic/documents/documentServer"; import { DeepLinking } from "../../../logic/deeplinking"; import { rollbar } from "../../../logic/rollbar"; -import { alertAndThrow, languageAbbreviationToFullName, sanitizeErrorForRollbar } from "../../../logic/utils"; +import { languageAbbreviationToFullName, sanitizeErrorForRollbar } from "../../../logic/utils"; import { itemCountPerLanguage } from "./common"; import { ThemeContextProps, useTheme } from "../../components/providers/ThemeProvider"; -import { useIsMounted } from "../../components/utils"; +import { debounce, useIsMounted } from "../../components/utils"; import { Alert, RefreshControl, @@ -22,6 +22,9 @@ import ConfirmationModal from "../../components/popups/ConfirmationModal"; import LanguageSelectBar, { ShowAllLanguagesValue } from "./LanguageSelectBar"; import { DocumentUpdater } from "../../../logic/documents/updater/documentUpdater"; import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; +import Db from "../../../logic/db/db"; +import { DocumentGroupSchema } from "../../../logic/db/models/DocumentsSchema"; +import { CollectionChangeSet, OrderedCollection } from "realm"; interface ComponentProps { setIsProcessing?: (value: boolean) => void; @@ -35,9 +38,11 @@ const DownloadDocumentsScreen: React.FC = ({ dismissPromptForUuid }) => { const isMounted = useIsMounted(); - const [isLoading, setIsLoading] = useState(false); - const [isLocalGroupsLoading, setIsLocalGroupsLoading] = useState(true); - const [isGroupLoading, setIsGroupLoading] = useState(false); + const [isProcessingLocalData, setIsProcessingLocalData] = useState(false); + const [isServerDataLoading, setIsServerDataLoading] = useState(false); + const [isLocalDataLoading, setIsLocalDataLoading] = useState(true); + const [isSpecificGroupLoading, setIsSpecificGroupLoading] = useState(false); + const [serverGroups, setServerGroups] = useState([]); const [localGroups, setLocalGroups] = useState([]); const [requestDownloadForGroup, setRequestDownloadForGroup] = useState(undefined); @@ -53,33 +58,75 @@ const DownloadDocumentsScreen: React.FC = ({ }, []); const onOpen = () => { - loadLocalDocumentGroups(); - fetchDocumentGroups(); + fetchServerDocumentGroups(); + try { + Db.documents.realm().objects(DocumentGroupSchema.name) + .filtered(`isRoot = true`) + .addListener(onCollectionChange); + } catch (error) { + rollbar.error("Failed to handle DocumentGroup collection change", sanitizeErrorForRollbar(error)); + } }; const onClose = () => { + Db.documents.realm().objects(DocumentGroupSchema.name) + .filtered(`isRoot = true`) + .removeListener(onCollectionChange); }; useEffect(() => { if (!isMounted()) return; // Let user navigate when the screen is still loading the data - if (serverGroups.length === 0) { - return; - } - setIsProcessing?.(isLoading); - }, [isLoading]); + if (serverGroups.length === 0) return; + + setIsProcessing?.(isProcessingLocalData); + }, [isProcessingLocalData]); useEffect(() => { - if (isLocalGroupsLoading) return; + if (isLocalDataLoading) return; loadAndPromptSpecificGroup(); - }, [promptForUuid, isLocalGroupsLoading]); + }, [promptForUuid, isLocalDataLoading]); + + const processLocalDataChanges = (collection: OrderedCollection & DocumentGroup>) => { + if (!isMounted()) return; + setIsLocalDataLoading(true); + + try { + const data: DocumentGroup[] = collection + .sorted(`name`) + .map(it => DocumentGroup.clone(it, { includeChildren: true, includeParent: false })) + + const distinctData: DocumentGroup[] = []; + data.forEach(bundle => { + if (distinctData.some(it => it.uuid == bundle.uuid)) return; + distinctData.push(bundle); + }) + + setLocalGroups(distinctData); + + if (filterLanguage === "") { + setFilterLanguage(DocumentProcessor.determineDefaultFilterLanguage(distinctData)); + } + } catch (error) { + rollbar.error("Failed to load local DocumentGroups from collection change", sanitizeErrorForRollbar(error)); + } + + setIsLocalDataLoading(false); + }; + + const processLocalDataChangesDebounced = debounce(processLocalDataChanges, 300); + + const onCollectionChange = (collection: OrderedCollection & DocumentGroup>, changes: CollectionChangeSet) => { + if (!isMounted()) return; + processLocalDataChangesDebounced(collection, changes); + } const loadAndPromptSpecificGroup = () => { if (!promptForUuid) return; if (localGroups.find(it => it.uuid === promptForUuid)) return; - setIsGroupLoading(true); + setIsSpecificGroupLoading(true); DocumentServer.fetchDocumentGroup({ uuid: promptForUuid }, {}) .then(data => { if (!isMounted()) return; @@ -100,37 +147,12 @@ const DownloadDocumentsScreen: React.FC = ({ dismissPromptForUuid?.(); if (!isMounted()) return; - setIsGroupLoading(false); + setIsSpecificGroupLoading(false); }); }; - const loadLocalDocumentGroups = () => { - setIsLoading(true); - setIsLocalGroupsLoading(true); - - let data: DocumentGroup[] = []; - try { - data = DocumentProcessor.loadLocalDocumentRoot() - .map(it => DocumentGroup.clone(it, {includeChildren: true, includeParent: false})) - } catch (error) { - rollbar.error("Cannot load local document groups", sanitizeErrorForRollbar(error)); - return alertAndThrow(error); - } - - if (!isMounted()) return; - - setLocalGroups(data); - - if (filterLanguage === "") { - setFilterLanguage(DocumentProcessor.determineDefaultFilterLanguage(data)); - } - - setIsLoading(false); - setIsLocalGroupsLoading(false); - }; - - const fetchDocumentGroups = () => { - setIsLoading(true); + const fetchServerDocumentGroups = () => { + setIsServerDataLoading(true); DocumentServer.fetchDocumentGroups() .then(data => { if (!isMounted()) return; @@ -145,7 +167,7 @@ const DownloadDocumentsScreen: React.FC = ({ }) .finally(() => { if (!isMounted()) return; - setIsLoading(false); + setIsServerDataLoading(false); }); }; @@ -171,17 +193,13 @@ const DownloadDocumentsScreen: React.FC = ({ }; const onDocumentGroupPress = (group: ServerDocumentGroup) => { - if (isLoading || isPopupOpen()) { - return; - } + if (isProcessingLocalData || isPopupOpen()) return; setRequestDownloadForGroup(group); }; const onLocalDocumentGroupPress = (group: LocalDocumentGroup) => { - if (isLoading || isPopupOpen()) { - return; - } + if (isProcessingLocalData || isPopupOpen()) return; if (DocumentProcessor.hasUpdate(serverGroups, group)) { const serverGroup = DocumentProcessor.getMatchingServerGroup(serverGroups, group); @@ -197,7 +215,7 @@ const DownloadDocumentsScreen: React.FC = ({ const group = requestDownloadForGroup; setRequestDownloadForGroup(undefined); - if (isLoading || group === undefined) return; + if (isProcessingLocalData || group === undefined) return; const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); if (isUpdating) return; @@ -209,7 +227,7 @@ const DownloadDocumentsScreen: React.FC = ({ const group = requestUpdateForGroup; setRequestUpdateForGroup(undefined); - if (isLoading || group === undefined) return; + if (isProcessingLocalData || group === undefined) return; const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); if (isUpdating) return; @@ -222,12 +240,12 @@ const DownloadDocumentsScreen: React.FC = ({ const saveDocumentGroup = (group: ServerDocumentGroup, isUpdate: boolean) => { if (!isMounted()) return; - setIsLoading(true); + setIsProcessingLocalData(true); updaterContext.addDocumentGroupUpdating(group); const call = isUpdate ? DocumentUpdater.fetchAndUpdateDocumentGroup(group) - : DocumentUpdater.fetchAndSaveDocumentGroup(group) + : DocumentUpdater.fetchAndSaveDocumentGroup(group); call .then(() => Alert.alert("Success", `${group.name} ${isUpdate ? "updated" : "added"}!`)) @@ -246,9 +264,7 @@ const DownloadDocumentsScreen: React.FC = ({ }) .finally(() => { if (!isMounted()) return; - setLocalGroups([]); - setIsLoading(false); - loadLocalDocumentGroups(); + setIsProcessingLocalData(false); }) .finally(() => { // Do this here after the state has been called, otherwise we get realm invalidation errors @@ -260,7 +276,7 @@ const DownloadDocumentsScreen: React.FC = ({ const group = requestDeleteForGroup; setRequestDeleteForGroup(undefined); - if (isLoading || group === undefined) return; + if (isProcessingLocalData || group === undefined) return; const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); if (isUpdating) { @@ -272,16 +288,13 @@ const DownloadDocumentsScreen: React.FC = ({ }; const deleteDocumentGroup = (group: LocalDocumentGroup) => { - setIsLoading(true); + setIsProcessingLocalData(true); updaterContext.removeDocumentGroupUpdating(group); const result = DocumentProcessor.deleteDocumentGroup(group); result.alert(); + setIsProcessingLocalData(false); result.throwIfException(); - - if (!isMounted()) return; - - loadLocalDocumentGroups(); }; const getAllLanguagesFromGroups = (groups: ServerDocumentGroup[]) => { @@ -301,71 +314,69 @@ const DownloadDocumentsScreen: React.FC = ({ const isOfSelectedLanguage = (it: { language: string }) => filterLanguage === ShowAllLanguagesValue || it.language.toUpperCase() === filterLanguage.toUpperCase(); - return ( - - setRequestDownloadForGroup(undefined)} - onConfirm={onConfirmDownloadDocumentGroup} - invertConfirmColor={true} - message={`Download documents for ${requestDownloadForGroup?.name}?`} /> - - setRequestUpdateForGroup(undefined)} - onConfirm={onConfirmUpdateDocumentGroup} - invertConfirmColor={true} - message={`Update ${requestUpdateForGroup?.name}?`} /> - - setRequestDeleteForGroup(undefined)} - onConfirm={onConfirmDeleteDocumentGroup} - message={`Delete all documents for ${requestDeleteForGroup?.name}?`} /> - - Select documents to download or delete: - - - - }> - - {localGroups - .filter(isOfSelectedLanguage) - .map((group: LocalDocumentGroup) => - )} - - {serverGroups - .filter(it => !DocumentProcessor.isGroupLocal(localGroups, it)) - .filter(isOfSelectedLanguage) - .map((group: ServerDocumentGroup) => - )} - - {serverGroups.length > 0 ? undefined : - - {isLoading || isGroupLoading ? "Loading..." : "No online data available..."} - - } - {isLoading || serverGroups.length === 0 || serverGroups.filter(isOfSelectedLanguage).length > 0 ? undefined : - - No documents found for language "{languageAbbreviationToFullName(filterLanguage)}"... - - } - - - ); + return + setRequestDownloadForGroup(undefined)} + onConfirm={onConfirmDownloadDocumentGroup} + invertConfirmColor={true} + message={`Download documents for ${requestDownloadForGroup?.name}?`} /> + + setRequestUpdateForGroup(undefined)} + onConfirm={onConfirmUpdateDocumentGroup} + invertConfirmColor={true} + message={`Update ${requestUpdateForGroup?.name}?`} /> + + setRequestDeleteForGroup(undefined)} + onConfirm={onConfirmDeleteDocumentGroup} + message={`Delete all documents for ${requestDeleteForGroup?.name}?`} /> + + Select documents to download or delete: + + + + }> + + {localGroups + .filter(isOfSelectedLanguage) + .map((group: LocalDocumentGroup) => + )} + + {serverGroups + .filter(it => !DocumentProcessor.isGroupLocal(localGroups, it)) + .filter(isOfSelectedLanguage) + .map((group: ServerDocumentGroup) => + )} + + {serverGroups.length > 0 ? undefined : + + {isServerDataLoading || isSpecificGroupLoading ? "Loading..." : "No online data available..."} + + } + {isLocalDataLoading || isServerDataLoading || serverGroups.length === 0 || serverGroups.filter(isOfSelectedLanguage).length > 0 ? undefined : + + No documents found for language "{languageAbbreviationToFullName(filterLanguage)}"... + + } + + ; }; export default DownloadDocumentsScreen; diff --git a/source/gui/screens/downloads/DownloadSongsScreen.tsx b/source/gui/screens/downloads/DownloadSongsScreen.tsx index 8e8d07d4..f3373994 100644 --- a/source/gui/screens/downloads/DownloadSongsScreen.tsx +++ b/source/gui/screens/downloads/DownloadSongsScreen.tsx @@ -9,7 +9,7 @@ import { DeepLinking } from "../../../logic/deeplinking"; import { alertAndThrow, languageAbbreviationToFullName, sanitizeErrorForRollbar } from "../../../logic/utils"; import { itemCountPerLanguage } from "./common"; import { ThemeContextProps, useTheme } from "../../components/providers/ThemeProvider"; -import { useIsMounted } from "../../components/utils"; +import { debounce, useIsMounted } from "../../components/utils"; import { Alert, RefreshControl, @@ -24,6 +24,9 @@ import LanguageSelectBar, { ShowAllLanguagesValue } from "./LanguageSelectBar"; import UrlLink from "../../components/UrlLink"; import { SongUpdater } from "../../../logic/songs/updater/songUpdater"; import { useUpdaterContext } from "../../components/providers/UpdaterContextProvider"; +import Db from "../../../logic/db/db"; +import { SongBundleSchema } from "../../../logic/db/models/SongsSchema"; +import { CollectionChangeSet, OrderedCollection } from "realm"; interface ComponentProps { setIsProcessing?: (value: boolean) => void; @@ -31,11 +34,17 @@ interface ComponentProps { dismissPromptForUuid?: () => void; } -const DownloadSongsScreen: React.FC = ({ setIsProcessing, promptForUuid, dismissPromptForUuid }) => { +const DownloadSongsScreen: React.FC = ({ + setIsProcessing, + promptForUuid, + dismissPromptForUuid + }) => { const isMounted = useIsMounted(); - const [isLoading, setIsLoading] = useState(false); - const [isLocalBundlesLoading, setIsLocalBundlesLoading] = useState(true); - const [isBundleLoading, setIsBundleLoading] = useState(false); + const [isProcessingLocalData, setIsProcessingLocalData] = useState(false); + const [isServerDataLoading, setIsServerDataLoading] = useState(false); + const [isLocalDataLoading, setIsLocalDataLoading] = useState(true); + const [isSpecificBundleLoading, setIsSpecificBundleLoading] = useState(false); + const [serverBundles, setServerBundles] = useState([]); const [localBundles, setLocalBundles] = useState([]); const [requestDownloadForBundle, setRequestDownloadForBundle] = useState(undefined); @@ -51,33 +60,71 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt }, []); const onOpen = () => { - loadLocalSongBundles(); - fetchSongBundles(); + fetchServerSongBundles(); + try { + Db.songs.realm().objects(SongBundleSchema.name).addListener(onCollectionChange); + } catch (error) { + rollbar.error("Failed to handle SongBundle collection change", sanitizeErrorForRollbar(error)); + } }; const onClose = () => { + Db.songs.realm().objects(SongBundleSchema.name).removeListener(onCollectionChange); }; useEffect(() => { if (!isMounted()) return; // Let user navigate when the screen is still loading the data - if (serverBundles.length === 0) { - return; - } - setIsProcessing?.(isLoading); - }, [isLoading]); + if (serverBundles.length === 0) return; + + setIsProcessing?.(isProcessingLocalData); + }, [isProcessingLocalData]); useEffect(() => { - if (isLocalBundlesLoading) return; + if (isLocalDataLoading) return; loadAndPromptSpecificBundle(); - }, [promptForUuid, isLocalBundlesLoading]); + }, [promptForUuid, isLocalDataLoading]); + + const processLocalDataChanges = (collection: OrderedCollection & SongBundle>) => { + if (!isMounted()) return; + setIsLocalDataLoading(true); + + try { + const data: SongBundle[] = collection + .sorted(`name`) + .map(it => SongBundle.clone(it, { includeSongs: true, includeVerses: false })) + + const distinctData: SongBundle[] = []; + data.forEach(bundle => { + if (distinctData.some(it => it.uuid == bundle.uuid)) return; + distinctData.push(bundle); + }) + + setLocalBundles(distinctData); + + if (filterLanguage === "") { + setFilterLanguage(SongProcessor.determineDefaultFilterLanguage(distinctData)); + } + } catch (error) { + rollbar.error("Failed to load local SongBundles from collection change", sanitizeErrorForRollbar(error)); + } + + setIsLocalDataLoading(false); + }; + + const processLocalDataChangesDebounced = debounce(processLocalDataChanges, 300); + + const onCollectionChange = (collection: OrderedCollection & SongBundle>, changes: CollectionChangeSet) => { + if (!isMounted()) return; + processLocalDataChangesDebounced(collection, changes); + } const loadAndPromptSpecificBundle = () => { if (!promptForUuid) return; if (localBundles.find(it => it.uuid === promptForUuid)) return; - setIsBundleLoading(true); + setIsSpecificBundleLoading(true); Server.fetchSongBundle({ uuid: promptForUuid }, {}) .then(data => { if (!isMounted()) return; @@ -98,37 +145,12 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt dismissPromptForUuid?.(); if (!isMounted()) return; - setIsBundleLoading(false); + setIsSpecificBundleLoading(false); }); }; - const loadLocalSongBundles = () => { - setIsLoading(true); - setIsLocalBundlesLoading(true); - - let data: SongBundle[] = []; - try { - data = SongProcessor.loadLocalSongBundles() - .map(it => SongBundle.clone(it, { includeSongs: true, includeVerses: false })) - } catch (error) { - rollbar.error("Cannot load local song bundles", sanitizeErrorForRollbar(error)); - return alertAndThrow(error); - } - - if (!isMounted()) return; - - setLocalBundles(data); - - if (filterLanguage === "") { - setFilterLanguage(SongProcessor.determineDefaultFilterLanguage(data)); - } - - setIsLoading(false); - setIsLocalBundlesLoading(false); - }; - - const fetchSongBundles = () => { - setIsLoading(true); + const fetchServerSongBundles = () => { + setIsServerDataLoading(true); Server.fetchSongBundles() .then(data => { if (!isMounted()) return; @@ -143,7 +165,7 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt }) .finally(() => { if (!isMounted()) return; - setIsLoading(false); + setIsServerDataLoading(false); }); }; @@ -169,17 +191,13 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt }; const onSongBundlePress = (bundle: ServerSongBundle) => { - if (isLoading || isPopupOpen()) { - return; - } + if (isProcessingLocalData || isPopupOpen()) return; setRequestDownloadForBundle(bundle); }; const onLocalSongBundlePress = (bundle: LocalSongBundle) => { - if (isLoading || isPopupOpen()) { - return; - } + if (isProcessingLocalData || isPopupOpen()) return; if (SongProcessor.hasUpdate(serverBundles, bundle)) { const serverBundle = SongProcessor.getMatchingServerBundle(serverBundles, bundle); @@ -195,7 +213,7 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt const bundle = requestDownloadForBundle; setRequestDownloadForBundle(undefined); - if (isLoading || bundle === undefined) return; + if (isProcessingLocalData || bundle === undefined) return; const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); if (isUpdating) return; @@ -207,7 +225,7 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt const bundle = requestUpdateForBundle; setRequestUpdateForBundle(undefined); - if (isLoading || bundle === undefined) return; + if (isProcessingLocalData || bundle === undefined) return; const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); if (isUpdating) return; @@ -220,7 +238,7 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt const saveSongBundle = (bundle: ServerSongBundle, isUpdate: boolean) => { if (!isMounted()) return; - setIsLoading(true); + setIsProcessingLocalData(true); updaterContext.addSongBundleUpdating(bundle); const call = isUpdate @@ -244,9 +262,7 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt }) .finally(() => { if (!isMounted()) return; - setLocalBundles([]); - setIsLoading(false); - loadLocalSongBundles(); + setIsProcessingLocalData(false); }) .finally(() => { // Do this here after the state has been called, otherwise we get realm invalidation errors @@ -258,7 +274,7 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt const bundle = requestDeleteForBundle; setRequestDeleteForBundle(undefined); - if (isLoading || bundle === undefined) return; + if (isProcessingLocalData || bundle === undefined) return; const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); if (isUpdating) { @@ -270,7 +286,7 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt }; const deleteSongBundle = (bundle: LocalSongBundle) => { - setIsLoading(true); + setIsProcessingLocalData(true); updaterContext.removeSongBundleUpdating(bundle); try { @@ -278,11 +294,11 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt Alert.alert("Success", successMessage); } catch (error) { alertAndThrow(error); + } finally { + if (isMounted()) { + setIsProcessingLocalData(false); + } } - - if (!isMounted()) return; - - loadLocalSongBundles(); }; const getAllLanguagesFromBundles = (bundles: ServerSongBundle[]) => { @@ -302,83 +318,81 @@ const DownloadSongsScreen: React.FC = ({ setIsProcessing, prompt const isOfSelectedLanguage = (it: { language: string }) => filterLanguage === ShowAllLanguagesValue || it.language.toUpperCase() === filterLanguage.toUpperCase(); - return ( - - setRequestDownloadForBundle(undefined)} - onConfirm={onConfirmDownloadSongBundle} - invertConfirmColor={true} - message={`Download songs for ${requestDownloadForBundle?.name}?`} /> - - setRequestUpdateForBundle(undefined)} - onConfirm={onConfirmUpdateSongBundle} - invertConfirmColor={true} - message={`Update ${requestUpdateForBundle?.name}?`} /> - - setRequestDeleteForBundle(undefined)} - onConfirm={onConfirmDeleteSongBundle} - message={`Delete all songs for ${requestDeleteForBundle?.name}?`} /> - - - We are still sorting out all the song - licenses, so we trust that you take the - responsibility to make sure you have the correct licenses for the songs you download. - - - If you want to download a song bundle which is not displayed, please feel free to - - contact us - . - - - Select a song bundle to download or delete: - - - - }> - - {localBundles - .filter(isOfSelectedLanguage) - .map((bundle: LocalSongBundle) => - )} - - {serverBundles - .filter(it => !SongProcessor.isBundleLocal(localBundles, it)) - .filter(isOfSelectedLanguage) - .map((bundle: ServerSongBundle) => - )} - - {serverBundles.length > 0 ? undefined : - - {isLoading || isBundleLoading ? "Loading..." : "No online data available..."} - - } - {isLoading || serverBundles.length === 0 || serverBundles.filter(isOfSelectedLanguage).length > 0 ? undefined : - - No bundles found for language "{languageAbbreviationToFullName(filterLanguage)}"... - - } - - - ); + return + setRequestDownloadForBundle(undefined)} + onConfirm={onConfirmDownloadSongBundle} + invertConfirmColor={true} + message={`Download songs for ${requestDownloadForBundle?.name}?`} /> + + setRequestUpdateForBundle(undefined)} + onConfirm={onConfirmUpdateSongBundle} + invertConfirmColor={true} + message={`Update ${requestUpdateForBundle?.name}?`} /> + + setRequestDeleteForBundle(undefined)} + onConfirm={onConfirmDeleteSongBundle} + message={`Delete all songs for ${requestDeleteForBundle?.name}?`} /> + + + We are still sorting out all the song + licenses, so we trust that you take the + responsibility to make sure you have the correct licenses for the songs you download. + + + If you want to download a song bundle which is not displayed, please feel free to + + contact us + . + + + Select a song bundle to download or delete: + + + + }> + + {localBundles + .filter(isOfSelectedLanguage) + .map((bundle: LocalSongBundle) => + )} + + {serverBundles + .filter(it => !SongProcessor.isBundleLocal(localBundles, it)) + .filter(isOfSelectedLanguage) + .map((bundle: ServerSongBundle) => + )} + + {serverBundles.length > 0 ? undefined : + + {isServerDataLoading || isSpecificBundleLoading ? "Loading..." : "No online data available..."} + + } + {isLocalDataLoading || isServerDataLoading || serverBundles.length === 0 || serverBundles.filter(isOfSelectedLanguage).length > 0 ? undefined : + + No bundles found for language "{languageAbbreviationToFullName(filterLanguage)}"... + + } + + ; }; export default DownloadSongsScreen; From e1e25ec22673272419659dd19aec54a9b7d74556 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 25 Nov 2024 11:30:02 +0200 Subject: [PATCH 49/51] fix(updater): Ignore items with no UUID (old version). --- source/logic/documents/updater/documentAutoUpdater.ts | 3 ++- source/logic/songs/updater/songAutoUpdater.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/logic/documents/updater/documentAutoUpdater.ts b/source/logic/documents/updater/documentAutoUpdater.ts index c093cdf7..357518a4 100644 --- a/source/logic/documents/updater/documentAutoUpdater.ts +++ b/source/logic/documents/updater/documentAutoUpdater.ts @@ -11,7 +11,8 @@ export namespace DocumentAutoUpdater { removeDocumentGroupUpdating: (bundle: { uuid: string }) => void, mayUseNetwork: () => boolean ) => { - const groups = DocumentProcessor.loadLocalDocumentRoot(); + const groups = DocumentProcessor.loadLocalDocumentRoot() + .filter(it => it.uuid.length > 0); if (groups.length == 0) return; const updates = await DocumentServer.fetchDocumentGroupUpdates(); diff --git a/source/logic/songs/updater/songAutoUpdater.ts b/source/logic/songs/updater/songAutoUpdater.ts index 1b9652c9..3f752b9e 100644 --- a/source/logic/songs/updater/songAutoUpdater.ts +++ b/source/logic/songs/updater/songAutoUpdater.ts @@ -11,7 +11,8 @@ export namespace SongAutoUpdater { removeSongBundleUpdating: (bundle: { uuid: string }) => void, mayUseNetwork: () => boolean ) => { - const bundles = SongProcessor.loadLocalSongBundles(); + const bundles = SongProcessor.loadLocalSongBundles() + .filter(it => it.uuid.length > 0); if (bundles.length == 0) return; const updates = await Server.fetchSongBundleUpdates(); From c4aa206335d25b22c6ba3dfe8eba8b3c07a8da61 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 25 Nov 2024 11:47:42 +0200 Subject: [PATCH 50/51] refactor(downloads): Made two screens share common names so we can keep code the same easier. --- .../downloads/DownloadDocumentsScreen.tsx | 230 +++++++++--------- .../screens/downloads/DownloadSongsScreen.tsx | 230 +++++++++--------- 2 files changed, 234 insertions(+), 226 deletions(-) diff --git a/source/gui/screens/downloads/DownloadDocumentsScreen.tsx b/source/gui/screens/downloads/DownloadDocumentsScreen.tsx index ce9e86d8..96133d7b 100644 --- a/source/gui/screens/downloads/DownloadDocumentsScreen.tsx +++ b/source/gui/screens/downloads/DownloadDocumentsScreen.tsx @@ -26,6 +26,10 @@ import Db from "../../../logic/db/db"; import { DocumentGroupSchema } from "../../../logic/db/models/DocumentsSchema"; import { CollectionChangeSet, OrderedCollection } from "realm"; +type ServerDataType = ServerDocumentGroup; +type LocalDataType = LocalDocumentGroup; +type ItemType = DocumentGroup; + interface ComponentProps { setIsProcessing?: (value: boolean) => void; promptForUuid?: string; @@ -41,13 +45,13 @@ const DownloadDocumentsScreen: React.FC = ({ const [isProcessingLocalData, setIsProcessingLocalData] = useState(false); const [isServerDataLoading, setIsServerDataLoading] = useState(false); const [isLocalDataLoading, setIsLocalDataLoading] = useState(true); - const [isSpecificGroupLoading, setIsSpecificGroupLoading] = useState(false); + const [isSpecificItemLoading, setIsSpecificItemLoading] = useState(false); - const [serverGroups, setServerGroups] = useState([]); - const [localGroups, setLocalGroups] = useState([]); - const [requestDownloadForGroup, setRequestDownloadForGroup] = useState(undefined); - const [requestUpdateForGroup, setRequestUpdateForGroup] = useState(undefined); - const [requestDeleteForGroup, setRequestDeleteForGroup] = useState(undefined); + const [serverData, setServerData] = useState([]); + const [localData, setLocalData] = useState([]); + const [requestDownloadForItem, setRequestDownloadForItem] = useState(undefined); + const [requestUpdateForItem, setRequestUpdateForItem] = useState(undefined); + const [requestDeleteForItem, setRequestDeleteForItem] = useState(undefined); const [filterLanguage, setFilterLanguage] = useState(""); const updaterContext = useUpdaterContext(); const styles = createStyles(useTheme()); @@ -58,9 +62,9 @@ const DownloadDocumentsScreen: React.FC = ({ }, []); const onOpen = () => { - fetchServerDocumentGroups(); + fetchServerData(); try { - Db.documents.realm().objects(DocumentGroupSchema.name) + Db.documents.realm().objects(DocumentGroupSchema.name) .filtered(`isRoot = true`) .addListener(onCollectionChange); } catch (error) { @@ -69,7 +73,7 @@ const DownloadDocumentsScreen: React.FC = ({ }; const onClose = () => { - Db.documents.realm().objects(DocumentGroupSchema.name) + Db.documents.realm().objects(DocumentGroupSchema.name) .filtered(`isRoot = true`) .removeListener(onCollectionChange); }; @@ -78,32 +82,32 @@ const DownloadDocumentsScreen: React.FC = ({ if (!isMounted()) return; // Let user navigate when the screen is still loading the data - if (serverGroups.length === 0) return; + if (serverData.length === 0) return; setIsProcessing?.(isProcessingLocalData); }, [isProcessingLocalData]); useEffect(() => { if (isLocalDataLoading) return; - loadAndPromptSpecificGroup(); + loadAndPromptSpecificItem(); }, [promptForUuid, isLocalDataLoading]); - const processLocalDataChanges = (collection: OrderedCollection & DocumentGroup>) => { + const processLocalDataChanges = (collection: OrderedCollection & ItemType>) => { if (!isMounted()) return; setIsLocalDataLoading(true); try { - const data: DocumentGroup[] = collection + const data: ItemType[] = collection .sorted(`name`) .map(it => DocumentGroup.clone(it, { includeChildren: true, includeParent: false })) - const distinctData: DocumentGroup[] = []; - data.forEach(bundle => { - if (distinctData.some(it => it.uuid == bundle.uuid)) return; - distinctData.push(bundle); + const distinctData: ItemType[] = []; + data.forEach(item => { + if (distinctData.some(it => it.uuid == item.uuid)) return; + distinctData.push(item); }) - setLocalGroups(distinctData); + setLocalData(distinctData); if (filterLanguage === "") { setFilterLanguage(DocumentProcessor.determineDefaultFilterLanguage(distinctData)); @@ -117,24 +121,24 @@ const DownloadDocumentsScreen: React.FC = ({ const processLocalDataChangesDebounced = debounce(processLocalDataChanges, 300); - const onCollectionChange = (collection: OrderedCollection & DocumentGroup>, changes: CollectionChangeSet) => { + const onCollectionChange = (collection: OrderedCollection & ItemType>, changes: CollectionChangeSet) => { if (!isMounted()) return; processLocalDataChangesDebounced(collection, changes); } - const loadAndPromptSpecificGroup = () => { + const loadAndPromptSpecificItem = () => { if (!promptForUuid) return; - if (localGroups.find(it => it.uuid === promptForUuid)) return; + if (localData.find(it => it.uuid === promptForUuid)) return; - setIsSpecificGroupLoading(true); + setIsSpecificItemLoading(true); DocumentServer.fetchDocumentGroup({ uuid: promptForUuid }, {}) .then(data => { if (!isMounted()) return; - if (localGroups.find(it => it.uuid === promptForUuid)) return; + if (localData.find(it => it.uuid === promptForUuid)) return; setFilterLanguage(data.language); - setRequestDownloadForGroup(data); + setRequestDownloadForItem(data); }) .catch(error => { if (error.name == "TypeError" && error.message == "Network request failed") { @@ -147,16 +151,16 @@ const DownloadDocumentsScreen: React.FC = ({ dismissPromptForUuid?.(); if (!isMounted()) return; - setIsSpecificGroupLoading(false); + setIsSpecificItemLoading(false); }); }; - const fetchServerDocumentGroups = () => { + const fetchServerData = () => { setIsServerDataLoading(true); DocumentServer.fetchDocumentGroups() .then(data => { if (!isMounted()) return; - setServerGroups(data); + setServerData(data); }) .catch(error => { if (error.name == "TypeError" && error.message == "Network request failed") { @@ -172,94 +176,94 @@ const DownloadDocumentsScreen: React.FC = ({ }; const applyUuidUpdateForPullRequest8 = () => { - DocumentUpdater.updateLocalGroupsWithUuid(localGroups, serverGroups); + DocumentUpdater.updateLocalGroupsWithUuid(localData, serverData); }; - useEffect(applyUuidUpdateForPullRequest8, [serverGroups]); + useEffect(applyUuidUpdateForPullRequest8, [serverData]); - const isPopupOpen = () => requestDeleteForGroup !== undefined || requestDownloadForGroup !== undefined; + const isPopupOpen = () => requestDeleteForItem !== undefined || requestDownloadForItem !== undefined; - const shareDocumentGroup = (it: LocalDocumentGroup | ServerDocumentGroup) => { + const shareItem = (it: LocalDataType | ServerDataType) => { return Share.share({ message: `Download documents for ${it.name}\n\n${DeepLinking.generateLinkForDocumentGroup(it)}` }) - .then(r => rollbar.debug("Document group shared.", { + .then(r => rollbar.debug("DocumentGroup shared.", { shareAction: r, bundle: it })) - .catch(error => rollbar.warning("Failed to share document group", { + .catch(error => rollbar.warning("Failed to share DocumentGroup", { ...sanitizeErrorForRollbar(error), bundle: it })); }; - const onDocumentGroupPress = (group: ServerDocumentGroup) => { + const onServerItemPress = (item: ServerDataType) => { if (isProcessingLocalData || isPopupOpen()) return; - setRequestDownloadForGroup(group); + setRequestDownloadForItem(item); }; - const onLocalDocumentGroupPress = (group: LocalDocumentGroup) => { + const onLocalItemPress = (item: LocalDataType) => { if (isProcessingLocalData || isPopupOpen()) return; - if (DocumentProcessor.hasUpdate(serverGroups, group)) { - const serverGroup = DocumentProcessor.getMatchingServerGroup(serverGroups, group); - if (serverGroup !== undefined) { - return setRequestUpdateForGroup(serverGroup); + if (DocumentProcessor.hasUpdate(serverData, item)) { + const serverItem = DocumentProcessor.getMatchingServerGroup(serverData, item); + if (serverItem !== undefined) { + return setRequestUpdateForItem(serverItem); } } - setRequestDeleteForGroup(group); + setRequestDeleteForItem(item); }; - const onConfirmDownloadDocumentGroup = () => { - const group = requestDownloadForGroup; - setRequestDownloadForGroup(undefined); + const onConfirmDownload = () => { + const item = requestDownloadForItem; + setRequestDownloadForItem(undefined); - if (isProcessingLocalData || group === undefined) return; + if (isProcessingLocalData || item === undefined) return; - const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); + const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === item.uuid); if (isUpdating) return; - downloadDocumentGroup(group); + downloadItem(item); }; - const onConfirmUpdateDocumentGroup = () => { - const group = requestUpdateForGroup; - setRequestUpdateForGroup(undefined); + const onConfirmUpdate = () => { + const item = requestUpdateForItem; + setRequestUpdateForItem(undefined); - if (isProcessingLocalData || group === undefined) return; + if (isProcessingLocalData || item === undefined) return; - const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); + const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === item.uuid); if (isUpdating) return; - updateDocumentGroup(group); + updateItem(item); }; - const downloadDocumentGroup = (group: ServerDocumentGroup) => saveDocumentGroup(group, false); - const updateDocumentGroup = (group: ServerDocumentGroup) => saveDocumentGroup(group, true); + const downloadItem = (item: ServerDataType) => saveItem(item, false); + const updateItem = (item: ServerDataType) => saveItem(item, true); - const saveDocumentGroup = (group: ServerDocumentGroup, isUpdate: boolean) => { + const saveItem = (item: ServerDataType, isUpdate: boolean) => { if (!isMounted()) return; setIsProcessingLocalData(true); - updaterContext.addDocumentGroupUpdating(group); + updaterContext.addDocumentGroupUpdating(item); const call = isUpdate - ? DocumentUpdater.fetchAndUpdateDocumentGroup(group) - : DocumentUpdater.fetchAndSaveDocumentGroup(group); + ? DocumentUpdater.fetchAndUpdateDocumentGroup(item) + : DocumentUpdater.fetchAndSaveDocumentGroup(item); call - .then(() => Alert.alert("Success", `${group.name} ${isUpdate ? "updated" : "added"}!`)) + .then(() => Alert.alert("Success", `${item.name} ${isUpdate ? "updated" : "added"}!`)) .catch(error => { - rollbar.error("Failed to import document group", { + rollbar.error("Failed to import DocumentGroup", { ...sanitizeErrorForRollbar(error), isUpdate: isUpdate, - group: group, + item: item, }); if (error.name == "TypeError" && error.message == "Network request failed") { - Alert.alert("Error", `Could not ${isUpdate ? "update" : "download"} ${group.name}. Make sure your internet connection is working or try again later.`) + Alert.alert("Error", `Could not ${isUpdate ? "update" : "download"} ${item.name}. Make sure your internet connection is working or try again later.`); } else { - Alert.alert("Error", `Could not ${isUpdate ? "update" : "download"} ${group.name}. \n${error}\n\nTry again later.`); + Alert.alert("Error", `Could not ${isUpdate ? "update" : "download"} ${item.name}. \n${error}\n\nTry again later.`); } }) .finally(() => { @@ -268,37 +272,37 @@ const DownloadDocumentsScreen: React.FC = ({ }) .finally(() => { // Do this here after the state has been called, otherwise we get realm invalidation errors - updaterContext.removeDocumentGroupUpdating(group); + updaterContext.removeDocumentGroupUpdating(item); }) }; - const onConfirmDeleteDocumentGroup = () => { - const group = requestDeleteForGroup; - setRequestDeleteForGroup(undefined); + const onConfirmDelete = () => { + const item = requestDeleteForItem; + setRequestDeleteForItem(undefined); - if (isProcessingLocalData || group === undefined) return; + if (isProcessingLocalData || item === undefined) return; - const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === group.uuid); + const isUpdating = updaterContext.documentGroupsUpdating.some(it => it.uuid === item.uuid); if (isUpdating) { Alert.alert("Could not delete", "This group is being updated. Please wait until this operation is done and try again.") return; } - deleteDocumentGroup(group); + deleteItem(item); }; - const deleteDocumentGroup = (group: LocalDocumentGroup) => { + const deleteItem = (item: LocalDataType) => { setIsProcessingLocalData(true); - updaterContext.removeDocumentGroupUpdating(group); + updaterContext.removeDocumentGroupUpdating(item); - const result = DocumentProcessor.deleteDocumentGroup(group); + const result = DocumentProcessor.deleteDocumentGroup(item); result.alert(); setIsProcessingLocalData(false); result.throwIfException(); }; - const getAllLanguagesFromGroups = (groups: ServerDocumentGroup[]) => { - const languages = DocumentProcessor.getAllLanguagesFromDocumentGroups(groups); + const getAllLanguagesFromServerData = (data: ServerDataType[]) => { + const languages = DocumentProcessor.getAllLanguagesFromDocumentGroups(data); if (languages.length > 0 && filterLanguage === "") { if (languages.includes("AF")) { @@ -315,62 +319,62 @@ const DownloadDocumentsScreen: React.FC = ({ filterLanguage === ShowAllLanguagesValue || it.language.toUpperCase() === filterLanguage.toUpperCase(); return - setRequestDownloadForGroup(undefined)} - onConfirm={onConfirmDownloadDocumentGroup} + setRequestDownloadForItem(undefined)} + onConfirm={onConfirmDownload} invertConfirmColor={true} - message={`Download documents for ${requestDownloadForGroup?.name}?`} /> + message={`Download documents for ${requestDownloadForItem?.name}?`} /> - setRequestUpdateForGroup(undefined)} - onConfirm={onConfirmUpdateDocumentGroup} + setRequestUpdateForItem(undefined)} + onConfirm={onConfirmUpdate} invertConfirmColor={true} - message={`Update ${requestUpdateForGroup?.name}?`} /> + message={`Update ${requestUpdateForItem?.name}?`} /> - setRequestDeleteForGroup(undefined)} - onConfirm={onConfirmDeleteDocumentGroup} - message={`Delete all documents for ${requestDeleteForGroup?.name}?`} /> + setRequestDeleteForItem(undefined)} + onConfirm={onConfirmDelete} + message={`Delete all documents for ${requestDeleteForItem?.name}?`} /> Select documents to download or delete: - + itemCountPerLanguage={itemCountPerLanguage(localData)} /> }> + refreshing={isProcessingLocalData || isSpecificItemLoading || isLocalDataLoading || isServerDataLoading} />}> - {localGroups + {localData .filter(isOfSelectedLanguage) - .map((group: LocalDocumentGroup) => - )} - - {serverGroups - .filter(it => !DocumentProcessor.isGroupLocal(localGroups, it)) + .map((item: LocalDataType) => + )} + + {serverData + .filter(it => !DocumentProcessor.isGroupLocal(localData, it)) .filter(isOfSelectedLanguage) - .map((group: ServerDocumentGroup) => - )} - - {serverGroups.length > 0 ? undefined : + .map((item: ServerDataType) => + )} + + {serverData.length > 0 ? undefined : - {isServerDataLoading || isSpecificGroupLoading ? "Loading..." : "No online data available..."} + {isServerDataLoading || isSpecificItemLoading ? "Loading..." : "No online data available..."} } - {isLocalDataLoading || isServerDataLoading || serverGroups.length === 0 || serverGroups.filter(isOfSelectedLanguage).length > 0 ? undefined : + {isLocalDataLoading || isServerDataLoading || serverData.length === 0 || serverData.filter(isOfSelectedLanguage).length > 0 ? undefined : No documents found for language "{languageAbbreviationToFullName(filterLanguage)}"... diff --git a/source/gui/screens/downloads/DownloadSongsScreen.tsx b/source/gui/screens/downloads/DownloadSongsScreen.tsx index f3373994..6e91a927 100644 --- a/source/gui/screens/downloads/DownloadSongsScreen.tsx +++ b/source/gui/screens/downloads/DownloadSongsScreen.tsx @@ -28,6 +28,10 @@ import Db from "../../../logic/db/db"; import { SongBundleSchema } from "../../../logic/db/models/SongsSchema"; import { CollectionChangeSet, OrderedCollection } from "realm"; +type ServerDataType = ServerSongBundle; +type LocalDataType = LocalSongBundle; +type ItemType = SongBundle; + interface ComponentProps { setIsProcessing?: (value: boolean) => void; promptForUuid?: string; @@ -43,13 +47,13 @@ const DownloadSongsScreen: React.FC = ({ const [isProcessingLocalData, setIsProcessingLocalData] = useState(false); const [isServerDataLoading, setIsServerDataLoading] = useState(false); const [isLocalDataLoading, setIsLocalDataLoading] = useState(true); - const [isSpecificBundleLoading, setIsSpecificBundleLoading] = useState(false); + const [isSpecificItemLoading, setIsSpecificItemLoading] = useState(false); - const [serverBundles, setServerBundles] = useState([]); - const [localBundles, setLocalBundles] = useState([]); - const [requestDownloadForBundle, setRequestDownloadForBundle] = useState(undefined); - const [requestUpdateForBundle, setRequestUpdateForBundle] = useState(undefined); - const [requestDeleteForBundle, setRequestDeleteForBundle] = useState(undefined); + const [serverData, setServerData] = useState([]); + const [localData, setLocalData] = useState([]); + const [requestDownloadForItem, setRequestDownloadForItem] = useState(undefined); + const [requestUpdateForItem, setRequestUpdateForItem] = useState(undefined); + const [requestDeleteForItem, setRequestDeleteForItem] = useState(undefined); const [filterLanguage, setFilterLanguage] = useState(""); const updaterContext = useUpdaterContext(); const styles = createStyles(useTheme()); @@ -60,48 +64,48 @@ const DownloadSongsScreen: React.FC = ({ }, []); const onOpen = () => { - fetchServerSongBundles(); + fetchServerData(); try { - Db.songs.realm().objects(SongBundleSchema.name).addListener(onCollectionChange); + Db.songs.realm().objects(SongBundleSchema.name).addListener(onCollectionChange); } catch (error) { rollbar.error("Failed to handle SongBundle collection change", sanitizeErrorForRollbar(error)); } }; const onClose = () => { - Db.songs.realm().objects(SongBundleSchema.name).removeListener(onCollectionChange); + Db.songs.realm().objects(SongBundleSchema.name).removeListener(onCollectionChange); }; useEffect(() => { if (!isMounted()) return; // Let user navigate when the screen is still loading the data - if (serverBundles.length === 0) return; + if (serverData.length === 0) return; setIsProcessing?.(isProcessingLocalData); }, [isProcessingLocalData]); useEffect(() => { if (isLocalDataLoading) return; - loadAndPromptSpecificBundle(); + loadAndPromptSpecificItem(); }, [promptForUuid, isLocalDataLoading]); - const processLocalDataChanges = (collection: OrderedCollection & SongBundle>) => { + const processLocalDataChanges = (collection: OrderedCollection & ItemType>) => { if (!isMounted()) return; setIsLocalDataLoading(true); try { - const data: SongBundle[] = collection + const data: ItemType[] = collection .sorted(`name`) .map(it => SongBundle.clone(it, { includeSongs: true, includeVerses: false })) - const distinctData: SongBundle[] = []; - data.forEach(bundle => { - if (distinctData.some(it => it.uuid == bundle.uuid)) return; - distinctData.push(bundle); + const distinctData: ItemType[] = []; + data.forEach(item => { + if (distinctData.some(it => it.uuid == item.uuid)) return; + distinctData.push(item); }) - setLocalBundles(distinctData); + setLocalData(distinctData); if (filterLanguage === "") { setFilterLanguage(SongProcessor.determineDefaultFilterLanguage(distinctData)); @@ -115,24 +119,24 @@ const DownloadSongsScreen: React.FC = ({ const processLocalDataChangesDebounced = debounce(processLocalDataChanges, 300); - const onCollectionChange = (collection: OrderedCollection & SongBundle>, changes: CollectionChangeSet) => { + const onCollectionChange = (collection: OrderedCollection & ItemType>, changes: CollectionChangeSet) => { if (!isMounted()) return; processLocalDataChangesDebounced(collection, changes); } - const loadAndPromptSpecificBundle = () => { + const loadAndPromptSpecificItem = () => { if (!promptForUuid) return; - if (localBundles.find(it => it.uuid === promptForUuid)) return; + if (localData.find(it => it.uuid === promptForUuid)) return; - setIsSpecificBundleLoading(true); + setIsSpecificItemLoading(true); Server.fetchSongBundle({ uuid: promptForUuid }, {}) .then(data => { if (!isMounted()) return; - if (localBundles.find(it => it.uuid === promptForUuid)) return; + if (localData.find(it => it.uuid === promptForUuid)) return; setFilterLanguage(data.language); - setRequestDownloadForBundle(data); + setRequestDownloadForItem(data); }) .catch(error => { if (error.name == "TypeError" && error.message == "Network request failed") { @@ -145,16 +149,16 @@ const DownloadSongsScreen: React.FC = ({ dismissPromptForUuid?.(); if (!isMounted()) return; - setIsSpecificBundleLoading(false); + setIsSpecificItemLoading(false); }); }; - const fetchServerSongBundles = () => { + const fetchServerData = () => { setIsServerDataLoading(true); Server.fetchSongBundles() .then(data => { if (!isMounted()) return; - setServerBundles(data); + setServerData(data); }) .catch(error => { if (error.name == "TypeError" && error.message == "Network request failed") { @@ -170,94 +174,94 @@ const DownloadSongsScreen: React.FC = ({ }; const applyUuidUpdateForPullRequest8 = () => { - SongUpdater.updateLocalBundlesWithUuid(localBundles, serverBundles); + SongUpdater.updateLocalBundlesWithUuid(localData, serverData); }; - useEffect(applyUuidUpdateForPullRequest8, [serverBundles]); + useEffect(applyUuidUpdateForPullRequest8, [serverData]); - const isPopupOpen = () => requestDeleteForBundle !== undefined || requestDownloadForBundle !== undefined; + const isPopupOpen = () => requestDeleteForItem !== undefined || requestDownloadForItem !== undefined; - const shareSongBundle = (it: LocalSongBundle | ServerSongBundle) => { + const shareItem = (it: LocalDataType | ServerDataType) => { return Share.share({ message: `Download songs for ${it.name}\n\n${DeepLinking.generateLinkForSongBundle(it)}` }) - .then(r => rollbar.debug("Song bundle shared.", { + .then(r => rollbar.debug("SongBundle shared.", { shareAction: r, bundle: it })) - .catch(error => rollbar.warning("Failed to share song bundle", { + .catch(error => rollbar.warning("Failed to share SongBundle", { ...sanitizeErrorForRollbar(error), bundle: it })); }; - const onSongBundlePress = (bundle: ServerSongBundle) => { + const onServerItemPress = (item: ServerDataType) => { if (isProcessingLocalData || isPopupOpen()) return; - setRequestDownloadForBundle(bundle); + setRequestDownloadForItem(item); }; - const onLocalSongBundlePress = (bundle: LocalSongBundle) => { + const onLocalItemPress = (item: LocalDataType) => { if (isProcessingLocalData || isPopupOpen()) return; - if (SongProcessor.hasUpdate(serverBundles, bundle)) { - const serverBundle = SongProcessor.getMatchingServerBundle(serverBundles, bundle); - if (serverBundle !== undefined) { - return setRequestUpdateForBundle(serverBundle); + if (SongProcessor.hasUpdate(serverData, item)) { + const serverItem = SongProcessor.getMatchingServerBundle(serverData, item); + if (serverItem !== undefined) { + return setRequestUpdateForItem(serverItem); } } - setRequestDeleteForBundle(bundle); + setRequestDeleteForItem(item); }; - const onConfirmDownloadSongBundle = () => { - const bundle = requestDownloadForBundle; - setRequestDownloadForBundle(undefined); + const onConfirmDownload = () => { + const item = requestDownloadForItem; + setRequestDownloadForItem(undefined); - if (isProcessingLocalData || bundle === undefined) return; + if (isProcessingLocalData || item === undefined) return; - const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); + const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === item.uuid); if (isUpdating) return; - downloadSongBundle(bundle); + downloadItem(item); }; - const onConfirmUpdateSongBundle = () => { - const bundle = requestUpdateForBundle; - setRequestUpdateForBundle(undefined); + const onConfirmUpdate = () => { + const item = requestUpdateForItem; + setRequestUpdateForItem(undefined); - if (isProcessingLocalData || bundle === undefined) return; + if (isProcessingLocalData || item === undefined) return; - const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); + const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === item.uuid); if (isUpdating) return; - updateSongBundle(bundle); + updateItem(item); }; - const downloadSongBundle = (bundle: ServerSongBundle) => saveSongBundle(bundle, false); - const updateSongBundle = (bundle: ServerSongBundle) => saveSongBundle(bundle, true); + const downloadItem = (item: ServerDataType) => saveItem(item, false); + const updateItem = (item: ServerDataType) => saveItem(item, true); - const saveSongBundle = (bundle: ServerSongBundle, isUpdate: boolean) => { + const saveItem = (item: ServerDataType, isUpdate: boolean) => { if (!isMounted()) return; setIsProcessingLocalData(true); - updaterContext.addSongBundleUpdating(bundle); + updaterContext.addSongBundleUpdating(item); const call = isUpdate - ? SongUpdater.fetchAndUpdateSongBundle(bundle) - : SongUpdater.fetchAndSaveSongBundle(bundle); + ? SongUpdater.fetchAndUpdateSongBundle(item) + : SongUpdater.fetchAndSaveSongBundle(item); call - .then(() => Alert.alert("Success", `${bundle.name} ${isUpdate ? "updated" : "added"}!`)) + .then(() => Alert.alert("Success", `${item.name} ${isUpdate ? "updated" : "added"}!`)) .catch(error => { - rollbar.error("Failed to import song bundle", { + rollbar.error("Failed to import SongBundle", { ...sanitizeErrorForRollbar(error), isUpdate: isUpdate, - bundle: bundle, + item: item, }); if (error.name == "TypeError" && error.message == "Network request failed") { - Alert.alert("Error", `Could not ${isUpdate ? "update" : "download"} ${bundle.name}. Make sure your internet connection is working or try again later.`); + Alert.alert("Error", `Could not ${isUpdate ? "update" : "download"} ${item.name}. Make sure your internet connection is working or try again later.`); } else { - Alert.alert("Error", `Could not ${isUpdate ? "update" : "download"} ${bundle.name}. \n${error}\n\nTry again later.`); + Alert.alert("Error", `Could not ${isUpdate ? "update" : "download"} ${item.name}. \n${error}\n\nTry again later.`); } }) .finally(() => { @@ -266,31 +270,31 @@ const DownloadSongsScreen: React.FC = ({ }) .finally(() => { // Do this here after the state has been called, otherwise we get realm invalidation errors - updaterContext.removeSongBundleUpdating(bundle); + updaterContext.removeSongBundleUpdating(item); }) }; - const onConfirmDeleteSongBundle = () => { - const bundle = requestDeleteForBundle; - setRequestDeleteForBundle(undefined); + const onConfirmDelete = () => { + const item = requestDeleteForItem; + setRequestDeleteForItem(undefined); - if (isProcessingLocalData || bundle === undefined) return; + if (isProcessingLocalData || item === undefined) return; - const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === bundle.uuid); + const isUpdating = updaterContext.songBundlesUpdating.some(it => it.uuid === item.uuid); if (isUpdating) { Alert.alert("Could not delete", "This bundle is being updated. Please wait until this operation is done and try again.") return; } - deleteSongBundle(bundle); + deleteItem(item); }; - const deleteSongBundle = (bundle: LocalSongBundle) => { + const deleteItem = (item: LocalDataType) => { setIsProcessingLocalData(true); - updaterContext.removeSongBundleUpdating(bundle); + updaterContext.removeSongBundleUpdating(item); try { - const successMessage = SongProcessor.deleteSongBundle(bundle) + const successMessage = SongProcessor.deleteSongBundle(item) Alert.alert("Success", successMessage); } catch (error) { alertAndThrow(error); @@ -301,8 +305,8 @@ const DownloadSongsScreen: React.FC = ({ } }; - const getAllLanguagesFromBundles = (bundles: ServerSongBundle[]) => { - const languages = SongProcessor.getAllLanguagesFromBundles(bundles); + const getAllLanguagesFromServerData = (data: ServerDataType[]) => { + const languages = SongProcessor.getAllLanguagesFromBundles(data); if (languages.length > 0 && filterLanguage === "") { if (languages.includes("AF")) { @@ -319,22 +323,22 @@ const DownloadSongsScreen: React.FC = ({ filterLanguage === ShowAllLanguagesValue || it.language.toUpperCase() === filterLanguage.toUpperCase(); return - setRequestDownloadForBundle(undefined)} - onConfirm={onConfirmDownloadSongBundle} + setRequestDownloadForItem(undefined)} + onConfirm={onConfirmDownload} invertConfirmColor={true} - message={`Download songs for ${requestDownloadForBundle?.name}?`} /> + message={`Download songs for ${requestDownloadForItem?.name}?`} /> - setRequestUpdateForBundle(undefined)} - onConfirm={onConfirmUpdateSongBundle} + setRequestUpdateForItem(undefined)} + onConfirm={onConfirmUpdate} invertConfirmColor={true} - message={`Update ${requestUpdateForBundle?.name}?`} /> + message={`Update ${requestUpdateForItem?.name}?`} /> - setRequestDeleteForBundle(undefined)} - onConfirm={onConfirmDeleteSongBundle} - message={`Delete all songs for ${requestDeleteForBundle?.name}?`} /> + setRequestDeleteForItem(undefined)} + onConfirm={onConfirmDelete} + message={`Delete all songs for ${requestDeleteForItem?.name}?`} /> We are still sorting out all the song @@ -350,43 +354,43 @@ const DownloadSongsScreen: React.FC = ({ Select a song bundle to download or delete: - + itemCountPerLanguage={itemCountPerLanguage(localData)} /> }> + refreshing={isProcessingLocalData || isSpecificItemLoading || isLocalDataLoading || isServerDataLoading} />}> - {localBundles + {localData .filter(isOfSelectedLanguage) - .map((bundle: LocalSongBundle) => - )} - - {serverBundles - .filter(it => !SongProcessor.isBundleLocal(localBundles, it)) + .map((item: LocalDataType) => + )} + + {serverData + .filter(it => !SongProcessor.isBundleLocal(localData, it)) .filter(isOfSelectedLanguage) - .map((bundle: ServerSongBundle) => - )} - - {serverBundles.length > 0 ? undefined : + .map((item: ServerDataType) => + )} + + {serverData.length > 0 ? undefined : - {isServerDataLoading || isSpecificBundleLoading ? "Loading..." : "No online data available..."} + {isServerDataLoading || isSpecificItemLoading ? "Loading..." : "No online data available..."} } - {isLocalDataLoading || isServerDataLoading || serverBundles.length === 0 || serverBundles.filter(isOfSelectedLanguage).length > 0 ? undefined : + {isLocalDataLoading || isServerDataLoading || serverData.length === 0 || serverData.filter(isOfSelectedLanguage).length > 0 ? undefined : No bundles found for language "{languageAbbreviationToFullName(filterLanguage)}"... From 97116e005cdea2f52bf6797422e7b5768ca4f716 Mon Sep 17 00:00:00 2001 From: "S. Jansen" Date: Mon, 25 Nov 2024 11:49:51 +0200 Subject: [PATCH 51/51] style(downloads): Fixed loading indicator not always visible at first. --- source/gui/screens/downloads/DownloadDocumentsScreen.tsx | 5 ++++- source/gui/screens/downloads/DownloadSongsScreen.tsx | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/source/gui/screens/downloads/DownloadDocumentsScreen.tsx b/source/gui/screens/downloads/DownloadDocumentsScreen.tsx index 96133d7b..ec68be40 100644 --- a/source/gui/screens/downloads/DownloadDocumentsScreen.tsx +++ b/source/gui/screens/downloads/DownloadDocumentsScreen.tsx @@ -401,7 +401,10 @@ const createStyles = ({ colors }: ThemeContextProps) => StyleSheet.create({ color: colors.text.default }, - listContainer: { flex: 1 }, + listContainer: { + flex: 1, + minHeight: 100, + }, emptyListText: { padding: 20, diff --git a/source/gui/screens/downloads/DownloadSongsScreen.tsx b/source/gui/screens/downloads/DownloadSongsScreen.tsx index 6e91a927..728ae183 100644 --- a/source/gui/screens/downloads/DownloadSongsScreen.tsx +++ b/source/gui/screens/downloads/DownloadSongsScreen.tsx @@ -420,7 +420,10 @@ const createStyles = ({ colors }: ThemeContextProps) => StyleSheet.create({ color: colors.text.lighter }, - listContainer: { flex: 1 }, + listContainer: { + flex: 1, + minHeight: 100, + }, emptyListText: { padding: 20,