update expo sdk to 54

This commit is contained in:
tapframe 2025-10-15 02:24:20 +05:30
parent 92aaae40f6
commit 07233ba9ae
20 changed files with 207 additions and 107 deletions

View file

@ -94,11 +94,50 @@ android {
applicationId 'com.nuvio.app' applicationId 'com.nuvio.app'
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 19 versionCode 20
versionName "1.2.4" versionName "1.2.5"
buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\"" buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\""
} }
// Split APKs by architecture and density for smaller downloads
splits {
abi {
enable true
reset()
include "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
universalApk true // Generate universal APK as well
}
density {
enable true
reset()
include "ldpi", "mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
universalApk true // Generate universal APK as well
}
}
// Generate unique version codes for each split APK
def abiVersionCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
def densityVersionCodes = ['ldpi': 1, 'mdpi': 2, 'hdpi': 3, 'xhdpi': 4, 'xxhdpi': 5, 'xxxhdpi': 6]
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def baseVersionCode = 19 // Current versionCode 20from defaultConfig
def abiName = output.getFilter(com.android.build.OutputFile.ABI)
def densityName = output.getFilter(com.android.build.OutputFile.DENSITY)
def versionCode 20= baseVersionCode * 100 // Base multiplier
if (abiName != null) {
versionCode 20+= abiVersionCodes.get(abiName) * 10
}
if (densityName != null) {
versionCode 20+= densityVersionCodes.get(densityName)
}
output.versionCodeOverride = versionCode
}
}
signingConfigs { signingConfigs {
debug { debug {
storeFile file('debug.keystore') storeFile file('debug.keystore')

View file

@ -3,5 +3,5 @@
<string name="expo_splash_screen_resize_mode" translatable="false">contain</string> <string name="expo_splash_screen_resize_mode" translatable="false">contain</string>
<string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string> <string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string>
<string name="expo_system_ui_user_interface_style" translatable="false">dark</string> <string name="expo_system_ui_user_interface_style" translatable="false">dark</string>
<string name="expo_runtime_version">1.2.4</string> <string name="expo_runtime_version">1.2.5</string>
</resources> </resources>

View file

@ -2,7 +2,7 @@
"expo": { "expo": {
"name": "Nuvio", "name": "Nuvio",
"slug": "nuvio", "slug": "nuvio",
"version": "1.2.4", "version": "1.2.5",
"orientation": "default", "orientation": "default",
"backgroundColor": "#020404", "backgroundColor": "#020404",
"icon": "./assets/ios/AppIcon.appiconset/Icon-App-60x60@3x.png", "icon": "./assets/ios/AppIcon.appiconset/Icon-App-60x60@3x.png",
@ -17,7 +17,7 @@
"ios": { "ios": {
"supportsTablet": true, "supportsTablet": true,
"icon": "./assets/ios/AppIcon.appiconset/Icon-App-60x60@3x.png", "icon": "./assets/ios/AppIcon.appiconset/Icon-App-60x60@3x.png",
"buildNumber": "19", "buildNumber": "20",
"infoPlist": { "infoPlist": {
"NSAppTransportSecurity": { "NSAppTransportSecurity": {
"NSAllowsArbitraryLoads": true "NSAllowsArbitraryLoads": true
@ -48,7 +48,7 @@
"WAKE_LOCK" "WAKE_LOCK"
], ],
"package": "com.nuvio.app", "package": "com.nuvio.app",
"versionCode": 19, "versionCode": 20,
"architectures": [ "architectures": [
"arm64-v8a", "arm64-v8a",
"armeabi-v7a", "armeabi-v7a",
@ -94,6 +94,6 @@
"fallbackToCacheTimeout": 30000, "fallbackToCacheTimeout": 30000,
"url": "https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest" "url": "https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest"
}, },
"runtimeVersion": "1.2.4" "runtimeVersion": "1.2.5"
} }
} }

View file

@ -25,9 +25,10 @@
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Nuvio/Images.xcassets; sourceTree = "<group>"; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Nuvio/Images.xcassets; sourceTree = "<group>"; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Nuvio/Info.plist; sourceTree = "<group>"; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Nuvio/Info.plist; sourceTree = "<group>"; };
2DDA95A7458A78E817D9496D /* libPods-Nuvio.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Nuvio.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 2DDA95A7458A78E817D9496D /* libPods-Nuvio.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Nuvio.a"; sourceTree = BUILT_PRODUCTS_DIR; };
49055D6E250FAFA21141FE49 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Nuvio/PrivacyInfo.xcprivacy; sourceTree = "<group>"; }; 49055D6E250FAFA21141FE49 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Nuvio/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
6E0017E5203955A430ABF21B /* Pods-Nuvio.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuvio.release.xcconfig"; path = "Target Support Files/Pods-Nuvio/Pods-Nuvio.release.xcconfig"; sourceTree = "<group>"; }; 6E0017E5203955A430ABF21B /* Pods-Nuvio.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Nuvio.release.xcconfig"; path = "Target Support Files/Pods-Nuvio/Pods-Nuvio.release.xcconfig"; sourceTree = "<group>"; };
6E007C0BAC8C453623E81663 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Nuvio/ExpoModulesProvider.swift"; sourceTree = "<group>"; }; 6E007C0BAC8C453623E81663 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Nuvio/ExpoModulesProvider.swift"; sourceTree = "<group>"; };
73BB213C2E9EEAC700EC03F8 /* NuvioRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = NuvioRelease.entitlements; path = Nuvio/NuvioRelease.entitlements; sourceTree = "<group>"; };
9FBA88F02E86ECD700892850 /* KSPlayerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSPlayerManager.m; sourceTree = "<group>"; }; 9FBA88F02E86ECD700892850 /* KSPlayerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSPlayerManager.m; sourceTree = "<group>"; };
9FBA88F12E86ECD700892850 /* KSPlayerModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerModule.swift; sourceTree = "<group>"; }; 9FBA88F12E86ECD700892850 /* KSPlayerModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerModule.swift; sourceTree = "<group>"; };
9FBA88F22E86ECD700892850 /* KSPlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerView.swift; sourceTree = "<group>"; }; 9FBA88F22E86ECD700892850 /* KSPlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSPlayerView.swift; sourceTree = "<group>"; };
@ -55,6 +56,7 @@
13B07FAE1A68108700A75B9A /* Nuvio */ = { 13B07FAE1A68108700A75B9A /* Nuvio */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
73BB213C2E9EEAC700EC03F8 /* NuvioRelease.entitlements */,
F11748412D0307B40044C1D9 /* AppDelegate.swift */, F11748412D0307B40044C1D9 /* AppDelegate.swift */,
F11748442D0722820044C1D9 /* Nuvio-Bridging-Header.h */, F11748442D0722820044C1D9 /* Nuvio-Bridging-Header.h */,
9FBA88F02E86ECD700892850 /* KSPlayerManager.m */, 9FBA88F02E86ECD700892850 /* KSPlayerManager.m */,
@ -132,7 +134,6 @@
BD6015E69A4861CCBD3C1D39 /* Pods-Nuvio.debug.xcconfig */, BD6015E69A4861CCBD3C1D39 /* Pods-Nuvio.debug.xcconfig */,
6E0017E5203955A430ABF21B /* Pods-Nuvio.release.xcconfig */, 6E0017E5203955A430ABF21B /* Pods-Nuvio.release.xcconfig */,
); );
name = Pods;
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -440,6 +441,7 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Nuvio/Nuvio.entitlements; CODE_SIGN_ENTITLEMENTS = Nuvio/Nuvio.entitlements;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = NLXTHANK2N;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
GCC_PREPROCESSOR_DEFINITIONS = ( GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)", "$(inherited)",
@ -458,7 +460,7 @@
"-lc++", "-lc++",
); );
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.app; PRODUCT_BUNDLE_IDENTIFIER = "com.nuvio.app";
PRODUCT_NAME = "Nuvio"; PRODUCT_NAME = "Nuvio";
SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -474,8 +476,9 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Nuvio/Nuvio.entitlements; CODE_SIGN_ENTITLEMENTS = Nuvio/NuvioRelease.entitlements;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = NLXTHANK2N;
INFOPLIST_FILE = Nuvio/Info.plist; INFOPLIST_FILE = Nuvio/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1; IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -489,7 +492,7 @@
"-lc++", "-lc++",
); );
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
PRODUCT_BUNDLE_IDENTIFIER = com.nuvio.app; PRODUCT_BUNDLE_IDENTIFIER = "com.nuvio.app";
PRODUCT_NAME = "Nuvio"; PRODUCT_NAME = "Nuvio";
SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Nuvio/Nuvio-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;

