[MOB-2] Job Manager (#1114)

* add job manager modal and button

* cleanup directories and add card to debug screen

* expo sdk 49

* update pods

* updated native android files

* updated native ios files

* pods being cringe

* update hermes

* podfile

* big update packages

* fix and upgrade animations to reanimated 3

* nice types moti

* clean imports

* upgrade react-hook-form (fix type)

* move stuff to sd/client and some organization

* camel case

* i liek switch

* Merge iconImg & circleIcon props

* wip

* copy changes to mobile

* move job context and job progress to client and also use it on mobile

* pnpm-lock

* (wip) - make job swipeable + styling

* job progress bar and more style tweaks

* no spring animation on progress bar pls

* new loading animation

* padding and pnpm lock

* indeterminate progress bar

* cleanup & update packages etc

* leave some todos for future

* fix types

* monorepo types :)

---------

Co-authored-by: Oscar Beaumont <oscar@otbeaumont.me>
This commit is contained in:
Utku
2023-08-26 00:40:07 +03:00
committed by GitHub
parent 17de35baec
commit e2f30715e3
125 changed files with 1852 additions and 1729 deletions

View File

@@ -42,7 +42,7 @@ export function lockAppTheme(themeType: AppThemeType) {
return invoke()<null>("lock_app_theme", { themeType })
}
export type RevealItem = { Location: { id: number } } | { FilePath: { id: number } }
export type AppThemeType = "Auto" | "Light" | "Dark"
export type OpenFilePathResult = { t: "NoLibrary" } | { t: "NoFile"; c: number } | { t: "OpenError"; c: [number, string] } | { t: "AllGood"; c: number } | { t: "Internal"; c: string }
export type RevealItem = { Location: { id: number } } | { FilePath: { id: number } }
export type OpenWithApplication = { url: string; name: string }

View File

@@ -31,7 +31,7 @@
"react": "18.2.0",
"react-burger-menu": "^3.0.9",
"react-dom": "^18.2.0",
"react-hook-form": "^7.43.9",
"react-hook-form": "~7.45.2",
"react-tsparticles": "^2.10.1",
"reading-time": "^1.5.0",
"rehype-autolink-headings": "^6.1.1",
@@ -45,7 +45,7 @@
"three": "^0.154",
"tsparticles": "^2.9.3",
"uuid": "^9.0.0",
"zod": "^3.21.4"
"zod": "~3.22.2"
},
"devDependencies": {
"@sd/config": "workspace:*",

View File

@@ -1,55 +1,34 @@
# 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
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
.cxx/
*.keystore
!debug.keystore
# node.js
#
# dependencies
node_modules/
npm-debug.log
yarn-error.log
# Bundle artifacts
*.jsbundle
# CocoaPods
/ios/Pods/
# Temporary files created by Metro to check the health of the file watcher
.metro-health-check*
# Expo
.expo/
dist/
web-build/
dist/
# Native
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
# Metro
.metro-health-check*
# debug
npm-debug.*
yarn-debug.*
yarn-error.*
# macOS
.DS_Store
*.pem
# local env files
.env*.local
# typescript
*.tsbuildinfo

View File

@@ -12,4 +12,4 @@ local.properties
*.hprof
# Bundle artifacts
*.jsbundle
*.jsbundle

View File

@@ -1,8 +1,6 @@
apply plugin: "com.android.application"
apply plugin: "com.facebook.react"
import com.android.build.OutputFile
// SPACEDRIVE CODE
apply plugin: 'org.mozilla.rust-android-gradle.rust-android'
@@ -33,16 +31,7 @@ tasks.whenTaskAdded { task ->
}
// END SPACEDRIVE CODE
def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath()
def expoDebuggableVariants = ['debug']
// Override `debuggableVariants` for expo-updates debugging
if (System.getenv('EX_UPDATES_NATIVE_DEBUG') == "1") {
react {
expoDebuggableVariants = []
}
}
/**
* This is the configuration block to customize your React Native Android app.
@@ -52,17 +41,20 @@ 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"
debuggableVariants = expoDebuggableVariants
codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
// Use Expo CLI to bundle the app, this ensures the Metro config
// works correctly with Expo projects.
cliFile = new File(["node", "--print", "require.resolve('@expo/cli')"].execute(null, rootDir).text.trim())
bundleCommand = "export:embed"
/* Folders */
// The root of your project, i.e. where "package.json" lives. Default is '..'
// root = file("../")
// The folder where the react-native NPM package is. Default is ../node_modules/react-native
// reactNativeDir = file("../node_modules/react-native")
// The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen
// codegenDir = file("../node_modules/react-native-codegen")
// The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js
// cliFile = file("../node_modules/react-native/cli.js")
// The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen
// codegenDir = file("../node_modules/@react-native/codegen")
/* Variants */
// The list of variants to that are debuggable. For those we're going to
@@ -73,9 +65,7 @@ react {
/* Bundling */
// A list containing the node command and its flags. Default is just 'node'.
// nodeExecutableAndArgs = ["node"]
//
// The command to run when bundling. By default is 'bundle'
// bundleCommand = "ram-bundle"
//
// The path to the CLI configuration file. Default is empty.
// bundleConfig = file(../rn-cli.config.js)
@@ -98,19 +88,6 @@ react {
// hermesFlags = ["-O", "-output-source-map"]
}
// Override `hermesEnabled` by `expo.jsEngine`
ext {
hermesEnabled = (findProperty('expo.jsEngine') ?: "hermes") == "hermes"
}
/**
* Set this to true to create four separate APKs instead of one,
* one for each native architecture. This is useful if you don't
* use App Bundles (https://developer.android.com/guide/app-bundle/)
* and want to have separate APKs to upload to the Play Store.
*/
def enableSeparateBuildPerCPUArchitecture = false
/**
* Set this to true to Run Proguard on Release builds to minify the Java bytecode.
*/
@@ -129,37 +106,20 @@ def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInRelea
*/
def jscFlavor = 'org.webkit:android-jsc:+'
/**
* Private function to get the list of Native Architectures you want to build.
* This reads the value from reactNativeArchitectures in your gradle.properties
* file and works together with the --active-arch-only flag of react-native run-android.
*/
def reactNativeArchitectures() {
def value = project.getProperties().get("reactNativeArchitectures")
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
}
android {
ndkVersion rootProject.ext.ndkVersion
compileSdkVersion rootProject.ext.compileSdkVersion
namespace 'com.spacedrive.app'
namespace "com.spacedrive"
defaultConfig {
applicationId 'com.spacedrive.app'
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "0.0.1"
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include (*reactNativeArchitectures())
}
buildConfigField("boolean", "REACT_NATIVE_UNSTABLE_USE_RUNTIME_SCHEDULER_ALWAYS", (findProperty("reactNative.unstable_useRuntimeSchedulerAlways") ?: true).toString())
}
signingConfigs {
debug {
@@ -177,26 +137,11 @@ android {
// Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android.
signingConfig signingConfigs.debug
shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false)
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// https://developer.android.com/studio/build/configure-apk-splits.html
// Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
defaultConfig.versionCode * 1000 + versionCodes.get(abi)
}
}
}
}
// Apply static values from `gradle.properties` to the `android.packagingOptions`
@@ -248,8 +193,6 @@ dependencies {
}
}
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0")
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}")
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.squareup.okhttp3', module:'okhttp'

View File

@@ -11,4 +11,4 @@
-keep class com.swmansion.reanimated.** { *; }
-keep class com.facebook.react.turbomodule.** { *; }
# Add any project specific keep options here:
# Add any project specific keep options here:

View File

@@ -72,4 +72,4 @@ public class ReactNativeFlipper {
}
}
}
}
}

View File

@@ -14,11 +14,10 @@
</intent>
</queries>
<application android:name=".MainApplication" android:label="@string/app_name"
android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher" android:allowBackup="true" android:theme="@style/AppTheme"
android:requestLegacyExternalStorage="true">
<meta-data android:name="expo.modules.updates.ENABLED" android:value="false" />
<meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="48.0.0" />
<meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="49.0.0" />
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH"
android:value="ALWAYS" />
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS" android:value="0" />

View File

@@ -40,10 +40,7 @@ public class MainActivity extends ReactActivity {
this,
getMainComponentName(),
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled
// If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18).
DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled
));
DefaultNewArchitectureEntryPoint.getFabricEnabled()));
}
/**
@@ -65,4 +62,4 @@ public class MainActivity extends ReactActivity {
// because it's doing more than {@link Activity#moveTaskToBack} in fact.
super.invokeDefaultOnBackPressed();
}
}
}

View File

@@ -8,6 +8,7 @@ import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.config.ReactFeatureFlags;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactNativeHost;
import com.facebook.soloader.SoLoader;
@@ -37,7 +38,7 @@ public class MainApplication extends Application implements ReactApplication {
@Override
protected String getJSMainModuleName() {
return "index";
return ".expo/.virtual-metro-entry";
}
@Override
@@ -60,6 +61,9 @@ public class MainApplication extends Application implements ReactApplication {
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
if (!BuildConfig.REACT_NATIVE_UNSTABLE_USE_RUNTIME_SCHEDULER_ALWAYS) {
ReactFeatureFlags.unstable_useRuntimeSchedulerAlways = false;
}
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
DefaultNewArchitectureEntryPoint.load();
@@ -73,4 +77,4 @@ public class MainApplication extends Application implements ReactApplication {
super.onConfigurationChanged(newConfig);
ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig);
}
}
}

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

@@ -20,7 +20,7 @@
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">
<selector>
<!--
<!--
This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I).
The item below with state_pressed="false" and state_focused="false" causes a NullPointerException.
NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)'

View File

@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splashscreen_background" />
<item android:drawable="@color/splashscreen_background"/>
</layer-list>

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/iconBackground"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/iconBackground"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -1,6 +1,6 @@
<resources>
<color name="splashscreen_background">#000000</color>
<color name="iconBackground">#ffffff</color>
<color name="iconBackground">#FFFFFF</color>
<color name="colorPrimary">#023c69</color>
<color name="colorPrimaryDark">#000000</color>
</resources>

View File

@@ -1,3 +1,5 @@
<resources>
<string name="app_name">Spacedrive</string>
<string name="expo_splash_screen_resize_mode" translatable="false">contain</string>
<string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string>
</resources>

View File

@@ -1,20 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree.
*/
package com.spacedrive.app;
import android.content.Context;
import com.facebook.react.ReactInstanceManager;
/**
* Class responsible of loading Flipper inside your React Native application. This is the release
* flavor of it so it's empty as we don't want to load Flipper.
*/
public class ReactNativeFlipper {
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
// Do nothing as we don't want to initialize Flipper on Release.
}
}

View File

