Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
gotools

# Node
nodejs_20
nodejs_22
corepack

# Java (Android builds)
Expand Down
4 changes: 3 additions & 1 deletion mobile-app/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath()
react {
entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim())
reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc"
// hermesCommand is intentionally not set: RN 0.86 moved the prebuilt
// hermesc CLI out of react-native/sdks/hermesc into the `hermes-compiler`
// npm package, and the plugin resolves it automatically from there.
codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()

enableBundleCompression = (findProperty('android.enableBundleCompression') ?: false).toBoolean()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,37 +6,26 @@ import android.content.res.Configuration
import com.facebook.react.PackageList
import com.facebook.react.ReactApplication
import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative
import com.facebook.react.ReactNativeHost
import com.facebook.react.ReactPackage
import com.facebook.react.ReactHost
import com.facebook.react.common.ReleaseLevel
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint
import com.facebook.react.defaults.DefaultReactNativeHost

import expo.modules.ApplicationLifecycleDispatcher
import expo.modules.ReactNativeHostWrapper
import expo.modules.ExpoReactHostFactory

class MainApplication : Application(), ReactApplication {

override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper(
this,
object : DefaultReactNativeHost(this) {
override fun getPackages(): List<ReactPackage> =
PackageList(this).packages.apply {
add(GoServerBridgePackage())
add(QRScannerPackage())
}

override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry"

override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG

override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
}
)

override val reactHost: ReactHost
get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost)
override val reactHost: ReactHost by lazy {
ExpoReactHostFactory.getDefaultReactHost(
context = applicationContext,
packageList =
PackageList(this).packages.apply {
add(GoServerBridgePackage())
add(QRScannerPackage())
}
)
}

override fun onCreate() {
super.onCreate()
Expand Down
17 changes: 9 additions & 8 deletions mobile-app/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,6 @@
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "light",
"newArchEnabled": true,
"splash": {
"image": "./assets/splash-icon.png",
"resizeMode": "contain",
"backgroundColor": "#2b57c8"
},
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.siddarthkay.syncup"
Expand All @@ -21,15 +15,22 @@
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#2b57c8"
},
"edgeToEdgeEnabled": true,
"predictiveBackGestureEnabled": false,
"package": "com.siddarthkay.syncup"
},
"web": {
"favicon": "./assets/favicon.png"
},
"plugins": [
"expo-video"
"expo-video",
[
"expo-splash-screen",
{
"image": "./assets/splash-icon.png",
"resizeMode": "contain",
"backgroundColor": "#2b57c8"
}
]
]
}
}
5 changes: 5 additions & 0 deletions mobile-app/eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ module.exports = [
// Exhaustive deps is a noisy but valuable correctness check.
'react-hooks/exhaustive-deps': 'warn',

'react-hooks/refs': 'warn',
'react-hooks/set-state-in-effect': 'warn',
'react-hooks/immutability': 'warn',
'react-hooks/purity': 'warn',

// Soft on 'any', we use it for a few bridge-facing boundaries.
'@typescript-eslint/no-explicit-any': 'off',

Expand Down
6 changes: 2 additions & 4 deletions mobile-app/ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@ podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties
ENV['RCT_NEW_ARCH_ENABLED'] ||= '0' if podfile_properties['newArchEnabled'] == 'false'
ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] ||= podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR']
ENV['RCT_USE_RN_DEP'] ||= '1' if podfile_properties['ios.buildReactNativeFromSource'] != 'true' && podfile_properties['newArchEnabled'] != 'false'
# Force building React-Core from source to include DevSupport for expo-dev-client since expo 55 is not out yet
ENV['RCT_USE_PREBUILT_RNCORE'] = '0'
platform :ios, podfile_properties['ios.deploymentTarget'] || '16.0'
platform :ios, podfile_properties['ios.deploymentTarget'] || '16.4'

prepare_react_native_project!