View file

@ -19,7 +19,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string> <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.2.4</string> <string>1.2.5</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleURLTypes</key> <key>CFBundleURLTypes</key>
@ -39,7 +39,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>19</string> <string>20</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>12.0</string> <string>12.0</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.associated-domains</key>
<array/>
</dict>
</plist>

View file

@ -9,7 +9,7 @@
<key>EXUpdatesLaunchWaitMs</key> <key>EXUpdatesLaunchWaitMs</key>
<integer>30000</integer> <integer>30000</integer>
<key>EXUpdatesRuntimeVersion</key> <key>EXUpdatesRuntimeVersion</key>
<string>1.2.4</string> <string>1.2.5</string>
<key>EXUpdatesURL</key> <key>EXUpdatesURL</key>
<string>https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest</string> <string>https://grim-reyna-tapframe-69970143.koyeb.app/api/manifest</string>
</dict> </dict>

View file

@ -2336,7 +2336,7 @@ PODS:
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
- ReactNativeDependencies - ReactNativeDependencies
- Yoga - Yoga
- RNReanimated (3.19.3): - RNReanimated (4.1.3):
- hermes-engine - hermes-engine
- RCTRequired - RCTRequired
- RCTTypeSafety - RCTTypeSafety
@ -2358,10 +2358,10 @@ PODS:
- ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
- ReactNativeDependencies - ReactNativeDependencies
- RNReanimated/reanimated (= 3.19.3) - RNReanimated/reanimated (= 4.1.3)
- RNReanimated/worklets (= 3.19.3) - RNWorklets
- Yoga - Yoga
- RNReanimated/reanimated (3.19.3): - RNReanimated/reanimated (4.1.3):
- hermes-engine - hermes-engine
- RCTRequired - RCTRequired
- RCTTypeSafety - RCTTypeSafety
@ -2383,56 +2383,10 @@ PODS:
- ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
- ReactNativeDependencies - ReactNativeDependencies
- RNReanimated/reanimated/apple (= 3.19.3) - RNReanimated/reanimated/apple (= 4.1.3)
- RNWorklets
- Yoga - Yoga
- RNReanimated/reanimated/apple (3.19.3): - RNReanimated/reanimated/apple (4.1.3):
- hermes-engine
- RCTRequired
- RCTTypeSafety
- React-Core
- React-Core-prebuilt
- React-debug
- React-Fabric
- React-featureflags
- React-graphics
- React-hermes
- React-ImageManager
- React-jsi
- React-NativeModulesApple
- React-RCTFabric
- React-renderercss
- React-rendererdebug
- React-utils
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- RNReanimated/worklets (3.19.3):
- hermes-engine
- RCTRequired
- RCTTypeSafety
- React-Core
- React-Core-prebuilt
- React-debug
- React-Fabric
- React-featureflags
- React-graphics
- React-hermes
- React-ImageManager
- React-jsi
- React-NativeModulesApple
- React-RCTFabric
- React-renderercss
- React-rendererdebug
- React-utils
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNReanimated/worklets/apple (= 3.19.3)
- Yoga
- RNReanimated/worklets/apple (3.19.3):
- hermes-engine - hermes-engine
- RCTRequired - RCTRequired
- RCTTypeSafety - RCTTypeSafety
@ -2454,6 +2408,7 @@ PODS:
- ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
- ReactNativeDependencies - ReactNativeDependencies
- RNWorklets
- Yoga - Yoga
- RNScreens (4.16.0): - RNScreens (4.16.0):
- hermes-engine - hermes-engine
@ -2593,6 +2548,77 @@ PODS:
- ReactCommon/turbomodule/core - ReactCommon/turbomodule/core
- ReactNativeDependencies - ReactNativeDependencies
- Yoga - Yoga
- RNWorklets (0.6.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
- React-Core
- React-Core-prebuilt
- React-debug
- React-Fabric
- React-featureflags
- React-graphics
- React-hermes
- React-ImageManager
- React-jsi
- React-NativeModulesApple
- React-RCTFabric
- React-renderercss
- React-rendererdebug
- React-utils
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNWorklets/worklets (= 0.6.1)
- Yoga
- RNWorklets/worklets (0.6.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
- React-Core
- React-Core-prebuilt
- React-debug
- React-Fabric
- React-featureflags
- React-graphics
- React-hermes
- React-ImageManager
- React-jsi
- React-NativeModulesApple
- React-RCTFabric
- React-renderercss
- React-rendererdebug
- React-utils
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNWorklets/worklets/apple (= 0.6.1)
- Yoga
- RNWorklets/worklets/apple (0.6.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
- React-Core
- React-Core-prebuilt
- React-debug
- React-Fabric
- React-featureflags
- React-graphics
- React-hermes
- React-ImageManager
- React-jsi
- React-NativeModulesApple
- React-RCTFabric
- React-renderercss
- React-rendererdebug
- React-utils
- ReactCodegen
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- SDWebImage (5.21.3): - SDWebImage (5.21.3):
- SDWebImage/Core (= 5.21.3) - SDWebImage/Core (= 5.21.3)
- SDWebImage/Core (5.21.3) - SDWebImage/Core (5.21.3)
@ -2729,6 +2755,7 @@ DEPENDENCIES:
- "RNSentry (from `../node_modules/@sentry/react-native`)" - "RNSentry (from `../node_modules/@sentry/react-native`)"
- RNSVG (from `../node_modules/react-native-svg`) - RNSVG (from `../node_modules/react-native-svg`)
- RNVectorIcons (from `../node_modules/react-native-vector-icons`) - RNVectorIcons (from `../node_modules/react-native-vector-icons`)
- RNWorklets (from `../node_modules/react-native-worklets`)
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
SPEC REPOS: SPEC REPOS:
@ -2994,6 +3021,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-svg" :path: "../node_modules/react-native-svg"
RNVectorIcons: RNVectorIcons:
:path: "../node_modules/react-native-vector-icons" :path: "../node_modules/react-native-vector-icons"
RNWorklets:
:path: "../node_modules/react-native-worklets"
Yoga: Yoga:
:path: "../node_modules/react-native/ReactCommon/yoga" :path: "../node_modules/react-native/ReactCommon/yoga"
@ -3135,11 +3164,12 @@ SPEC CHECKSUMS:
RNCPicker: a7170edbcbf8288de8edb2502e08e7fc757fa755 RNCPicker: a7170edbcbf8288de8edb2502e08e7fc757fa755
RNFastImage: 42a769cd260a7686b1db32a9f7d754333bad4e77 RNFastImage: 42a769cd260a7686b1db32a9f7d754333bad4e77
RNGestureHandler: 2914750df066d89bf9d8f48a10ad5f0051108ac3 RNGestureHandler: 2914750df066d89bf9d8f48a10ad5f0051108ac3
RNReanimated: 112c0628c3c11b56c261bafb8df9ae72eb525aec RNReanimated: 3895a29fdf77bbe2a627e1ed599a5e5d1df76c29
RNScreens: d8d6f1792f6e7ac12b0190d33d8d390efc0c1845 RNScreens: d8d6f1792f6e7ac12b0190d33d8d390efc0c1845
RNSentry: 41979b419908128847ef662cc130a400b7576fa9 RNSentry: 41979b419908128847ef662cc130a400b7576fa9
RNSVG: 31d6639663c249b7d5abc9728dde2041eb2a3c34 RNSVG: 31d6639663c249b7d5abc9728dde2041eb2a3c34
RNVectorIcons: 4351544f100d4f12cac156a7c13399e60bab3e26 RNVectorIcons: 4351544f100d4f12cac156a7c13399e60bab3e26
RNWorklets: 54d8dffb7f645873a58484658ddfd4bd1a9a0bc1
SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a
SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57 SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380

View file

@ -16,6 +16,7 @@ import Animated, {
Extrapolate, Extrapolate,
useAnimatedReaction, useAnimatedReaction,
runOnJS, runOnJS,
SharedValue,
} from 'react-native-reanimated'; } from 'react-native-reanimated';
import { useTheme } from '../../contexts/ThemeContext'; import { useTheme } from '../../contexts/ThemeContext';
import { logger } from '../../utils/logger'; import { logger } from '../../utils/logger';
@ -28,9 +29,9 @@ interface FloatingHeaderProps {
handleBack: () => void; handleBack: () => void;
handleToggleLibrary: () => void; handleToggleLibrary: () => void;
inLibrary: boolean; inLibrary: boolean;
headerOpacity: Animated.SharedValue<number>; headerOpacity: SharedValue<number>;
headerElementsY: Animated.SharedValue<number>; headerElementsY: SharedValue<number>;
headerElementsOpacity: Animated.SharedValue<number>; headerElementsOpacity: SharedValue<number>;
safeAreaTop: number; safeAreaTop: number;
setLogoLoadError: (error: boolean) => void; setLogoLoadError: (error: boolean) => void;
} }

View file

@ -29,6 +29,7 @@ import Animated, {
FadeIn, FadeIn,
runOnUI, runOnUI,
useDerivedValue, useDerivedValue,
SharedValue,
} from 'react-native-reanimated'; } from 'react-native-reanimated';
import { useTheme } from '../../contexts/ThemeContext'; import { useTheme } from '../../contexts/ThemeContext';
import { useTraktContext } from '../../contexts/TraktContext'; import { useTraktContext } from '../../contexts/TraktContext';
@ -52,14 +53,14 @@ interface HeroSectionProps {
bannerImage: string | null; bannerImage: string | null;
loadingBanner: boolean; loadingBanner: boolean;
logoLoadError: boolean; logoLoadError: boolean;
scrollY: Animated.SharedValue<number>; scrollY: SharedValue<number>;
heroHeight: Animated.SharedValue<number>; heroHeight: SharedValue<number>;
heroOpacity: Animated.SharedValue<number>; heroOpacity: SharedValue<number>;
logoOpacity: Animated.SharedValue<number>; logoOpacity: SharedValue<number>;
buttonsOpacity: Animated.SharedValue<number>; buttonsOpacity: SharedValue<number>;
buttonsTranslateY: Animated.SharedValue<number>; buttonsTranslateY: SharedValue<number>;
watchProgressOpacity: Animated.SharedValue<number>; watchProgressOpacity: SharedValue<number>;
watchProgressWidth: Animated.SharedValue<number>; watchProgressWidth: SharedValue<number>;
watchProgress: { watchProgress: {
currentTime: number; currentTime: number;
duration: number; duration: number;

View file

@ -1,6 +1,6 @@
import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
import { AppState } from 'react-native'; import { AppState } from 'react-native';
import * as FileSystem from 'expo-file-system'; import * as FileSystem from 'expo-file-system/legacy';
import AsyncStorage from '@react-native-async-storage/async-storage'; import AsyncStorage from '@react-native-async-storage/async-storage';
import { notificationService } from '../services/notificationService'; import { notificationService } from '../services/notificationService';
@ -135,7 +135,7 @@ export const DownloadsProvider: React.FC<{ children: React.ReactNode }> = ({ chi
downloadsRef.current = downloads; downloadsRef.current = downloads;
}, [downloads]); }, [downloads]);
// Keep active resumables in memory (not persisted) // Keep active resumables in memory (not persisted)
const resumablesRef = useRef<Map<string, FileSystem.DownloadResumable>>(new Map()); const resumablesRef = useRef<Map<string, any>>(new Map());
const lastBytesRef = useRef<Map<string, { bytes: number; time: number }>>(new Map()); const lastBytesRef = useRef<Map<string, { bytes: number; time: number }>>(new Map());
// Persist and restore // Persist and restore
@ -245,7 +245,7 @@ export const DownloadsProvider: React.FC<{ children: React.ReactNode }> = ({ chi
console.log(`[DownloadsContext] Creating new resumable for download: ${id}`); console.log(`[DownloadsContext] Creating new resumable for download: ${id}`);
// Only create new resumable if none exists (should be rare for resume operations) // Only create new resumable if none exists (should be rare for resume operations)
const progressCallback: FileSystem.DownloadProgressCallback = (data) => { const progressCallback = (data: any) => {
const { totalBytesWritten, totalBytesExpectedToWrite } = data; const { totalBytesWritten, totalBytesExpectedToWrite } = data;
const now = Date.now(); const now = Date.now();
const last = lastBytesRef.current.get(id); const last = lastBytesRef.current.get(id);
@ -385,7 +385,7 @@ export const DownloadsProvider: React.FC<{ children: React.ReactNode }> = ({ chi
} }
// Create file path - use a simple unique identifier with extension from HEAD request // Create file path - use a simple unique identifier with extension from HEAD request
const baseDir = FileSystem.documentDirectory || FileSystem.cacheDirectory || FileSystem.documentDirectory; const baseDir = (FileSystem as any).documentDirectory || (FileSystem as any).cacheDirectory || '/tmp/';
const uniqueId = `${Date.now()}_${Math.random().toString(36).substring(7)}`; const uniqueId = `${Date.now()}_${Math.random().toString(36).substring(7)}`;
const extension = await getExtensionFromHeaders(input.url, input.headers); const extension = await getExtensionFromHeaders(input.url, input.headers);
const fileUri = extension ? `${baseDir}downloads/${uniqueId}.${extension}` : `${baseDir}downloads/${uniqueId}`; const fileUri = extension ? `${baseDir}downloads/${uniqueId}.${extension}` : `${baseDir}downloads/${uniqueId}`;
@ -424,7 +424,7 @@ export const DownloadsProvider: React.FC<{ children: React.ReactNode }> = ({ chi
setDownloads(prev => [newItem, ...prev]); setDownloads(prev => [newItem, ...prev]);
const progressCallback: FileSystem.DownloadProgressCallback = (data) => { const progressCallback = (data: any) => {
const { totalBytesWritten, totalBytesExpectedToWrite } = data; const { totalBytesWritten, totalBytesExpectedToWrite } = data;
const now = Date.now(); const now = Date.now();
const last = lastBytesRef.current.get(compoundId); const last = lastBytesRef.current.get(compoundId);

View file

@ -834,11 +834,19 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat
type: localized.type, type: localized.type,
originCountry: localized.origin_country, originCountry: localized.origin_country,
originalLanguage: localized.original_language, originalLanguage: localized.original_language,
createdBy: localized.created_by, createdBy: localized.created_by?.map(creator => ({
id: creator.id,
name: creator.name,
profile_path: creator.profile_path || undefined
})),
}; };
const productionInfo = Array.isArray(localized.networks) const productionInfo = Array.isArray(localized.networks)
? localized.networks ? localized.networks
.map((n: any) => ({ id: n?.id, name: n?.name, logo: tmdbSvc.getImageUrl(n?.logo_path, 'w185') })) .map((n: any) => ({
id: n?.id,
name: n?.name,
logo: tmdbSvc.getImageUrl(n?.logo_path, 'w185') || undefined
}))
.filter((n: any) => n && (n.logo || n.name)) .filter((n: any) => n && (n.logo || n.name))
: []; : [];
@ -1844,7 +1852,7 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat
.map((n: any) => ({ .map((n: any) => ({
id: n?.id, id: n?.id,
name: n?.name, name: n?.name,
logo: tmdbService.getImageUrl(n?.logo_path, 'w185'), logo: tmdbService.getImageUrl(n?.logo_path, 'w185') || undefined,
})) }))
.filter((n: any) => n && (n.logo || n.name)) .filter((n: any) => n && (n.logo || n.name))
: []; : [];
@ -1861,7 +1869,11 @@ export const useMetadata = ({ id, type, addonId }: UseMetadataProps): UseMetadat
type: showDetails.type, type: showDetails.type,
originCountry: showDetails.origin_country, originCountry: showDetails.origin_country,
originalLanguage: showDetails.original_language, originalLanguage: showDetails.original_language,
createdBy: showDetails.created_by, createdBy: showDetails.created_by?.map(creator => ({
id: creator.id,
name: creator.name,
profile_path: creator.profile_path || undefined
})),
}; };
// Update metadata with TV details // Update metadata with TV details

View file

@ -766,9 +766,6 @@ const CatalogScreen: React.FC<CatalogScreenProps> = ({ route, navigation }) => {
contentContainerStyle={styles.list} contentContainerStyle={styles.list}
showsVerticalScrollIndicator={false} showsVerticalScrollIndicator={false}
removeClippedSubviews={true} removeClippedSubviews={true}
maxToRenderPerBatch={effectiveNumColumns * 3}
windowSize={10}
initialNumToRender={effectiveNumColumns * 4}
getItemType={() => 'item'} getItemType={() => 'item'}
/> />
) : renderEmptyState()} ) : renderEmptyState()}

View file

@ -5,7 +5,6 @@ export { default as AddonsScreen } from './AddonsScreen';
export { default as SettingsScreen } from './SettingsScreen'; export { default as SettingsScreen } from './SettingsScreen';
export { default as MetadataScreen } from './MetadataScreen'; export { default as MetadataScreen } from './MetadataScreen';
export { default as CatalogScreen } from './CatalogScreen'; export { default as CatalogScreen } from './CatalogScreen';
export { default as DiscoverScreen } from './DiscoverScreen';
export { default as LibraryScreen } from './LibraryScreen'; export { default as LibraryScreen } from './LibraryScreen';
export { default as ShowRatingsScreen } from './ShowRatingsScreen'; export { default as ShowRatingsScreen } from './ShowRatingsScreen';
export { default as CatalogSettingsScreen } from './CatalogSettingsScreen'; export { default as CatalogSettingsScreen } from './CatalogSettingsScreen';

View file

@ -1,5 +1,5 @@
import AsyncStorage from '@react-native-async-storage/async-storage'; import AsyncStorage from '@react-native-async-storage/async-storage';
import * as FileSystem from 'expo-file-system'; import * as FileSystem from 'expo-file-system/legacy';
import { Platform } from 'react-native'; import { Platform } from 'react-native';
import { logger } from '../utils/logger'; import { logger } from '../utils/logger';
import { AppSettings, DEFAULT_SETTINGS } from '../hooks/useSettings'; import { AppSettings, DEFAULT_SETTINGS } from '../hooks/useSettings';
@ -150,7 +150,7 @@ export class BackupService {
scraperCount; scraperCount;
// Save to file // Save to file
const fileUri = `${FileSystem.documentDirectory}${filename}`; const fileUri = `${(FileSystem as any).documentDirectory || '/tmp/'}${filename}`;
await FileSystem.writeAsStringAsync(fileUri, JSON.stringify(backupData, null, 2)); await FileSystem.writeAsStringAsync(fileUri, JSON.stringify(backupData, null, 2));
logger.info(`[BackupService] Backup created successfully: ${filename}`); logger.info(`[BackupService] Backup created successfully: ${filename}`);
@ -332,7 +332,7 @@ export class BackupService {
*/ */
public async listBackups(): Promise<string[]> { public async listBackups(): Promise<string[]> {
try { try {
const files = await FileSystem.readDirectoryAsync(FileSystem.documentDirectory!); const files = await FileSystem.readDirectoryAsync((FileSystem as any).documentDirectory || '/tmp/');
return files return files
.filter(file => file.startsWith(this.BACKUP_FILENAME_PREFIX) && file.endsWith('.json')) .filter(file => file.startsWith(this.BACKUP_FILENAME_PREFIX) && file.endsWith('.json'))
.sort((a, b) => b.localeCompare(a)); // Sort by filename (newest first) .sort((a, b) => b.localeCompare(a)); // Sort by filename (newest first)

View file

@ -161,16 +161,16 @@ class MemoryMonitorService {
private clearGlobalCaches(): void { private clearGlobalCaches(): void {
try { try {
// Clear any global caches your app might have // Clear any global caches your app might have
if (global && global.__APP_CACHE__) { if (global && (global as any).__APP_CACHE__) {
global.__APP_CACHE__ = {}; (global as any).__APP_CACHE__ = {};
} }
if (global && global.__METADATA_CACHE__) { if (global && (global as any).__METADATA_CACHE__) {
global.__METADATA_CACHE__ = {}; (global as any).__METADATA_CACHE__ = {};
} }
if (global && global.__EPISODE_CACHE__) { if (global && (global as any).__EPISODE_CACHE__) {
global.__EPISODE_CACHE__ = {}; (global as any).__EPISODE_CACHE__ = {};
} }
} catch (error) { } catch (error) {
logger.warn('[MemoryMonitor] Could not clear global caches:', error); logger.warn('[MemoryMonitor] Could not clear global caches:', error);
@ -180,13 +180,13 @@ class MemoryMonitorService {
private clearImageCaches(): void { private clearImageCaches(): void {
try { try {
// Clear React Native image caches if available // Clear React Native image caches if available
if (global && global.__IMAGE_CACHE__) { if (global && (global as any).__IMAGE_CACHE__) {
global.__IMAGE_CACHE__ = {}; (global as any).__IMAGE_CACHE__ = {};
} }
// Clear Expo Image cache if available // Clear Expo Image cache if available
// Note: Expo Image has its own cache management, but we can suggest cleanup // Note: Expo Image has its own cache management, but we can suggest cleanup
if (global && global.expo && global.expo.ImagePicker) { if (global && (global as any).expo && (global as any).expo.ImagePicker) {
// This is just an example - actual cache clearing would depend on the library // This is just an example - actual cache clearing would depend on the library
} }
} catch (error) { } catch (error) {

View file

@ -81,6 +81,8 @@ class NotificationService {
shouldShowAlert: true, shouldShowAlert: true,
shouldPlaySound: true, shouldPlaySound: true,
shouldSetBadge: true, shouldSetBadge: true,
shouldShowBanner: true,
shouldShowList: true,
}), }),
}); });

View file

@ -52,6 +52,13 @@ export interface TMDBShow {
poster_path: string | null; poster_path: string | null;
air_date: string; air_date: string;
}[]; }[];
status?: string;
episode_run_time?: number[];
type?: string;
origin_country?: string[];
original_language?: string;
created_by?: { id: number; name: string; profile_path?: string | null }[];
networks?: { id: number; name: string; logo_path: string | null; origin_country: string }[];
} }
export interface TMDBTrendingResult { export interface TMDBTrendingResult {

View file

@ -1,7 +1,6 @@
import AsyncStorage from '@react-native-async-storage/async-storage'; import AsyncStorage from '@react-native-async-storage/async-storage';
import { AppState, AppStateStatus } from 'react-native'; import { AppState, AppStateStatus } from 'react-native';
import { logger } from '../utils/logger'; import { logger } from '../utils/logger';
import { imageCacheService } from './imageCacheService';
// Storage keys // Storage keys
export const TRAKT_ACCESS_TOKEN_KEY = 'trakt_access_token'; export const TRAKT_ACCESS_TOKEN_KEY = 'trakt_access_token';

View file

@ -1,7 +1,7 @@
// Single source of truth for the app version displayed in Settings // Single source of truth for the app version displayed in Settings
// Update this when bumping app version // Update this when bumping app version
export const APP_VERSION = '1.2.4'; export const APP_VERSION = '1.2.5';
export function getDisplayedAppVersion(): string { export function getDisplayedAppVersion(): string {
return APP_VERSION; return APP_VERSION;