diff --git a/index.js b/index.js new file mode 100644 index 000000000..1d6e981ef --- /dev/null +++ b/index.js @@ -0,0 +1,8 @@ +import { registerRootComponent } from 'expo'; + +import App from './App'; + +// registerRootComponent calls AppRegistry.registerComponent('main', () => App); +// It also ensures that whether you load the app in Expo Go or in a native build, +// the environment is set up appropriately +registerRootComponent(App); diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 000000000..8beb34430 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,30 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace +.xcode.env.local + +# Bundle artifacts +*.jsbundle + +# CocoaPods +/Pods/ diff --git a/ios/.xcode.env b/ios/.xcode.env new file mode 100644 index 000000000..3d5782c71 --- /dev/null +++ b/ios/.xcode.env @@ -0,0 +1,11 @@ +# This `.xcode.env` file is versioned and is used to source the environment +# used when running script phases inside Xcode. +# To customize your local environment, you can create an `.xcode.env.local` +# file that is not versioned. + +# NODE_BINARY variable contains the PATH to the node executable. +# +# Customize the NODE_BINARY variable here. +# For example, to use nvm with brew, add the following line +# . "$(brew --prefix nvm)/nvm.sh" --no-use +export NODE_BINARY=$(command -v node) diff --git a/ios/Jellyfin.xcodeproj/project.pbxproj b/ios/Jellyfin.xcodeproj/project.pbxproj new file mode 100644 index 000000000..8d26dc85d --- /dev/null +++ b/ios/Jellyfin.xcodeproj/project.pbxproj @@ -0,0 +1,489 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 2C12A4B19C954DC0A8B0A1A1 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B2CFF3463DF4D8CB087A118 /* noop-file.swift */; }; + 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; + 96905EF65AED1B983A6B3ABC /* libPods-Jellyfin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Jellyfin.a */; }; + B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; + BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* Jellyfin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Jellyfin.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Jellyfin/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Jellyfin/AppDelegate.mm; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Jellyfin/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Jellyfin/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Jellyfin/main.m; sourceTree = ""; }; + 4B2CFF3463DF4D8CB087A118 /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "Jellyfin/noop-file.swift"; sourceTree = ""; }; + 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Jellyfin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Jellyfin.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6C2E3173556A471DD304B334 /* Pods-Jellyfin.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jellyfin.debug.xcconfig"; path = "Target Support Files/Pods-Jellyfin/Pods-Jellyfin.debug.xcconfig"; sourceTree = ""; }; + 7A4D352CD337FB3A3BF06240 /* Pods-Jellyfin.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jellyfin.release.xcconfig"; path = "Target Support Files/Pods-Jellyfin/Pods-Jellyfin.release.xcconfig"; sourceTree = ""; }; + AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Jellyfin/SplashScreen.storyboard; sourceTree = ""; }; + BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Jellyfin/ExpoModulesProvider.swift"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 96905EF65AED1B983A6B3ABC /* libPods-Jellyfin.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13B07FAE1A68108700A75B9A /* Jellyfin */ = { + isa = PBXGroup; + children = ( + BB2F792B24A3F905000567C9 /* Supporting */, + 008F07F21AC5B25A0029DE68 /* main.jsbundle */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.mm */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB71A68108700A75B9A /* main.m */, + AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, + 4B2CFF3463DF4D8CB087A118 /* noop-file.swift */, + ); + name = Jellyfin; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Jellyfin.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* Jellyfin */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + D65327D7A22EEC0BE12398D9 /* Pods */, + D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* Jellyfin.app */, + ); + name = Products; + sourceTree = ""; + }; + 92DBD88DE9BF7D494EA9DA96 /* Jellyfin */ = { + isa = PBXGroup; + children = ( + FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */, + ); + name = Jellyfin; + sourceTree = ""; + }; + BB2F792B24A3F905000567C9 /* Supporting */ = { + isa = PBXGroup; + children = ( + BB2F792C24A3F905000567C9 /* Expo.plist */, + ); + name = Supporting; + path = Jellyfin/Supporting; + sourceTree = ""; + }; + D65327D7A22EEC0BE12398D9 /* Pods */ = { + isa = PBXGroup; + children = ( + 6C2E3173556A471DD304B334 /* Pods-Jellyfin.debug.xcconfig */, + 7A4D352CD337FB3A3BF06240 /* Pods-Jellyfin.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = { + isa = PBXGroup; + children = ( + 92DBD88DE9BF7D494EA9DA96 /* Jellyfin */, + ); + name = ExpoModulesProviders; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 13B07F861A680F5B00A75B9A /* Jellyfin */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Jellyfin" */; + buildPhases = ( + 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, + FD10A7F022414F080027D42C /* Start Packager */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Jellyfin; + productName = Jellyfin; + productReference = 13B07F961A680F5B00A75B9A /* Jellyfin.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + TargetAttributes = { + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1250; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Jellyfin" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* Jellyfin */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; + }; + 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Jellyfin-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Jellyfin/Pods-Jellyfin-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Jellyfin/Pods-Jellyfin-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + FD10A7F022414F080027D42C /* Start Packager */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Start Packager"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n fi\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, + 2C12A4B19C954DC0A8B0A1A1 /* noop-file.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-Jellyfin.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Jellyfin/Jellyfin.entitlements; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "FB_SONARKIT_ENABLED=1", + ); + INFOPLIST_FILE = Jellyfin/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = org.jellyfin.expo; + PRODUCT_NAME = Jellyfin; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-Jellyfin.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Jellyfin/Jellyfin.entitlements; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = Jellyfin/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; + PRODUCT_BUNDLE_IDENTIFIER = org.jellyfin.expo; + PRODUCT_NAME = Jellyfin; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; + LIBRARY_SEARCH_PATHS = "\"$(inherited)\""; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; + LIBRARY_SEARCH_PATHS = "\"$(inherited)\""; + MTL_ENABLE_DEBUG_INFO = NO; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Jellyfin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Jellyfin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/ios/Jellyfin.xcodeproj/xcshareddata/xcschemes/Jellyfin.xcscheme b/ios/Jellyfin.xcodeproj/xcshareddata/xcschemes/Jellyfin.xcscheme new file mode 100644 index 000000000..b50422692 --- /dev/null +++ b/ios/Jellyfin.xcodeproj/xcshareddata/xcschemes/Jellyfin.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Jellyfin.xcworkspace/contents.xcworkspacedata b/ios/Jellyfin.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..b29de61ef --- /dev/null +++ b/ios/Jellyfin.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Jellyfin/AppDelegate.h b/ios/Jellyfin/AppDelegate.h new file mode 100644 index 000000000..f7d297204 --- /dev/null +++ b/ios/Jellyfin/AppDelegate.h @@ -0,0 +1,9 @@ +#import +#import +#import + +#import + +@interface AppDelegate : EXAppDelegateWrapper + +@end diff --git a/ios/Jellyfin/AppDelegate.mm b/ios/Jellyfin/AppDelegate.mm new file mode 100644 index 000000000..a6e13e11a --- /dev/null +++ b/ios/Jellyfin/AppDelegate.mm @@ -0,0 +1,166 @@ +#import "AppDelegate.h" + +#import +#import +#import +#import +#import + +#import + +#if RCT_NEW_ARCH_ENABLED +#import +#import +#import +#import +#import +#import + +#import + +static NSString *const kRNConcurrentRoot = @"concurrentRoot"; + +@interface AppDelegate () { + RCTTurboModuleManager *_turboModuleManager; + RCTSurfacePresenterBridgeAdapter *_bridgeAdapter; + std::shared_ptr _reactNativeConfig; + facebook::react::ContextContainer::Shared _contextContainer; +} +@end +#endif + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + RCTAppSetupPrepareApp(application); + + RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions]; + +#if RCT_NEW_ARCH_ENABLED + _contextContainer = std::make_shared(); + _reactNativeConfig = std::make_shared(); + _contextContainer->insert("ReactNativeConfig", _reactNativeConfig); + _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer]; + bridge.surfacePresenter = _bridgeAdapter.surfacePresenter; +#endif + + NSDictionary *initProps = [self prepareInitialProps]; + UIView *rootView = [self.reactDelegate createRootViewWithBridge:bridge moduleName:@"main" initialProperties:initProps]; + + rootView.backgroundColor = [UIColor whiteColor]; + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + UIViewController *rootViewController = [self.reactDelegate createRootViewController]; + rootViewController.view = rootView; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; + + [super application:application didFinishLaunchingWithOptions:launchOptions]; + + return YES; +} + +- (NSArray> *)extraModulesForBridge:(RCTBridge *)bridge +{ + // If you'd like to export some custom RCTBridgeModules, add them here! + return @[]; +} + +/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. +/// +/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html +/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). +/// @return: `true` if the `concurrentRoot` feture is enabled. Otherwise, it returns `false`. +- (BOOL)concurrentRootEnabled +{ + // Switch this bool to turn on and off the concurrent root + return true; +} + +- (NSDictionary *)prepareInitialProps +{ + NSMutableDictionary *initProps = [NSMutableDictionary new]; +#if RCT_NEW_ARCH_ENABLED + initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]); +#endif + return initProps; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +// Linking API +- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { + return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; +} + +// Universal Links +- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { + BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; + return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; +} + +// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken +{ + return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; +} + +// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries +- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error +{ + return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; +} + +// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries +- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler +{ + return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; +} + +#if RCT_NEW_ARCH_ENABLED + +#pragma mark - RCTCxxBridgeDelegate + +- (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge +{ + _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge + delegate:self + jsInvoker:bridge.jsCallInvoker]; + return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager); +} + +#pragma mark RCTTurboModuleManagerDelegate + +- (Class)getModuleClassFromName:(const char *)name +{ + return RCTCoreModulesClassProvider(name); +} + +- (std::shared_ptr)getTurboModule:(const std::string &)name + jsInvoker:(std::shared_ptr)jsInvoker +{ + return nullptr; +} + +- (std::shared_ptr)getTurboModule:(const std::string &)name + initParams: + (const facebook::react::ObjCTurboModule::InitParams &)params +{ + return nullptr; +} + +- (id)getModuleInstanceFromClass:(Class)moduleClass +{ + return RCTAppSetupDefaultModuleFromClass(moduleClass); +} + +#endif + +@end diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png new file mode 100644 index 000000000..2bf62da8e Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png new file mode 100644 index 000000000..deca6658e Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png new file mode 100644 index 000000000..5f36a8624 Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png new file mode 100644 index 000000000..294e97b5c Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png new file mode 100644 index 000000000..97f9a901c Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png new file mode 100644 index 000000000..c2676f9b9 Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png new file mode 100644 index 000000000..deca6658e Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png new file mode 100644 index 000000000..4498a367a Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png new file mode 100644 index 000000000..57bcc1131 Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png new file mode 100644 index 000000000..57bcc1131 Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png new file mode 100644 index 000000000..b71cb8830 Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png new file mode 100644 index 000000000..9251644c8 Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png new file mode 100644 index 000000000..49ba4e529 Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png new file mode 100644 index 000000000..8b49ef5b4 Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png differ diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..f920cb0ec --- /dev/null +++ b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images": [ + { + "idiom": "iphone", + "size": "20x20", + "scale": "2x", + "filename": "App-Icon-20x20@2x.png" + }, + { + "idiom": "iphone", + "size": "20x20", + "scale": "3x", + "filename": "App-Icon-20x20@3x.png" + }, + { + "idiom": "iphone", + "size": "29x29", + "scale": "1x", + "filename": "App-Icon-29x29@1x.png" + }, + { + "idiom": "iphone", + "size": "29x29", + "scale": "2x", + "filename": "App-Icon-29x29@2x.png" + }, + { + "idiom": "iphone", + "size": "29x29", + "scale": "3x", + "filename": "App-Icon-29x29@3x.png" + }, + { + "idiom": "iphone", + "size": "40x40", + "scale": "2x", + "filename": "App-Icon-40x40@2x.png" + }, + { + "idiom": "iphone", + "size": "40x40", + "scale": "3x", + "filename": "App-Icon-40x40@3x.png" + }, + { + "idiom": "iphone", + "size": "60x60", + "scale": "2x", + "filename": "App-Icon-60x60@2x.png" + }, + { + "idiom": "iphone", + "size": "60x60", + "scale": "3x", + "filename": "App-Icon-60x60@3x.png" + }, + { + "idiom": "ipad", + "size": "20x20", + "scale": "1x", + "filename": "App-Icon-20x20@1x.png" + }, + { + "idiom": "ipad", + "size": "20x20", + "scale": "2x", + "filename": "App-Icon-20x20@2x.png" + }, + { + "idiom": "ipad", + "size": "29x29", + "scale": "1x", + "filename": "App-Icon-29x29@1x.png" + }, + { + "idiom": "ipad", + "size": "29x29", + "scale": "2x", + "filename": "App-Icon-29x29@2x.png" + }, + { + "idiom": "ipad", + "size": "40x40", + "scale": "1x", + "filename": "App-Icon-40x40@1x.png" + }, + { + "idiom": "ipad", + "size": "40x40", + "scale": "2x", + "filename": "App-Icon-40x40@2x.png" + }, + { + "idiom": "ipad", + "size": "76x76", + "scale": "1x", + "filename": "App-Icon-76x76@1x.png" + }, + { + "idiom": "ipad", + "size": "76x76", + "scale": "2x", + "filename": "App-Icon-76x76@2x.png" + }, + { + "idiom": "ipad", + "size": "83.5x83.5", + "scale": "2x", + "filename": "App-Icon-83.5x83.5@2x.png" + }, + { + "idiom": "ios-marketing", + "size": "1024x1024", + "scale": "1x", + "filename": "ItunesArtwork@2x.png" + } + ], + "info": { + "version": 1, + "author": "expo" + } +} \ No newline at end of file diff --git a/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png new file mode 100644 index 000000000..944bf947b Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png differ diff --git a/ios/Jellyfin/Images.xcassets/Contents.json b/ios/Jellyfin/Images.xcassets/Contents.json new file mode 100644 index 000000000..ed285c2e5 --- /dev/null +++ b/ios/Jellyfin/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "expo" + } +} diff --git a/ios/Jellyfin/Images.xcassets/SplashScreen.imageset/Contents.json b/ios/Jellyfin/Images.xcassets/SplashScreen.imageset/Contents.json new file mode 100644 index 000000000..3cf848977 --- /dev/null +++ b/ios/Jellyfin/Images.xcassets/SplashScreen.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images": [ + { + "idiom": "universal", + "filename": "image.png", + "scale": "1x" + }, + { + "idiom": "universal", + "scale": "2x" + }, + { + "idiom": "universal", + "scale": "3x" + } + ], + "info": { + "version": 1, + "author": "expo" + } +} \ No newline at end of file diff --git a/ios/Jellyfin/Images.xcassets/SplashScreen.imageset/image.png b/ios/Jellyfin/Images.xcassets/SplashScreen.imageset/image.png new file mode 100644 index 000000000..ca45c9ba0 Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/SplashScreen.imageset/image.png differ diff --git a/ios/Jellyfin/Images.xcassets/SplashScreenBackground.imageset/Contents.json b/ios/Jellyfin/Images.xcassets/SplashScreenBackground.imageset/Contents.json new file mode 100644 index 000000000..3cf848977 --- /dev/null +++ b/ios/Jellyfin/Images.xcassets/SplashScreenBackground.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images": [ + { + "idiom": "universal", + "filename": "image.png", + "scale": "1x" + }, + { + "idiom": "universal", + "scale": "2x" + }, + { + "idiom": "universal", + "scale": "3x" + } + ], + "info": { + "version": 1, + "author": "expo" + } +} \ No newline at end of file diff --git a/ios/Jellyfin/Images.xcassets/SplashScreenBackground.imageset/image.png b/ios/Jellyfin/Images.xcassets/SplashScreenBackground.imageset/image.png new file mode 100644 index 000000000..30665825f Binary files /dev/null and b/ios/Jellyfin/Images.xcassets/SplashScreenBackground.imageset/image.png differ diff --git a/ios/Jellyfin/Info.plist b/ios/Jellyfin/Info.plist new file mode 100644 index 000000000..46c803563 --- /dev/null +++ b/ios/Jellyfin/Info.plist @@ -0,0 +1,86 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Jellyfin + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.5.0 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleURLSchemes + + org.jellyfin.expo + + + + CFBundleVersion + 5.5.0.0 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSMicrophoneUsageDescription + Allow $(PRODUCT_NAME) to access your microphone + RCTRootViewBackgroundColor + 4279242768 + UIBackgroundModes + + audio + + UILaunchStoryboardName + SplashScreen + UIRequiredDeviceCapabilities + + armv7 + + UIRequiresFullScreen + + UIStatusBarStyle + UIStatusBarStyleDefault + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIUserInterfaceStyle + Automatic + UIViewControllerBasedStatusBarAppearance + + + \ No newline at end of file diff --git a/ios/Jellyfin/Jellyfin.entitlements b/ios/Jellyfin/Jellyfin.entitlements new file mode 100644 index 000000000..018a6e20c --- /dev/null +++ b/ios/Jellyfin/Jellyfin.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + \ No newline at end of file diff --git a/ios/Jellyfin/SplashScreen.storyboard b/ios/Jellyfin/SplashScreen.storyboard new file mode 100644 index 000000000..ed03a5299 --- /dev/null +++ b/ios/Jellyfin/SplashScreen.storyboard @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ios/Jellyfin/Supporting/Expo.plist b/ios/Jellyfin/Supporting/Expo.plist new file mode 100644 index 000000000..34d650461 --- /dev/null +++ b/ios/Jellyfin/Supporting/Expo.plist @@ -0,0 +1,16 @@ + + + + + EXUpdatesCheckOnLaunch + ALWAYS + EXUpdatesEnabled + + EXUpdatesLaunchWaitMs + 0 + EXUpdatesSDKVersion + 46.0.0 + EXUpdatesURL + https://exp.host/@jellyfin/jellyfin-expo + + \ No newline at end of file diff --git a/ios/Jellyfin/main.m b/ios/Jellyfin/main.m new file mode 100644 index 000000000..25181b6cc --- /dev/null +++ b/ios/Jellyfin/main.m @@ -0,0 +1,10 @@ +#import + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} + diff --git a/ios/Jellyfin/noop-file.swift b/ios/Jellyfin/noop-file.swift new file mode 100644 index 000000000..b2ffafbfc --- /dev/null +++ b/ios/Jellyfin/noop-file.swift @@ -0,0 +1,4 @@ +// +// @generated +// A blank Swift file must be created for native modules with Swift files to work correctly. +// diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 000000000..9e119e6ec --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,67 @@ +require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") +require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") +require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules") + +require 'json' +podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} + +platform :ios, podfile_properties['ios.deploymentTarget'] || '12.4' +install! 'cocoapods', + :deterministic_uuids => false + +target 'Jellyfin' do + use_expo_modules! + config = use_native_modules! + + use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] + + # Flags change depending on the env values. + flags = get_default_flags() + + use_react_native!( + :path => config[:reactNativePath], + :hermes_enabled => flags[:hermes_enabled] || podfile_properties['expo.jsEngine'] == 'hermes', + :fabric_enabled => flags[:fabric_enabled], + # An absolute path to your application root. + :app_path => "#{Dir.pwd}/.." + ) + + # Uncomment to opt-in to using Flipper + # Note that if you have use_frameworks! enabled, Flipper will not work + # + # if !ENV['CI'] + # use_flipper!() + # end + + post_install do |installer| + react_native_post_install(installer) + __apply_Xcode_12_5_M1_post_install_workaround(installer) + + # This is necessary for Xcode 14, because it signs resource bundles by default + # when building for devices. + installer.target_installation_results.pod_target_installation_results + .each do |pod_name, target_installation_result| + target_installation_result.resource_bundle_targets.each do |resource_bundle_target| + resource_bundle_target.build_configurations.each do |config| + config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' + end + end + end + + # This is necessary for Xcode 15 compatibility + # https://github.com/facebook/react-native/issues/37748#issuecomment-1580589448 + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION'] + end + end + end + + post_integrate do |installer| + begin + expo_patch_react_imports!(installer) + rescue => e + Pod::UI.warn e + end + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 000000000..c4b90aaa1 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,637 @@ +PODS: + - boost (1.76.0) + - DoubleConversion (1.1.6) + - EXApplication (4.2.2): + - ExpoModulesCore + - EXAV (12.0.4): + - ExpoModulesCore + - React-runtimeexecutor + - ReactCommon + - EXConstants (13.2.4): + - ExpoModulesCore + - EXDevice (4.3.0): + - ExpoModulesCore + - EXErrorRecovery (3.2.0): + - ExpoModulesCore + - EXFileSystem (14.1.0): + - ExpoModulesCore + - EXFont (10.2.1): + - ExpoModulesCore + - Expo (46.0.21): + - ExpoModulesCore + - ExpoKeepAwake (10.2.1): + - ExpoModulesCore + - ExpoLocalization (13.1.0): + - ExpoModulesCore + - ExpoModulesCore (0.11.10): + - React-Core + - ReactCommon/turbomodule/core + - ExpoSystemUI (1.3.0): + - ExpoModulesCore + - ExpoWebBrowser (11.0.0): + - ExpoModulesCore + - EXScreenOrientation (4.3.0): + - ExpoModulesCore + - React-Core + - EXSplashScreen (0.16.2): + - ExpoModulesCore + - React-Core + - FBLazyVector (0.69.9) + - FBReactNativeSpec (0.69.9): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.69.9) + - RCTTypeSafety (= 0.69.9) + - React-Core (= 0.69.9) + - React-jsi (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - fmt (6.2.1) + - glog (0.3.5) + - RCT-Folly (2021.06.28.00-v2): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCT-Folly/Default (= 2021.06.28.00-v2) + - RCT-Folly/Default (2021.06.28.00-v2): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCTRequired (0.69.9) + - RCTTypeSafety (0.69.9): + - FBLazyVector (= 0.69.9) + - RCTRequired (= 0.69.9) + - React-Core (= 0.69.9) + - React (0.69.9): + - React-Core (= 0.69.9) + - React-Core/DevSupport (= 0.69.9) + - React-Core/RCTWebSocket (= 0.69.9) + - React-RCTActionSheet (= 0.69.9) + - React-RCTAnimation (= 0.69.9) + - React-RCTBlob (= 0.69.9) + - React-RCTImage (= 0.69.9) + - React-RCTLinking (= 0.69.9) + - React-RCTNetwork (= 0.69.9) + - React-RCTSettings (= 0.69.9) + - React-RCTText (= 0.69.9) + - React-RCTVibration (= 0.69.9) + - React-bridging (0.69.9): + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsi (= 0.69.9) + - React-callinvoker (0.69.9) + - React-Codegen (0.69.9): + - FBReactNativeSpec (= 0.69.9) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.69.9) + - RCTTypeSafety (= 0.69.9) + - React-Core (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - React-Core (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.69.9) + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/CoreModulesHeaders (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/Default (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/DevSupport (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.69.9) + - React-Core/RCTWebSocket (= 0.69.9) + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-jsinspector (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/RCTActionSheetHeaders (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/RCTAnimationHeaders (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/RCTBlobHeaders (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/RCTImageHeaders (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/RCTLinkingHeaders (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/RCTNetworkHeaders (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/RCTSettingsHeaders (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/RCTTextHeaders (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/RCTVibrationHeaders (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-Core/RCTWebSocket (0.69.9): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.69.9) + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsiexecutor (= 0.69.9) + - React-perflogger (= 0.69.9) + - Yoga + - React-CoreModules (0.69.9): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.69.9) + - React-Codegen (= 0.69.9) + - React-Core/CoreModulesHeaders (= 0.69.9) + - React-jsi (= 0.69.9) + - React-RCTImage (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - React-cxxreact (0.69.9): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-callinvoker (= 0.69.9) + - React-jsi (= 0.69.9) + - React-jsinspector (= 0.69.9) + - React-logger (= 0.69.9) + - React-perflogger (= 0.69.9) + - React-runtimeexecutor (= 0.69.9) + - React-jsi (0.69.9): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsi/Default (= 0.69.9) + - React-jsi/Default (0.69.9): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsiexecutor (0.69.9): + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-perflogger (= 0.69.9) + - React-jsinspector (0.69.9) + - React-logger (0.69.9): + - glog + - react-native-get-random-values (1.8.0): + - React-Core + - react-native-safe-area-context (4.3.1): + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React + - ReactCommon/turbomodule/core + - react-native-webview (11.23.0): + - React-Core + - React-perflogger (0.69.9) + - React-RCTActionSheet (0.69.9): + - React-Core/RCTActionSheetHeaders (= 0.69.9) + - React-RCTAnimation (0.69.9): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.69.9) + - React-Codegen (= 0.69.9) + - React-Core/RCTAnimationHeaders (= 0.69.9) + - React-jsi (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - React-RCTBlob (0.69.9): + - RCT-Folly (= 2021.06.28.00-v2) + - React-Codegen (= 0.69.9) + - React-Core/RCTBlobHeaders (= 0.69.9) + - React-Core/RCTWebSocket (= 0.69.9) + - React-jsi (= 0.69.9) + - React-RCTNetwork (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - React-RCTImage (0.69.9): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.69.9) + - React-Codegen (= 0.69.9) + - React-Core/RCTImageHeaders (= 0.69.9) + - React-jsi (= 0.69.9) + - React-RCTNetwork (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - React-RCTLinking (0.69.9): + - React-Codegen (= 0.69.9) + - React-Core/RCTLinkingHeaders (= 0.69.9) + - React-jsi (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - React-RCTNetwork (0.69.9): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.69.9) + - React-Codegen (= 0.69.9) + - React-Core/RCTNetworkHeaders (= 0.69.9) + - React-jsi (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - React-RCTSettings (0.69.9): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.69.9) + - React-Codegen (= 0.69.9) + - React-Core/RCTSettingsHeaders (= 0.69.9) + - React-jsi (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - React-RCTText (0.69.9): + - React-Core/RCTTextHeaders (= 0.69.9) + - React-RCTVibration (0.69.9): + - RCT-Folly (= 2021.06.28.00-v2) + - React-Codegen (= 0.69.9) + - React-Core/RCTVibrationHeaders (= 0.69.9) + - React-jsi (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - React-runtimeexecutor (0.69.9): + - React-jsi (= 0.69.9) + - ReactCommon (0.69.9): + - React-logger (= 0.69.9) + - ReactCommon/react_debug_core (= 0.69.9) + - ReactCommon/turbomodule (= 0.69.9) + - ReactCommon/react_debug_core (0.69.9): + - React-logger (= 0.69.9) + - ReactCommon/turbomodule (0.69.9): + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-bridging (= 0.69.9) + - React-callinvoker (= 0.69.9) + - React-Core (= 0.69.9) + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-logger (= 0.69.9) + - React-perflogger (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - ReactCommon/turbomodule/samples (= 0.69.9) + - ReactCommon/turbomodule/core (0.69.9): + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-bridging (= 0.69.9) + - React-callinvoker (= 0.69.9) + - React-Core (= 0.69.9) + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-logger (= 0.69.9) + - React-perflogger (= 0.69.9) + - ReactCommon/turbomodule/samples (0.69.9): + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-bridging (= 0.69.9) + - React-callinvoker (= 0.69.9) + - React-Core (= 0.69.9) + - React-cxxreact (= 0.69.9) + - React-jsi (= 0.69.9) + - React-logger (= 0.69.9) + - React-perflogger (= 0.69.9) + - ReactCommon/turbomodule/core (= 0.69.9) + - RNCAsyncStorage (1.17.11): + - React-Core + - RNCMaskedView (0.1.11): + - React + - RNGestureHandler (2.5.0): + - React-Core + - RNReanimated (2.9.1): + - DoubleConversion + - FBLazyVector + - FBReactNativeSpec + - glog + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-callinvoker + - React-Core + - React-Core/DevSupport + - React-Core/RCTWebSocket + - React-CoreModules + - React-cxxreact + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-RCTActionSheet + - React-RCTAnimation + - React-RCTBlob + - React-RCTImage + - React-RCTLinking + - React-RCTNetwork + - React-RCTSettings + - React-RCTText + - ReactCommon/turbomodule/core + - Yoga + - RNScreens (3.15.0): + - React-Core + - React-RCTImage + - Yoga (1.14.0) + +DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - EXApplication (from `../node_modules/expo-application/ios`) + - EXAV (from `../node_modules/expo-av/ios`) + - EXConstants (from `../node_modules/expo-constants/ios`) + - EXDevice (from `../node_modules/expo-device/ios`) + - EXErrorRecovery (from `../node_modules/expo-error-recovery/ios`) + - EXFileSystem (from `../node_modules/expo-file-system/ios`) + - EXFont (from `../node_modules/expo-font/ios`) + - Expo (from `../node_modules/expo`) + - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) + - ExpoLocalization (from `../node_modules/expo-localization/ios`) + - ExpoModulesCore (from `../node_modules/expo-modules-core/ios`) + - ExpoSystemUI (from `../node_modules/expo-system-ui/ios`) + - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) + - EXScreenOrientation (from `../node_modules/expo-screen-orientation/ios`) + - EXSplashScreen (from `../node_modules/expo-splash-screen/ios`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-bridging (from `../node_modules/react-native/ReactCommon`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Codegen (from `build/generated/ios`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - react-native-get-random-values (from `../node_modules/react-native-get-random-values`) + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - react-native-webview (from `../node_modules/react-native-webview`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" + - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)" + - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) + - RNReanimated (from `../node_modules/react-native-reanimated`) + - RNScreens (from `../node_modules/react-native-screens`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - fmt + +EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + EXApplication: + :path: "../node_modules/expo-application/ios" + EXAV: + :path: "../node_modules/expo-av/ios" + EXConstants: + :path: "../node_modules/expo-constants/ios" + EXDevice: + :path: "../node_modules/expo-device/ios" + EXErrorRecovery: + :path: "../node_modules/expo-error-recovery/ios" + EXFileSystem: + :path: "../node_modules/expo-file-system/ios" + EXFont: + :path: "../node_modules/expo-font/ios" + Expo: + :path: "../node_modules/expo" + ExpoKeepAwake: + :path: "../node_modules/expo-keep-awake/ios" + ExpoLocalization: + :path: "../node_modules/expo-localization/ios" + ExpoModulesCore: + :path: "../node_modules/expo-modules-core/ios" + ExpoSystemUI: + :path: "../node_modules/expo-system-ui/ios" + ExpoWebBrowser: + :path: "../node_modules/expo-web-browser/ios" + EXScreenOrientation: + :path: "../node_modules/expo-screen-orientation/ios" + EXSplashScreen: + :path: "../node_modules/expo-splash-screen/ios" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/React/FBReactNativeSpec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTRequired: + :path: "../node_modules/react-native/Libraries/RCTRequired" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-bridging: + :path: "../node_modules/react-native/ReactCommon" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Codegen: + :path: build/generated/ios + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + react-native-get-random-values: + :path: "../node_modules/react-native-get-random-values" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" + react-native-webview: + :path: "../node_modules/react-native-webview" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + RNCAsyncStorage: + :path: "../node_modules/@react-native-async-storage/async-storage" + RNCMaskedView: + :path: "../node_modules/@react-native-community/masked-view" + RNGestureHandler: + :path: "../node_modules/react-native-gesture-handler" + RNReanimated: + :path: "../node_modules/react-native-reanimated" + RNScreens: + :path: "../node_modules/react-native-screens" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: a7c83b31436843459a1961bfd74b96033dc77234 + DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 + EXApplication: e418d737a036e788510f2c4ad6c10a7d54d18586 + EXAV: 596506c9bee54ad52f2f3b625cdaeb9d9f2dd6b7 + EXConstants: 7c44785d41d8e959d527d23d29444277a4d1ee73 + EXDevice: 7647ca9b1fd8b269dfd896a7643d659343358054 + EXErrorRecovery: 74d71ee59f6814315457b09d68e86aa95cc7d05d + EXFileSystem: 927e0a8885aa9c49e50fc38eaba2c2389f2f1019 + EXFont: 06df627203afcb8a3b3152ec06eb2f11f46f0cff + Expo: 99284f9f697b6def5988fdf50652e21f062991e3 + ExpoKeepAwake: 8b47e5358d54ea4922b630a74f2acb026ab7a28b + ExpoLocalization: 63204f4b9d4f653469d266332ceaa6c6ac8a305d + ExpoModulesCore: 1b2f5f91eff132671f6d0642aad2ba7915c6ff41 + ExpoSystemUI: 9f550a8055e315f7b0c4da208de27e45fe7da0fb + ExpoWebBrowser: 5804ac42a8269d0e534bc4461993005f72535649 + EXScreenOrientation: c309fed5399e482c6adebe14f41a7fd9001d7bde + EXSplashScreen: 799bece80089219b2c989c1082d70f3b00995cda + FBLazyVector: d3c1d2923b1009f4e709e8f1b793dedf5b323454 + FBReactNativeSpec: d460df7d796ed4979c6cd4e092145b63eb28b5bb + fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 + glog: 3d02b25ca00c2d456734d0bcff864cbc62f6ae1a + RCT-Folly: b9d9fe1fc70114b751c076104e52f3b1b5e5a95a + RCTRequired: fe80e9f71dd15939e5399dd94d0aa0e5e069d592 + RCTTypeSafety: 4c802f7c4b9e7c55470e7fc56d50385cbfcce89b + React: efe0b6d0b7401a208d2d1bf8320c0b6a0dcd593b + React-bridging: 11a324da43d8467cfe528ccff0e00ab43bdf1cf4 + React-callinvoker: d4d34002df449053784f1131a6382e526d172395 + React-Codegen: 63eb91553568558cbd6fb2f336c3ff2fea66b37a + React-Core: 2875b1749729d07ef7cacef36e8b1381f27cc86e + React-CoreModules: 8b6665f9b128b875660d75a7144122c742ad4af9 + React-cxxreact: 76d426551a4d1d6f623ef8f87a26690d5a6be93e + React-jsi: 47b65f4f789f198004c47e5b6ceaae95ea3f3659 + React-jsiexecutor: 3b506d7fc50275bf44f8fd5624f23eaedd78bf78 + React-jsinspector: 5b92a5a30e02e1a21802f293cc71e05d887c7378 + React-logger: 96d904c5bc87c2660d48e6a36fb2edf65f9cfb11 + react-native-get-random-values: a6ea6a8a65dc93e96e24a11105b1a9c8cfe1d72a + react-native-safe-area-context: 6c12e3859b6f27b25de4fee8201cfb858432d8de + react-native-webview: e771bc375f789ebfa02a26939a57dbc6fa897336 + React-perflogger: f6f4b3c63629ead2e8a5a22eaedd06368c31617a + React-RCTActionSheet: 5e95058e99c53313d778d96b7f37697ce3a9418e + React-RCTAnimation: c4f86d756d8398c674f61d00075993a368d83480 + React-RCTBlob: c74cb1350831866b3b23c2379ccc3a5909593bc5 + React-RCTImage: cc72e4092e08c7070d1dce7704fbdcdfc9e0a721 + React-RCTLinking: dca79b9df468980462a399a630156f5a5fc0b5bc + React-RCTNetwork: 0dfb918fd237b6fa4e3820769c57a6a0ad61f934 + React-RCTSettings: a9fb6736139ddf8e7d11842c8a948c47c1ae603d + React-RCTText: 87456d45e8bcc0c831b7c7fcfcfd860a54f54a79 + React-RCTVibration: ea899478e6f10ee526f476f769ab33211be2addd + React-runtimeexecutor: df1518d092e8c74cafddc56690d1ac386ec24d7a + ReactCommon: fac40473e2c4117522384027ab33ad0cb6717dc5 + RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60 + RNCMaskedView: 0e1bc4bfa8365eba5fbbb71e07fbdc0555249489 + RNGestureHandler: bad495418bcbd3ab47017a38d93d290ebd406f50 + RNReanimated: 2cf7451318bb9cc430abeec8d67693f9cf4e039c + RNScreens: 4a1af06327774490d97342c00aee0c2bafb497b7 + Yoga: 7a4d48cfb35dfa542151e615fa73c1a0d88caf21 + +PODFILE CHECKSUM: 6ff4c838a1c209b25f53e9709460e3847fe29a5e + +COCOAPODS: 1.15.2 diff --git a/ios/Podfile.properties.json b/ios/Podfile.properties.json new file mode 100644 index 000000000..f6d872e81 --- /dev/null +++ b/ios/Podfile.properties.json @@ -0,0 +1,3 @@ +{ + "expo.jsEngine": "jsc" +} diff --git a/package-lock.json b/package-lock.json index ccba80e1d..b5ee496da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,6 @@ { "name": "jellyfin-expo", + "version": "1.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -5255,6 +5256,15 @@ "parse-json": "^4.0.0" } }, + "create-react-class": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, "cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", @@ -5302,6 +5312,14 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==" }, + "css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "requires": { + "hyphenate-style-name": "^1.0.3" + } + }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -6528,9 +6546,9 @@ } }, "expo": { - "version": "46.0.20", - "resolved": "https://registry.npmjs.org/expo/-/expo-46.0.20.tgz", - "integrity": "sha512-bNvLMcByZia/JsTngCXEKmI+outPQo6/V5M896yzUo4hdLApwIwq7kV/6bZqHuWyYFSdRgem3NATJRisHQrP1A==", + "version": "46.0.21", + "resolved": "https://registry.npmjs.org/expo/-/expo-46.0.21.tgz", + "integrity": "sha512-leTI/GZXDN78xIThqimdK3Bk6uQ5dVkuWr+C0U/K0Ng5qDojQhJGtkM2lSS595KVTa3uYP6m0149MBg6Fp3fpA==", "requires": { "@babel/runtime": "^7.14.0", "@expo/cli": "0.3.3", @@ -6725,6 +6743,16 @@ "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.4.4.tgz", "integrity": "sha512-5DV0hIEWgatSC3UgQuAZBoQeaS9CqeWRZ3vzBR9R/+IUD87Adbi4FGhU10nymRqFXOizGsureButGZIXPs7zEA==" }, + "expo-system-ui": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-1.3.0.tgz", + "integrity": "sha512-LQyG4rkZfZsYN3FSneWuNDVoZZ93TvN5byvLLTgJ8x90Lcuf7f7R5NHF6b2eq9IqTVkZedmHnmKO1TBV2fLg/A==", + "requires": { + "@expo/config-plugins": "~5.0.0", + "@react-native/normalize-color": "^2.0.0", + "debug": "^4.3.2" + } + }, "expo-web-browser": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-11.0.0.tgz", @@ -6845,6 +6873,11 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-loops": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.4.tgz", + "integrity": "sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg==" + }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -7513,6 +7546,11 @@ "debug": "4" } }, + "hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==" + }, "i18next": { "version": "21.10.0", "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.10.0.tgz", @@ -7652,6 +7690,15 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "inline-style-prefixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz", + "integrity": "sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==", + "requires": { + "css-in-js-utils": "^3.1.0", + "fast-loops": "^1.1.3" + } + }, "internal-ip": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", @@ -10933,6 +10980,11 @@ "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==" }, + "normalize-css-color": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/normalize-css-color/-/normalize-css-color-1.0.2.tgz", + "integrity": "sha512-jPJ/V7Cp1UytdidsPqviKEElFQJs22hUUgK5BOPHTwOonNCk7/2qOxhhqzEajmFrWJowADFfOFh1V+aWkRfy+w==" + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -11516,6 +11568,11 @@ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==" }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -11709,6 +11766,15 @@ } } }, + "react-dom": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.0.0.tgz", + "integrity": "sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + } + }, "react-freeze": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.3.tgz", @@ -11986,6 +12052,20 @@ "whatwg-url-without-unicode": "8.0.0-3" } }, + "react-native-web": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.18.12.tgz", + "integrity": "sha512-fboP7yqobJ8InSr4fP+bQ3scOtSQtUoPcR+HWasH8b/fk/RO+mWcJs/8n+lewy9WTZc2D68ha7VwRDviUshEWA==", + "requires": { + "@babel/runtime": "^7.18.6", + "create-react-class": "^15.7.0", + "fbjs": "^3.0.4", + "inline-style-prefixer": "^6.0.1", + "normalize-css-color": "^1.0.2", + "postcss-value-parser": "^4.2.0", + "styleq": "^0.1.2" + } + }, "react-native-webview": { "version": "11.23.0", "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.23.0.tgz", @@ -13302,6 +13382,11 @@ "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==" }, + "styleq": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/styleq/-/styleq-0.1.3.tgz", + "integrity": "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==" + }, "sucrase": { "version": "3.29.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.29.0.tgz", diff --git a/package.json b/package.json index 968f990af..0f86d31ed 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,10 @@ { - "main": "node_modules/expo/AppEntry.js", + "name": "jellyfin-expo", + "version": "1.5.0", "scripts": { - "start": "expo start", - "android": "expo start --android", - "ios": "expo start --ios", + "start": "expo start --dev-client", + "android": "expo run:android", + "ios": "expo run:ios", "eject": "expo prebuild", "lint": "eslint \".\"", "test": "jest --watchAll" @@ -42,7 +43,7 @@ "@react-navigation/native-stack": "6.9.12", "@react-navigation/stack": "6.3.16", "compare-versions": "3.6.0", - "expo": "^46.0.0", + "expo": "46.0.21", "expo-asset": "~8.6.3", "expo-av": "~12.0.4", "expo-constants": "~13.2.4", @@ -54,6 +55,7 @@ "expo-screen-orientation": "~4.3.0", "expo-splash-screen": "~0.16.2", "expo-status-bar": "~1.4.0", + "expo-system-ui": "~1.3.0", "expo-web-browser": "~11.0.0", "i18next": "21.10.0", "mobx": "5.15.7", @@ -74,7 +76,9 @@ "react-native-screens": "~3.15.0", "react-native-url-polyfill": "1.3.0", "react-native-webview": "11.23.0", - "uuid": "8.3.2" + "uuid": "8.3.2", + "react-dom": "18.0.0", + "react-native-web": "~0.18.7" }, "devDependencies": { "@babel/core": "^7.18.6", diff --git a/patches/xcode15.patch b/patches/xcode15.patch new file mode 100644 index 000000000..ce8b23d3a --- /dev/null +++ b/patches/xcode15.patch @@ -0,0 +1,31 @@ +diff --git a/ios/Podfile b/ios/Podfile +index 6b1937a..9e119e6 100644 +--- a/ios/Podfile ++++ b/ios/Podfile +@@ -47,6 +47,14 @@ target 'Jellyfin' do + end + end + end ++ ++ # This is necessary for Xcode 15 compatibility ++ # https://github.com/facebook/react-native/issues/37748#issuecomment-1580589448 ++ installer.pods_project.targets.each do |target| ++ target.build_configurations.each do |config| ++ config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION'] ++ end ++ end + end + + post_integrate do |installer| +diff --git a/ios/Podfile.lock b/ios/Podfile.lock +index bea2dad..c4b90aa 100644 +--- a/ios/Podfile.lock ++++ b/ios/Podfile.lock +@@ -632,6 +632,6 @@ SPEC CHECKSUMS: + RNScreens: 4a1af06327774490d97342c00aee0c2bafb497b7 + Yoga: 7a4d48cfb35dfa542151e615fa73c1a0d88caf21 + +-PODFILE CHECKSUM: 886347fc7958cd8169a4e06f4a5e125dadf419a3 ++PODFILE CHECKSUM: 6ff4c838a1c209b25f53e9709460e3847fe29a5e + + COCOAPODS: 1.15.2