Expand Down Expand Up @@ -61,7 +59,7 @@ target 'syncup' do
# Patch pod targets
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.0'
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.4'
config.build_settings['HEADER_SEARCH_PATHS'] ||= ['$(inherited)']
config.build_settings['HEADER_SEARCH_PATHS'] << folly_path
end
Expand Down
2 changes: 1 addition & 1 deletion mobile-app/ios/Podfile.properties.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"expo.jsEngine": "hermes",
"EX_DEV_CLIENT_NETWORK_INSPECTOR": "true",
"newArchEnabled": "true",
"ios.deploymentTarget": "16.0"
"ios.deploymentTarget": "16.4"
}
32 changes: 28 additions & 4 deletions mobile-app/ios/syncup.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -256,11 +256,15 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-syncup/Pods-syncup-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ExpoModulesJSI/ExpoModulesJSI.framework/ExpoModulesJSI",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/React-Core-prebuilt/React.framework/React",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/ReactNativeDependencies/ReactNativeDependencies.framework/ReactNativeDependencies",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermesvm.framework/hermesvm",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ExpoModulesJSI.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/React.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactNativeDependencies.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermesvm.framework",
);
Expand All @@ -284,6 +288,7 @@
"${PODS_CONFIGURATION_BUILD_DIR}/RNSVG/RNSVGFilters.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-timing/React-timing_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-launcher/EXDevLauncher.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-menu/EXDevMenu.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/react-native-blob-util/ReactNativeBlobUtilPrivacyInfo.bundle",
Expand All @@ -298,6 +303,7 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-timing_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevLauncher.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevMenu.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ReactNativeBlobUtilPrivacyInfo.bundle",
Expand Down Expand Up @@ -391,7 +397,7 @@
"FB_SONARKIT_ENABLED=1",
);
INFOPLIST_FILE = syncup/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -422,7 +428,7 @@
CODE_SIGN_ENTITLEMENTS = syncup/syncup.entitlements;
CURRENT_PROJECT_VERSION = 1;
INFOPLIST_FILE = syncup/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -490,14 +496,23 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = (
/usr/lib/swift,
"$(inherited)",
);
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"$(inherited)",
"-DRCT_REMOVE_LEGACY_ARCH=1",
);
OTHER_CPLUSPLUSFLAGS = (
"$(inherited)",
"-DRCT_REMOVE_LEGACY_ARCH=1",
);
PODFILE_DIR = "$(SRCROOT)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
Expand Down Expand Up @@ -546,13 +561,22 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
LD_RUNPATH_SEARCH_PATHS = (
/usr/lib/swift,
"$(inherited)",
);
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_CFLAGS = (
"$(inherited)",
"-DRCT_REMOVE_LEGACY_ARCH=1",
);
OTHER_CPLUSPLUSFLAGS = (
"$(inherited)",
"-DRCT_REMOVE_LEGACY_ARCH=1",
);
PODFILE_DIR = "$(SRCROOT)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ENABLE_EXPLICIT_MODULES = NO;
Expand Down
3 changes: 1 addition & 2 deletions mobile-app/ios/syncup/AppDelegate.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import AppIntents
import Expo
public import Expo
import React
import ReactAppDependencyProvider
import UserNotifications
Expand Down Expand Up @@ -44,7 +44,6 @@ public class AppDelegate: ExpoAppDelegate {

reactNativeDelegate = delegate
reactNativeFactory = factory
bindReactNativeFactory(factory)

#if os(iOS) || os(tvOS)
window = UIWindow(frame: UIScreen.main.bounds)
Expand Down
40 changes: 19 additions & 21 deletions mobile-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,38 +21,40 @@
]
},
"dependencies": {
"@babel/core": "^7.28.4",
"@babel/core": "^7.29.0",
"@expo/vector-icons": "^15.0.2",
"@react-native-async-storage/async-storage": "2.2.0",
"@shopify/flash-list": "^2.3.1",
"expo": "~54.0.10",
"expo-camera": "~17.0.10",
"expo-dev-client": "~6.0.12",
"expo-file-system": "~19.0.21",
"expo-haptics": "~15.0.8",
"expo-media-library": "~18.2.1",
"expo-sharing": "~14.0.8",
"expo-status-bar": "~3.0.8",
"expo-video": "~3.0.16",
"react": "19.1.1",
"react-native": "0.82.0",
"expo": "~57.0.7",
"expo-camera": "~57.0.3",
"expo-dev-client": "~57.0.7",
"expo-file-system": "~57.0.1",
"expo-haptics": "~57.0.1",
"expo-media-library": "~57.0.3",
"expo-sharing": "~57.0.6",
"expo-splash-screen": "~57.0.4",
"expo-status-bar": "~57.0.1",
"expo-video": "~57.0.1",
"react": "19.2.3",
"react-native": "0.86.0",
"react-native-blob-util": "^0.24.7",
"react-native-pdf": "^7.0.4",
"react-native-qrcode-svg": "^6.3.21",
"react-native-safe-area-context": "^5.7.0",
"react-native-svg": "^15.15.4",
"react-native-webview": "13.15.0"
"react-native-webview": "13.16.1"
},
"devDependencies": {
"@types/babel__core": "^7",
"@types/jest": "^30.0.0",
"@types/react": "~19.1.0",
"@types/react": "~19.2.0",
"eslint": "^9.17.0",
"eslint-config-expo": "^55.0.0",
"eslint-config-expo": "^57.0.0",
"eslint-plugin-unused-imports": "^4.4.1",
"jest": "^30.3.0",
"prettier": "^3.8.3",
"ts-jest": "^29.4.9",
"typescript": "~5.9.2"
"typescript": "~6.0.3"
},
"codegenConfig": {
"name": "GoServerBridgeSpec",
Expand All @@ -74,9 +76,5 @@
]
}
},
"private": true,
"resolutions": {
"expo-modules-core@npm:3.0.18": "patch:expo-modules-core@npm%3A3.0.18#./patches/expo-modules-core-npm-3.0.18-8381554df1.patch",
"expo-dev-launcher@npm:6.0.14": "patch:expo-dev-launcher@npm%3A6.0.14#./patches/expo-dev-launcher-npm-6.0.14-4b3774e49b.patch"
}
"private": true
}
28 changes: 0 additions & 28 deletions mobile-app/patches/expo-dev-launcher-npm-6.0.14-4b3774e49b.patch

This file was deleted.

13 changes: 0 additions & 13 deletions mobile-app/patches/expo-modules-core-npm-3.0.18-8381554df1.patch

This file was deleted.

1 change: 1 addition & 0 deletions mobile-app/src/components/CameraCapture.android.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export const CameraView = forwardRef<
</>
);
});
CameraView.displayName = 'CameraView';

export function useCameraPermissions(): [
{ granted: boolean; canAskAgain: boolean } | null,
Expand Down
2 changes: 1 addition & 1 deletion mobile-app/src/screens/FilePreviewModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ function VideoPreview({ fileUri, audioOnly }: { fileUri: string; audioOnly?: boo
player={player}
style={audioOnly ? styles.audioView : styles.videoView}
contentFit="contain"
allowsFullscreen
fullscreenOptions={{ enable: true }}
allowsPictureInPicture
/>
</View>
Expand Down
Loading
Loading