@@ -6,9 +6,7 @@ buildscript {
minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '21')
compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '33')
targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '33')
if (findProperty('android.kotlinVersion')) {
kotlinVersion = findProperty('android.kotlinVersion')
}
kotlinVersion = findProperty('android.kotlinVersion') ?: '1.8.10'
frescoVersion = findProperty('expo.frescoVersion') ?: '2.5.0'
// We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP.
@@ -23,7 +21,7 @@ buildscript {
}
}
dependencies {
classpath('com.android.tools.build:gradle:7.4.1')
classpath('com.android.tools.build:gradle:7.4.2')
classpath('com.facebook.react:react-native-gradle-plugin')
// Spacedrive -- Rust plugin.
classpath('org.mozilla.rust-android-gradle:plugin:0.9.3')

View File

@@ -26,7 +26,7 @@ android.useAndroidX=true
android.enableJetifier=true
# Version of flipper SDK to use with React Native
FLIPPER_VERSION=0.125.0
FLIPPER_VERSION=0.182.0
# Use this property to specify which architecture you want to build.
# You can also override it from the CLI using
@@ -40,9 +40,9 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
# are providing them.
newArchEnabled=false
# The hosted JavaScript engine
# Supported values: expo.jsEngine = "hermes" | "jsc"
expo.jsEngine=hermes
# Use this property to enable or disable the Hermes JS engine.
# If set to false, you will be using JSC instead.
hermesEnabled=true
# Enable GIF support in React Native images (~200 B increase)
expo.gif.enabled=true
@@ -50,4 +50,9 @@ expo.gif.enabled=true
expo.webp.enabled=true
# Enable animated webp support (~3.4 MB increase)
# Disabled by default because iOS doesn't support animated webp
expo.webp.animated=false
expo.webp.animated=false
# Enable network inspector
EX_DEV_CLIENT_NETWORK_INSPECTOR=true
expo.jsEngine=hermes

View File

@@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
zipStorePath=wrapper/dists

View File

@@ -237,4 +237,4 @@ eval "set -- $(
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
exec "$JAVACMD" "$@"

View File

@@ -88,4 +88,4 @@ exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
:omega

View File

@@ -7,4 +7,4 @@ apply from: new File(["node", "--print", "require.resolve('@react-native-communi
applyNativeModulesSettingsGradle(settings)
include ':app'
includeBuild(new File(["node", "--print", "require.resolve('react-native-gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile())
includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile())

View File

@@ -9,15 +9,23 @@
"scheme": "spacedrive",
"platforms": ["ios", "android"],
"userInterfaceStyle": "automatic",
"icon": "./assets/icon.png",
"updates": {
"enabled": false,
"fallbackToCacheTimeout": 0
},
"assetBundlePatterns": ["**/*"],
"ios": {
"supportsTablet": false
"supportsTablet": false,
"bundleIdentifier": "com.spacedrive.app"
},
"android": {
"package": "com.spacedrive.app"
},
"splash": {
"image": "./assets/splash.png",
"backgroundColor": "#000000"
},
"android": {},
"privacy": "hidden"
}
}

BIN
apps/mobile/assets/icon.png Normal file
View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

View File

@@ -1 +1,11 @@
export NODE_BINARY=$(command -v node)
# 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)

View File

@@ -1,11 +1,11 @@
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 {}
ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0'
ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR']
platform :ios, podfile_properties['ios.deploymentTarget']
install! 'cocoapods',
@@ -61,8 +61,6 @@ target 'Spacedrive' do
react_native_post_install(
installer,
config[:reactNativePath],
# Set `mac_catalyst_enabled` to `true` in order to apply patches
# necessary for Mac Catalyst builds
:mac_catalyst_enabled => false
)
__apply_Xcode_12_5_M1_post_install_workaround(installer)

View File

@@ -1,45 +1,49 @@
PODS:
- boost (1.76.0)
- DoubleConversion (1.1.6)
- EXApplication (5.1.1):
- EXApplication (5.3.0):
- ExpoModulesCore
- EXConstants (14.2.1):
- EXConstants (14.4.2):
- ExpoModulesCore
- EXFileSystem (15.2.2):
- EXFileSystem (15.4.3):
- ExpoModulesCore
- EXFont (11.1.1):
- EXFont (11.4.0):
- ExpoModulesCore
- EXMediaLibrary (15.2.3):
- EXMediaLibrary (15.4.1):
- ExpoModulesCore
- RCT-Folly (= 2021.07.22.00)
- React-Core
- Expo (48.0.19):
- Expo (49.0.8):
- ExpoModulesCore
- ExpoKeepAwake (12.0.1):
- ExpoKeepAwake (12.3.0):
- ExpoModulesCore
- ExpoModulesCore (1.2.7):
- ExpoModulesCore (1.5.10):
- RCT-Folly (= 2021.07.22.00)
- React-Core
- React-NativeModulesApple
- React-RCTAppDelegate
- ReactCommon/turbomodule/core
- EXSplashScreen (0.18.2):
- EXSplashScreen (0.20.4):
- ExpoModulesCore
- React-Core
- FBLazyVector (0.71.3)
- FBReactNativeSpec (0.71.3):
- RCT-Folly (= 2021.07.22.00)
- RCTRequired (= 0.71.3)
- RCTTypeSafety (= 0.71.3)
- React-Core (= 0.71.3)
- React-jsi (= 0.71.3)
- ReactCommon/turbomodule/core (= 0.71.3)
- React-Core
- FBLazyVector (0.72.3)
- FBReactNativeSpec (0.72.3):
- RCT-Folly (= 2021.07.22.00)
- RCTRequired (= 0.72.3)
- RCTTypeSafety (= 0.72.3)
- React-Core (= 0.72.3)
- React-jsi (= 0.72.3)
- ReactCommon/turbomodule/core (= 0.72.3)
- fmt (6.2.1)
- glog (0.3.5)
- hermes-engine (0.71.3):
- hermes-engine/Pre-built (= 0.71.3)
- hermes-engine/Pre-built (0.71.3)
- hermes-engine (0.72.3):
- hermes-engine/Pre-built (= 0.72.3)
- hermes-engine/Pre-built (0.72.3)
- libevent (2.1.12)
- lottie-ios (3.4.4)
- lottie-react-native (5.1.4):
- lottie-ios (~> 3.4.0)
- lottie-ios (4.2.0)
- lottie-react-native (6.2.0):
- lottie-ios (~> 4.2.0)
- React-Core
- RCT-Folly (2021.07.22.00):
- boost
@@ -58,27 +62,29 @@ PODS:
- fmt (~> 6.2.1)
- glog
- libevent
- RCTRequired (0.71.3)
- RCTTypeSafety (0.71.3):
- FBLazyVector (= 0.71.3)
- RCTRequired (= 0.71.3)
- React-Core (= 0.71.3)
- React (0.71.3):
- React-Core (= 0.71.3)
- React-Core/DevSupport (= 0.71.3)
- React-Core/RCTWebSocket (= 0.71.3)
- React-RCTActionSheet (= 0.71.3)
- React-RCTAnimation (= 0.71.3)
- React-RCTBlob (= 0.71.3)
- React-RCTImage (= 0.71.3)
- React-RCTLinking (= 0.71.3)
- React-RCTNetwork (= 0.71.3)
- React-RCTSettings (= 0.71.3)
- React-RCTText (= 0.71.3)
- React-RCTVibration (= 0.71.3)
- React-callinvoker (0.71.3)
- React-Codegen (0.71.3):
- RCTRequired (0.72.3)
- RCTTypeSafety (0.72.3):
- FBLazyVector (= 0.72.3)
- RCTRequired (= 0.72.3)
- React-Core (= 0.72.3)
- React (0.72.3):
- React-Core (= 0.72.3)
- React-Core/DevSupport (= 0.72.3)
- React-Core/RCTWebSocket (= 0.72.3)
- React-RCTActionSheet (= 0.72.3)
- React-RCTAnimation (= 0.72.3)
- React-RCTBlob (= 0.72.3)
- React-RCTImage (= 0.72.3)
- React-RCTLinking (= 0.72.3)
- React-RCTNetwork (= 0.72.3)
- React-RCTSettings (= 0.72.3)
- React-RCTText (= 0.72.3)
- React-RCTVibration (= 0.72.3)
- React-callinvoker (0.72.3)
- React-Codegen (0.72.3):
- DoubleConversion
- FBReactNativeSpec
- glog
- hermes-engine
- RCT-Folly
- RCTRequired
@@ -86,319 +92,388 @@ PODS:
- React-Core
- React-jsi
- React-jsiexecutor
- React-NativeModulesApple
- React-rncore
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- React-Core (0.71.3):
- React-Core (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default (= 0.71.3)
- React-cxxreact (= 0.71.3)
- React-Core/Default (= 0.72.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/CoreModulesHeaders (0.71.3):
- React-Core/CoreModulesHeaders (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/Default (0.71.3):
- React-Core/Default (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/DevSupport (0.71.3):
- React-Core/DevSupport (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default (= 0.71.3)
- React-Core/RCTWebSocket (= 0.71.3)
- React-cxxreact (= 0.71.3)
- React-Core/Default (= 0.72.3)
- React-Core/RCTWebSocket (= 0.72.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-jsinspector (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-jsinspector (= 0.72.3)
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/RCTActionSheetHeaders (0.71.3):
- React-Core/RCTActionSheetHeaders (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/RCTAnimationHeaders (0.71.3):
- React-Core/RCTAnimationHeaders (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/RCTBlobHeaders (0.71.3):
- React-Core/RCTBlobHeaders (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/RCTImageHeaders (0.71.3):
- React-Core/RCTImageHeaders (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/RCTLinkingHeaders (0.71.3):
- React-Core/RCTLinkingHeaders (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/RCTNetworkHeaders (0.71.3):
- React-Core/RCTNetworkHeaders (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/RCTSettingsHeaders (0.71.3):
- React-Core/RCTSettingsHeaders (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/RCTTextHeaders (0.71.3):
- React-Core/RCTTextHeaders (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/RCTVibrationHeaders (0.71.3):
- React-Core/RCTVibrationHeaders (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default
- React-cxxreact (= 0.71.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-Core/RCTWebSocket (0.71.3):
- React-Core/RCTWebSocket (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Core/Default (= 0.71.3)
- React-cxxreact (= 0.71.3)
- React-Core/Default (= 0.72.3)
- React-cxxreact
- React-hermes
- React-jsi (= 0.71.3)
- React-jsiexecutor (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi
- React-jsiexecutor
- React-perflogger
- React-runtimeexecutor
- React-utils
- SocketRocket (= 0.6.1)
- Yoga
- React-CoreModules (0.71.3):
- React-CoreModules (0.72.3):
- RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.71.3)
- React-Codegen (= 0.71.3)
- React-Core/CoreModulesHeaders (= 0.71.3)
- React-jsi (= 0.71.3)
- RCTTypeSafety (= 0.72.3)
- React-Codegen (= 0.72.3)
- React-Core/CoreModulesHeaders (= 0.72.3)
- React-jsi (= 0.72.3)
- React-RCTBlob
- React-RCTImage (= 0.71.3)
- ReactCommon/turbomodule/core (= 0.71.3)
- React-cxxreact (0.71.3):
- React-RCTImage (= 0.72.3)
- ReactCommon/turbomodule/core (= 0.72.3)
- SocketRocket (= 0.6.1)
- React-cxxreact (0.72.3):
- boost (= 1.76.0)
- DoubleConversion
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-callinvoker (= 0.71.3)
- React-jsi (= 0.71.3)
- React-jsinspector (= 0.71.3)
- React-logger (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-runtimeexecutor (= 0.71.3)
- React-hermes (0.71.3):
- React-callinvoker (= 0.72.3)
- React-debug (= 0.72.3)
- React-jsi (= 0.72.3)
- React-jsinspector (= 0.72.3)
- React-logger (= 0.72.3)
- React-perflogger (= 0.72.3)
- React-runtimeexecutor (= 0.72.3)
- React-debug (0.72.3)
- React-hermes (0.72.3):
- DoubleConversion
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- RCT-Folly/Futures (= 2021.07.22.00)
- React-cxxreact (= 0.71.3)
- React-cxxreact (= 0.72.3)
- React-jsi
- React-jsiexecutor (= 0.71.3)
- React-jsinspector (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsi (0.71.3):
- React-jsiexecutor (= 0.72.3)
- React-jsinspector (= 0.72.3)
- React-perflogger (= 0.72.3)
- React-jsi (0.72.3):
- boost (= 1.76.0)
- DoubleConversion
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-jsiexecutor (0.71.3):
- React-jsiexecutor (0.72.3):
- DoubleConversion
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-cxxreact (= 0.71.3)
- React-jsi (= 0.71.3)
- React-perflogger (= 0.71.3)
- React-jsinspector (0.71.3)
- React-logger (0.71.3):
- React-cxxreact (= 0.72.3)
- React-jsi (= 0.72.3)
- React-perflogger (= 0.72.3)
- React-jsinspector (0.72.3)
- React-logger (0.72.3):
- glog
- react-native-document-picker (8.2.1):
- react-native-document-picker (9.0.1):
- React-Core
- react-native-safe-area-context (4.5.1):
- react-native-safe-area-context (4.7.1):
- React-Core
- React-NativeModulesApple (0.72.3):
- hermes-engine
- React-callinvoker
- React-Core
- React-cxxreact
- React-jsi
- React-runtimeexecutor
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- React-perflogger (0.72.3)
- React-RCTActionSheet (0.72.3):
- React-Core/RCTActionSheetHeaders (= 0.72.3)
- React-RCTAnimation (0.72.3):
- RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.72.3)
- React-Codegen (= 0.72.3)
- React-Core/RCTAnimationHeaders (= 0.72.3)
- React-jsi (= 0.72.3)
- ReactCommon/turbomodule/core (= 0.72.3)
- React-RCTAppDelegate (0.72.3):
- RCT-Folly
- RCTRequired
- RCTTypeSafety
- React-Core
- React-CoreModules
- React-hermes
- React-NativeModulesApple
- React-RCTImage
- React-RCTNetwork
- React-runtimescheduler
- ReactCommon/turbomodule/core
- React-perflogger (0.71.3)
- React-RCTActionSheet (0.71.3):
- React-Core/RCTActionSheetHeaders (= 0.71.3)
- React-RCTAnimation (0.71.3):
- RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.71.3)
- React-Codegen (= 0.71.3)
- React-Core/RCTAnimationHeaders (= 0.71.3)
- React-jsi (= 0.71.3)
- ReactCommon/turbomodule/core (= 0.71.3)
- React-RCTAppDelegate (0.71.3):
- RCT-Folly
- RCTRequired
- RCTTypeSafety
- React-Core
- ReactCommon/turbomodule/core
- React-RCTBlob (0.71.3):
- React-RCTBlob (0.72.3):
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-Codegen (= 0.71.3)
- React-Core/RCTBlobHeaders (= 0.71.3)
- React-Core/RCTWebSocket (= 0.71.3)
- React-jsi (= 0.71.3)
- React-RCTNetwork (= 0.71.3)
- ReactCommon/turbomodule/core (= 0.71.3)
- React-RCTImage (0.71.3):
- React-Codegen (= 0.72.3)
- React-Core/RCTBlobHeaders (= 0.72.3)
- React-Core/RCTWebSocket (= 0.72.3)
- React-jsi (= 0.72.3)
- React-RCTNetwork (= 0.72.3)
- ReactCommon/turbomodule/core (= 0.72.3)
- React-RCTImage (0.72.3):
- RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.71.3)
- React-Codegen (= 0.71.3)
- React-Core/RCTImageHeaders (= 0.71.3)
- React-jsi (= 0.71.3)
- React-RCTNetwork (= 0.71.3)
- ReactCommon/turbomodule/core (= 0.71.3)
- React-RCTLinking (0.71.3):
- React-Codegen (= 0.71.3)
- React-Core/RCTLinkingHeaders (= 0.71.3)
- React-jsi (= 0.71.3)
- ReactCommon/turbomodule/core (= 0.71.3)
- React-RCTNetwork (0.71.3):
- RCTTypeSafety (= 0.72.3)
- React-Codegen (= 0.72.3)
- React-Core/RCTImageHeaders (= 0.72.3)
- React-jsi (= 0.72.3)
- React-RCTNetwork (= 0.72.3)
- ReactCommon/turbomodule/core (= 0.72.3)
- React-RCTLinking (0.72.3):
- React-Codegen (= 0.72.3)
- React-Core/RCTLinkingHeaders (= 0.72.3)
- React-jsi (= 0.72.3)
- ReactCommon/turbomodule/core (= 0.72.3)
- React-RCTNetwork (0.72.3):
- RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.71.3)
- React-Codegen (= 0.71.3)
- React-Core/RCTNetworkHeaders (= 0.71.3)
- React-jsi (= 0.71.3)
- ReactCommon/turbomodule/core (= 0.71.3)
- React-RCTSettings (0.71.3):
- RCTTypeSafety (= 0.72.3)
- React-Codegen (= 0.72.3)
- React-Core/RCTNetworkHeaders (= 0.72.3)
- React-jsi (= 0.72.3)
- ReactCommon/turbomodule/core (= 0.72.3)
- React-RCTSettings (0.72.3):
- RCT-Folly (= 2021.07.22.00)
- RCTTypeSafety (= 0.71.3)
- React-Codegen (= 0.71.3)
- React-Core/RCTSettingsHeaders (= 0.71.3)
- React-jsi (= 0.71.3)
- ReactCommon/turbomodule/core (= 0.71.3)
- React-RCTText (0.71.3):
- React-Core/RCTTextHeaders (= 0.71.3)
- React-RCTVibration (0.71.3):
- RCTTypeSafety (= 0.72.3)
- React-Codegen (= 0.72.3)
- React-Core/RCTSettingsHeaders (= 0.72.3)
- React-jsi (= 0.72.3)
- ReactCommon/turbomodule/core (= 0.72.3)
- React-RCTText (0.72.3):
- React-Core/RCTTextHeaders (= 0.72.3)
- React-RCTVibration (0.72.3):
- RCT-Folly (= 2021.07.22.00)
- React-Codegen (= 0.71.3)
- React-Core/RCTVibrationHeaders (= 0.71.3)
- React-jsi (= 0.71.3)
- ReactCommon/turbomodule/core (= 0.71.3)
- React-runtimeexecutor (0.71.3):
- React-jsi (= 0.71.3)
- ReactCommon/turbomodule/bridging (0.71.3):
- React-Codegen (= 0.72.3)
- React-Core/RCTVibrationHeaders (= 0.72.3)
- React-jsi (= 0.72.3)
- ReactCommon/turbomodule/core (= 0.72.3)
- React-rncore (0.72.3)
- React-runtimeexecutor (0.72.3):
- React-jsi (= 0.72.3)
- React-runtimescheduler (0.72.3):
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-callinvoker
- React-debug
- React-jsi
- React-runtimeexecutor
- React-utils (0.72.3):
- glog
- RCT-Folly (= 2021.07.22.00)
- React-debug
- ReactCommon/turbomodule/bridging (0.72.3):
- DoubleConversion
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-callinvoker (= 0.71.3)
- React-Core (= 0.71.3)
- React-cxxreact (= 0.71.3)
- React-jsi (= 0.71.3)
- React-logger (= 0.71.3)
- React-perflogger (= 0.71.3)
- ReactCommon/turbomodule/core (0.71.3):
- React-callinvoker (= 0.72.3)
- React-cxxreact (= 0.72.3)
- React-jsi (= 0.72.3)
- React-logger (= 0.72.3)
- React-perflogger (= 0.72.3)
- ReactCommon/turbomodule/core (0.72.3):
- DoubleConversion
- glog
- hermes-engine
- RCT-Folly (= 2021.07.22.00)
- React-callinvoker (= 0.71.3)
- React-Core (= 0.71.3)
- React-cxxreact (= 0.71.3)
- React-jsi (= 0.71.3)
- React-logger (= 0.71.3)
- React-perflogger (= 0.71.3)
- RNCAsyncStorage (1.17.12):
- React-callinvoker (= 0.72.3)
- React-cxxreact (= 0.72.3)
- React-jsi (= 0.72.3)
- React-logger (= 0.72.3)
- React-perflogger (= 0.72.3)
- RNCAsyncStorage (1.18.2):
- React-Core
- RNCMaskedView (0.2.8):
- RNCMaskedView (0.2.9):
- React-Core
- RNFlashList (1.4.2):
- RNFlashList (1.5.0):
- React-Core
- RNFS (2.20.0):
- React-Core
- RNGestureHandler (2.9.0):
- RNGestureHandler (2.12.1):
- React-Core
- RNReanimated (2.14.4):
- RNReanimated (3.4.2):
- DoubleConversion
- FBLazyVector
- FBReactNativeSpec
- glog
- hermes-engine
- RCT-Folly
- RCTRequired
- RCTTypeSafety
@@ -408,11 +483,13 @@ PODS:
- React-Core/RCTWebSocket
- React-CoreModules
- React-cxxreact
- React-hermes
- React-jsi
- React-jsiexecutor
- React-jsinspector
- React-RCTActionSheet
- React-RCTAnimation
- React-RCTAppDelegate
- React-RCTBlob
- React-RCTImage
- React-RCTLinking
@@ -421,11 +498,12 @@ PODS:
- React-RCTText
- ReactCommon/turbomodule/core
- Yoga
- RNScreens (3.20.0):
- RNScreens (3.23.0):
- React-Core
- React-RCTImage
- RNSVG (13.4.0):
- RNSVG (13.10.0):
- React-Core
- SocketRocket (0.6.1)
- Yoga (1.14.0)
DEPENDENCIES:
@@ -456,6 +534,7 @@ DEPENDENCIES:
- 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-debug (from `../../../node_modules/react-native/ReactCommon/react/debug`)
- React-hermes (from `../../../node_modules/react-native/ReactCommon/hermes`)
- React-jsi (from `../../../node_modules/react-native/ReactCommon/jsi`)
- React-jsiexecutor (from `../../../node_modules/react-native/ReactCommon/jsiexecutor`)
@@ -463,6 +542,7 @@ DEPENDENCIES:
- React-logger (from `../../../node_modules/react-native/ReactCommon/logger`)
- react-native-document-picker (from `../../../node_modules/react-native-document-picker`)
- react-native-safe-area-context (from `../../../node_modules/react-native-safe-area-context`)
- React-NativeModulesApple (from `../../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)
- 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`)
@@ -474,7 +554,10 @@ DEPENDENCIES:
- 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-rncore (from `../../../node_modules/react-native/ReactCommon`)
- React-runtimeexecutor (from `../../../node_modules/react-native/ReactCommon/runtimeexecutor`)
- React-runtimescheduler (from `../../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)
- React-utils (from `../../../node_modules/react-native/ReactCommon/react/utils`)
- 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-masked-view/masked-view`)"
@@ -491,6 +574,7 @@ SPEC REPOS:
- fmt
- libevent
- lottie-ios
- SocketRocket
EXTERNAL SOURCES:
boost:
@@ -523,6 +607,7 @@ EXTERNAL SOURCES:
:podspec: "../../../node_modules/react-native/third-party-podspecs/glog.podspec"
hermes-engine:
:podspec: "../../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec"
:tag: hermes-2023-03-20-RNv0.72.0-49794cfc7c81fb8f69fd60c3bbf85a7480cc5a77
lottie-react-native:
:path: "../../../node_modules/lottie-react-native"
RCT-Folly:
@@ -543,6 +628,8 @@ EXTERNAL SOURCES:
:path: "../../../node_modules/react-native/React/CoreModules"
React-cxxreact:
:path: "../../../node_modules/react-native/ReactCommon/cxxreact"
React-debug:
:path: "../../../node_modules/react-native/ReactCommon/react/debug"
React-hermes:
:path: "../../../node_modules/react-native/ReactCommon/hermes"
React-jsi:
@@ -557,6 +644,8 @@ EXTERNAL SOURCES:
:path: "../../../node_modules/react-native-document-picker"
react-native-safe-area-context:
:path: "../../../node_modules/react-native-safe-area-context"
React-NativeModulesApple:
:path: "../../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios"
React-perflogger:
:path: "../../../node_modules/react-native/ReactCommon/reactperflogger"
React-RCTActionSheet:
@@ -579,8 +668,14 @@ EXTERNAL SOURCES:
:path: "../../../node_modules/react-native/Libraries/Text"
React-RCTVibration:
:path: "../../../node_modules/react-native/Libraries/Vibration"
React-rncore:
:path: "../../../node_modules/react-native/ReactCommon"
React-runtimeexecutor:
:path: "../../../node_modules/react-native/ReactCommon/runtimeexecutor"
React-runtimescheduler:
:path: "../../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler"
React-utils:
:path: "../../../node_modules/react-native/ReactCommon/react/utils"
ReactCommon:
:path: "../../../node_modules/react-native/ReactCommon"
RNCAsyncStorage:
@@ -603,64 +698,70 @@ EXTERNAL SOURCES:
:path: "../../../node_modules/react-native/ReactCommon/yoga"
SPEC CHECKSUMS:
boost: 57d2868c099736d80fcd648bf211b4431e51a558
DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903
EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9
EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d
EXFont: 6ea3800df746be7233208d80fe379b8ed74f4272
EXMediaLibrary: 587cd8aad27a6fc8d7c38b950bc75bc1845a7480
Expo: 8448e3a2aa1b295f029c81551e1ab6d986517fdb
ExpoKeepAwake: 69f5f627670d62318410392d03e0b5db0f85759a
ExpoModulesCore: 653958063a301098b541ae4dfed1ac0b98db607b
EXSplashScreen: 0e0a9ba0cf7553094e93213099bd7b42e6e237e9
FBLazyVector: 60195509584153283780abdac5569feffb8f08cc
FBReactNativeSpec: c5a5c4f1b95ae42a17cd22c8c89c482a7b327fe3
boost: 20b6b3a53cb43939b6ffc2fd27d15ec7497167d0
DoubleConversion: 2d248a4174d78beaaa49735340c9bcc564091245
EXApplication: 02655a251434d564bb0e73291f5a490c74b5b76f
EXConstants: ce5bbea779da8031ac818c36bea41b10e14d04e1
EXFileSystem: 941b273758aee14be2ecc671dacb4f10dd28c833
EXFont: 738c44c390953ebcbab075a4848bfbef025fd9ee
EXMediaLibrary: 8ac14ce76f266026b10cac2ab049debe032d7ae7
Expo: 900dc423a0e2c7e822b2c683a89426e82695fb27
ExpoKeepAwake: be4cbd52d9b177cde0fd66daa1913afa3161fc1d
ExpoModulesCore: e5a168deba84f74c0e558befa31dbaea06c00af0
EXSplashScreen: 89586b0961acd173b04713b7457949b063a659da
FBLazyVector: 4cce221dd782d3ff7c4172167bba09d58af67ccb
FBReactNativeSpec: 60173e22b99be9ad9ac3842270d319de48e42817
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
hermes-engine: 38bfe887e456b33b697187570a08de33969f5db7
glog: 5b8834f2f3f7d36c1c73e5a9837f53f03cfe84eb
hermes-engine: 51d305855e02ee41d1b97d8b179ae88d01239906
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
lottie-ios: 8f97d3271e155c2d688875c29cd3c74908aef5f8
lottie-react-native: b702fab740cdb952a8e2354713d3beda63ff97b0
RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1
RCTRequired: bec48f07daf7bcdc2655a0cde84e07d24d2a9e2a
RCTTypeSafety: 171394eebacf71e1cfad79dbfae7ee8fc16ca80a
React: d7433ccb6a8c36e4cbed59a73c0700fc83c3e98a
React-callinvoker: 15f165009bd22ae829b2b600e50bcc98076ce4b8
React-Codegen: b5910000eaf1e0c2f47d29be6f82f5f1264420d7
React-Core: b6f2f78d580a90b83fd7b0d1c6911c799f6eac82
React-CoreModules: e0cbc1a4f4f3f60e23c476fef7ab37be363ea8c1
React-cxxreact: c87f3f124b2117d00d410b35f16c2257e25e50fa
React-hermes: c64ca6bdf16a7069773103c9bedaf30ec90ab38f
React-jsi: 39729361645568e238081b3b3180fbad803f25a4
React-jsiexecutor: 515b703d23ffadeac7687bc2d12fb08b90f0aaa1
React-jsinspector: 9f7c9137605e72ca0343db4cea88006cb94856dd
React-logger: 957e5dc96d9dbffc6e0f15e0ee4d2b42829ff207
react-native-document-picker: 69ca2094d8780cfc1e7e613894d15290fdc54bba
react-native-safe-area-context: f5549f36508b1b7497434baa0cd97d7e470920d4
React-perflogger: af8a3d31546077f42d729b949925cc4549f14def
React-RCTActionSheet: 57cc5adfefbaaf0aae2cf7e10bccd746f2903673
React-RCTAnimation: 11c61e94da700c4dc915cf134513764d87fc5e2b
React-RCTAppDelegate: c3980adeaadcfd6cb495532e928b36ac6db3c14a
React-RCTBlob: ccc5049d742b41971141415ca86b83b201495695
React-RCTImage: 7a9226b0944f1e76e8e01e35a9245c2477cdbabb
React-RCTLinking: bbe8cc582046a9c04f79c235b73c93700263e8b4
React-RCTNetwork: fc2ca322159dc54e06508d4f5c3e934da63dc013
React-RCTSettings: f1e9db2cdf946426d3f2b210e4ff4ce0f0d842ef
React-RCTText: 1c41dd57e5d742b1396b4eeb251851ce7ff0fca1
React-RCTVibration: 5199a180d04873366a83855de55ac33ce60fe4d5
React-runtimeexecutor: 7bf0dafc7b727d93c8cb94eb00a9d3753c446c3e
ReactCommon: 6f65ea5b7d84deb9e386f670dd11ce499ded7b40
RNCAsyncStorage: 09fc8595e6d6f6d5abf16b23a56b257d9c6b7c5b
RNCMaskedView: bc0170f389056201c82a55e242e5d90070e18e5a
RNFlashList: 7fbca4fc075484a9426f1610d648dbea2de94eb0
lottie-ios: 809ecf2d460ed650a6aed7aa88b2ec45fab4779c
lottie-react-native: b04640d81bfc87915cd5c9058caa1112374691ff
RCT-Folly: 30d165d2e977f66793419c3314296392cb793f38
RCTRequired: a2faf4bad4e438ca37b2040cb8f7799baa065c18
RCTTypeSafety: cb09f3e4747b6d18331a15eb05271de7441ca0b3
React: 13109005b5353095c052f26af37413340ccf7a5d
React-callinvoker: c8c87bce983aa499c13cb06d4447c025a35274d6
React-Codegen: 712d523524d89d71f1cf7cc624854941be983c4d
React-Core: 688f88b7f3a3d30b4848036223f8b07102c687e5
React-CoreModules: 63c063a3ade8fb3b1bec5fd9a50f17b0421558c6
React-cxxreact: 37765b4975541105b2a3322a4b473417c158c869
React-debug: 51f11ef8db14b47f24e71c42a4916d4192972156
React-hermes: 935ae71fb3d7654e947beba8498835cd5e479707
React-jsi: ec628dc7a15ffea969f237b0ea6d2fde212b19dd
React-jsiexecutor: 59d1eb03af7d30b7d66589c410f13151271e8006
React-jsinspector: b511447170f561157547bc0bef3f169663860be7
React-logger: c5b527272d5f22eaa09bb3c3a690fee8f237ae95
react-native-document-picker: 2b8f18667caee73a96708a82b284a4f40b30a156
react-native-safe-area-context: 9697629f7b2cda43cf52169bb7e0767d330648c2
React-NativeModulesApple: c57f3efe0df288a6532b726ad2d0322a9bf38472
React-perflogger: 6bd153e776e6beed54c56b0847e1220a3ff92ba5
React-RCTActionSheet: c0b62af44e610e69d9a2049a682f5dba4e9dff17
React-RCTAnimation: f9bf9719258926aea9ecb8a2aa2595d3ff9a6022
React-RCTAppDelegate: e5ac35d4dbd1fae7df3a62b47db04b6a8d151592
React-RCTBlob: c4f1e69a6ef739aa42586b876d637dab4e3b5bed
React-RCTImage: e5798f01aba248416c02a506cf5e6dfcba827638
React-RCTLinking: f5b6227c879e33206f34e68924c458f57bbb96d9
React-RCTNetwork: d5554fbfac1c618da3c8fa29933108ea22837788
React-RCTSettings: 189c71e3e6146ba59f4f7e2cbeb494cf2ad42afa
React-RCTText: 19425aea9d8b6ccae55a27916355b17ab577e56e
React-RCTVibration: 388ac0e1455420895d1ca2548401eed964b038a6
React-rncore: 0f8b25194031cc6554c5203266497acfb8521ac5
React-runtimeexecutor: 369ae9bb3f83b65201c0c8f7d50b72280b5a1dbc
React-runtimescheduler: 837c1bebd2f84572db17698cd702ceaf585b0d9a
React-utils: bcb57da67eec2711f8b353f6e3d33bd8e4b2efa3
ReactCommon: 3ccb8fb14e6b3277e38c73b0ff5e4a1b8db017a9
RNCAsyncStorage: ddc4ee162bfd41b0d2c68bf2d95acd81dd7f1f93
RNCMaskedView: 949696f25ec596bfc697fc88e6f95cf0c79669b6
RNFlashList: 25b0e092b4470c84db0386d4f5316dc34123bb6d
RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39
RNReanimated: addc4900bf47882118d0a1b21747fa6705fa8cff
RNScreens: 218801c16a2782546d30bd2026bb625c0302d70f
RNSVG: 07dbd870b0dcdecc99b3a202fa37c8ca163caec2
Yoga: 5ed1699acbba8863755998a4245daa200ff3817b
RNGestureHandler: c0d04458598fcb26052494ae23dda8f8f5162b13
RNReanimated: 79025fdede9665be5b1eec93abcd95ce19bf5ad4
RNScreens: 6a8a3c6b808aa48dca1780df7b73ea524f602c63
RNSVG: 80584470ff1ffc7994923ea135a3e5ad825546b9
SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17
Yoga: 8796b55dba14d7004f980b54bcc9833ee45b28ce
PODFILE CHECKSUM: 7a4bb50e685f075b59612fa770c28d9a25b9edea
PODFILE CHECKSUM: bb3a1dc1b354487fb718a75205b2653b9a19b1a1
COCOAPODS: 1.11.3

View File

@@ -1,4 +1,5 @@
{
"expo.jsEngine": "hermes",
"ios.deploymentTarget": "13.0"
"ios.deploymentTarget": "13.0",
"EX_DEV_CLIENT_NETWORK_INSPECTOR": "true"
}

View File

@@ -149,6 +149,7 @@
BC1F37E21575379C81F561DC /* [CP] Check Pods Manifest.lock */,
350DC403297BF2B8009CD6A1 /* Build Spacedrive Core */,
FD10A7F022414F080027D42C /* Start Packager */,
0883FA647AA9D506CE94B59A /* [Expo] Configure project */,
13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
@@ -224,6 +225,25 @@
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\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" $PROJECT_ROOT ios relative | tail -n 1)\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n";
};
0883FA647AA9D506CE94B59A /* [Expo] Configure project */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "[Expo] Configure project";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Spacedrive/expo-configure-project.sh\"\n";
};
350DC403297BF2B8009CD6A1 /* Build Spacedrive Core */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -593,6 +613,8 @@
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "$(inherited)";
OTHER_CPLUSPLUSFLAGS = "$(inherited)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native";
SDKROOT = iphoneos;
};
@@ -646,6 +668,8 @@
);
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_CFLAGS = "$(inherited)";
OTHER_CPLUSPLUSFLAGS = "$(inherited)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native";
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;

View File

@@ -1,78 +1,88 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1130"
version = "1.3">
LastUpgradeVersion="1130"
version="1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
parallelizeBuildables="YES"
buildImplicitDependencies="YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
buildForTesting="YES"
buildForRunning="YES"
buildForProfiling="YES"
buildForArchiving="YES"
buildForAnalyzing="YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "Spacedrive.app"
BlueprintName = "Spacedrive"
ReferencedContainer = "container:Spacedrive.xcodeproj">
BuildableIdentifier="primary"
BlueprintIdentifier="13B07F861A680F5B00A75B9A"
BuildableName="Spacedrive.app"
BlueprintName="Spacedrive"
ReferencedContainer="container:Spacedrive.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
buildConfiguration="Debug"
selectedDebuggerIdentifier="Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier="Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv="YES">
<Testables>
<TestableReference
skipped="NO">
<BuildableReference
BuildableIdentifier="primary"
BlueprintIdentifier="00E356ED1AD99517003FC87E"
BuildableName="SpacedriveTests.xctest"
BlueprintName="SpacedriveTests"
ReferencedContainer="container:Spacedrive.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
buildConfiguration="Debug"
selectedDebuggerIdentifier="Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier="Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle="0"
useCustomWorkingDirectory="NO"
ignoresPersistentStateOnLaunch="NO"
debugDocumentVersioning="YES"
debugServiceExtension="internal"
allowLocationSimulation="YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
runnableDebuggingMode="0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "Spacedrive.app"
BlueprintName = "Spacedrive"
ReferencedContainer = "container:Spacedrive.xcodeproj">
BuildableIdentifier="primary"
BlueprintIdentifier="13B07F861A680F5B00A75B9A"
BuildableName="Spacedrive.app"
BlueprintName="Spacedrive"
ReferencedContainer="container:Spacedrive.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
buildConfiguration="Release"
shouldUseLaunchSchemeArgsEnv="YES"
savedToolIdentifier=""
useCustomWorkingDirectory="NO"
debugDocumentVersioning="YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
runnableDebuggingMode="0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "Spacedrive.app"
BlueprintName = "Spacedrive"
ReferencedContainer = "container:Spacedrive.xcodeproj">
BuildableIdentifier="primary"
BlueprintIdentifier="13B07F861A680F5B00A75B9A"
BuildableName="Spacedrive.app"
BlueprintName="Spacedrive"
ReferencedContainer="container:Spacedrive.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
buildConfiguration="Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
buildConfiguration="Release"
revealArchiveInOrganizer="YES">
</ArchiveAction>
</Scheme>
</Scheme>

View File

@@ -19,22 +19,12 @@
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"];
#else
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}
/// 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` feature is enabled. Otherwise, it returns `false`.
- (BOOL)concurrentRootEnabled
{
return true;
}
// Linking API
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options];

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 733 B

After

Width:  |  Height:  |  Size: 736 B

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 KiB

After

Width:  |  Height:  |  Size: 341 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View File

@@ -1,89 +1,91 @@
<?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">
<?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>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Spacedrive</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>0.0.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>spacedrive</string>
<string>com.spacedrive.app</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true />
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true />
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true />
</dict>
</dict>
</dict>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Give Spacedrive permission to save photos</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Give Spacedrive permission to access your photos</string>
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>
<key>UIFileSharingEnabled</key>
<true />
<key>UILaunchStoryboardName</key>
<string>SplashScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UIRequiresFullScreen</key>
<false />
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDefault</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIUserInterfaceStyle</key>
<string>Automatic</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false />
<key>ITSAppUsesNonExemptEncryption</key>
<false />
</dict>
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true />
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Spacedrive</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Spacedrive</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>0.0.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>spacedrive</string>
<string>com.spacedrive.app</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true />
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true />
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true />
</dict>
</dict>
</dict>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Allow Spacedrive to save photos</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Allow Spacedrive to access your photos</string>
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>
<key>UIFileSharingEnabled</key>
<true />
<key>UILaunchStoryboardName</key>
<string>SplashScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UIRequiresFullScreen</key>
<false />
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDefault</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIUserInterfaceStyle</key>
<string>Automatic</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false />
<key>ITSAppUsesNonExemptEncryption</key>
<false />
</dict>
</plist>

View File

@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16096" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="EXPO-VIEWCONTROLLER-1">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0"
toolsVersion="16096" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none"
useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES"
colorMatched="YES" initialViewController="EXPO-VIEWCONTROLLER-1">
<device id="retina5_5" orientation="portrait" appearance="light" />
<dependencies>
<deployment identifier="iOS" />
@@ -10,36 +13,73 @@
<scenes>
<scene sceneID="EXPO-SCENE-1">
<objects>
<viewController storyboardIdentifier="SplashScreenViewController" id="EXPO-VIEWCONTROLLER-1" sceneMemberID="viewController">
<view key="view" userInteractionEnabled="NO" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="EXPO-ContainerView" userLabel="ContainerView">
<viewController storyboardIdentifier="SplashScreenViewController"
id="EXPO-VIEWCONTROLLER-1" sceneMemberID="viewController">
<view key="view" userInteractionEnabled="NO" contentMode="scaleToFill"
insetsLayoutMarginsFromSafeArea="NO" id="EXPO-ContainerView"
userLabel="ContainerView">
<rect key="frame" x="0.0" y="0.0" width="414" height="736" />
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES" />
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES"
flexibleMaxY="YES" />
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" insetsLayoutMarginsFromSafeArea="NO" image="SplashScreenBackground" translatesAutoresizingMaskIntoConstraints="NO" id="EXPO-SplashScreenBackground" userLabel="SplashScreenBackground">
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill"
horizontalHuggingPriority="251" verticalHuggingPriority="251"
insetsLayoutMarginsFromSafeArea="NO" image="SplashScreenBackground"
translatesAutoresizingMaskIntoConstraints="NO"
id="EXPO-SplashScreenBackground" userLabel="SplashScreenBackground">
<rect key="frame" x="0.0" y="0.0" width="414" height="736" />
</imageView>
<imageView id="EXPO-SplashScreen" userLabel="SplashScreen" image="SplashScreen" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" clipsSubviews="true" userInteractionEnabled="false" translatesAutoresizingMaskIntoConstraints="false">
<imageView id="EXPO-SplashScreen" userLabel="SplashScreen"
image="SplashScreen" contentMode="scaleAspectFit"
horizontalHuggingPriority="251" verticalHuggingPriority="251"
clipsSubviews="true" userInteractionEnabled="false"
translatesAutoresizingMaskIntoConstraints="false">
<rect key="frame" x="0" y="0" width="414" height="736" />
</imageView>
</subviews>
<constraints>
<constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="top" secondItem="EXPO-ContainerView" secondAttribute="top" id="1gX-mQ-vu6" />
<constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="leading" secondItem="EXPO-ContainerView" secondAttribute="leading" id="6tX-OG-Sck" />
<constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="trailing" secondItem="EXPO-ContainerView" secondAttribute="trailing" id="ABX-8g-7v4" />
<constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="bottom" secondItem="EXPO-ContainerView" secondAttribute="bottom" id="jkI-2V-eW5" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="top" secondItem="EXPO-ContainerView" secondAttribute="top" id="2VS-Uz-0LU" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="leading" secondItem="EXPO-ContainerView" secondAttribute="leading" id="LhH-Ei-DKo" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="trailing" secondItem="EXPO-ContainerView" secondAttribute="trailing" id="I6l-TP-6fn" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="bottom" secondItem="EXPO-ContainerView" secondAttribute="bottom" id="nbp-HC-eaG" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="top" secondItem="EXPO-ContainerView" secondAttribute="top" id="83fcb9b545b870ba44c24f0feeb116490c499c52" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="leading" secondItem="EXPO-ContainerView" secondAttribute="leading" id="61d16215e44b98e39d0a2c74fdbfaaa22601b12c" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="trailing" secondItem="EXPO-ContainerView" secondAttribute="trailing" id="f934da460e9ab5acae3ad9987d5b676a108796c1" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="bottom" secondItem="EXPO-ContainerView" secondAttribute="bottom" id="d6a0be88096b36fb132659aa90203d39139deda9" />
<constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="top"
secondItem="EXPO-ContainerView" secondAttribute="top"
id="1gX-mQ-vu6" />
<constraint firstItem="EXPO-SplashScreenBackground"
firstAttribute="leading" secondItem="EXPO-ContainerView"
secondAttribute="leading" id="6tX-OG-Sck" />
<constraint firstItem="EXPO-SplashScreenBackground"
firstAttribute="trailing" secondItem="EXPO-ContainerView"
secondAttribute="trailing" id="ABX-8g-7v4" />
<constraint firstItem="EXPO-SplashScreenBackground"
firstAttribute="bottom" secondItem="EXPO-ContainerView"
secondAttribute="bottom" id="jkI-2V-eW5" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="top"
secondItem="EXPO-ContainerView" secondAttribute="top"
id="2VS-Uz-0LU" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="leading"
secondItem="EXPO-ContainerView" secondAttribute="leading"
id="LhH-Ei-DKo" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="trailing"
secondItem="EXPO-ContainerView" secondAttribute="trailing"
id="I6l-TP-6fn" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="bottom"
secondItem="EXPO-ContainerView" secondAttribute="bottom"
id="nbp-HC-eaG" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="top"
secondItem="EXPO-ContainerView" secondAttribute="top"
id="83fcb9b545b870ba44c24f0feeb116490c499c52" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="leading"
secondItem="EXPO-ContainerView" secondAttribute="leading"
id="61d16215e44b98e39d0a2c74fdbfaaa22601b12c" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="trailing"
secondItem="EXPO-ContainerView" secondAttribute="trailing"
id="f934da460e9ab5acae3ad9987d5b676a108796c1" />
<constraint firstItem="EXPO-SplashScreen" firstAttribute="bottom"
secondItem="EXPO-ContainerView" secondAttribute="bottom"
id="d6a0be88096b36fb132659aa90203d39139deda9" />
</constraints>
<viewLayoutGuide key="safeArea" id="Rmq-lb-GrQ" />
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="EXPO-PLACEHOLDER-1" userLabel="First Responder" sceneMemberID="firstResponder" />
<placeholder placeholderIdentifier="IBFirstResponder" id="EXPO-PLACEHOLDER-1"
userLabel="First Responder" sceneMemberID="firstResponder" />
</objects>
<point key="canvasLocation" x="140.625" y="129.4921875" />
</scene>

View File

@@ -9,7 +9,7 @@
<key>EXUpdatesLaunchWaitMs</key>
<integer>0</integer>
<key>EXUpdatesSDKVersion</key>
<string>48.0.0</string>
<string>49.0.0</string>
<key>EXUpdatesURL</key>
<string>https://exp.host/@spacedrive/spacedrive</string>
</dict>

View File

@@ -8,7 +8,7 @@
"start": "expo start --dev-client",
"android": "expo run:android",
"ios": "expo run:ios",
"xcode": "open ios/spacedrive.xcworkspace",
"xcode": "open ios/Spacedrive.xcworkspace",
"android-studio": "open -a '/Applications/Android Studio.app' ./android",
"lint": "eslint src --cache",
"typecheck": "tsc -b",
@@ -18,56 +18,56 @@
"dependencies": {
"@gorhom/bottom-sheet": "^4.4.7",
"@hookform/resolvers": "^3.1.0",
"@react-native-async-storage/async-storage": "~1.17.12",
"@react-native-masked-view/masked-view": "0.2.8",
"@react-navigation/bottom-tabs": "^6.5.7",
"@react-navigation/drawer": "^6.6.2",
"@react-navigation/native": "^6.1.6",
"@react-navigation/stack": "^6.3.16",
"@react-native-async-storage/async-storage": "~1.18.2",
"@react-native-masked-view/masked-view": "0.2.9",
"@react-navigation/bottom-tabs": "^6.5.8",
"@react-navigation/drawer": "^6.6.3",
"@react-navigation/native": "^6.1.7",
"@react-navigation/stack": "^6.3.17",
"@rspc/client": "=0.0.0-main-799eec5d",
"@rspc/react": "=0.0.0-main-799eec5d",
"@sd/assets": "workspace:*",
"@sd/client": "workspace:*",
"@shopify/flash-list": "1.4.2",
"@shopify/flash-list": "1.5.0",
"@tanstack/react-query": "^4.29.1",
"class-variance-authority": "^0.5.3",
"dayjs": "^1.11.8",
"event-target-polyfill": "^0.0.3",
"expo": "~48.0.19",
"expo-linking": "~4.0.1",
"expo-media-library": "~15.2.3",
"expo-splash-screen": "~0.18.2",
"expo-status-bar": "~1.4.4",
"expo": "~49.0.8",
"expo-linking": "~5.0.2",
"expo-media-library": "~15.4.1",
"expo-splash-screen": "~0.20.4",
"expo-status-bar": "~1.6.0",
"intl": "^1.2.5",
"lottie-react-native": "5.1.4",
"moti": "^0.24.2",
"lottie-react-native": "6.2.0",
"moti": "^0.26.0",
"phosphor-react-native": "^1.1.2",
"react": "18.2.0",
"react-hook-form": "^7.43.9",
"react-native": "0.71.3",
"react-native-document-picker": "^8.2.1",
"react-hook-form": "~7.45.2",
"react-native": "0.72.3",
"react-native-document-picker": "^9.0.1",
"react-native-fs": "^2.20.0",
"react-native-gesture-handler": "~2.9.0",
"react-native-gesture-handler": "~2.12.1",
"react-native-popup-menu": "^0.16.1",
"react-native-reanimated": "~2.14.4",
"react-native-safe-area-context": "4.5.1",
"react-native-screens": "~3.20.0",
"react-native-svg": "13.4.0",
"react-native-reanimated": "~3.4.2",
"react-native-safe-area-context": "4.7.1",
"react-native-screens": "~3.23.0",
"react-native-svg": "13.10.0",
"react-native-wheel-color-picker": "^1.2.0",
"twrnc": "^3.6.1",
"twrnc": "^3.6.4",
"use-count-up": "^3.0.1",
"use-debounce": "^9.0.4",
"valtio": "^1.10.4",
"zod": "^3.21.4"
"zod": "~3.22.2"
},
"devDependencies": {
"@babel/core": "^7.22.1",
"@rnx-kit/metro-config": "^1.3.6",
"@rnx-kit/metro-config": "^1.3.8",
"@sd/config": "workspace:*",
"@types/react": "~18.0.38",
"babel-plugin-module-resolver": "^5.0.0",
"eslint-plugin-react-native": "^4.0.0",
"react-native-svg-transformer": "^1.0.0",
"react-native-svg-transformer": "^1.1.0",
"typescript": "^5.1.3"
}
}

View File

@@ -0,0 +1,38 @@
import { MotiView } from 'moti';
import { memo } from 'react';
import { View } from 'react-native';
import { tw } from '~/lib/tailwind';
type ProgressBarProps = {
value: number;
total: number;
pending?: boolean;
};
export const ProgressBar = memo((props: ProgressBarProps) => {
const percentage = props.pending ? 0 : Math.round((props.value / props.total) * 100);
if (props.pending) {
// Show indeterminate progress bar
return (
<View style={tw`h-1 overflow-hidden rounded-full bg-app-button`}>
<MotiView
style={tw`h-full w-[50%] bg-accent`}
from={{ left: '-50%' }}
animate={{ left: '100%' }}
transition={{ type: 'timing', duration: 1500, loop: true }}
/>
</View>
);
}
return (
<View style={tw`h-1 w-[94%] overflow-hidden rounded-full bg-app-button`}>
<MotiView
style={tw`h-full bg-accent`}
animate={{ width: `${percentage}%` }}
transition={{ type: 'timing' }}
/>
</View>
);
});

View File

@@ -1,9 +1,13 @@
import { MotiView, useDynamicAnimation } from 'moti';
import { MotiView } from 'moti';
import { PropsWithChildren, ReactNode } from 'react';
import { StyleSheet, View, ViewProps } from 'react-native';
import { useDerivedValue, useSharedValue } from 'react-native-reanimated';
import { StyleSheet, ViewProps } from 'react-native';
import Animated, {
runOnJS,
useAnimatedStyle,
useSharedValue,
withTiming
} from 'react-native-reanimated';
import Layout from '~/constants/Layout';
import { tw } from '~/lib/tailwind';
type MotiViewProps = PropsWithChildren<ViewProps>;
@@ -57,61 +61,54 @@ type AnimatedHeightProps = {
hide?: boolean;
onHeightDidAnimate?: (height: number) => void;
initialHeight?: number;
} & React.ComponentProps<typeof MotiView>;
duration?: number;
} & MotiViewProps;
export function AnimatedHeight({
children,
hide = false,
hide = !children,
style,
delay = 0,
transition = { type: 'timing', delay },
onHeightDidAnimate,
initialHeight = 0,
...motiViewProps
duration = 200,
initialHeight = 0
}: AnimatedHeightProps) {
const measuredHeight = useSharedValue(initialHeight);
const state = useDynamicAnimation(() => {
const childStyle = useAnimatedStyle(
() => ({
opacity: withTiming(!measuredHeight.value || hide ? 0 : 1, { duration })
}),
[hide, measuredHeight]
);
const containerStyle = useAnimatedStyle(() => {
return {
height: initialHeight,
opacity: !initialHeight || hide ? 0 : 1
height: withTiming(hide ? 0 : measuredHeight.value, { duration }, () => {
if (onHeightDidAnimate) {
runOnJS(onHeightDidAnimate)(measuredHeight.value);
}
})
};
});
if ('state' in motiViewProps) {
console.warn('[AnimateHeight] state prop not supported');
}
useDerivedValue(() => {
let height = Math.ceil(measuredHeight.value);
if (hide) {
height = 0;
}
state.animateTo({
height,
opacity: !height || hide ? 0 : 1
});
}, [hide, measuredHeight]);
return (
<MotiView
{...motiViewProps}
state={state}
transition={transition}
onDidAnimate={
onHeightDidAnimate &&
((key, finished, _, { attemptedValue }) =>
key === 'height' && onHeightDidAnimate(attemptedValue as number))
}
style={[tw`overflow-hidden`, style]}
>
<View
style={[StyleSheet.absoluteFill, { bottom: 'auto' }]}
<Animated.View style={[styles.hidden, style, containerStyle]}>
<Animated.View
style={[StyleSheet.absoluteFill, styles.autoBottom, childStyle]}
onLayout={({ nativeEvent }) => {
measuredHeight.value = nativeEvent.layout.height;
measuredHeight.value = Math.ceil(nativeEvent.layout.height);
}}
>
{children}
</View>
</MotiView>
</Animated.View>
</Animated.View>
);
}
const styles = StyleSheet.create({
autoBottom: {
bottom: 'auto'
},
hidden: {
overflow: 'hidden'
}
});

View File

@@ -1,14 +1,20 @@
import AnimatedLottieView, { AnimatedLottieViewProps } from 'lottie-react-native';
import LottieView from 'lottie-react-native';
// They probably forgot to export the type on this update lol.
// import type LottieViewProps from 'lottie-react-native';
import { StyleProp, ViewStyle } from 'react-native';
type AnimationProps = Omit<AnimatedLottieViewProps, 'source'>;
type AnimationProps = {
style?: StyleProp<ViewStyle>;
speed?: number;
};
export const PulseAnimation = ({ style }: AnimationProps) => {
export const PulseAnimation = (props: AnimationProps) => {
return (
<AnimatedLottieView
<LottieView
autoPlay
loop
source={require('@sd/assets/lottie/loading-pulse.json')}
style={style}
{...props}
/>
);
};

View File

@@ -1,11 +1,16 @@
import { AppLogo } from '@sd/assets/images';
import { DrawerContentScrollView } from '@react-navigation/drawer';
import { DrawerContentComponentProps } from '@react-navigation/drawer/lib/typescript/src/types';
import { Gear } from 'phosphor-react-native';
import { CheckCircle, Gear } from 'phosphor-react-native';
import { useRef } from 'react';
import { Image, Platform, Pressable, Text, View } from 'react-native';
import { JobManagerContextProvider, useLibraryQuery } from '@sd/client';
import Layout from '~/constants/Layout';
import { tw, twStyle } from '~/lib/tailwind';
import { getStackNameFromState } from '~/utils/nav';
import { PulseAnimation } from '../animation/lottie';
import { ModalRef } from '../layout/Modal';
import { JobManagerModal } from '../modal/job/JobManagerModal';
import DrawerLibraryManager from './DrawerLibraryManager';
import DrawerLocations from './DrawerLocations';
import DrawerTags from './DrawerTags';
@@ -15,9 +20,20 @@ const drawerHeight = Platform.select({
android: Layout.window.height * 0.9
});
function JobIcon() {
const { data: isActive } = useLibraryQuery(['jobs.isActive']);
return isActive ? (
<PulseAnimation style={tw`h-[24px] w-[32px]`} speed={1.5} />
) : (
<CheckCircle color="white" size={24} />
);
}
const DrawerContent = ({ navigation, state }: DrawerContentComponentProps) => {
const stackName = getStackNameFromState(state);
const modalRef = useRef<ModalRef>(null);
return (
<DrawerContentScrollView style={tw`flex-1 px-3 py-2`} scrollEnabled={false}>
<View style={twStyle('justify-between', { height: drawerHeight })}>
@@ -27,6 +43,7 @@ const DrawerContent = ({ navigation, state }: DrawerContentComponentProps) => {
<Text style={tw`ml-2 text-lg font-bold text-ink`}>Spacedrive</Text>
</View>
<View style={tw`mt-6`} />
{/* Library Manager */}
<DrawerLibraryManager />
{/* Locations */}
@@ -34,10 +51,19 @@ const DrawerContent = ({ navigation, state }: DrawerContentComponentProps) => {
{/* Tags */}
<DrawerTags stackName={stackName} />
</View>
{/* Settings */}
<Pressable onPress={() => navigation.navigate('Settings')}>
<Gear color={tw.color('ink')} size={24} />
</Pressable>
<View style={tw`flex w-full flex-row items-center gap-x-4`}>
{/* Settings */}
<Pressable onPress={() => navigation.navigate('Settings')}>
<Gear color="white" size={24} />
</Pressable>
<JobManagerContextProvider>
{/* Job Manager */}
<Pressable onPress={() => modalRef.current?.present()}>
<JobIcon />
</Pressable>
<JobManagerModal ref={modalRef} />
</JobManagerContextProvider>
</View>
</View>
</DrawerContentScrollView>
);

View File

@@ -35,7 +35,7 @@ type DrawerTagsProp = {
const DrawerTags = ({ stackName }: DrawerTagsProp) => {
const navigation = useNavigation<DrawerNavigationHelpers>();
const { data: tags } = useLibraryQuery(['tags.list'], { keepPreviousData: true });
const tags = useLibraryQuery(['tags.list']);
const modalRef = useRef<ModalRef>(null);
@@ -46,7 +46,7 @@ const DrawerTags = ({ stackName }: DrawerTagsProp) => {
containerStyle={tw`mb-3 ml-1 mt-6`}
>
<View style={tw`mt-2`}>
{tags?.map((tag) => (
{tags.data?.map((tag) => (
<DrawerTagItem
key={tag.id}
tagName={tag.name!}

View File

@@ -0,0 +1,92 @@
import {
Copy,
Fingerprint,
Folder,
Icon,
Image,
Info,
Scissors,
Trash
} from 'phosphor-react-native';
import { memo } from 'react';
import { View, ViewStyle } from 'react-native';
import { JobProgressEvent, JobReport, useJobInfo } from '@sd/client';
import { tw } from '~/lib/tailwind';
import { ProgressBar } from '../animation/ProgressBar';
import JobContainer from './JobContainer';
type JobProps = {
job: JobReport;
isChild?: boolean;
containerStyle?: ViewStyle;
progress: JobProgressEvent | null;
};
const JobIcon: Record<string, Icon> = {
indexer: Folder,
thumbnailer: Image,
file_identifier: Fingerprint,
file_copier: Copy,
file_deleter: Trash,
file_cutter: Scissors,
object_validator: Fingerprint
};
function Job({ job, isChild, progress }: JobProps) {
const jobData = useJobInfo(job, progress);
if (job.status === 'CompletedWithErrors') {
// TODO:
// const JobError = (
// <pre className="custom-scroll inspector-scroll max-h-[300px] rounded border border-app-darkBox bg-app-darkBox/80 p-3">
// {job.errors_text.map((error, i) => (
// <p
// className="mb-1 w-full overflow-auto whitespace-normal break-words text-sm"
// key={i}
// >
// {error.trim()}
// </p>
// ))}
// </pre>
// );
jobData.textItems?.push([
{
text: 'Completed with errors',
icon: Info as any,
onClick: () => {
// TODO:
// showAlertDialog({
// title: 'Error',
// description:
// 'The job completed with errors. Please see the error log below for more information. If you need help, please contact support and provide this error.',
// children: JobError
// });
// }
}
}
]);
}
return (
<JobContainer
name={jobData.name}
icon={JobIcon[job.name]}
textItems={
['Queued'].includes(job.status) ? [[{ text: job.status }]] : jobData.textItems
}
isChild={isChild}
>
{(jobData.isRunning || jobData.isPaused) && (
<View style={tw`my-1.5 ml-1.5 w-[300px]`}>
<ProgressBar
pending={jobData.taskCount == 0}
value={jobData.completedTaskCount}
total={jobData.taskCount}
/>
</View>
)}
</JobContainer>
);
}
export default memo(Job);

View File

@@ -0,0 +1,79 @@
import { Icon } from 'phosphor-react-native';
import { Fragment } from 'react';
import { Image, Text, View, ViewStyle } from 'react-native';
import { TextItems } from '@sd/client';
import { styled, tw, twStyle } from '~/lib/tailwind';
type JobContainerProps = {
name: string;
icon?: string | Icon;
// Array of arrays of TextItems, where each array of TextItems is a truncated line of text.
textItems?: TextItems;
isChild?: boolean;
children: React.ReactNode;
containerStyle?: ViewStyle;
};
const MetaContainer = styled(View, 'flex w-full overflow-hidden flex-col');
// Job container consolidates the common layout of a job item, used for regular jobs (Job.tsx) and grouped jobs (JobGroup.tsx).
export default function JobContainer(props: JobContainerProps) {
const { name, icon: Icon, textItems, isChild, children, ...restProps } = props;
return (
<View
style={twStyle(
'flex flex-row justify-center',
'border-b border-app-line/50 px-8 py-4',
isChild && 'my-1.5 border-b-0 p-2 pl-12',
restProps.containerStyle
)}
>
{typeof Icon === 'number' ? (
<Image source={Icon} style={tw`ml-4 mr-1 h-8 w-8`} />
) : (
Icon && (
<View
style={tw`mr-1 h-7 w-7 items-center justify-center rounded-full bg-app-button`}
>
<Icon weight="fill" color="white" size={18} />
</View>
)
)}
<MetaContainer>
<Text style={tw`pl-1.5 text-sm font-medium text-white`} numberOfLines={1}>
{name}
</Text>
{textItems?.map((item, index) => {
// filter out undefined text so we don't render empty TextItems
const filteredItems = item.filter((i) => i?.text);
return (
<Text
key={index}
style={tw`mt-[2px] pl-1.5 text-[13px] text-ink-faint`}
numberOfLines={1}
>
{filteredItems.map((item, index) => {
const Icon = item?.icon;
return (
<Fragment key={index}>
{Icon && (
<Icon
weight="fill"
// TODO: this might be ugly
style={tw`-mt-0.5 ml-[5px] inline`}
/>
)}
<Text key={index}>{item?.text}</Text>
{index < filteredItems.length - 1 && <Text> </Text>}
</Fragment>
);
})}
</Text>
);
})}
{children && <View style={tw`mt-1`}>{children}</View>}
</MetaContainer>
</View>
);
}

View File

@@ -0,0 +1,191 @@
import { Folder } from '@sd/assets/icons';
import dayjs from 'dayjs';
import { DotsThreeVertical, Pause, Play, Stop } from 'phosphor-react-native';
import { useMemo, useState } from 'react';
import { Animated, Pressable, View } from 'react-native';
import { Swipeable } from 'react-native-gesture-handler';
import {
JobGroup,
JobProgressEvent,
JobReport,
getJobNiceActionName,
getTotalTasks,
useLibraryMutation,
useTotalElapsedTimeText
} from '@sd/client';
import { tw } from '~/lib/tailwind';
import { ProgressBar } from '../animation/ProgressBar';
import { AnimatedHeight } from '../animation/layout';
import { Button } from '../primitive/Button';
import Job from './Job';
import JobContainer from './JobContainer';
interface JobGroupProps {
group: JobGroup;
progress: Record<string, JobProgressEvent>;
}
export default function ({ group, progress }: JobGroupProps) {
const { jobs } = group;
const [showChildJobs, setShowChildJobs] = useState(false);
const runningJob = jobs.find((job) => job.status === 'Running');
const tasks = getTotalTasks(jobs);
const totalGroupTime = useTotalElapsedTimeText(jobs);
const dateStarted = useMemo(() => {
const createdAt = dayjs(jobs[0]?.created_at).fromNow();
return createdAt.charAt(0).toUpperCase() + createdAt.slice(1);
}, [jobs]);
if (jobs.length === 0) return <></>;
const renderRightActions = (
progress: Animated.AnimatedInterpolation<number>,
_dragX: Animated.AnimatedInterpolation<number>,
swipeable: Swipeable
) => {
const translate = progress.interpolate({
inputRange: [0, 1],
outputRange: [100, 0],
extrapolate: 'clamp'
});
return (
<Animated.View
style={[
tw`flex flex-row items-center pr-4`,
{ transform: [{ translateX: translate }] }
]}
>
<Options activeJob={runningJob} group={group} />
</Animated.View>
);
};
return (
<Swipeable
containerStyle={tw.style(showChildJobs && 'bg-app-darkBox/30')}
enableTrackpadTwoFingerGesture
renderRightActions={renderRightActions}
>
{jobs?.length > 1 ? (
<>
<Pressable onPress={() => setShowChildJobs((v) => !v)}>
<JobContainer
icon={Folder}
containerStyle={tw.style('pb-2', showChildJobs && 'border-b-0 pb-1')}
name={getJobNiceActionName(
group.action ?? '',
group.status === 'Completed',
jobs[0]
)}
textItems={[
[
{
text: `${tasks.total} ${
tasks.total <= 1 ? 'task' : 'tasks'
}`
},
{ text: dateStarted },
{ text: totalGroupTime || undefined },
{
text: ['Queued', 'Paused', 'Canceled', 'Failed'].includes(
group.status
)
? group.status
: undefined
}
],
[
{
text:
!showChildJobs && runningJob !== undefined
? progress[runningJob.id]?.message
: undefined
}
]
]}
>
{!showChildJobs && runningJob && (
<View style={tw`mb-2 ml-1.5`}>
<ProgressBar
pending={tasks.completed === 0}
value={tasks.completed}
total={tasks.total}
/>
</View>
)}
</JobContainer>
</Pressable>
{showChildJobs && (
<AnimatedHeight style={tw`mb-4`}>
{jobs.map((job) => (
<Job
isChild={jobs.length > 1}
key={job.id}
job={job}
progress={progress[job.id] ?? null}
/>
))}
</AnimatedHeight>
)}
</>
) : (
<Job job={jobs[0]!} progress={progress[jobs[0]!.id] || null} />
)}
</Swipeable>
);
}
function Options({ activeJob, group }: { activeJob?: JobReport; group: JobGroup }) {
const resumeJob = useLibraryMutation(['jobs.resume'], {
onError: () => {
// TODO: Toasts
}
});
const pauseJob = useLibraryMutation(['jobs.pause'], {
onError: () => {
// TODO: Toasts
}
});
const cancelJob = useLibraryMutation(['jobs.cancel'], {
onError: () => {
// TODO: Toasts
}
});
const isJobPaused = useMemo(
() => group.jobs.some((job) => job.status === 'Paused'),
[group.jobs]
);
return (
<>
{/* Resume */}
{(group.status === 'Queued' || group.status === 'Paused' || isJobPaused) && (
<Button variant="outline" size="sm" onPress={() => resumeJob.mutate(group.id)}>
<Play size={18} color="white" />
</Button>
)}
{/* TODO: This should remove the job from panel */}
{!activeJob !== undefined ? (
<Button variant="outline" size="sm">
<DotsThreeVertical size={16} color="white" />
</Button>
) : (
<View style={tw`flex flex-row gap-2`}>
<Button variant="outline" size="sm" onPress={() => pauseJob.mutate(group.id)}>
<Pause size={16} color="white" />
</Button>
<Button variant="outline" size="sm" onPress={() => cancelJob.mutate(group.id)}>
<Stop size={16} color="white" />
</Button>
</View>
)}
</>
);
}

View File

@@ -1,6 +1,7 @@
import {
BottomSheetBackdrop,
BottomSheetBackdropProps,
BottomSheetFlatList,
BottomSheetHandle,
BottomSheetHandleProps,
BottomSheetModal,
@@ -72,6 +73,7 @@ export const Modal = forwardRef<ModalRef, ModalProps>((props, ref) => {
});
export const ModalScrollView = BottomSheetScrollView;
export const ModalFlatlist = BottomSheetFlatList;
type ConfirmModalProps = {
title: string;

View File

@@ -0,0 +1,44 @@
import { useQueryClient } from '@tanstack/react-query';
import { forwardRef } from 'react';
import { FlatList, Text, View } from 'react-native';
import { useJobProgress, useLibraryQuery } from '@sd/client';
import JobGroup from '~/components/job/JobGroup';
import { Modal, ModalRef } from '~/components/layout/Modal';
import { tw } from '~/lib/tailwind';
// TODO:
// - When there is no job, make modal height smaller
// - Add clear all jobs button
export const JobManagerModal = forwardRef<ModalRef, unknown>((_, ref) => {
const queryClient = useQueryClient();
const jobGroups = useLibraryQuery(['jobs.reports']);
const progress = useJobProgress(jobGroups.data);
// const clearAllJobs = useLibraryMutation(['jobs.clearAll'], {
// onError: () => {
// // TODO: Show error toast
// },
// onSuccess: () => {
// queryClient.invalidateQueries(['jobs.reports ']);
// }
// });
return (
<Modal ref={ref} snapPoints={['60']} title="Recent Jobs" showCloseButton>
<FlatList
data={jobGroups.data}
style={tw`flex-1`}
keyExtractor={(i) => i.id}
contentContainerStyle={tw`mt-4`}
renderItem={({ item }) => <JobGroup group={item} progress={progress} />}
ListEmptyComponent={
<View style={tw`flex h-60 items-center justify-center`}>
<Text style={tw`text-center text-base text-ink-dull`}>No jobs.</Text>
</View>
}
/>
</Modal>
);
});

View File

@@ -50,6 +50,7 @@ export const AnimatedButton: FC<AnimatedButtonProps> = ({ variant, size, disable
return (
<MotiPressable
disabled={disabled}
// @ts-ignore
animate={useMemo(
() =>
({ hovered, pressed }) => {

View File

@@ -1,4 +1,4 @@
import { ComponentType, createElement, forwardRef } from 'react';
import { Component, ComponentType, ElementType, createElement, forwardRef } from 'react';
import { create } from 'twrnc';
import { Themes } from '@sd/client';

View File

@@ -8,7 +8,6 @@ export default function OverviewScreen({ navigation }: OverviewStackScreenProps<
return (
<VirtualizedListWrapper>
<View style={tw`mt-4 px-4`}>
{/* Stats */}
<OverviewStats />
</View>
</VirtualizedListWrapper>

View File

@@ -39,7 +39,6 @@ const GeneralSettingsScreen = ({ navigation }: SettingsStackScreenProps<'General
<SettingsTitle style={tw`mt-3`}>Node Port</SettingsTitle>
<Input value={node.p2p_port?.toString() ?? '5795'} keyboardType="numeric" />
</Card>
{/* TODO: Move this to Debug screen */}
{debugState.enabled && (
<Card style={tw`mt-4`}>
{/* Card Header */}

View File

@@ -4,7 +4,7 @@ import { Animated, FlatList, Text, View } from 'react-native';
import { Swipeable } from 'react-native-gesture-handler';
import { LibraryConfigWrapped, useBridgeQuery } from '@sd/client';
import { ModalRef } from '~/components/layout/Modal';
import DeleteLibraryModal from '~/components/modal/confirm-modals/DeleteLibraryModal';
import DeleteLibraryModal from '~/components/modal/confirmModals/DeleteLibraryModal';
import { AnimatedButton, FakeButton } from '~/components/primitive/Button';
import { tw, twStyle } from '~/lib/tailwind';
import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator';

View File

@@ -1,6 +1,7 @@
import React from 'react';
import { Text, View } from 'react-native';
import { getDebugState, toggleFeatureFlag, useDebugState, useFeatureFlags } from '@sd/client';
import Card from '~/components/layout/Card';
import { Button } from '~/components/primitive/Button';
import { tw } from '~/lib/tailwind';
import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator';
@@ -8,26 +9,29 @@ import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator';
const DebugScreen = ({ navigation }: SettingsStackScreenProps<'Debug'>) => {
const debugState = useDebugState();
const featureFlags = useFeatureFlags();
return (
<View>
<Text style={tw`text-ink`}>Debug</Text>
<Button onPress={() => toggleFeatureFlag(['p2pPairing', 'spacedrop'])}>
<Text style={tw`text-ink`}>Toggle P2P</Text>
</Button>
<Button onPress={() => (getDebugState().rspcLogger = !getDebugState().rspcLogger)}>
<Text style={tw`text-ink`}>Toggle rspc logger</Text>
</Button>
<Text style={tw`text-ink`}>{JSON.stringify(featureFlags)}</Text>
<Text style={tw`text-ink`}>{JSON.stringify(debugState)}</Text>
<Button
onPress={() => {
navigation.popToTop();
navigation.replace('Home');
getDebugState().enabled = false;
}}
>
<Text style={tw`text-ink`}>Disable Debug Mode</Text>
</Button>
<View style={tw`flex-1 p-4`}>
<Card style={tw`gap-y-4 bg-app-box`}>
<Text style={tw`font-semibold text-ink`}>Debug</Text>
<Button onPress={() => toggleFeatureFlag(['p2pPairing', 'spacedrop'])}>
<Text style={tw`text-ink`}>Toggle P2P</Text>
</Button>
<Button onPress={() => (getDebugState().rspcLogger = !getDebugState().rspcLogger)}>
<Text style={tw`text-ink`}>Toggle rspc logger</Text>
</Button>
<Text style={tw`text-ink`}>{JSON.stringify(featureFlags)}</Text>
<Text style={tw`text-ink`}>{JSON.stringify(debugState)}</Text>
<Button
onPress={() => {
navigation.popToTop();
navigation.replace('Home');
getDebugState().enabled = false;
}}
>
<Text style={tw`text-ink`}>Disable Debug Mode</Text>
</Button>
</Card>
</View>
);
};

View File

@@ -6,7 +6,7 @@ import { Alert, ScrollView, Text, View } from 'react-native';
import { useLibraryMutation, useLibraryQuery } from '@sd/client';
import { Input } from '~/components/form/Input';
import { Switch } from '~/components/form/Switch';
import DeleteLocationModal from '~/components/modal/confirm-modals/DeleteLocationModal';
import DeleteLocationModal from '~/components/modal/confirmModals/DeleteLocationModal';
import { AnimatedButton, FakeButton } from '~/components/primitive/Button';
import { Divider } from '~/components/primitive/Divider';
import {

View File

@@ -5,7 +5,7 @@ import { Alert, View } from 'react-native';
import { useBridgeMutation, useLibraryContext } from '@sd/client';
import { Input } from '~/components/form/Input';
import { Switch } from '~/components/form/Switch';
import DeleteLibraryModal from '~/components/modal/confirm-modals/DeleteLibraryModal';
import DeleteLibraryModal from '~/components/modal/confirmModals/DeleteLibraryModal';
import { FakeButton } from '~/components/primitive/Button';
import { Divider } from '~/components/primitive/Divider';
import { SettingsContainer, SettingsTitle } from '~/components/settings/SettingsContainer';

View File

@@ -12,7 +12,7 @@ import {
import FolderIcon from '~/components/icons/FolderIcon';
import { ModalRef } from '~/components/layout/Modal';
import ImportModal from '~/components/modal/ImportModal';
import DeleteLocationModal from '~/components/modal/confirm-modals/DeleteLocationModal';
import DeleteLocationModal from '~/components/modal/confirmModals/DeleteLocationModal';
import { AnimatedButton } from '~/components/primitive/Button';
import { tw, twStyle } from '~/lib/tailwind';
import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator';

View File

@@ -4,7 +4,7 @@ import { Animated, FlatList, Text, View } from 'react-native';
import { Swipeable } from 'react-native-gesture-handler';
import { Tag, useLibraryQuery } from '@sd/client';
import { ModalRef } from '~/components/layout/Modal';
import DeleteTagModal from '~/components/modal/confirm-modals/DeleteTagModal';
import DeleteTagModal from '~/components/modal/confirmModals/DeleteTagModal';
import CreateTagModal from '~/components/modal/tag/CreateTagModal';
import UpdateTagModal from '~/components/modal/tag/UpdateTagModal';
import { AnimatedButton, FakeButton } from '~/components/primitive/Button';

View File

@@ -9,9 +9,9 @@ import * as ObjectItems from './Object/Items';
import * as SharedItems from './SharedItems';
import { ContextMenuContextProvider } from './context';
export * as SharedItems from './SharedItems';
export * as FilePathItems from './FilePath/Items';
export * as ObjectItems from './Object/Items';
export * as SharedItems from './SharedItems';
const Items = ({ children }: { children?: () => ReactNode }) => (
<>

View File

@@ -1,10 +1,9 @@
import { Gear } from 'phosphor-react';
import { useClientContext, useDebugState } from '@sd/client';
import { JobManagerContextProvider, useClientContext, useDebugState } from '@sd/client';
import { Button, ButtonLink, Popover, Tooltip, dialogManager } from '@sd/ui';
import DebugPopover from './DebugPopover';
import FeedbackDialog from './FeedbackDialog';
import { IsRunningJob, JobManager } from './JobManager';
import { JobManagerContextProvider } from './JobManager/context';
export default () => {
const { library } = useClientContext();

View File

@@ -1,11 +1,9 @@
import dayjs from 'dayjs';
import { Info, Question } from 'phosphor-react';
import { Copy, Fingerprint, Folder, Icon, Image, Info, Scissors, Trash } from 'phosphor-react';
import { memo } from 'react';
import { JobProgressEvent, JobReport } from '@sd/client';
import { JobProgressEvent, JobReport, useJobInfo } from '@sd/client';
import { ProgressBar } from '@sd/ui';
import { showAlertDialog } from '~/components';
import JobContainer from './JobContainer';
import useJobInfo from './useJobInfo';
interface JobProps {
job: JobReport;
@@ -14,21 +12,18 @@ interface JobProps {
progress: JobProgressEvent | null;
}
const JobIcon: Record<string, Icon> = {
indexer: Folder,
thumbnailer: Image,
file_identifier: Fingerprint,
file_copier: Copy,
file_deleter: Trash,
file_cutter: Scissors,
object_validator: Fingerprint
};
function Job({ job, className, isChild, progress }: JobProps) {
const info = useJobInfo(job, progress)[job.name] || {
name: job.name,
icon: Question,
textItems: [[{ text: job.status.replace(/([A-Z])/g, ' $1').trim() }]]
};
const isRunning = job.status === 'Running';
const isPaused = job.status === 'Paused';
const task_count = progress?.task_count || job.task_count;
const completed_task_count = progress?.completed_task_count || job.completed_task_count;
// dayjs from seconds to time
// const timeText = isRunning ? formatEstimatedRemainingTime(job.estimated_completion) : undefined;
const jobData = useJobInfo(job, progress);
// I don't like sending TSX as a prop due to lack of hot-reload, but it's the only way to get the error log to show up
if (job.status === 'CompletedWithErrors') {
@@ -44,7 +39,7 @@ function Job({ job, className, isChild, progress }: JobProps) {
))}
</pre>
);
info.textItems?.push([
jobData.textItems?.push([
{
text: 'Completed with errors',
icon: Info,
@@ -63,18 +58,19 @@ function Job({ job, className, isChild, progress }: JobProps) {
return (
<JobContainer
className={className}
name={info.name}
circleIcon={info.icon}
textItems={['Queued'].includes(job.status) ? [[{ text: job.status }]] : info.textItems}
// textItems={[[{ text: job.status }, { text: job.id, }]]}
name={jobData.name}
icon={JobIcon[job.name]}
textItems={
['Queued'].includes(job.status) ? [[{ text: job.status }]] : jobData.textItems
}
isChild={isChild}
>
{(isRunning || isPaused) && (
{(jobData.isRunning || jobData.isPaused) && (
<div className="my-1 ml-1.5 w-[335px]">
<ProgressBar
pending={task_count == 0}
value={completed_task_count}
total={task_count}
pending={jobData.taskCount == 0}
value={jobData.completedTaskCount}
total={jobData.taskCount}
/>
</div>
)}
@@ -83,15 +79,3 @@ function Job({ job, className, isChild, progress }: JobProps) {
}
export default memo(Job);
function formatEstimatedRemainingTime(end_date: string) {
const duration = dayjs.duration(new Date(end_date).getTime() - Date.now());
if (duration.hours() > 0) {
return `${duration.hours()} hour${duration.hours() > 1 ? 's' : ''} remaining`;
} else if (duration.minutes() > 0) {
return `${duration.minutes()} minute${duration.minutes() > 1 ? 's' : ''} remaining`;
} else {
return `${duration.seconds()} second${duration.seconds() > 1 ? 's' : ''} remaining`;
}
}

View File

@@ -1,22 +1,12 @@
/* eslint-disable tailwindcss/classnames-order */
import clsx from 'clsx';
import { ForwardRefExoticComponent, Fragment, HTMLAttributes, ReactNode, forwardRef } from 'react';
import { TextItems } from '@sd/client';
import { Tooltip, tw } from '@sd/ui';
import classes from './Job.module.scss';
export interface TextItem {
text?: string;
tooltip?: string;
icon?: ForwardRefExoticComponent<any>;
onClick?: () => void;
}
// first array for lines, second array for items separated by " • ".
export type TextItems = (TextItem | undefined)[][];
interface JobContainerProps extends HTMLAttributes<HTMLLIElement> {
name: string;
iconImg?: string;
circleIcon?: ForwardRefExoticComponent<any>;
icon?: string | ForwardRefExoticComponent<any>;
// Array of arrays of TextItems, where each array of TextItems is a truncated line of text.
textItems?: TextItems;
isChild?: boolean;
@@ -32,16 +22,7 @@ const TextItem = tw.span`truncate`;
// Job container consolidates the common layout of a job item, used for regular jobs (Job.tsx) and grouped jobs (JobGroup.tsx).
const JobContainer = forwardRef<HTMLLIElement, JobContainerProps>((props, ref) => {
const {
name,
iconImg,
circleIcon: CircleIcon,
textItems,
isChild,
children,
className,
...restProps
} = props;
const { name, icon: Icon, textItems, isChild, children, className, ...restProps } = props;
return (
<li
@@ -54,24 +35,27 @@ const JobContainer = forwardRef<HTMLLIElement, JobContainerProps>((props, ref) =
)}
{...restProps}
>
{CircleIcon && (
<CircleIcon weight="fill" className={clsx(CIRCLE_ICON_CLASS, isChild && 'mx-1')} />
{typeof Icon === 'string' ? (
<img src={Icon} className={IMG_ICON_CLASS} />
) : (
Icon && (
<Icon weight="fill" className={clsx(CIRCLE_ICON_CLASS, isChild && 'mx-1')} />
)
)}
{iconImg && <img src={iconImg} className={IMG_ICON_CLASS} />}
<MetaContainer>
<Tooltip tooltipClassName="bg-black max-w-[400px]" position="top" label={name}>
<span className="truncate pl-1.5 font-semibold">{name}</span>
</Tooltip>
{textItems?.map((textItems, lineIndex) => {
{textItems?.map((item, index) => {
// filter out undefined text so we don't render empty TextItems
const filteredItems = textItems.filter((i) => i?.text);
const filteredItems = item.filter((i) => i?.text);
const popoverText = filteredItems.map((i) => i?.text).join(' • ');
return (
<Tooltip
label={popoverText}
key={lineIndex}
key={index}
tooltipClassName="bg-black max-w-[400px]"
>
<TextLine>
@@ -82,7 +66,7 @@ const JobContainer = forwardRef<HTMLLIElement, JobContainerProps>((props, ref) =
<TextItem
onClick={textItem?.onClick}
className={clsx(
// lineIndex > 0 && 'px-1.5 py-0.5 italic',
// index > 0 && 'px-1.5 py-0.5 italic',
textItem?.onClick &&
'-ml-1.5 rounded-md hover:bg-app-button/50'
)}

Some files were not shown because too many files have changed in this diff Show More