diff --git a/.github/workflows/maestro-test.yml b/.github/workflows/maestro-test.yml index d485a189..e3b7a36b 100644 --- a/.github/workflows/maestro-test.yml +++ b/.github/workflows/maestro-test.yml @@ -1,7 +1,7 @@ name: Run Maestro Tests on: - workflow_dispatch: + pull_request: jobs: build-android: diff --git a/.prettierrc.js b/.prettierrc.js index d5545c1c..d767dbc6 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -8,7 +8,6 @@ module.exports = { printWidth: 100, useTabs: true, tabWidth: 4, - arrowParens: 'always', endOfLine: 'lf', trailingComma: 'all', } diff --git a/App.tsx b/App.tsx index 2e3834d6..db2c16e7 100644 --- a/App.tsx +++ b/App.tsx @@ -20,10 +20,14 @@ import ErrorBoundary from './src/components/ErrorBoundary' import Toast from 'react-native-toast-message' import JellifyToastConfig from './src/constants/toast.config' import OTAUpdateScreen from './src/components/OtaUpdates' +import { usePerformanceMonitor } from './src/hooks/use-performance-monitor' export const backgroundRuntime = createWorkletRuntime('background') export default function App(): React.JSX.Element { + // Add performance monitoring to track app-level re-renders + const performanceMetrics = usePerformanceMonitor('App', 3) + const [playerIsReady, setPlayerIsReady] = useState(false) const isDarkMode = useColorScheme() === 'dark' @@ -31,13 +35,22 @@ export default function App(): React.JSX.Element { autoHandleInterruptions: true, iosCategory: IOSCategory.Playback, iosCategoryOptions: [IOSCategoryOptions.AllowAirPlay, IOSCategoryOptions.AllowBluetooth], + // Enhanced buffer settings for gapless playback + maxCacheSize: 50 * 1024 * 1024, // 50MB cache + maxBuffer: 30000, // 30 seconds buffer + minBuffer: 15000, // 15 seconds minimum buffer + playBuffer: 2500, // 2.5 seconds play buffer + backBuffer: 5000, // 5 seconds back buffer }) .then(() => TrackPlayer.updateOptions({ capabilities: CAPABILITIES, notificationCapabilities: CAPABILITIES, compactCapabilities: CAPABILITIES, - progressUpdateEventInterval: 10, + // Reduced interval for smoother progress tracking and earlier prefetch detection + progressUpdateEventInterval: 5, + // Enable gapless playback + alwaysPauseOnInterruption: false, }), ) .finally(() => { diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..1e3eed16 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,79 @@ +# ๐Ÿ‘ฉโ€๐Ÿ’ป Contributing + +We are open to any developer that wants to lend their hand at _Jellify_ development, and developers can join our [Discord server](https://discord.gg/jellify) to get in contact with us. + +Here's the best way to get started: + +- Fork this repository +- Follow the instructions for [Running Locally](#๏ธrunning-locally) +- Check out the [issues](https://github.com/Jellify-Music/App/issues) if you need inspiration +- Hack, hack, hack +- ??? +- Submit a Pull Request to sync the main repository with your fork +- Profit! ๐ŸŽ‰ + +## ๐Ÿƒโ€โ™€๏ธRunning Locally + +### โš›๏ธ Universal Dependencies + +- [Ruby](https://www.ruby-lang.org/en/documentation/installation/) for Fastlane +- [NodeJS v22](https://nodejs.org/en/download) for React Native +- [Maestro](https://docs.maestro.dev/getting-started/installing-maestro) for running E2E tests + +### ๐ŸŽ iOS + +#### Dependencies + +- [Xcode](https://developer.apple.com/xcode/) for building + +#### Instructions + +##### Setup + +- Clone this repository +- Run `yarn init-ios:new-arch` to initialize the project + - This will install `npm` packages, install `bundler` and required gems, and install required CocoaPods with [React Native's New Architecture](https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#what-is-the-new-architecture) +- In the `ios` directory, run `fastlane match development --readonly` to fetch the development signing certificates + - _You will need access to the "Jellify Signing" private repository_ + +##### Running + +- Run `yarn start` to start the dev server +- Open the `Jellify.xcodeworkspace` with Xcode, _not_ the `Jellify.xcodeproject` +- Run either on a device or in the simulator + - _You will need to wait for Xcode to finish it's "Indexing" step_ + +##### Building + +- To create a build, run `yarn fastlane:ios:build` to use fastlane to compile an `.ipa` + +### ๐Ÿค– Android + +#### Dependencies + +- [Android Studio](https://developer.android.com/studio) +- [Java Development Kit](https://www.oracle.com/th/java/technologies/downloads/) + +#### Instructions + +##### Setup + +- Clone this repository +- Run `yarn install` to install `npm` packages + +##### Running + +- Run `yarn start` to start the dev server +- Open the `android` folder with Android Studio + - _Android Studio should automatically grab the "Run Configurations" and initialize Gradle_ +- Run either on a device or in the simulator + +##### Building + +- To create a build, run `yarn fastlane:android:build` to use fastlane to compile an `.apk` for all architectures + +#### References + +- [Setting up Android SDK](https://developer.android.com/about/versions/14/setup-sdk) +- [ANDROID_HOME not being set](https://stackoverflow.com/questions/26356359/error-android-home-is-not-set-and-android-command-not-in-your-path-you-must/54888107#54888107) +- [Android Auto app not showing up](https://www.reddit.com/r/AndroidAuto/s/LGYHoSPdXm) \ No newline at end of file diff --git a/README.md b/README.md index ca4f91b9..1941b174 100644 --- a/README.md +++ b/README.md @@ -241,83 +241,6 @@ You can support _Jellify_ development via [Patreon](https://patreon.com/anultrav This allows me to prioritize specific features, acquire additional hardware for testing and development, and helps cover operational costs like Apple Developer Licenses. -## ๐Ÿƒโ€โ™€๏ธRunning Locally - -### โš›๏ธ Universal Dependencies - -- [Ruby](https://www.ruby-lang.org/en/documentation/installation/) for Fastlane -- [NodeJS v22](https://nodejs.org/en/download) for React Native -- [Maestro](https://docs.maestro.dev/getting-started/installing-maestro) for running E2E tests - -### ๐ŸŽ iOS - -#### Dependencies - -- [Xcode](https://developer.apple.com/xcode/) for building - -#### Instructions - -##### Setup - -- Clone this repository -- Run `yarn init-ios:new-arch` to initialize the project - - This will install `npm` packages, install `bundler` and required gems, and install required CocoaPods with [React Native's New Architecture](https://reactnative.dev/blog/2024/10/23/the-new-architecture-is-here#what-is-the-new-architecture) -- In the `ios` directory, run `fastlane match development --readonly` to fetch the development signing certificates - - _You will need access to the "Jellify Signing" private repository_ - -##### Running - -- Run `yarn start` to start the dev server -- Open the `Jellify.xcodeworkspace` with Xcode, _not_ the `Jellify.xcodeproject` -- Run either on a device or in the simulator - - _You will need to wait for Xcode to finish it's "Indexing" step_ - -##### Building - -- To create a build, run `yarn fastlane:ios:build` to use fastlane to compile an `.ipa` - -### ๐Ÿค– Android - -#### Dependencies - -- [Android Studio](https://developer.android.com/studio) -- [Java Development Kit](https://www.oracle.com/th/java/technologies/downloads/) - -#### Instructions - -##### Setup - -- Clone this repository -- Run `yarn install` to install `npm` packages - -##### Running - -- Run `yarn start` to start the dev server -- Open the `android` folder with Android Studio - - _Android Studio should automatically grab the "Run Configurations" and initialize Gradle_ -- Run either on a device or in the simulator - -##### Building - -- To create a build, run `yarn fastlane:android:build` to use fastlane to compile an `.apk` for all architectures - -#### References - -- [Setting up Android SDK](https://developer.android.com/about/versions/14/setup-sdk) -- [ANDROID_HOME not being set](https://stackoverflow.com/questions/26356359/error-android-home-is-not-set-and-android-command-not-in-your-path-you-must/54888107#54888107) -- [Android Auto app not showing up](https://www.reddit.com/r/AndroidAuto/s/LGYHoSPdXm) - -## ๐Ÿ‘ฉโ€๐Ÿ’ป Contributing - -We are open to any developer that wants to lend their hand at _Jellify_ development! Here's the best way to get started - -- Fork this repository -- Follow the instructions for [Running Locally](#๏ธrunning-locally) -- Hack, hack, hack -- ??? -- Submit a Pull Request to sync the main repository with your fork! -- Profit ๐ŸŽ‰ - ## ๐Ÿ™ Special Thanks To - The [Jellyfin Team](https://jellyfin.org/) for making this possible with their software, SDKs, and unequivocal helpfulness. @@ -328,7 +251,9 @@ We are open to any developer that wants to lend their hand at _Jellify_ developm - [Nicolas Charpentier](https://github.com/charpeni) for his [React Native URL Polyfill](https://github.com/charpeni/react-native-url-polyfill) module and for his assistance with getting Jest working - The team behind [Podverse](https://github.com/podverse/podverse-rn) for their incredible open source project, of which was used as a reference extensively during development - My fellow [contributors](https://github.com/anultravioletaurora/Jellify/graphs/contributors) who have poured so much heart and a lot of sweat into making _Jellify_ a great experience - - Extra thanks to [John](https://github.com/johngrantdev) and [Vali-98](https://github.com/Vali-98) for shaping and designing the user experience in many places + - Extra thanks to [John](https://github.com/johngrantdev), [Vali-98](https://github.com/Vali-98), and [Erik](https://github.com/felinusfish) for shaping and designing the user experience + - Shout out to [skalthoff](https://github.com/skalthoff) for championing many features: + - Gapless Playback - Huge thank you to [Ritesh](https://github.com/riteshshukla04) for literally so many things: - Offline Mode and Network Detection - Error Boundary Detection diff --git a/android/app/src/main/assets/fonts/Aileron-Black.otf b/android/app/src/main/assets/fonts/Aileron-Black.otf deleted file mode 100644 index c5eb31fb..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-Black.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-BlackItalic.otf b/android/app/src/main/assets/fonts/Aileron-BlackItalic.otf deleted file mode 100644 index 4fdd1670..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-BlackItalic.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-Bold.otf b/android/app/src/main/assets/fonts/Aileron-Bold.otf deleted file mode 100644 index c2bfaabf..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-Bold.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-BoldItalic.otf b/android/app/src/main/assets/fonts/Aileron-BoldItalic.otf deleted file mode 100644 index 0de2da9f..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-BoldItalic.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-Heavy.otf b/android/app/src/main/assets/fonts/Aileron-Heavy.otf deleted file mode 100644 index 86adc32f..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-Heavy.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-HeavyItalic.otf b/android/app/src/main/assets/fonts/Aileron-HeavyItalic.otf deleted file mode 100644 index 5a7b44b4..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-HeavyItalic.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-Italic.otf b/android/app/src/main/assets/fonts/Aileron-Italic.otf deleted file mode 100644 index 4fcf7e0b..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-Italic.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-Light.otf b/android/app/src/main/assets/fonts/Aileron-Light.otf deleted file mode 100644 index ec443430..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-Light.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-LightItalic.otf b/android/app/src/main/assets/fonts/Aileron-LightItalic.otf deleted file mode 100644 index 5a095abd..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-LightItalic.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-Regular.otf b/android/app/src/main/assets/fonts/Aileron-Regular.otf deleted file mode 100644 index 4248f6ff..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-Regular.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-SemiBold.otf b/android/app/src/main/assets/fonts/Aileron-SemiBold.otf deleted file mode 100644 index b1f507df..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-SemiBold.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-SemiBoldItalic.otf b/android/app/src/main/assets/fonts/Aileron-SemiBoldItalic.otf deleted file mode 100644 index 2b7924ee..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-SemiBoldItalic.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-Thin.otf b/android/app/src/main/assets/fonts/Aileron-Thin.otf deleted file mode 100644 index 39b6e990..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-Thin.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-ThinItalic.otf b/android/app/src/main/assets/fonts/Aileron-ThinItalic.otf deleted file mode 100644 index df40ebf9..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-ThinItalic.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-UltraLight.otf b/android/app/src/main/assets/fonts/Aileron-UltraLight.otf deleted file mode 100644 index 4131241b..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-UltraLight.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Aileron-UltraLightItalic.otf b/android/app/src/main/assets/fonts/Aileron-UltraLightItalic.otf deleted file mode 100644 index 17d762e6..00000000 Binary files a/android/app/src/main/assets/fonts/Aileron-UltraLightItalic.otf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/Figtree-Black.otf b/android/app/src/main/assets/fonts/Figtree-Black.otf new file mode 100644 index 00000000..bd897663 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-Black.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-BlackItalic.otf b/android/app/src/main/assets/fonts/Figtree-BlackItalic.otf new file mode 100644 index 00000000..dd247b81 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-BlackItalic.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-Bold.otf b/android/app/src/main/assets/fonts/Figtree-Bold.otf new file mode 100644 index 00000000..26c20d2a Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-Bold.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-BoldItalic.otf b/android/app/src/main/assets/fonts/Figtree-BoldItalic.otf new file mode 100644 index 00000000..d21f6b72 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-BoldItalic.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-ExtraBold.otf b/android/app/src/main/assets/fonts/Figtree-ExtraBold.otf new file mode 100644 index 00000000..030e7f45 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-ExtraBold.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-ExtraBoldItalic.otf b/android/app/src/main/assets/fonts/Figtree-ExtraBoldItalic.otf new file mode 100644 index 00000000..6fce54b6 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-ExtraBoldItalic.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-Italic.otf b/android/app/src/main/assets/fonts/Figtree-Italic.otf new file mode 100644 index 00000000..a5319345 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-Italic.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-Light.otf b/android/app/src/main/assets/fonts/Figtree-Light.otf new file mode 100644 index 00000000..eb40d4de Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-Light.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-LightItalic.otf b/android/app/src/main/assets/fonts/Figtree-LightItalic.otf new file mode 100644 index 00000000..4549b999 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-LightItalic.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-Medium.otf b/android/app/src/main/assets/fonts/Figtree-Medium.otf new file mode 100644 index 00000000..f12a2e37 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-Medium.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-MediumItalic.otf b/android/app/src/main/assets/fonts/Figtree-MediumItalic.otf new file mode 100644 index 00000000..83ca5399 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-MediumItalic.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-Regular.otf b/android/app/src/main/assets/fonts/Figtree-Regular.otf new file mode 100644 index 00000000..20b5ac99 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-Regular.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-SemiBold.otf b/android/app/src/main/assets/fonts/Figtree-SemiBold.otf new file mode 100644 index 00000000..d2f28021 Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-SemiBold.otf differ diff --git a/android/app/src/main/assets/fonts/Figtree-SemiBoldItalic.otf b/android/app/src/main/assets/fonts/Figtree-SemiBoldItalic.otf new file mode 100644 index 00000000..375ef7ce Binary files /dev/null and b/android/app/src/main/assets/fonts/Figtree-SemiBoldItalic.otf differ diff --git a/android/link-assets-manifest.json b/android/link-assets-manifest.json index a379dc69..1d92b62c 100644 --- a/android/link-assets-manifest.json +++ b/android/link-assets-manifest.json @@ -2,68 +2,60 @@ "migIndex": 1, "data": [ { - "path": "assets/fonts/Aileron-Black.otf", - "sha1": "f9c3d80856ec2f23c8733b63edc9bd9d3051d999" + "path": "assets/fonts/Figtree-Black.otf", + "sha1": "b73ea990d4cb9d083ba9c83fcb294c9a0f6d047b" }, { - "path": "assets/fonts/Aileron-BlackItalic.otf", - "sha1": "ffb617e90f50dfe1eb2bd4df80736d55ccacbb73" + "path": "assets/fonts/Figtree-BlackItalic.otf", + "sha1": "cf1e0fae27e6e5fac99ade89606c2e1beaee9591" }, { - "path": "assets/fonts/Aileron-Bold.otf", - "sha1": "9daa863f1c9a0f9efacd19fe9329c0fb9332ca7a" + "path": "assets/fonts/Figtree-Bold.otf", + "sha1": "ae0e42549ac7e9c3eef3c1d30559c4c1cd12c956" }, { - "path": "assets/fonts/Aileron-BoldItalic.otf", - "sha1": "13dbc6d1c10932eeacac7c680a7f71a25f6f821e" + "path": "assets/fonts/Figtree-BoldItalic.otf", + "sha1": "4eaafcb1bc116ef2ba27563abcf7ef14950168b6" }, { - "path": "assets/fonts/Aileron-Heavy.otf", - "sha1": "56a9def7cf4ad3efefec7485be8cd95a265ab1f6" + "path": "assets/fonts/Figtree-ExtraBold.otf", + "sha1": "fd27451fd8d4345bf10fb2df7709ce5d227bd0e0" }, { - "path": "assets/fonts/Aileron-HeavyItalic.otf", - "sha1": "23255fa29564f9757f779ba29c1d5649c2bf4259" + "path": "assets/fonts/Figtree-ExtraBoldItalic.otf", + "sha1": "a95dbce0e64237016368ed9b4ebd59d6fa511df1" }, { - "path": "assets/fonts/Aileron-Italic.otf", - "sha1": "338b043581d997314a4a03924ed30ff6461fd37e" + "path": "assets/fonts/Figtree-Italic.otf", + "sha1": "dd8e424f080055ab68c1443c2dbaf23036a0b8e9" }, { - "path": "assets/fonts/Aileron-Light.otf", - "sha1": "bf29e850d4c6dc3c73e46eb322f367c81ca07aad" + "path": "assets/fonts/Figtree-Light.otf", + "sha1": "a5970daf4ba6f327add523fcfb9a7e8b18eab236" }, { - "path": "assets/fonts/Aileron-LightItalic.otf", - "sha1": "48a4355b8792657845b3b0cd39c42994923a117a" + "path": "assets/fonts/Figtree-LightItalic.otf", + "sha1": "23d693a3ea682078ba5680ed36bbb561f5f9b22c" }, { - "path": "assets/fonts/Aileron-Regular.otf", - "sha1": "5a78965873fbce38941cd3da109280af89a42de5" + "path": "assets/fonts/Figtree-Medium.otf", + "sha1": "88cfdca20a37949ef1ef22d3787e85e6fc1f3fda" }, { - "path": "assets/fonts/Aileron-SemiBold.otf", - "sha1": "3c4affc8a57d6915e1255fd6c5312d1443bcc824" + "path": "assets/fonts/Figtree-MediumItalic.otf", + "sha1": "2df859b3f99c65473e2131881fd03ee086b20f27" }, { - "path": "assets/fonts/Aileron-SemiBoldItalic.otf", - "sha1": "46f85a5b66cf813651057ff2ed623527bdcd4b6f" + "path": "assets/fonts/Figtree-Regular.otf", + "sha1": "d250271defee0620eecd53ffbe262aa6db0b1612" }, { - "path": "assets/fonts/Aileron-Thin.otf", - "sha1": "ee9d845c2b370a3ac00cfe402079233f8621ef9c" + "path": "assets/fonts/Figtree-SemiBold.otf", + "sha1": "752c72cd807768824ee845f2844149c232e71d1f" }, { - "path": "assets/fonts/Aileron-ThinItalic.otf", - "sha1": "31db89d81d0f354cc67dfc53bad54be5bfd44214" - }, - { - "path": "assets/fonts/Aileron-UltraLight.otf", - "sha1": "ee4b6ef0bb1606ef950ba9acca0e78bb2cc2dc24" - }, - { - "path": "assets/fonts/Aileron-UltraLightItalic.otf", - "sha1": "8a34c35019102ac48f86fc0255d06c8ca05933d0" + "path": "assets/fonts/Figtree-SemiBoldItalic.otf", + "sha1": "229451957167354dece0680b901d3bfacd333589" } ] } diff --git a/assets/fonts/Aileron-Black.otf b/assets/fonts/Aileron-Black.otf deleted file mode 100644 index c5eb31fb..00000000 Binary files a/assets/fonts/Aileron-Black.otf and /dev/null differ diff --git a/assets/fonts/Aileron-BlackItalic.otf b/assets/fonts/Aileron-BlackItalic.otf deleted file mode 100644 index 4fdd1670..00000000 Binary files a/assets/fonts/Aileron-BlackItalic.otf and /dev/null differ diff --git a/assets/fonts/Aileron-Bold.otf b/assets/fonts/Aileron-Bold.otf deleted file mode 100644 index c2bfaabf..00000000 Binary files a/assets/fonts/Aileron-Bold.otf and /dev/null differ diff --git a/assets/fonts/Aileron-BoldItalic.otf b/assets/fonts/Aileron-BoldItalic.otf deleted file mode 100644 index 0de2da9f..00000000 Binary files a/assets/fonts/Aileron-BoldItalic.otf and /dev/null differ diff --git a/assets/fonts/Aileron-Heavy.otf b/assets/fonts/Aileron-Heavy.otf deleted file mode 100644 index 86adc32f..00000000 Binary files a/assets/fonts/Aileron-Heavy.otf and /dev/null differ diff --git a/assets/fonts/Aileron-HeavyItalic.otf b/assets/fonts/Aileron-HeavyItalic.otf deleted file mode 100644 index 5a7b44b4..00000000 Binary files a/assets/fonts/Aileron-HeavyItalic.otf and /dev/null differ diff --git a/assets/fonts/Aileron-Italic.otf b/assets/fonts/Aileron-Italic.otf deleted file mode 100644 index 4fcf7e0b..00000000 Binary files a/assets/fonts/Aileron-Italic.otf and /dev/null differ diff --git a/assets/fonts/Aileron-Light.otf b/assets/fonts/Aileron-Light.otf deleted file mode 100644 index ec443430..00000000 Binary files a/assets/fonts/Aileron-Light.otf and /dev/null differ diff --git a/assets/fonts/Aileron-LightItalic.otf b/assets/fonts/Aileron-LightItalic.otf deleted file mode 100644 index 5a095abd..00000000 Binary files a/assets/fonts/Aileron-LightItalic.otf and /dev/null differ diff --git a/assets/fonts/Aileron-Regular.otf b/assets/fonts/Aileron-Regular.otf deleted file mode 100644 index 4248f6ff..00000000 Binary files a/assets/fonts/Aileron-Regular.otf and /dev/null differ diff --git a/assets/fonts/Aileron-SemiBold.otf b/assets/fonts/Aileron-SemiBold.otf deleted file mode 100644 index b1f507df..00000000 Binary files a/assets/fonts/Aileron-SemiBold.otf and /dev/null differ diff --git a/assets/fonts/Aileron-SemiBoldItalic.otf b/assets/fonts/Aileron-SemiBoldItalic.otf deleted file mode 100644 index 2b7924ee..00000000 Binary files a/assets/fonts/Aileron-SemiBoldItalic.otf and /dev/null differ diff --git a/assets/fonts/Aileron-Thin.otf b/assets/fonts/Aileron-Thin.otf deleted file mode 100644 index 39b6e990..00000000 Binary files a/assets/fonts/Aileron-Thin.otf and /dev/null differ diff --git a/assets/fonts/Aileron-ThinItalic.otf b/assets/fonts/Aileron-ThinItalic.otf deleted file mode 100644 index df40ebf9..00000000 Binary files a/assets/fonts/Aileron-ThinItalic.otf and /dev/null differ diff --git a/assets/fonts/Aileron-UltraLight.otf b/assets/fonts/Aileron-UltraLight.otf deleted file mode 100644 index 4131241b..00000000 Binary files a/assets/fonts/Aileron-UltraLight.otf and /dev/null differ diff --git a/assets/fonts/Aileron-UltraLightItalic.otf b/assets/fonts/Aileron-UltraLightItalic.otf deleted file mode 100644 index 17d762e6..00000000 Binary files a/assets/fonts/Aileron-UltraLightItalic.otf and /dev/null differ diff --git a/assets/fonts/Figtree-Black.otf b/assets/fonts/Figtree-Black.otf new file mode 100644 index 00000000..bd897663 Binary files /dev/null and b/assets/fonts/Figtree-Black.otf differ diff --git a/assets/fonts/Figtree-BlackItalic.otf b/assets/fonts/Figtree-BlackItalic.otf new file mode 100644 index 00000000..dd247b81 Binary files /dev/null and b/assets/fonts/Figtree-BlackItalic.otf differ diff --git a/assets/fonts/Figtree-Bold.otf b/assets/fonts/Figtree-Bold.otf new file mode 100644 index 00000000..26c20d2a Binary files /dev/null and b/assets/fonts/Figtree-Bold.otf differ diff --git a/assets/fonts/Figtree-BoldItalic.otf b/assets/fonts/Figtree-BoldItalic.otf new file mode 100644 index 00000000..d21f6b72 Binary files /dev/null and b/assets/fonts/Figtree-BoldItalic.otf differ diff --git a/assets/fonts/Figtree-ExtraBold.otf b/assets/fonts/Figtree-ExtraBold.otf new file mode 100644 index 00000000..030e7f45 Binary files /dev/null and b/assets/fonts/Figtree-ExtraBold.otf differ diff --git a/assets/fonts/Figtree-ExtraBoldItalic.otf b/assets/fonts/Figtree-ExtraBoldItalic.otf new file mode 100644 index 00000000..6fce54b6 Binary files /dev/null and b/assets/fonts/Figtree-ExtraBoldItalic.otf differ diff --git a/assets/fonts/Figtree-Italic.otf b/assets/fonts/Figtree-Italic.otf new file mode 100644 index 00000000..a5319345 Binary files /dev/null and b/assets/fonts/Figtree-Italic.otf differ diff --git a/assets/fonts/Figtree-Light.otf b/assets/fonts/Figtree-Light.otf new file mode 100644 index 00000000..eb40d4de Binary files /dev/null and b/assets/fonts/Figtree-Light.otf differ diff --git a/assets/fonts/Figtree-LightItalic.otf b/assets/fonts/Figtree-LightItalic.otf new file mode 100644 index 00000000..4549b999 Binary files /dev/null and b/assets/fonts/Figtree-LightItalic.otf differ diff --git a/assets/fonts/Figtree-Medium.otf b/assets/fonts/Figtree-Medium.otf new file mode 100644 index 00000000..f12a2e37 Binary files /dev/null and b/assets/fonts/Figtree-Medium.otf differ diff --git a/assets/fonts/Figtree-MediumItalic.otf b/assets/fonts/Figtree-MediumItalic.otf new file mode 100644 index 00000000..83ca5399 Binary files /dev/null and b/assets/fonts/Figtree-MediumItalic.otf differ diff --git a/assets/fonts/Figtree-Regular.otf b/assets/fonts/Figtree-Regular.otf new file mode 100644 index 00000000..20b5ac99 Binary files /dev/null and b/assets/fonts/Figtree-Regular.otf differ diff --git a/assets/fonts/Figtree-SemiBold.otf b/assets/fonts/Figtree-SemiBold.otf new file mode 100644 index 00000000..d2f28021 Binary files /dev/null and b/assets/fonts/Figtree-SemiBold.otf differ diff --git a/assets/fonts/Figtree-SemiBoldItalic.otf b/assets/fonts/Figtree-SemiBoldItalic.otf new file mode 100644 index 00000000..375ef7ce Binary files /dev/null and b/assets/fonts/Figtree-SemiBoldItalic.otf differ diff --git a/fonts.config.ts b/fonts.config.ts index ee4e3e27..1b263b3b 100644 --- a/fonts.config.ts +++ b/fonts.config.ts @@ -1,32 +1,40 @@ import { fonts } from '@tamagui/config/v4' import { createFont } from 'tamagui' -const aileronFace = { - 100: { normal: 'Aileron-UltraLight', italic: 'Aileron UltraLight Italic' }, - 200: { normal: 'Aileron-Thin', italic: 'Aileron Thin Italic' }, - 300: { normal: 'Aileron-Light', italic: 'Aileron Light Italic' }, - 400: { normal: 'Aileron-Regular', italic: 'Aileron Italic' }, - 500: { normal: 'Aileron-Regular', italic: 'Aileron Italic' }, - 600: { normal: 'Aileron-SemiBold', italic: 'Aileron SemiBold Italic' }, - 700: { normal: 'Aileron-Bold', italic: 'Aileron Bold Italic' }, - 800: { normal: 'Aileron-Heavy', italic: 'Aileron Heavy Italic' }, - 900: { normal: 'Aileron-Black', italic: 'Aileron-BlackItalic' }, +const figtreeFace = { + 100: { normal: 'Figtree-Light', italic: 'Figtree Light Italic' }, + 200: { normal: 'Figtree-Light', italic: 'Figtree Light Italic' }, + 300: { normal: 'Figtree-Regular', italic: 'Figtree Italic' }, + 400: { normal: 'Figtree-Medium', italic: 'Figtree Medium Italic' }, + 500: { normal: 'Figtree-SemiBold', italic: 'Figtree SemiBold Italic' }, + 600: { normal: 'Figtree-Bold', italic: 'Figtree Bold Italic' }, + 700: { normal: 'Figtree-ExtraBold', italic: 'Figtree ExtraBold Italic' }, + 800: { normal: 'Figtree-Black', italic: 'Figtree Black Italic' }, + 900: { normal: 'Figtree-Black', italic: 'Figtree Black Italic' }, } export const bodyFont = createFont({ - family: 'Aileron-Bold', + family: 'Figtree', size: fonts.body.size, lineHeight: fonts.body.lineHeight, - weight: fonts.body.weight, + weight: { + 4: '300', + 6: '600', + 8: '900', + }, letterSpacing: fonts.body.letterSpacing, - face: aileronFace, + face: figtreeFace, }) export const headingFont = createFont({ - family: 'Aileron-Black', + family: 'Figtree', size: fonts.heading.size, lineHeight: fonts.heading.lineHeight, - weight: fonts.heading.weight, + weight: { + 4: '300', + 6: '600', + 8: '900', + }, letterSpacing: fonts.heading.letterSpacing, - face: aileronFace, + face: figtreeFace, }) diff --git a/ios/Jellify.xcodeproj/project.pbxproj b/ios/Jellify.xcodeproj/project.pbxproj index a9dce9a4..a1ea85c9 100644 --- a/ios/Jellify.xcodeproj/project.pbxproj +++ b/ios/Jellify.xcodeproj/project.pbxproj @@ -8,26 +8,34 @@ /* Begin PBXBuildFile section */ 00E356F31AD99517003FC87E /* JellifyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* JellifyTests.m */; }; + 1265343243674813A09FABA1 /* Figtree-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 6D530F1FFB1A4A1AB8DBCBB5 /* Figtree-Light.otf */; }; + 12D872C7A4EB46098395E0E6 /* Figtree-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DEF20584B68B4278A94DE482 /* Figtree-Regular.otf */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 217EBE16A3E8C5FBF476C905 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = F757EB73303E0AC21EF34F64 /* PrivacyInfo.xcprivacy */; }; + 349489BE63034B8488AEB348 /* Figtree-ExtraBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 809C125985044862A11BF363 /* Figtree-ExtraBold.otf */; }; + 371541D24E8B4ED09F3E0232 /* Figtree-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 73F5649796BB4A29AF608270 /* Figtree-Italic.otf */; }; + 56FB5F5E49FEE21FAAA689D9 /* libPods-Jellify.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C5258FBB23272277847FE07E /* libPods-Jellify.a */; }; + 6D01DB978D2E4372B7DBB1DE /* Figtree-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 5DE4B5F2208F4966A8FB3045 /* Figtree-BoldItalic.otf */; }; + 7C76A304B85A470899DC1104 /* Figtree-SemiBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = FEB4464569A04518A333830C /* Figtree-SemiBoldItalic.otf */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; - 9D70AF74B3F54D679E527364 /* libPods-Jellify.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 95B4030EF5077AD57C505857 /* libPods-Jellify.a */; }; - CF620D0C2CF2BB210045E433 /* Aileron-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620CFC2CF2BB1F0045E433 /* Aileron-Italic.otf */; }; - CF620D0D2CF2BB210045E433 /* Aileron-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620CFD2CF2BB1F0045E433 /* Aileron-Thin.otf */; }; - CF620D0E2CF2BB210045E433 /* Aileron-HeavyItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620CFE2CF2BB1F0045E433 /* Aileron-HeavyItalic.otf */; }; - CF620D0F2CF2BB210045E433 /* Aileron-SemiBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620CFF2CF2BB1F0045E433 /* Aileron-SemiBoldItalic.otf */; }; - CF620D102CF2BB210045E433 /* Aileron-Heavy.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D002CF2BB1F0045E433 /* Aileron-Heavy.otf */; }; - CF620D112CF2BB210045E433 /* Aileron-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D012CF2BB1F0045E433 /* Aileron-BoldItalic.otf */; }; - CF620D122CF2BB210045E433 /* Aileron-UltraLight.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D022CF2BB1F0045E433 /* Aileron-UltraLight.otf */; }; - CF620D132CF2BB210045E433 /* Aileron-UltraLightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D032CF2BB200045E433 /* Aileron-UltraLightItalic.otf */; }; - CF620D142CF2BB210045E433 /* Aileron-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D042CF2BB200045E433 /* Aileron-Regular.otf */; }; - CF620D152CF2BB210045E433 /* Aileron-LightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D052CF2BB200045E433 /* Aileron-LightItalic.otf */; }; - CF620D162CF2BB210045E433 /* Aileron-BlackItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D062CF2BB200045E433 /* Aileron-BlackItalic.otf */; }; - CF620D172CF2BB210045E433 /* Aileron-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D072CF2BB200045E433 /* Aileron-Light.otf */; }; - CF620D182CF2BB210045E433 /* Aileron-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D082CF2BB200045E433 /* Aileron-Bold.otf */; }; - CF620D192CF2BB210045E433 /* Aileron-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D092CF2BB200045E433 /* Aileron-Black.otf */; }; - CF620D1A2CF2BB210045E433 /* Aileron-ThinItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D0A2CF2BB200045E433 /* Aileron-ThinItalic.otf */; }; - CF620D1B2CF2BB210045E433 /* Aileron-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D0B2CF2BB200045E433 /* Aileron-SemiBold.otf */; }; + 8D4E743194A841CD99D2E848 /* Figtree-BlackItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2F5D67B394724F1B97DE0CA1 /* Figtree-BlackItalic.otf */; }; + B3A23A2BDB99428997FAFAFD /* Figtree-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 700121E1AAA5485EA4215C17 /* Figtree-Bold.otf */; }; + C0208644013D4FEFA246A0E3 /* Figtree-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 49B52B8BEDDF4BEDBD4265DD /* Figtree-Medium.otf */; }; + C49BE00A96F041E78E89EE45 /* Figtree-ExtraBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7D2BAACBD08E405DA9C124A7 /* Figtree-ExtraBoldItalic.otf */; }; + CF605E6B2DF95BAB00858968 /* Figtree-LightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E652DF95BAB00858968 /* Figtree-LightItalic.otf */; }; + CF605E6C2DF95BAB00858968 /* Figtree-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E662DF95BAB00858968 /* Figtree-Medium.otf */; }; + CF605E6D2DF95BAB00858968 /* Figtree-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E602DF95BAB00858968 /* Figtree-BoldItalic.otf */; }; + CF605E6E2DF95BAB00858968 /* Figtree-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E632DF95BAB00858968 /* Figtree-Italic.otf */; }; + CF605E6F2DF95BAB00858968 /* Figtree-ExtraBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E622DF95BAB00858968 /* Figtree-ExtraBoldItalic.otf */; }; + CF605E702DF95BAB00858968 /* Figtree-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E5D2DF95BAB00858968 /* Figtree-Black.otf */; }; + CF605E712DF95BAB00858968 /* Figtree-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E5F2DF95BAB00858968 /* Figtree-Bold.otf */; }; + CF605E722DF95BAB00858968 /* Figtree-BlackItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E5E2DF95BAB00858968 /* Figtree-BlackItalic.otf */; }; + CF605E732DF95BAB00858968 /* Figtree-ExtraBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E612DF95BAB00858968 /* Figtree-ExtraBold.otf */; }; + CF605E742DF95BAB00858968 /* Figtree-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E642DF95BAB00858968 /* Figtree-Light.otf */; }; + CF605E752DF95BAB00858968 /* Figtree-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E672DF95BAB00858968 /* Figtree-MediumItalic.otf */; }; + CF605E762DF95BAB00858968 /* Figtree-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E692DF95BAB00858968 /* Figtree-SemiBold.otf */; }; + CF605E772DF95BAB00858968 /* Figtree-SemiBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E6A2DF95BAB00858968 /* Figtree-SemiBoldItalic.otf */; }; + CF605E782DF95BAB00858968 /* Figtree-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF605E682DF95BAB00858968 /* Figtree-Regular.otf */; }; CF68914E2D45316A00F1279C /* icon_1024pt_1x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF68914A2D45316A00F1279C /* icon_1024pt_1x.jpg */; }; CF6891542D45316A00F1279C /* icon_20pt_2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF6891422D45316A00F1279C /* icon_20pt_2x.jpg */; }; CF6891562D45316A00F1279C /* icon_29pt_2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF6891442D45316A00F1279C /* icon_29pt_2x.jpg */; }; @@ -59,6 +67,10 @@ CF98CA472D3E99E0003D88B7 /* CarScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF98CA452D3E99DF003D88B7 /* CarScene.swift */; }; CF98CA482D3E99E0003D88B7 /* PhoneScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF98CA462D3E99DF003D88B7 /* PhoneScene.swift */; }; CF98CA492D3E99E0003D88B7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF98CA442D3E99DF003D88B7 /* AppDelegate.swift */; }; + D2520D0645B1455D94F0A309 /* Figtree-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 530483661D3447FBBB171F49 /* Figtree-MediumItalic.otf */; }; + E45C53479EEB45B8A0347240 /* Figtree-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8798FC37A1454014A7B318F9 /* Figtree-SemiBold.otf */; }; + FECF1EA9C0C247E0AC353DAA /* Figtree-LightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8B91428F7F524687A96EE362 /* Figtree-LightItalic.otf */; }; + FFD4130A15D84927BAC3F48B /* Figtree-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = 1B11DD756F3A49939D34FD1B /* Figtree-Black.otf */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -79,43 +91,36 @@ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Jellify/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Jellify/Info.plist; sourceTree = ""; }; 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = Jellify/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 1D5EDD3ECA2154FB05E36C5D /* Pods-Jellify.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jellify.debug.xcconfig"; path = "Target Support Files/Pods-Jellify/Pods-Jellify.debug.xcconfig"; sourceTree = ""; }; + 1B11DD756F3A49939D34FD1B /* Figtree-Black.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-Black.otf"; path = "../assets/fonts/Figtree-Black.otf"; sourceTree = ""; }; + 1EFD74F540EE131CCCC762FE /* Pods-Jellify.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jellify.debug.xcconfig"; path = "Target Support Files/Pods-Jellify/Pods-Jellify.debug.xcconfig"; sourceTree = ""; }; + 2F5D67B394724F1B97DE0CA1 /* Figtree-BlackItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-BlackItalic.otf"; path = "../assets/fonts/Figtree-BlackItalic.otf"; sourceTree = ""; }; + 49B52B8BEDDF4BEDBD4265DD /* Figtree-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-Medium.otf"; path = "../assets/fonts/Figtree-Medium.otf"; sourceTree = ""; }; + 530483661D3447FBBB171F49 /* Figtree-MediumItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-MediumItalic.otf"; path = "../assets/fonts/Figtree-MediumItalic.otf"; sourceTree = ""; }; + 5DE4B5F2208F4966A8FB3045 /* Figtree-BoldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-BoldItalic.otf"; path = "../assets/fonts/Figtree-BoldItalic.otf"; sourceTree = ""; }; + 6D530F1FFB1A4A1AB8DBCBB5 /* Figtree-Light.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-Light.otf"; path = "../assets/fonts/Figtree-Light.otf"; sourceTree = ""; }; + 700121E1AAA5485EA4215C17 /* Figtree-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-Bold.otf"; path = "../assets/fonts/Figtree-Bold.otf"; sourceTree = ""; }; + 73F5649796BB4A29AF608270 /* Figtree-Italic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-Italic.otf"; path = "../assets/fonts/Figtree-Italic.otf"; sourceTree = ""; }; + 7D2BAACBD08E405DA9C124A7 /* Figtree-ExtraBoldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-ExtraBoldItalic.otf"; path = "../assets/fonts/Figtree-ExtraBoldItalic.otf"; sourceTree = ""; }; + 809C125985044862A11BF363 /* Figtree-ExtraBold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-ExtraBold.otf"; path = "../assets/fonts/Figtree-ExtraBold.otf"; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = Jellify/LaunchScreen.storyboard; sourceTree = ""; }; - 95B4030EF5077AD57C505857 /* libPods-Jellify.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Jellify.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - A42F7FBA73F634466F310088 /* Pods-Jellify.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jellify.release.xcconfig"; path = "Target Support Files/Pods-Jellify/Pods-Jellify.release.xcconfig"; sourceTree = ""; }; - CF620CFC2CF2BB1F0045E433 /* Aileron-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-Italic.otf"; path = "../assets/fonts/Aileron-Italic.otf"; sourceTree = ""; }; - CF620CFD2CF2BB1F0045E433 /* Aileron-Thin.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-Thin.otf"; path = "../assets/fonts/Aileron-Thin.otf"; sourceTree = ""; }; - CF620CFE2CF2BB1F0045E433 /* Aileron-HeavyItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-HeavyItalic.otf"; path = "../assets/fonts/Aileron-HeavyItalic.otf"; sourceTree = ""; }; - CF620CFF2CF2BB1F0045E433 /* Aileron-SemiBoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-SemiBoldItalic.otf"; path = "../assets/fonts/Aileron-SemiBoldItalic.otf"; sourceTree = ""; }; - CF620D002CF2BB1F0045E433 /* Aileron-Heavy.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-Heavy.otf"; path = "../assets/fonts/Aileron-Heavy.otf"; sourceTree = ""; }; - CF620D012CF2BB1F0045E433 /* Aileron-BoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-BoldItalic.otf"; path = "../assets/fonts/Aileron-BoldItalic.otf"; sourceTree = ""; }; - CF620D022CF2BB1F0045E433 /* Aileron-UltraLight.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-UltraLight.otf"; path = "../assets/fonts/Aileron-UltraLight.otf"; sourceTree = ""; }; - CF620D032CF2BB200045E433 /* Aileron-UltraLightItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-UltraLightItalic.otf"; path = "../assets/fonts/Aileron-UltraLightItalic.otf"; sourceTree = ""; }; - CF620D042CF2BB200045E433 /* Aileron-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-Regular.otf"; path = "../assets/fonts/Aileron-Regular.otf"; sourceTree = ""; }; - CF620D052CF2BB200045E433 /* Aileron-LightItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-LightItalic.otf"; path = "../assets/fonts/Aileron-LightItalic.otf"; sourceTree = ""; }; - CF620D062CF2BB200045E433 /* Aileron-BlackItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-BlackItalic.otf"; path = "../assets/fonts/Aileron-BlackItalic.otf"; sourceTree = ""; }; - CF620D072CF2BB200045E433 /* Aileron-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-Light.otf"; path = "../assets/fonts/Aileron-Light.otf"; sourceTree = ""; }; - CF620D082CF2BB200045E433 /* Aileron-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-Bold.otf"; path = "../assets/fonts/Aileron-Bold.otf"; sourceTree = ""; }; - CF620D092CF2BB200045E433 /* Aileron-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-Black.otf"; path = "../assets/fonts/Aileron-Black.otf"; sourceTree = ""; }; - CF620D0A2CF2BB200045E433 /* Aileron-ThinItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-ThinItalic.otf"; path = "../assets/fonts/Aileron-ThinItalic.otf"; sourceTree = ""; }; - CF620D0B2CF2BB200045E433 /* Aileron-SemiBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Aileron-SemiBold.otf"; path = "../assets/fonts/Aileron-SemiBold.otf"; sourceTree = ""; }; + 8798FC37A1454014A7B318F9 /* Figtree-SemiBold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-SemiBold.otf"; path = "../assets/fonts/Figtree-SemiBold.otf"; sourceTree = ""; }; + 8B91428F7F524687A96EE362 /* Figtree-LightItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-LightItalic.otf"; path = "../assets/fonts/Figtree-LightItalic.otf"; sourceTree = ""; }; + C5258FBB23272277847FE07E /* libPods-Jellify.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Jellify.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + CF605E5D2DF95BAB00858968 /* Figtree-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-Black.otf"; sourceTree = ""; }; + CF605E5E2DF95BAB00858968 /* Figtree-BlackItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-BlackItalic.otf"; sourceTree = ""; }; + CF605E5F2DF95BAB00858968 /* Figtree-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-Bold.otf"; sourceTree = ""; }; + CF605E602DF95BAB00858968 /* Figtree-BoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-BoldItalic.otf"; sourceTree = ""; }; + CF605E612DF95BAB00858968 /* Figtree-ExtraBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-ExtraBold.otf"; sourceTree = ""; }; + CF605E622DF95BAB00858968 /* Figtree-ExtraBoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-ExtraBoldItalic.otf"; sourceTree = ""; }; + CF605E632DF95BAB00858968 /* Figtree-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-Italic.otf"; sourceTree = ""; }; + CF605E642DF95BAB00858968 /* Figtree-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-Light.otf"; sourceTree = ""; }; + CF605E652DF95BAB00858968 /* Figtree-LightItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-LightItalic.otf"; sourceTree = ""; }; + CF605E662DF95BAB00858968 /* Figtree-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-Medium.otf"; sourceTree = ""; }; + CF605E672DF95BAB00858968 /* Figtree-MediumItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-MediumItalic.otf"; sourceTree = ""; }; + CF605E682DF95BAB00858968 /* Figtree-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-Regular.otf"; sourceTree = ""; }; + CF605E692DF95BAB00858968 /* Figtree-SemiBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-SemiBold.otf"; sourceTree = ""; }; + CF605E6A2DF95BAB00858968 /* Figtree-SemiBoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Figtree-SemiBoldItalic.otf"; sourceTree = ""; }; CF6588752D25C12400AECE18 /* Jellify.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Jellify.entitlements; path = Jellify/Jellify.entitlements; sourceTree = ""; }; - CF6891312D45316A00F1279C /* Aileron-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-Black.otf"; sourceTree = ""; }; - CF6891322D45316A00F1279C /* Aileron-BlackItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-BlackItalic.otf"; sourceTree = ""; }; - CF6891332D45316A00F1279C /* Aileron-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-Bold.otf"; sourceTree = ""; }; - CF6891342D45316A00F1279C /* Aileron-BoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-BoldItalic.otf"; sourceTree = ""; }; - CF6891352D45316A00F1279C /* Aileron-Heavy.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-Heavy.otf"; sourceTree = ""; }; - CF6891362D45316A00F1279C /* Aileron-HeavyItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-HeavyItalic.otf"; sourceTree = ""; }; - CF6891372D45316A00F1279C /* Aileron-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-Italic.otf"; sourceTree = ""; }; - CF6891382D45316A00F1279C /* Aileron-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-Light.otf"; sourceTree = ""; }; - CF6891392D45316A00F1279C /* Aileron-LightItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-LightItalic.otf"; sourceTree = ""; }; - CF68913A2D45316A00F1279C /* Aileron-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-Regular.otf"; sourceTree = ""; }; - CF68913B2D45316A00F1279C /* Aileron-SemiBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-SemiBold.otf"; sourceTree = ""; }; - CF68913C2D45316A00F1279C /* Aileron-SemiBoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-SemiBoldItalic.otf"; sourceTree = ""; }; - CF68913D2D45316A00F1279C /* Aileron-Thin.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-Thin.otf"; sourceTree = ""; }; - CF68913E2D45316A00F1279C /* Aileron-ThinItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-ThinItalic.otf"; sourceTree = ""; }; - CF68913F2D45316A00F1279C /* Aileron-UltraLight.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-UltraLight.otf"; sourceTree = ""; }; - CF6891402D45316A00F1279C /* Aileron-UltraLightItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Aileron-UltraLightItalic.otf"; sourceTree = ""; }; CF6891422D45316A00F1279C /* icon_20pt_2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = icon_20pt_2x.jpg; sourceTree = ""; }; CF6891432D45316A00F1279C /* icon_20pt_3x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = icon_20pt_3x.jpg; sourceTree = ""; }; CF6891442D45316A00F1279C /* icon_29pt_2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = icon_29pt_2x.jpg; sourceTree = ""; }; @@ -148,8 +153,11 @@ CF98CA442D3E99DF003D88B7 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; CF98CA452D3E99DF003D88B7 /* CarScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarScene.swift; sourceTree = ""; }; CF98CA462D3E99DF003D88B7 /* PhoneScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneScene.swift; sourceTree = ""; }; + DEF20584B68B4278A94DE482 /* Figtree-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-Regular.otf"; path = "../assets/fonts/Figtree-Regular.otf"; sourceTree = ""; }; + E53A46F6214019C12F016ACB /* Pods-Jellify.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Jellify.release.xcconfig"; path = "Target Support Files/Pods-Jellify/Pods-Jellify.release.xcconfig"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; F757EB73303E0AC21EF34F64 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Jellify/PrivacyInfo.xcprivacy; sourceTree = ""; }; + FEB4464569A04518A333830C /* Figtree-SemiBoldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Figtree-SemiBoldItalic.otf"; path = "../assets/fonts/Figtree-SemiBoldItalic.otf"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -164,7 +172,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9D70AF74B3F54D679E527364 /* libPods-Jellify.a in Frameworks */, + 56FB5F5E49FEE21FAAA689D9 /* libPods-Jellify.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -205,11 +213,33 @@ name = Jellify; sourceTree = ""; }; + 2A501C162584451593F3C639 /* Resources */ = { + isa = PBXGroup; + children = ( + 1B11DD756F3A49939D34FD1B /* Figtree-Black.otf */, + 2F5D67B394724F1B97DE0CA1 /* Figtree-BlackItalic.otf */, + 700121E1AAA5485EA4215C17 /* Figtree-Bold.otf */, + 5DE4B5F2208F4966A8FB3045 /* Figtree-BoldItalic.otf */, + 809C125985044862A11BF363 /* Figtree-ExtraBold.otf */, + 7D2BAACBD08E405DA9C124A7 /* Figtree-ExtraBoldItalic.otf */, + 73F5649796BB4A29AF608270 /* Figtree-Italic.otf */, + 6D530F1FFB1A4A1AB8DBCBB5 /* Figtree-Light.otf */, + 8B91428F7F524687A96EE362 /* Figtree-LightItalic.otf */, + 49B52B8BEDDF4BEDBD4265DD /* Figtree-Medium.otf */, + 530483661D3447FBBB171F49 /* Figtree-MediumItalic.otf */, + DEF20584B68B4278A94DE482 /* Figtree-Regular.otf */, + 8798FC37A1454014A7B318F9 /* Figtree-SemiBold.otf */, + FEB4464569A04518A333830C /* Figtree-SemiBoldItalic.otf */, + ); + name = Resources; + path = ""; + sourceTree = ""; + }; 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 95B4030EF5077AD57C505857 /* libPods-Jellify.a */, + C5258FBB23272277847FE07E /* libPods-Jellify.a */, ); name = Frameworks; sourceTree = ""; @@ -225,28 +255,13 @@ isa = PBXGroup; children = ( CF68914C2D45316A00F1279C /* assets */, - CF620D092CF2BB200045E433 /* Aileron-Black.otf */, - CF620D062CF2BB200045E433 /* Aileron-BlackItalic.otf */, - CF620D082CF2BB200045E433 /* Aileron-Bold.otf */, - CF620D012CF2BB1F0045E433 /* Aileron-BoldItalic.otf */, - CF620D002CF2BB1F0045E433 /* Aileron-Heavy.otf */, - CF620CFE2CF2BB1F0045E433 /* Aileron-HeavyItalic.otf */, - CF620CFC2CF2BB1F0045E433 /* Aileron-Italic.otf */, - CF620D072CF2BB200045E433 /* Aileron-Light.otf */, - CF620D052CF2BB200045E433 /* Aileron-LightItalic.otf */, - CF620D042CF2BB200045E433 /* Aileron-Regular.otf */, - CF620D0B2CF2BB200045E433 /* Aileron-SemiBold.otf */, - CF620CFF2CF2BB1F0045E433 /* Aileron-SemiBoldItalic.otf */, - CF620CFD2CF2BB1F0045E433 /* Aileron-Thin.otf */, - CF620D0A2CF2BB200045E433 /* Aileron-ThinItalic.otf */, - CF620D022CF2BB1F0045E433 /* Aileron-UltraLight.otf */, - CF620D032CF2BB200045E433 /* Aileron-UltraLightItalic.otf */, 13B07FAE1A68108700A75B9A /* Jellify */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* JellifyTests */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, BBD78D7AC51CEA395F1C20DB /* Pods */, + 2A501C162584451593F3C639 /* Resources */, ); indentWidth = 2; sourceTree = ""; @@ -265,8 +280,8 @@ BBD78D7AC51CEA395F1C20DB /* Pods */ = { isa = PBXGroup; children = ( - 1D5EDD3ECA2154FB05E36C5D /* Pods-Jellify.debug.xcconfig */, - A42F7FBA73F634466F310088 /* Pods-Jellify.release.xcconfig */, + 1EFD74F540EE131CCCC762FE /* Pods-Jellify.debug.xcconfig */, + E53A46F6214019C12F016ACB /* Pods-Jellify.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -274,22 +289,20 @@ CF6891412D45316A00F1279C /* fonts */ = { isa = PBXGroup; children = ( - CF6891312D45316A00F1279C /* Aileron-Black.otf */, - CF6891322D45316A00F1279C /* Aileron-BlackItalic.otf */, - CF6891332D45316A00F1279C /* Aileron-Bold.otf */, - CF6891342D45316A00F1279C /* Aileron-BoldItalic.otf */, - CF6891352D45316A00F1279C /* Aileron-Heavy.otf */, - CF6891362D45316A00F1279C /* Aileron-HeavyItalic.otf */, - CF6891372D45316A00F1279C /* Aileron-Italic.otf */, - CF6891382D45316A00F1279C /* Aileron-Light.otf */, - CF6891392D45316A00F1279C /* Aileron-LightItalic.otf */, - CF68913A2D45316A00F1279C /* Aileron-Regular.otf */, - CF68913B2D45316A00F1279C /* Aileron-SemiBold.otf */, - CF68913C2D45316A00F1279C /* Aileron-SemiBoldItalic.otf */, - CF68913D2D45316A00F1279C /* Aileron-Thin.otf */, - CF68913E2D45316A00F1279C /* Aileron-ThinItalic.otf */, - CF68913F2D45316A00F1279C /* Aileron-UltraLight.otf */, - CF6891402D45316A00F1279C /* Aileron-UltraLightItalic.otf */, + CF605E5D2DF95BAB00858968 /* Figtree-Black.otf */, + CF605E5E2DF95BAB00858968 /* Figtree-BlackItalic.otf */, + CF605E5F2DF95BAB00858968 /* Figtree-Bold.otf */, + CF605E602DF95BAB00858968 /* Figtree-BoldItalic.otf */, + CF605E612DF95BAB00858968 /* Figtree-ExtraBold.otf */, + CF605E622DF95BAB00858968 /* Figtree-ExtraBoldItalic.otf */, + CF605E632DF95BAB00858968 /* Figtree-Italic.otf */, + CF605E642DF95BAB00858968 /* Figtree-Light.otf */, + CF605E652DF95BAB00858968 /* Figtree-LightItalic.otf */, + CF605E662DF95BAB00858968 /* Figtree-Medium.otf */, + CF605E672DF95BAB00858968 /* Figtree-MediumItalic.otf */, + CF605E682DF95BAB00858968 /* Figtree-Regular.otf */, + CF605E692DF95BAB00858968 /* Figtree-SemiBold.otf */, + CF605E6A2DF95BAB00858968 /* Figtree-SemiBoldItalic.otf */, ); path = fonts; sourceTree = ""; @@ -356,13 +369,13 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Jellify" */; buildPhases = ( - F74F914889A8D884A0B6CADF /* [CP] Check Pods Manifest.lock */, + F2941A9DFD6110FBBD27A857 /* [CP] Check Pods Manifest.lock */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 1E8DEA05AEB2DD976158686F /* [CP] Embed Pods Frameworks */, - 20B672AD2C4E05F9590DDE44 /* [CP] Copy Pods Resources */, + 685DDF3EA1C2C37AC564BF48 /* [CP] Embed Pods Frameworks */, + CBD74D2CBEABF41A945B5E58 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -422,21 +435,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - CF620D0C2CF2BB210045E433 /* Aileron-Italic.otf in Resources */, - CF620D0D2CF2BB210045E433 /* Aileron-Thin.otf in Resources */, - CF620D0E2CF2BB210045E433 /* Aileron-HeavyItalic.otf in Resources */, - CF620D0F2CF2BB210045E433 /* Aileron-SemiBoldItalic.otf in Resources */, - CF620D102CF2BB210045E433 /* Aileron-Heavy.otf in Resources */, - CF620D112CF2BB210045E433 /* Aileron-BoldItalic.otf in Resources */, - CF620D122CF2BB210045E433 /* Aileron-UltraLight.otf in Resources */, - CF620D132CF2BB210045E433 /* Aileron-UltraLightItalic.otf in Resources */, - CF620D142CF2BB210045E433 /* Aileron-Regular.otf in Resources */, - CF620D152CF2BB210045E433 /* Aileron-LightItalic.otf in Resources */, - CF620D162CF2BB210045E433 /* Aileron-BlackItalic.otf in Resources */, - CF620D172CF2BB210045E433 /* Aileron-Light.otf in Resources */, - CF620D182CF2BB210045E433 /* Aileron-Bold.otf in Resources */, - CF620D192CF2BB210045E433 /* Aileron-Black.otf in Resources */, - CF620D1A2CF2BB210045E433 /* Aileron-ThinItalic.otf in Resources */, CF6B19F32D55121E002464CB /* icon_tinted_original.png in Resources */, CF6B19F42D55121E002464CB /* icon_tinted_29pt_3x.png in Resources */, CF6B19F52D55121E002464CB /* icon_tinted_20pt_2x.png in Resources */, @@ -446,7 +444,6 @@ CF6B19F92D55121E002464CB /* icon_tinted_20pt_3x.png in Resources */, CF6B19FA2D55121E002464CB /* icon_tinted_60pt_3x.png in Resources */, CF6B19FB2D55121E002464CB /* icon_tinted_40pt_2x.png in Resources */, - CF620D1B2CF2BB210045E433 /* Aileron-SemiBold.otf in Resources */, 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, CF6B19E92D5510E0002464CB /* icon_dark_original.png in Resources */, @@ -455,6 +452,20 @@ CF6B19DE2D550FA7002464CB /* icon_dark_29pt_3x.png in Resources */, CF6B19DF2D550FA7002464CB /* icon_dark_60pt_2x.png in Resources */, CF6B19E02D550FA7002464CB /* icon_dark_29pt_2x.png in Resources */, + CF605E6B2DF95BAB00858968 /* Figtree-LightItalic.otf in Resources */, + CF605E6C2DF95BAB00858968 /* Figtree-Medium.otf in Resources */, + CF605E6D2DF95BAB00858968 /* Figtree-BoldItalic.otf in Resources */, + CF605E6E2DF95BAB00858968 /* Figtree-Italic.otf in Resources */, + CF605E6F2DF95BAB00858968 /* Figtree-ExtraBoldItalic.otf in Resources */, + CF605E702DF95BAB00858968 /* Figtree-Black.otf in Resources */, + CF605E712DF95BAB00858968 /* Figtree-Bold.otf in Resources */, + CF605E722DF95BAB00858968 /* Figtree-BlackItalic.otf in Resources */, + CF605E732DF95BAB00858968 /* Figtree-ExtraBold.otf in Resources */, + CF605E742DF95BAB00858968 /* Figtree-Light.otf in Resources */, + CF605E752DF95BAB00858968 /* Figtree-MediumItalic.otf in Resources */, + CF605E762DF95BAB00858968 /* Figtree-SemiBold.otf in Resources */, + CF605E772DF95BAB00858968 /* Figtree-SemiBoldItalic.otf in Resources */, + CF605E782DF95BAB00858968 /* Figtree-Regular.otf in Resources */, CF6B19E22D550FA7002464CB /* icon_dark_20pt_3x.png in Resources */, CF6B19E32D550FA7002464CB /* icon_dark_40pt_2x.png in Resources */, CF6B19E42D550FA7002464CB /* icon_dark_40pt_3x.png in Resources */, @@ -469,6 +480,20 @@ CF6891602D45316A00F1279C /* icon_20pt_3x.jpg in Resources */, CF6891622D45316A00F1279C /* icon_29pt_3x.jpg in Resources */, 217EBE16A3E8C5FBF476C905 /* PrivacyInfo.xcprivacy in Resources */, + FFD4130A15D84927BAC3F48B /* Figtree-Black.otf in Resources */, + 8D4E743194A841CD99D2E848 /* Figtree-BlackItalic.otf in Resources */, + B3A23A2BDB99428997FAFAFD /* Figtree-Bold.otf in Resources */, + 6D01DB978D2E4372B7DBB1DE /* Figtree-BoldItalic.otf in Resources */, + 349489BE63034B8488AEB348 /* Figtree-ExtraBold.otf in Resources */, + C49BE00A96F041E78E89EE45 /* Figtree-ExtraBoldItalic.otf in Resources */, + 371541D24E8B4ED09F3E0232 /* Figtree-Italic.otf in Resources */, + 1265343243674813A09FABA1 /* Figtree-Light.otf in Resources */, + FECF1EA9C0C247E0AC353DAA /* Figtree-LightItalic.otf in Resources */, + C0208644013D4FEFA246A0E3 /* Figtree-Medium.otf in Resources */, + D2520D0645B1455D94F0A309 /* Figtree-MediumItalic.otf in Resources */, + 12D872C7A4EB46098395E0E6 /* Figtree-Regular.otf in Resources */, + E45C53479EEB45B8A0347240 /* Figtree-SemiBold.otf in Resources */, + 7C76A304B85A470899DC1104 /* Figtree-SemiBoldItalic.otf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -491,7 +516,7 @@ shellPath = /bin/sh; shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; - 1E8DEA05AEB2DD976158686F /* [CP] Embed Pods Frameworks */ = { + 685DDF3EA1C2C37AC564BF48 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -499,20 +524,16 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 20B672AD2C4E05F9590DDE44 /* [CP] Copy Pods Resources */ = { + CBD74D2CBEABF41A945B5E58 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -520,20 +541,16 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-resources.sh\"\n"; showEnvVarsInLog = 0; }; - F74F914889A8D884A0B6CADF /* [CP] Check Pods Manifest.lock */ = { + F2941A9DFD6110FBBD27A857 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -642,7 +659,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1D5EDD3ECA2154FB05E36C5D /* Pods-Jellify.debug.xcconfig */; + baseConfigurationReference = 1EFD74F540EE131CCCC762FE /* Pods-Jellify.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; @@ -684,14 +701,14 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A42F7FBA73F634466F310088 /* Pods-Jellify.release.xcconfig */; + baseConfigurationReference = E53A46F6214019C12F016ACB /* Pods-Jellify.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Jellify/Jellify.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 192; DEVELOPMENT_TEAM = WAH9CZ8BPG; @@ -713,8 +730,8 @@ OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.cosmonautical.jellify; PRODUCT_NAME = Jellify; - PROVISIONING_PROFILE_SPECIFIER = "match Development com.cosmonautical.jellify"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.cosmonautical.jellify"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development com.cosmonautical.jellify"; SWIFT_OBJC_BRIDGING_HEADER = "Jellify-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -807,7 +824,10 @@ "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); - OTHER_LDFLAGS = "$(inherited) "; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; @@ -893,7 +913,10 @@ "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); - OTHER_LDFLAGS = "$(inherited) "; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/ios/Jellify/Info.plist b/ios/Jellify/Info.plist index 82535ea0..2f38ccf6 100644 --- a/ios/Jellify/Info.plist +++ b/ios/Jellify/Info.plist @@ -61,7 +61,7 @@ NSLocalNetworkUsageDescription ${PRODUCT_NAME} uses the local network to connect to one's Jellyfin server for streaming music NSLocationWhenInUseUsageDescription - + RCTNewArchEnabled UIAppFonts @@ -85,17 +85,20 @@ Octicons.ttf Zocial.ttf Fontisto.ttf - Aileron-Black.otf - Aileron-BlackItalic.otf - Aileron-Bold.otf - Aileron-BoldItalic.otf - Aileron-Heavy.otf - Aileron-HeavyItalic.otf - Aileron-Italic.otf - Aileron-Light.otf - Aileron-Thin.otf - Aileron-UltraLight.otf - Aileron-Regular.otf + Figtree-Black.otf + Figtree-BlackItalic.otf + Figtree-Bold.otf + Figtree-BoldItalic.otf + Figtree-ExtraBold.otf + Figtree-ExtraBoldItalic.otf + Figtree-Italic.otf + Figtree-Light.otf + Figtree-LightItalic.otf + Figtree-Medium.otf + Figtree-MediumItalic.otf + Figtree-Regular.otf + Figtree-SemiBold.otf + Figtree-SemiBoldItalic.otf UIApplicationSceneManifest diff --git a/ios/PhoneScene.swift b/ios/PhoneScene.swift index fe92fcc3..59a5b67a 100644 --- a/ios/PhoneScene.swift +++ b/ios/PhoneScene.swift @@ -32,68 +32,10 @@ class PhoneSceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } guard let windowScene = scene as? UIWindowScene else { return } - guard let appRootView = appDelegate.window?.rootViewController?.view else { return } - - let containerViewController = UIViewController() - containerViewController.view.backgroundColor = .systemBackground // dynamic light/dark - - // Create safe area container - let safeAreaContainer = UIView() - safeAreaContainer.translatesAutoresizingMaskIntoConstraints = false - containerViewController.view.addSubview(safeAreaContainer) - - NSLayoutConstraint.activate([ - safeAreaContainer.topAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.topAnchor), - safeAreaContainer.bottomAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.bottomAnchor), - safeAreaContainer.leadingAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.leadingAnchor), - safeAreaContainer.trailingAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.trailingAnchor), - ]) - - // Create colored views for top and bottom safe area - let topBar = UIView() - let bottomBar = UIView() - topBar.translatesAutoresizingMaskIntoConstraints = false - bottomBar.translatesAutoresizingMaskIntoConstraints = false - - // Color that automatically adapts to dark/light mode - topBar.backgroundColor = UIColor { trait in - return trait.userInterfaceStyle == .dark ? UIColor(hex: "#0C0622") : UIColor(hex:"#FFFFFF") - } - bottomBar.backgroundColor = UIColor { trait in - return trait.userInterfaceStyle == .dark ? UIColor(hex:"#0C0622") : UIColor(hex:"#FFFFFF") - } - - containerViewController.view.addSubview(topBar) - containerViewController.view.addSubview(bottomBar) - - NSLayoutConstraint.activate([ - // Top bar - topBar.topAnchor.constraint(equalTo: containerViewController.view.topAnchor), - topBar.leadingAnchor.constraint(equalTo: containerViewController.view.leadingAnchor), - topBar.trailingAnchor.constraint(equalTo: containerViewController.view.trailingAnchor), - topBar.bottomAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.topAnchor), - - // Bottom bar - bottomBar.topAnchor.constraint(equalTo: containerViewController.view.safeAreaLayoutGuide.bottomAnchor), - bottomBar.leadingAnchor.constraint(equalTo: containerViewController.view.leadingAnchor), - bottomBar.trailingAnchor.constraint(equalTo: containerViewController.view.trailingAnchor), - bottomBar.bottomAnchor.constraint(equalTo: containerViewController.view.bottomAnchor), - ]) - - // Add appRootView inside safeAreaContainer - appRootView.translatesAutoresizingMaskIntoConstraints = false - safeAreaContainer.addSubview(appRootView) - - NSLayoutConstraint.activate([ - appRootView.topAnchor.constraint(equalTo: safeAreaContainer.topAnchor), - appRootView.bottomAnchor.constraint(equalTo: safeAreaContainer.bottomAnchor), - appRootView.leadingAnchor.constraint(equalTo: safeAreaContainer.leadingAnchor), - appRootView.trailingAnchor.constraint(equalTo: safeAreaContainer.trailingAnchor), - ]) // Set up the window let window = UIWindow(windowScene: windowScene) - window.rootViewController = containerViewController + window.rootViewController = appDelegate.window?.rootViewController self.window = window window.makeKeyAndVisible() } diff --git a/ios/Podfile b/ios/Podfile index 0bb24c24..92379a17 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -15,6 +15,8 @@ if linkage != nil use_frameworks! :linkage => linkage.to_sym end + + target 'Jellify' do config = use_native_modules! @@ -24,6 +26,9 @@ target 'Jellify' do :app_path => "#{Pod::Config.instance.installation_root}/.." ) + + pod 'SDWebImage', :modular_headers => true + post_install do |installer| # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 react_native_post_install( diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8dfb9ac5..691c018f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,13 +1,44 @@ PODS: - boost (1.84.0) + - BVLinearGradient (2.8.3): + - React-Core - DoubleConversion (1.1.6) - fast_float (8.0.0) - - FBLazyVector (0.80.0) + - FBLazyVector (0.80.1) - fmt (11.0.2) - glog (0.3.5) - hermes-engine (0.80.0): - hermes-engine/Pre-built (= 0.80.0) - hermes-engine/Pre-built (0.80.0) + - JellifyBlur (0.1.3): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga - libwebp (1.5.0): - libwebp/demux (= 1.5.0) - libwebp/mux (= 1.5.0) @@ -39,27 +70,27 @@ PODS: - fast_float (= 8.0.0) - fmt (= 11.0.2) - glog - - RCTDeprecation (0.80.0) - - RCTRequired (0.80.0) - - RCTTypeSafety (0.80.0): - - FBLazyVector (= 0.80.0) - - RCTRequired (= 0.80.0) - - React-Core (= 0.80.0) - - React (0.80.0): - - React-Core (= 0.80.0) - - React-Core/DevSupport (= 0.80.0) - - React-Core/RCTWebSocket (= 0.80.0) - - React-RCTActionSheet (= 0.80.0) - - React-RCTAnimation (= 0.80.0) - - React-RCTBlob (= 0.80.0) - - React-RCTImage (= 0.80.0) - - React-RCTLinking (= 0.80.0) - - React-RCTNetwork (= 0.80.0) - - React-RCTSettings (= 0.80.0) - - React-RCTText (= 0.80.0) - - React-RCTVibration (= 0.80.0) - - React-callinvoker (0.80.0) - - React-Core (0.80.0): + - RCTDeprecation (0.80.1) + - RCTRequired (0.80.1) + - RCTTypeSafety (0.80.1): + - FBLazyVector (= 0.80.1) + - RCTRequired (= 0.80.1) + - React-Core (= 0.80.1) + - React (0.80.1): + - React-Core (= 0.80.1) + - React-Core/DevSupport (= 0.80.1) + - React-Core/RCTWebSocket (= 0.80.1) + - React-RCTActionSheet (= 0.80.1) + - React-RCTAnimation (= 0.80.1) + - React-RCTBlob (= 0.80.1) + - React-RCTImage (= 0.80.1) + - React-RCTLinking (= 0.80.1) + - React-RCTNetwork (= 0.80.1) + - React-RCTSettings (= 0.80.1) + - React-RCTText (= 0.80.1) + - React-RCTVibration (= 0.80.1) + - React-callinvoker (0.80.1) + - React-Core (0.80.1): - boost - DoubleConversion - fast_float @@ -69,7 +100,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.80.0) + - React-Core/Default (= 0.80.1) - React-cxxreact - React-featureflags - React-hermes @@ -83,7 +114,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/CoreModulesHeaders (0.80.0): + - React-Core/CoreModulesHeaders (0.80.1): - boost - DoubleConversion - fast_float @@ -107,7 +138,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/Default (0.80.0): + - React-Core/Default (0.80.1): - boost - DoubleConversion - fast_float @@ -130,7 +161,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/DevSupport (0.80.0): + - React-Core/DevSupport (0.80.1): - boost - DoubleConversion - fast_float @@ -140,8 +171,8 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.80.0) - - React-Core/RCTWebSocket (= 0.80.0) + - React-Core/Default (= 0.80.1) + - React-Core/RCTWebSocket (= 0.80.1) - React-cxxreact - React-featureflags - React-hermes @@ -155,7 +186,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTActionSheetHeaders (0.80.0): + - React-Core/RCTActionSheetHeaders (0.80.1): - boost - DoubleConversion - fast_float @@ -179,7 +210,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTAnimationHeaders (0.80.0): + - React-Core/RCTAnimationHeaders (0.80.1): - boost - DoubleConversion - fast_float @@ -203,7 +234,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTBlobHeaders (0.80.0): + - React-Core/RCTBlobHeaders (0.80.1): - boost - DoubleConversion - fast_float @@ -227,7 +258,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTImageHeaders (0.80.0): + - React-Core/RCTImageHeaders (0.80.1): - boost - DoubleConversion - fast_float @@ -251,7 +282,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTLinkingHeaders (0.80.0): + - React-Core/RCTLinkingHeaders (0.80.1): - boost - DoubleConversion - fast_float @@ -275,7 +306,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTNetworkHeaders (0.80.0): + - React-Core/RCTNetworkHeaders (0.80.1): - boost - DoubleConversion - fast_float @@ -299,7 +330,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTSettingsHeaders (0.80.0): + - React-Core/RCTSettingsHeaders (0.80.1): - boost - DoubleConversion - fast_float @@ -323,7 +354,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTTextHeaders (0.80.0): + - React-Core/RCTTextHeaders (0.80.1): - boost - DoubleConversion - fast_float @@ -347,7 +378,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTVibrationHeaders (0.80.0): + - React-Core/RCTVibrationHeaders (0.80.1): - boost - DoubleConversion - fast_float @@ -371,7 +402,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTWebSocket (0.80.0): + - React-Core/RCTWebSocket (0.80.1): - boost - DoubleConversion - fast_float @@ -381,7 +412,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.80.0) + - React-Core/Default (= 0.80.1) - React-cxxreact - React-featureflags - React-hermes @@ -395,7 +426,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-CoreModules (0.80.0): + - React-CoreModules (0.80.1): - boost - DoubleConversion - fast_float @@ -403,19 +434,19 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - RCTTypeSafety (= 0.80.0) - - React-Core/CoreModulesHeaders (= 0.80.0) - - React-jsi (= 0.80.0) + - RCTTypeSafety (= 0.80.1) + - React-Core/CoreModulesHeaders (= 0.80.1) + - React-jsi (= 0.80.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-NativeModulesApple - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.80.0) + - React-RCTImage (= 0.80.1) - ReactCommon - SocketRocket - - React-cxxreact (0.80.0): + - React-cxxreact (0.80.1): - boost - DoubleConversion - fast_float @@ -424,19 +455,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.80.0) - - React-debug (= 0.80.0) - - React-jsi (= 0.80.0) + - React-callinvoker (= 0.80.1) + - React-debug (= 0.80.1) + - React-jsi (= 0.80.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.80.0) - - React-perflogger (= 0.80.0) - - React-runtimeexecutor (= 0.80.0) - - React-timing (= 0.80.0) + - React-logger (= 0.80.1) + - React-perflogger (= 0.80.1) + - React-runtimeexecutor (= 0.80.1) + - React-timing (= 0.80.1) - SocketRocket - - React-debug (0.80.0) - - React-defaultsnativemodule (0.80.0): + - React-debug (0.80.1) + - React-defaultsnativemodule (0.80.1): - boost - DoubleConversion - fast_float @@ -454,7 +485,7 @@ PODS: - React-microtasksnativemodule - React-RCTFBReactNativeSpec - SocketRocket - - React-domnativemodule (0.80.0): + - React-domnativemodule (0.80.1): - boost - DoubleConversion - fast_float @@ -473,7 +504,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric (0.80.0): + - React-Fabric (0.80.1): - boost - DoubleConversion - fast_float @@ -487,22 +518,22 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/animations (= 0.80.0) - - React-Fabric/attributedstring (= 0.80.0) - - React-Fabric/componentregistry (= 0.80.0) - - React-Fabric/componentregistrynative (= 0.80.0) - - React-Fabric/components (= 0.80.0) - - React-Fabric/consistency (= 0.80.0) - - React-Fabric/core (= 0.80.0) - - React-Fabric/dom (= 0.80.0) - - React-Fabric/imagemanager (= 0.80.0) - - React-Fabric/leakchecker (= 0.80.0) - - React-Fabric/mounting (= 0.80.0) - - React-Fabric/observers (= 0.80.0) - - React-Fabric/scheduler (= 0.80.0) - - React-Fabric/telemetry (= 0.80.0) - - React-Fabric/templateprocessor (= 0.80.0) - - React-Fabric/uimanager (= 0.80.0) + - React-Fabric/animations (= 0.80.1) + - React-Fabric/attributedstring (= 0.80.1) + - React-Fabric/componentregistry (= 0.80.1) + - React-Fabric/componentregistrynative (= 0.80.1) + - React-Fabric/components (= 0.80.1) + - React-Fabric/consistency (= 0.80.1) + - React-Fabric/core (= 0.80.1) + - React-Fabric/dom (= 0.80.1) + - React-Fabric/imagemanager (= 0.80.1) + - React-Fabric/leakchecker (= 0.80.1) + - React-Fabric/mounting (= 0.80.1) + - React-Fabric/observers (= 0.80.1) + - React-Fabric/scheduler (= 0.80.1) + - React-Fabric/telemetry (= 0.80.1) + - React-Fabric/templateprocessor (= 0.80.1) + - React-Fabric/uimanager (= 0.80.1) - React-featureflags - React-graphics - React-hermes @@ -514,7 +545,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animations (0.80.0): + - React-Fabric/animations (0.80.1): - boost - DoubleConversion - fast_float @@ -539,7 +570,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/attributedstring (0.80.0): + - React-Fabric/attributedstring (0.80.1): - boost - DoubleConversion - fast_float @@ -564,7 +595,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistry (0.80.0): + - React-Fabric/componentregistry (0.80.1): - boost - DoubleConversion - fast_float @@ -589,7 +620,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistrynative (0.80.0): + - React-Fabric/componentregistrynative (0.80.1): - boost - DoubleConversion - fast_float @@ -614,7 +645,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components (0.80.0): + - React-Fabric/components (0.80.1): - boost - DoubleConversion - fast_float @@ -628,10 +659,10 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.80.0) - - React-Fabric/components/root (= 0.80.0) - - React-Fabric/components/scrollview (= 0.80.0) - - React-Fabric/components/view (= 0.80.0) + - React-Fabric/components/legacyviewmanagerinterop (= 0.80.1) + - React-Fabric/components/root (= 0.80.1) + - React-Fabric/components/scrollview (= 0.80.1) + - React-Fabric/components/view (= 0.80.1) - React-featureflags - React-graphics - React-hermes @@ -643,7 +674,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/legacyviewmanagerinterop (0.80.0): + - React-Fabric/components/legacyviewmanagerinterop (0.80.1): - boost - DoubleConversion - fast_float @@ -668,7 +699,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/root (0.80.0): + - React-Fabric/components/root (0.80.1): - boost - DoubleConversion - fast_float @@ -693,7 +724,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/scrollview (0.80.0): + - React-Fabric/components/scrollview (0.80.1): - boost - DoubleConversion - fast_float @@ -718,7 +749,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/view (0.80.0): + - React-Fabric/components/view (0.80.1): - boost - DoubleConversion - fast_float @@ -745,7 +776,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric/consistency (0.80.0): + - React-Fabric/consistency (0.80.1): - boost - DoubleConversion - fast_float @@ -770,7 +801,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/core (0.80.0): + - React-Fabric/core (0.80.1): - boost - DoubleConversion - fast_float @@ -795,7 +826,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/dom (0.80.0): + - React-Fabric/dom (0.80.1): - boost - DoubleConversion - fast_float @@ -820,7 +851,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/imagemanager (0.80.0): + - React-Fabric/imagemanager (0.80.1): - boost - DoubleConversion - fast_float @@ -845,7 +876,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/leakchecker (0.80.0): + - React-Fabric/leakchecker (0.80.1): - boost - DoubleConversion - fast_float @@ -870,7 +901,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/mounting (0.80.0): + - React-Fabric/mounting (0.80.1): - boost - DoubleConversion - fast_float @@ -895,7 +926,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers (0.80.0): + - React-Fabric/observers (0.80.1): - boost - DoubleConversion - fast_float @@ -909,7 +940,7 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/observers/events (= 0.80.0) + - React-Fabric/observers/events (= 0.80.1) - React-featureflags - React-graphics - React-hermes @@ -921,7 +952,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/events (0.80.0): + - React-Fabric/observers/events (0.80.1): - boost - DoubleConversion - fast_float @@ -946,7 +977,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/scheduler (0.80.0): + - React-Fabric/scheduler (0.80.1): - boost - DoubleConversion - fast_float @@ -973,7 +1004,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/telemetry (0.80.0): + - React-Fabric/telemetry (0.80.1): - boost - DoubleConversion - fast_float @@ -998,7 +1029,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/templateprocessor (0.80.0): + - React-Fabric/templateprocessor (0.80.1): - boost - DoubleConversion - fast_float @@ -1023,7 +1054,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager (0.80.0): + - React-Fabric/uimanager (0.80.1): - boost - DoubleConversion - fast_float @@ -1037,7 +1068,7 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/uimanager/consistency (= 0.80.0) + - React-Fabric/uimanager/consistency (= 0.80.1) - React-featureflags - React-graphics - React-hermes @@ -1050,7 +1081,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager/consistency (0.80.0): + - React-Fabric/uimanager/consistency (0.80.1): - boost - DoubleConversion - fast_float @@ -1076,7 +1107,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-FabricComponents (0.80.0): + - React-FabricComponents (0.80.1): - boost - DoubleConversion - fast_float @@ -1091,8 +1122,8 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components (= 0.80.0) - - React-FabricComponents/textlayoutmanager (= 0.80.0) + - React-FabricComponents/components (= 0.80.1) + - React-FabricComponents/textlayoutmanager (= 0.80.1) - React-featureflags - React-graphics - React-hermes @@ -1105,7 +1136,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components (0.80.0): + - React-FabricComponents/components (0.80.1): - boost - DoubleConversion - fast_float @@ -1120,15 +1151,15 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.80.0) - - React-FabricComponents/components/iostextinput (= 0.80.0) - - React-FabricComponents/components/modal (= 0.80.0) - - React-FabricComponents/components/rncore (= 0.80.0) - - React-FabricComponents/components/safeareaview (= 0.80.0) - - React-FabricComponents/components/scrollview (= 0.80.0) - - React-FabricComponents/components/text (= 0.80.0) - - React-FabricComponents/components/textinput (= 0.80.0) - - React-FabricComponents/components/unimplementedview (= 0.80.0) + - React-FabricComponents/components/inputaccessory (= 0.80.1) + - React-FabricComponents/components/iostextinput (= 0.80.1) + - React-FabricComponents/components/modal (= 0.80.1) + - React-FabricComponents/components/rncore (= 0.80.1) + - React-FabricComponents/components/safeareaview (= 0.80.1) + - React-FabricComponents/components/scrollview (= 0.80.1) + - React-FabricComponents/components/text (= 0.80.1) + - React-FabricComponents/components/textinput (= 0.80.1) + - React-FabricComponents/components/unimplementedview (= 0.80.1) - React-featureflags - React-graphics - React-hermes @@ -1141,7 +1172,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/inputaccessory (0.80.0): + - React-FabricComponents/components/inputaccessory (0.80.1): - boost - DoubleConversion - fast_float @@ -1168,7 +1199,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/iostextinput (0.80.0): + - React-FabricComponents/components/iostextinput (0.80.1): - boost - DoubleConversion - fast_float @@ -1195,7 +1226,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/modal (0.80.0): + - React-FabricComponents/components/modal (0.80.1): - boost - DoubleConversion - fast_float @@ -1222,7 +1253,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/rncore (0.80.0): + - React-FabricComponents/components/rncore (0.80.1): - boost - DoubleConversion - fast_float @@ -1249,7 +1280,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/safeareaview (0.80.0): + - React-FabricComponents/components/safeareaview (0.80.1): - boost - DoubleConversion - fast_float @@ -1276,7 +1307,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/scrollview (0.80.0): + - React-FabricComponents/components/scrollview (0.80.1): - boost - DoubleConversion - fast_float @@ -1303,7 +1334,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/text (0.80.0): + - React-FabricComponents/components/text (0.80.1): - boost - DoubleConversion - fast_float @@ -1330,7 +1361,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/textinput (0.80.0): + - React-FabricComponents/components/textinput (0.80.1): - boost - DoubleConversion - fast_float @@ -1357,7 +1388,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/unimplementedview (0.80.0): + - React-FabricComponents/components/unimplementedview (0.80.1): - boost - DoubleConversion - fast_float @@ -1384,7 +1415,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/textlayoutmanager (0.80.0): + - React-FabricComponents/textlayoutmanager (0.80.1): - boost - DoubleConversion - fast_float @@ -1411,7 +1442,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricImage (0.80.0): + - React-FabricImage (0.80.1): - boost - DoubleConversion - fast_float @@ -1420,22 +1451,22 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - RCTRequired (= 0.80.0) - - RCTTypeSafety (= 0.80.0) + - RCTRequired (= 0.80.1) + - RCTTypeSafety (= 0.80.1) - React-Fabric - React-featureflags - React-graphics - React-hermes - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.80.0) + - React-jsiexecutor (= 0.80.1) - React-logger - React-rendererdebug - React-utils - ReactCommon - SocketRocket - Yoga - - React-featureflags (0.80.0): + - React-featureflags (0.80.1): - boost - DoubleConversion - fast_float @@ -1444,7 +1475,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-featureflagsnativemodule (0.80.0): + - React-featureflagsnativemodule (0.80.1): - boost - DoubleConversion - fast_float @@ -1460,7 +1491,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-graphics (0.80.0): + - React-graphics (0.80.1): - boost - DoubleConversion - fast_float @@ -1474,7 +1505,7 @@ PODS: - React-jsiexecutor - React-utils - SocketRocket - - React-hermes (0.80.0): + - React-hermes (0.80.1): - boost - DoubleConversion - fast_float @@ -1483,16 +1514,16 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.80.0) + - React-cxxreact (= 0.80.1) - React-jsi - - React-jsiexecutor (= 0.80.0) + - React-jsiexecutor (= 0.80.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-perflogger (= 0.80.0) + - React-perflogger (= 0.80.1) - React-runtimeexecutor - SocketRocket - - React-idlecallbacksnativemodule (0.80.0): + - React-idlecallbacksnativemodule (0.80.1): - boost - DoubleConversion - fast_float @@ -1508,7 +1539,7 @@ PODS: - React-runtimescheduler - ReactCommon/turbomodule/core - SocketRocket - - React-ImageManager (0.80.0): + - React-ImageManager (0.80.1): - boost - DoubleConversion - fast_float @@ -1523,7 +1554,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-jserrorhandler (0.80.0): + - React-jserrorhandler (0.80.1): - boost - DoubleConversion - fast_float @@ -1538,7 +1569,7 @@ PODS: - React-jsi - ReactCommon/turbomodule/bridging - SocketRocket - - React-jsi (0.80.0): + - React-jsi (0.80.1): - boost - DoubleConversion - fast_float @@ -1548,7 +1579,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-jsiexecutor (0.80.0): + - React-jsiexecutor (0.80.1): - boost - DoubleConversion - fast_float @@ -1557,14 +1588,14 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.80.0) - - React-jsi (= 0.80.0) + - React-cxxreact (= 0.80.1) + - React-jsi (= 0.80.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-perflogger (= 0.80.0) + - React-perflogger (= 0.80.1) - SocketRocket - - React-jsinspector (0.80.0): + - React-jsinspector (0.80.1): - boost - DoubleConversion - fast_float @@ -1578,10 +1609,10 @@ PODS: - React-jsinspectorcdp - React-jsinspectornetwork - React-jsinspectortracing - - React-perflogger (= 0.80.0) - - React-runtimeexecutor (= 0.80.0) + - React-perflogger (= 0.80.1) + - React-runtimeexecutor (= 0.80.1) - SocketRocket - - React-jsinspectorcdp (0.80.0): + - React-jsinspectorcdp (0.80.1): - boost - DoubleConversion - fast_float @@ -1590,7 +1621,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-jsinspectornetwork (0.80.0): + - React-jsinspectornetwork (0.80.1): - boost - DoubleConversion - fast_float @@ -1600,7 +1631,7 @@ PODS: - RCT-Folly/Fabric - React-jsinspectorcdp - SocketRocket - - React-jsinspectortracing (0.80.0): + - React-jsinspectortracing (0.80.1): - boost - DoubleConversion - fast_float @@ -1610,7 +1641,7 @@ PODS: - RCT-Folly/Fabric - React-oscompat - SocketRocket - - React-jsitooling (0.80.0): + - React-jsitooling (0.80.1): - boost - DoubleConversion - fast_float @@ -1618,15 +1649,15 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.80.0) - - React-jsi (= 0.80.0) + - React-cxxreact (= 0.80.1) + - React-jsi (= 0.80.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - SocketRocket - - React-jsitracing (0.80.0): + - React-jsitracing (0.80.1): - React-jsi - - React-logger (0.80.0): + - React-logger (0.80.1): - boost - DoubleConversion - fast_float @@ -1635,7 +1666,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-Mapbuffer (0.80.0): + - React-Mapbuffer (0.80.1): - boost - DoubleConversion - fast_float @@ -1645,7 +1676,7 @@ PODS: - RCT-Folly/Fabric - React-debug - SocketRocket - - React-microtasksnativemodule (0.80.0): + - React-microtasksnativemodule (0.80.1): - boost - DoubleConversion - fast_float @@ -1662,36 +1693,7 @@ PODS: - SocketRocket - react-native-background-actions (4.0.1): - React-Core - - react-native-blob-util (0.21.2): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - SocketRocket - - Yoga - - react-native-blur (4.4.1): + - react-native-blob-util (0.22.2): - boost - DoubleConversion - fast_float @@ -1726,7 +1728,7 @@ PODS: - react-native-config/App (= 1.5.5) - react-native-config/App (1.5.5): - React-Core - - react-native-mmkv (3.2.0): + - react-native-mmkv (3.3.0): - boost - DoubleConversion - fast_float @@ -1787,7 +1789,7 @@ PODS: - SocketRocket - SSZipArchive (~> 2.4.3) - Yoga - - react-native-pager-view (6.7.1): + - react-native-pager-view (6.8.1): - boost - DoubleConversion - fast_float @@ -1816,7 +1818,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - react-native-safe-area-context (5.4.0): + - react-native-safe-area-context (5.5.1): - boost - DoubleConversion - fast_float @@ -1835,8 +1837,8 @@ PODS: - React-hermes - React-ImageManager - React-jsi - - react-native-safe-area-context/common (= 5.4.0) - - react-native-safe-area-context/fabric (= 5.4.0) + - react-native-safe-area-context/common (= 5.5.1) + - react-native-safe-area-context/fabric (= 5.5.1) - React-NativeModulesApple - React-RCTFabric - React-renderercss @@ -1847,7 +1849,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - react-native-safe-area-context/common (5.4.0): + - react-native-safe-area-context/common (5.5.1): - boost - DoubleConversion - fast_float @@ -1876,7 +1878,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - react-native-safe-area-context/fabric (5.4.0): + - react-native-safe-area-context/fabric (5.5.1): - boost - DoubleConversion - fast_float @@ -1909,7 +1911,7 @@ PODS: - react-native-track-player (4.1.1): - React-Core - SwiftAudioEx (= 1.1.0) - - React-NativeModulesApple (0.80.0): + - React-NativeModulesApple (0.80.1): - boost - DoubleConversion - fast_float @@ -1930,8 +1932,8 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - SocketRocket - - React-oscompat (0.80.0) - - React-perflogger (0.80.0): + - React-oscompat (0.80.1) + - React-perflogger (0.80.1): - boost - DoubleConversion - fast_float @@ -1940,7 +1942,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-performancetimeline (0.80.0): + - React-performancetimeline (0.80.1): - boost - DoubleConversion - fast_float @@ -1953,9 +1955,9 @@ PODS: - React-perflogger - React-timing - SocketRocket - - React-RCTActionSheet (0.80.0): - - React-Core/RCTActionSheetHeaders (= 0.80.0) - - React-RCTAnimation (0.80.0): + - React-RCTActionSheet (0.80.1): + - React-Core/RCTActionSheetHeaders (= 0.80.1) + - React-RCTAnimation (0.80.1): - boost - DoubleConversion - fast_float @@ -1971,7 +1973,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTAppDelegate (0.80.0): + - React-RCTAppDelegate (0.80.1): - boost - DoubleConversion - fast_float @@ -2004,7 +2006,7 @@ PODS: - React-utils - ReactCommon - SocketRocket - - React-RCTBlob (0.80.0): + - React-RCTBlob (0.80.1): - boost - DoubleConversion - fast_float @@ -2023,7 +2025,7 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTFabric (0.80.0): + - React-RCTFabric (0.80.1): - boost - DoubleConversion - fast_float @@ -2057,7 +2059,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-RCTFBReactNativeSpec (0.80.0): + - React-RCTFBReactNativeSpec (0.80.1): - boost - DoubleConversion - fast_float @@ -2075,7 +2077,7 @@ PODS: - React-NativeModulesApple - ReactCommon - SocketRocket - - React-RCTImage (0.80.0): + - React-RCTImage (0.80.1): - boost - DoubleConversion - fast_float @@ -2091,14 +2093,14 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTLinking (0.80.0): - - React-Core/RCTLinkingHeaders (= 0.80.0) - - React-jsi (= 0.80.0) + - React-RCTLinking (0.80.1): + - React-Core/RCTLinkingHeaders (= 0.80.1) + - React-jsi (= 0.80.1) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.80.0) - - React-RCTNetwork (0.80.0): + - ReactCommon/turbomodule/core (= 0.80.1) + - React-RCTNetwork (0.80.1): - boost - DoubleConversion - fast_float @@ -2116,7 +2118,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTRuntime (0.80.0): + - React-RCTRuntime (0.80.1): - boost - DoubleConversion - fast_float @@ -2136,7 +2138,7 @@ PODS: - React-RuntimeCore - React-RuntimeHermes - SocketRocket - - React-RCTSettings (0.80.0): + - React-RCTSettings (0.80.1): - boost - DoubleConversion - fast_float @@ -2151,10 +2153,10 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTText (0.80.0): - - React-Core/RCTTextHeaders (= 0.80.0) + - React-RCTText (0.80.1): + - React-Core/RCTTextHeaders (= 0.80.1) - Yoga - - React-RCTVibration (0.80.0): + - React-RCTVibration (0.80.1): - boost - DoubleConversion - fast_float @@ -2168,11 +2170,11 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-rendererconsistency (0.80.0) - - React-renderercss (0.80.0): + - React-rendererconsistency (0.80.1) + - React-renderercss (0.80.1): - React-debug - React-utils - - React-rendererdebug (0.80.0): + - React-rendererdebug (0.80.1): - boost - DoubleConversion - fast_float @@ -2182,8 +2184,8 @@ PODS: - RCT-Folly/Fabric - React-debug - SocketRocket - - React-rncore (0.80.0) - - React-RuntimeApple (0.80.0): + - React-rncore (0.80.1) + - React-RuntimeApple (0.80.1): - boost - DoubleConversion - fast_float @@ -2212,7 +2214,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-RuntimeCore (0.80.0): + - React-RuntimeCore (0.80.1): - boost - DoubleConversion - fast_float @@ -2235,9 +2237,9 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-runtimeexecutor (0.80.0): - - React-jsi (= 0.80.0) - - React-RuntimeHermes (0.80.0): + - React-runtimeexecutor (0.80.1): + - React-jsi (= 0.80.1) + - React-RuntimeHermes (0.80.1): - boost - DoubleConversion - fast_float @@ -2257,7 +2259,7 @@ PODS: - React-RuntimeCore - React-utils - SocketRocket - - React-runtimescheduler (0.80.0): + - React-runtimescheduler (0.80.1): - boost - DoubleConversion - fast_float @@ -2280,8 +2282,8 @@ PODS: - React-timing - React-utils - SocketRocket - - React-timing (0.80.0) - - React-utils (0.80.0): + - React-timing (0.80.1) + - React-utils (0.80.1): - boost - DoubleConversion - fast_float @@ -2292,11 +2294,11 @@ PODS: - RCT-Folly/Fabric - React-debug - React-hermes - - React-jsi (= 0.80.0) + - React-jsi (= 0.80.1) - SocketRocket - - ReactAppDependencyProvider (0.80.0): + - ReactAppDependencyProvider (0.80.1): - ReactCodegen - - ReactCodegen (0.80.0): + - ReactCodegen (0.80.1): - boost - DoubleConversion - fast_float @@ -2323,7 +2325,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - SocketRocket - - ReactCommon (0.80.0): + - ReactCommon (0.80.1): - boost - DoubleConversion - fast_float @@ -2331,9 +2333,9 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - ReactCommon/turbomodule (= 0.80.0) + - ReactCommon/turbomodule (= 0.80.1) - SocketRocket - - ReactCommon/turbomodule (0.80.0): + - ReactCommon/turbomodule (0.80.1): - boost - DoubleConversion - fast_float @@ -2342,15 +2344,15 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.80.0) - - React-cxxreact (= 0.80.0) - - React-jsi (= 0.80.0) - - React-logger (= 0.80.0) - - React-perflogger (= 0.80.0) - - ReactCommon/turbomodule/bridging (= 0.80.0) - - ReactCommon/turbomodule/core (= 0.80.0) + - React-callinvoker (= 0.80.1) + - React-cxxreact (= 0.80.1) + - React-jsi (= 0.80.1) + - React-logger (= 0.80.1) + - React-perflogger (= 0.80.1) + - ReactCommon/turbomodule/bridging (= 0.80.1) + - ReactCommon/turbomodule/core (= 0.80.1) - SocketRocket - - ReactCommon/turbomodule/bridging (0.80.0): + - ReactCommon/turbomodule/bridging (0.80.1): - boost - DoubleConversion - fast_float @@ -2359,13 +2361,13 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.80.0) - - React-cxxreact (= 0.80.0) - - React-jsi (= 0.80.0) - - React-logger (= 0.80.0) - - React-perflogger (= 0.80.0) + - React-callinvoker (= 0.80.1) + - React-cxxreact (= 0.80.1) + - React-jsi (= 0.80.1) + - React-logger (= 0.80.1) + - React-perflogger (= 0.80.1) - SocketRocket - - ReactCommon/turbomodule/core (0.80.0): + - ReactCommon/turbomodule/core (0.80.1): - boost - DoubleConversion - fast_float @@ -2374,14 +2376,14 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.80.0) - - React-cxxreact (= 0.80.0) - - React-debug (= 0.80.0) - - React-featureflags (= 0.80.0) - - React-jsi (= 0.80.0) - - React-logger (= 0.80.0) - - React-perflogger (= 0.80.0) - - React-utils (= 0.80.0) + - React-callinvoker (= 0.80.1) + - React-cxxreact (= 0.80.1) + - React-debug (= 0.80.1) + - React-featureflags (= 0.80.1) + - React-jsi (= 0.80.1) + - React-logger (= 0.80.1) + - React-perflogger (= 0.80.1) + - React-utils (= 0.80.1) - SocketRocket - RNCMaskedView (0.3.2): - boost @@ -2412,6 +2414,35 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga + - RNCPicker (2.11.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga - RNDeviceInfo (14.0.4): - React-Core - RNDnsLookup (1.0.6): @@ -2420,7 +2451,7 @@ PODS: - React-Core - SDWebImage (~> 5.11.1) - SDWebImageWebPCoder (~> 0.8.4) - - RNFlashList (2.0.0-rc.8): + - RNFlashList (2.0.0-rc.10): - boost - DoubleConversion - fast_float @@ -2451,7 +2482,7 @@ PODS: - Yoga - RNFS (2.20.0): - React-Core - - RNGestureHandler (2.26.0): + - RNGestureHandler (2.27.1): - boost - DoubleConversion - fast_float @@ -2658,7 +2689,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - RNScreens (4.11.0-nightly-20250509-5b482bc5c): + - RNScreens (4.11.1): - boost - DoubleConversion - fast_float @@ -2686,10 +2717,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNScreens/common (= 4.11.0-nightly-20250509-5b482bc5c) + - RNScreens/common (= 4.11.1) - SocketRocket - Yoga - - RNScreens/common (4.11.0-nightly-20250509-5b482bc5c): + - RNScreens/common (4.11.1): - boost - DoubleConversion - fast_float @@ -2761,12 +2792,14 @@ PODS: DEPENDENCIES: - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - BVLinearGradient (from `../node_modules/react-native-linear-gradient`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - JellifyBlur (from `../node_modules/blur-react-native`) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) - RCTRequired (from `../node_modules/react-native/Libraries/Required`) @@ -2803,7 +2836,6 @@ DEPENDENCIES: - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) - react-native-background-actions (from `../node_modules/react-native-background-actions`) - react-native-blob-util (from `../node_modules/react-native-blob-util`) - - "react-native-blur (from `../node_modules/@react-native-community/blur`)" - react-native-carplay (from `../node_modules/react-native-carplay`) - react-native-config (from `../node_modules/react-native-config`) - react-native-mmkv (from `../node_modules/react-native-mmkv`) @@ -2844,6 +2876,7 @@ DEPENDENCIES: - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - "RNCMaskedView (from `../node_modules/@react-native-masked-view/masked-view`)" + - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - RNDeviceInfo (from `../node_modules/react-native-device-info`) - RNDnsLookup (from `../node_modules/react-native-dns-lookup`) - RNFastImage (from `../node_modules/react-native-fast-image`) @@ -2854,6 +2887,7 @@ DEPENDENCIES: - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) - RNVectorIcons (from `../node_modules/react-native-vector-icons`) + - SDWebImage - SocketRocket (~> 0.7.1) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -2869,6 +2903,8 @@ SPEC REPOS: EXTERNAL SOURCES: boost: :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + BVLinearGradient: + :path: "../node_modules/react-native-linear-gradient" DoubleConversion: :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" fast_float: @@ -2882,6 +2918,8 @@ EXTERNAL SOURCES: hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" :tag: hermes-2025-05-06-RNv0.80.0-4eb6132a5bf0450bf4c6c91987675381d7ac8bca + JellifyBlur: + :path: "../node_modules/blur-react-native" RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: @@ -2952,8 +2990,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-background-actions" react-native-blob-util: :path: "../node_modules/react-native-blob-util" - react-native-blur: - :path: "../node_modules/@react-native-community/blur" react-native-carplay: :path: "../node_modules/react-native-carplay" react-native-config: @@ -3034,6 +3070,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" RNCMaskedView: :path: "../node_modules/@react-native-masked-view/masked-view" + RNCPicker: + :path: "../node_modules/@react-native-picker/picker" RNDeviceInfo: :path: "../node_modules/react-native-device-info" RNDnsLookup: @@ -3059,106 +3097,108 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 + BVLinearGradient: cb006ba232a1f3e4f341bb62c42d1098c284da70 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 - FBLazyVector: 778b815a6fb3fa1599f581ffb9a5e85fad313c1d + FBLazyVector: 09f03e4b6f42f955734b64a118f86509cc719427 fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 hermes-engine: 7068e976238b29e97b3bafd09a994542af7d5c0b + JellifyBlur: 06d28c27ef5a476ae3a275c1f309bf32b3ec93e0 libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 - RCTDeprecation: ff787f6c860a1b97dd1bc27264b61d23ad1994da - RCTRequired: 664eb8399ed8a83e26ab65af7c2ad390f7e61696 - RCTTypeSafety: a5cf7a7e80baf972e331dc028e5d5c19bb2535a4 - React: 606d4dccbcf29aec4dc84a7921405a28e1701a22 - React-callinvoker: 0e13bd3c039df9ceef04f7381a81f017655c8361 - React-Core: d118e66b5b561f5ab999dd7f9cf14f54dab376a7 - React-CoreModules: 6ec48c52c9ff2ca3fa110153de09e4c2379f1860 - React-cxxreact: cb406100002503e44de4b725e581ce24f47003b9 - React-debug: a9e91845f3670c3a19249f52919f0488b7842cf7 - React-defaultsnativemodule: ee76dbbfc31db775bc318f707f01869cd8a32f42 - React-domnativemodule: a3f44d7ea5c7f8ef5c6f88574471d6f0b73d2f17 - React-Fabric: bb3b550229a1cf7a93f9d8569a3a672cae115d94 - React-FabricComponents: a3b5184c705b5b45c8e6736f8bc579bae5cbecbe - React-FabricImage: 8d3a479a8c6097d20b7bd170df7d28b9da72381e - React-featureflags: 2d450523e473b3923790f9502feb8d13691b9e0e - React-featureflagsnativemodule: 90429c06d7aa290896a76639eaaa78c1d0bf4bca - React-graphics: 9e11a80b48b66d08d47c16cb5d922f1171840e70 - React-hermes: ae85ffa5ce034f07f63c95a7cbd15a391da8a6d3 - React-idlecallbacksnativemodule: bbacde3a9c82e14b9f3bfc9494bb960ce6801bf3 - React-ImageManager: d9f55275912e0ee5e34a66d30ad7c6327ce7daa4 - React-jserrorhandler: eeac7d0ce29ef27a5828d376ae84e516c2f3bab0 - React-jsi: 8eba045092d3ebe6b30f11e397185080e22e1c3d - React-jsiexecutor: 84978b702963ecee46f8e4d510931d4fdb7e8429 - React-jsinspector: 5efae7cf4601cb0c7441e4caaa5a6cc16781bf54 - React-jsinspectorcdp: df0f2b157b62a9f5d91c87600331c55414c35881 - React-jsinspectornetwork: af69093cf9d60dbcd00cda064ac271e2123f623e - React-jsinspectortracing: 2519b0016db1f338e56620a3fec253f455318359 - React-jsitooling: ffb70ee2d0c8836b1e8feddd0945847ae89271ad - React-jsitracing: 4a6b9ca5ed4195c51c9205712f06aba38fbb758e - React-logger: dce52a571ba0e0149c3f0fcc6866cbc0c8552c5e - React-Mapbuffer: f5754c33877eaf36e4c76c613b35615a181c85c5 - React-microtasksnativemodule: 23df6374a3ac422d8c2927839bcaeed61fee3dad + RCTDeprecation: efa5010912100e944a7ac9a93a157e1def1988fe + RCTRequired: bbc4cf999ddc4a4b076e076c74dd1d39d0254630 + RCTTypeSafety: d877728097547d0a37786cc9130c43ad71739ac3 + React: 4b0b9cb962e694611e5e8a697c1b0300a2510c21 + React-callinvoker: 70f125c17c7132811a6b473946ac5e7ae93b5e57 + React-Core: bab40f5b1f46fe0c5896895a6f333e861a821a81 + React-CoreModules: 05647d952e521113c128360633896ba7ba652e82 + React-cxxreact: 2b4bac1ec6eecc6288ac8a6caea6afb42585740e + React-debug: deb3a146ef717fa3e8f4c23e0288369fe53199b7 + React-defaultsnativemodule: 11e2948787a15d3cf1b66d7f29f13770a177bff7 + React-domnativemodule: 2f4b279acdb2963736fb5de2f585811dd90070b5 + React-Fabric: 6f8d1a303c96f1d078c14d74c4005bf457e5b782 + React-FabricComponents: b106410970e9a0c4e592da656c7a7e0947306c23 + React-FabricImage: 1abaf230dfce9b58fdf53c4128f3f40c6e64af6a + React-featureflags: f7ef58d91079efde3ad223bcca6d197e845d5bcf + React-featureflagsnativemodule: ae5abc9849d1696f4f8f11ee3744bf5715e032cf + React-graphics: b306856c6ed9aac32f717a229550406a53b28a6d + React-hermes: b6edce8fa19388654b1aea30844497cbeade83bc + React-idlecallbacksnativemodule: cb386712842cb9e479c89311edb234d529b64db4 + React-ImageManager: 8ce94417853eaa22faaad1f4cc1952dd3f8e2275 + React-jserrorhandler: ab827d67dc270a9c8703eef524230baeafaf6876 + React-jsi: 545342ec5c78ab1277af5f0dbe8d489e7e73db14 + React-jsiexecutor: 20210891c7c77255c16dec6762faf68b373f9f74 + React-jsinspector: 4e73460e488132d70d2b4894e5578cc856f2cb74 + React-jsinspectorcdp: 8b2bcb5779289cb2b9ca517f2965ed23eb2fd3e0 + React-jsinspectornetwork: b5e0cb9e488d294eed2d8209dc3dc0f9587210c1 + React-jsinspectortracing: f3c4036e7b984405ac910f878576d325dd9f2834 + React-jsitooling: 75bbfd221b6173a5e848ca5a6680506bac064a56 + React-jsitracing: 11ed7d821864dd988c159d4943e0a1e0937c11b1 + React-logger: 984ebd897afad067555d081deaf03f57c4315723 + React-Mapbuffer: 0c045c844ce6d85cde53e85ab163294c6adad349 + React-microtasksnativemodule: d9499269ad1f484ae71319bac1d9231447f2094e react-native-background-actions: 48e6bad9e2a47e3b04858634c5a05ea11062f680 - react-native-blob-util: 147867cf170ec721b07bedd54234628be96af188 - react-native-blur: 477fac85a42b5506232ef1d2b82aad359feadd26 + react-native-blob-util: a9a07801b63e97d1bbdcf4eba3b98ff16c249bd5 react-native-carplay: 8f388f6f73e5e0f73ed154ad8794371343ee20c0 react-native-config: 644074ab88db883fcfaa584f03520ec29589d7df - react-native-mmkv: d43fb42ed952f5e3be3ca25f07b0c1474eae7420 + react-native-mmkv: 7fb4729ad5cb787a4394e6c4bd48e4b8ec30f25c react-native-netinfo: cec9c4e86083cb5b6aba0e0711f563e2fbbff187 react-native-ota-hot-update: fe5bbc1e656018b0cf526adfcc92788e7f098110 - react-native-pager-view: 682422a9cd034c335cae12106c5ca8f892cffe9d - react-native-safe-area-context: bd8e149c82b5a20cfd55e9775d82f1b5954b7e6d + react-native-pager-view: 6e60acfd433ace1a7a1af75bd80b619a41478640 + react-native-safe-area-context: d3738f0c3b1fcefaed874a45891b0d44306c47c1 react-native-track-player: 6dc2e2633265704b8ab6d8124b80239d4ed1f911 - React-NativeModulesApple: e16d5c133019987285f001fbf1461a861e40426f - React-oscompat: 7c0a341cc31e350da71ddf2e46de0a845d1d1626 - React-perflogger: c91e01612298b74f70d846ae3666d2b078c547e0 - React-performancetimeline: 6b9a6951922d764073bc69617be43a9552de96ba - React-RCTActionSheet: 99864bd8422649219f24eca9a51445e698b70b8e - React-RCTAnimation: ae0790201f87e9782f4a8b4346ac414f4c3273f3 - React-RCTAppDelegate: e94955f941036818be7583fe820d13bf47c5e9af - React-RCTBlob: 472203c0f6fa4f25996ed94a2cdf5eaa92200fe3 - React-RCTFabric: 6f6b6979e6395f4fc33e6e25612f6272a71b7af5 - React-RCTFBReactNativeSpec: 9a0d5b08fcc6e0c73f2afc8fce60e8537db82b58 - React-RCTImage: 14ce85b3f9e898ad8ab2fd49be97f09e43251fb9 - React-RCTLinking: b189fd2fd5fce9c3189d64204f1a92c36ffc27bd - React-RCTNetwork: 66f7536d038d5ecec63acdc5e7c9b7f843fed4ac - React-RCTRuntime: 62482bc3df825749a51ff2c7aa2dd0b8d74ee930 - React-RCTSettings: 98360df5a9e6f6d10bd9738c6d4637005e4f842e - React-RCTText: 667ac6f696da8cd6671b5b562adf43419a787705 - React-RCTVibration: 13de9226d181fb939b187f3f682767c6e8cc80f8 - React-rendererconsistency: a4db9bb060c65bce8ae83d936ed0719696055bd2 - React-renderercss: f7788003b3c65702cbc123f8ba7678dd3cb67753 - React-rendererdebug: 67c92da913f21ebe041ce959f024ab89cf2a7bde - React-rncore: 322add36430c38049067a5d365f166256975391f - React-RuntimeApple: f3eedaeab424b467cfc61a308422235399ded08c - React-RuntimeCore: fd5ff77cca527e2ecd42e0d6a3eeafafde74d9c9 - React-runtimeexecutor: 49ea276161508d50b3486c385e1ca7972d1699f5 - React-RuntimeHermes: 85e8e095e106dbc6bcf5dcae051f56ba18b1d629 - React-runtimescheduler: c8581138c14a1e2036e8403628b963c0d1c88b26 - React-timing: a275a1c2e6112dba17f8f7dd496d439213bbea0d - React-utils: 449a6e1fd53886510e284e80bdbb1b1c6db29452 - ReactAppDependencyProvider: 3267432b637c9b38e86961b287f784ee1b08dde0 - ReactCodegen: 5d41e1df061200130dd326e55cdfdf94b0289c6e - ReactCommon: b028d09a66e60ebd83ca59d8cc9a1216360db147 + React-NativeModulesApple: 983f3483ef0a3446b56d490f09d579fba2442e17 + React-oscompat: 114036cd8f064558c9c1a0c04fc9ae5e1453706a + React-perflogger: e7287fee27c16e3c8bd4d470f2361572b63be16b + React-performancetimeline: 8ebbaa31d2d0cea680b0a2a567500d3cab8954fc + React-RCTActionSheet: 68c68b0a7a5d2b0cfc255c64889b6e485974e988 + React-RCTAnimation: d6c5c728b888a967ce9aff1ff71a8ed71a68d069 + React-RCTAppDelegate: 0fc048666bda159cd469a6fb9befb04b3fa62be4 + React-RCTBlob: 12d8c699a1f906840113ee8d8bb575e69a05509f + React-RCTFabric: 01e815845ebc185f44205dcbf50eeb712fec23fe + React-RCTFBReactNativeSpec: f57927fb0af6ce2f25c19f8b894e2986138aa89f + React-RCTImage: a82518168f4ee407913b23ca749ca79ef51959f3 + React-RCTLinking: 7f343b584c36f024f390fea563483568fe763ef6 + React-RCTNetwork: 3165eb757ceb62a7cde4cdad043d63314122e8a3 + React-RCTRuntime: feee590c459c4cb6aaa7a00f3abc8c04709b536f + React-RCTSettings: 6bad0ae45d8d872c873059f332f586f99875621f + React-RCTText: 657d60f35983062de8f0cea67c279aa7a3ea9858 + React-RCTVibration: 78f4770515141efb7f55f9b27c49dda95319c3a8 + React-rendererconsistency: f7baab26c6d0cd5b2eb7afcecfd2d8b957017b18 + React-renderercss: bdd2f83a4a054c3e4321fd61305c202b848e471b + React-rendererdebug: 9f8865ee038127a9d99d4b034c9da4935d204993 + React-rncore: f7438473c4c71ee1963fb06a8635bb96013c9e1c + React-RuntimeApple: 4d2ab9f72b9193da86eceded128a67254fc18aeb + React-RuntimeCore: 5fd73030438d094975ca0f549d162dd97746ae38 + React-runtimeexecutor: 17c70842d5e611130cb66f91e247bc4a609c3508 + React-RuntimeHermes: 3c88e6e1ea7ea0899dcffc77c10d61ea46688cfd + React-runtimescheduler: 024500621c7c93d65371498abb4ee26d34f5d47d + React-timing: c3c923df2b86194e1682e01167717481232f1dc7 + React-utils: 9154a037543147e1c24098f1a48fc8472602c092 + ReactAppDependencyProvider: afd905e84ee36e1678016ae04d7370c75ed539be + ReactCodegen: f8d5fb047c4cd9d2caade972cad9edac22521362 + ReactCommon: 17fd88849a174bf9ce45461912291aca711410fc RNCMaskedView: 7e0ce15656772a939ff0d269100bca3a182163c8 + RNCPicker: 3959648fed5fbfe8065368fbdf2420c7e73b2587 RNDeviceInfo: d863506092aef7e7af3a1c350c913d867d795047 RNDnsLookup: db4a89381b80ec1a5153088518d2c4f8e51f2521 RNFastImage: 462a183c4b0b6b26fdfd639e1ed6ba37536c3b87 - RNFlashList: 22fa96159031e6735bea179b4a9c0544d59ff5b5 + RNFlashList: 9ce3b4089afdc66a6676e53264bf222a224772c6 RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8 - RNGestureHandler: eeb622199ef1fb3a076243131095df1c797072f0 + RNGestureHandler: 5e1a1605659c22098719fc2e8aee453fe728f52e RNReactNativeHapticFeedback: 8eb91a6f48567d02ec8026e515102e18c41030cf RNReanimated: bc1ddb7a5352648bcf0d592256069833bf935a46 - RNScreens: 79823463457c124ca73289e1a2594712f8e0e7cc + RNScreens: ee2abe7e0c548eed14e92742e81ed991165c56aa RNVectorIcons: ef9b4b0b786053ebdd63ee2972f48de9633ba166 SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef SwiftAudioEx: f6aa653770f3a0d3851edaf8d834a30aee4a7646 - Yoga: 0c4b7d2aacc910a1f702694fa86be830386f4ceb + Yoga: daa1e4de4b971b977b23bc842aaa3e135324f1f3 -PODFILE CHECKSUM: 6c43107ef8f93930ea4053b68b45c8912648b48c +PODFILE CHECKSUM: 531be4f3bdf91c9e2b2a6f2444e455020f218a20 COCOAPODS: 1.16.2 diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile index acc9ba0b..ffbb27b7 100644 --- a/ios/fastlane/Fastfile +++ b/ios/fastlane/Fastfile @@ -24,9 +24,23 @@ platform :ios do type: "appstore", app_identifier: "com.cosmonautical.jellify", ) + match( + type: "development", + app_identifier: "com.cosmonautical.jellify", + ) + appIdentifier = "com.cosmonautical.jellify" + + target = "Jellify" + build_app( scheme: "Jellify - Release", - workspace: "Jellify.xcworkspace" + workspace: "Jellify.xcworkspace", + export_method: "app-store", + export_options: { + provisioningProfiles: { + "com.cosmonautical.jellify" => "match AppStore com.cosmonautical.jellify" + } + } ) end @@ -39,7 +53,8 @@ platform :ios do build_app( scheme: "Jellify - Release", - workspace: "Jellify.xcworkspace", + workspace: "Jellify.xcworkspace" + ) changelog_from_git_commits( date_format: "short", diff --git a/ios/link-assets-manifest.json b/ios/link-assets-manifest.json index a379dc69..835030c1 100644 --- a/ios/link-assets-manifest.json +++ b/ios/link-assets-manifest.json @@ -1,69 +1,61 @@ { - "migIndex": 1, - "data": [ - { - "path": "assets/fonts/Aileron-Black.otf", - "sha1": "f9c3d80856ec2f23c8733b63edc9bd9d3051d999" - }, - { - "path": "assets/fonts/Aileron-BlackItalic.otf", - "sha1": "ffb617e90f50dfe1eb2bd4df80736d55ccacbb73" - }, - { - "path": "assets/fonts/Aileron-Bold.otf", - "sha1": "9daa863f1c9a0f9efacd19fe9329c0fb9332ca7a" - }, - { - "path": "assets/fonts/Aileron-BoldItalic.otf", - "sha1": "13dbc6d1c10932eeacac7c680a7f71a25f6f821e" - }, - { - "path": "assets/fonts/Aileron-Heavy.otf", - "sha1": "56a9def7cf4ad3efefec7485be8cd95a265ab1f6" - }, - { - "path": "assets/fonts/Aileron-HeavyItalic.otf", - "sha1": "23255fa29564f9757f779ba29c1d5649c2bf4259" - }, - { - "path": "assets/fonts/Aileron-Italic.otf", - "sha1": "338b043581d997314a4a03924ed30ff6461fd37e" - }, - { - "path": "assets/fonts/Aileron-Light.otf", - "sha1": "bf29e850d4c6dc3c73e46eb322f367c81ca07aad" - }, - { - "path": "assets/fonts/Aileron-LightItalic.otf", - "sha1": "48a4355b8792657845b3b0cd39c42994923a117a" - }, - { - "path": "assets/fonts/Aileron-Regular.otf", - "sha1": "5a78965873fbce38941cd3da109280af89a42de5" - }, - { - "path": "assets/fonts/Aileron-SemiBold.otf", - "sha1": "3c4affc8a57d6915e1255fd6c5312d1443bcc824" - }, - { - "path": "assets/fonts/Aileron-SemiBoldItalic.otf", - "sha1": "46f85a5b66cf813651057ff2ed623527bdcd4b6f" - }, - { - "path": "assets/fonts/Aileron-Thin.otf", - "sha1": "ee9d845c2b370a3ac00cfe402079233f8621ef9c" - }, - { - "path": "assets/fonts/Aileron-ThinItalic.otf", - "sha1": "31db89d81d0f354cc67dfc53bad54be5bfd44214" - }, - { - "path": "assets/fonts/Aileron-UltraLight.otf", - "sha1": "ee4b6ef0bb1606ef950ba9acca0e78bb2cc2dc24" - }, - { - "path": "assets/fonts/Aileron-UltraLightItalic.otf", - "sha1": "8a34c35019102ac48f86fc0255d06c8ca05933d0" - } - ] + "migIndex": 1, + "data": [ + { + "path": "assets/fonts/Figtree-Black.otf", + "sha1": "b73ea990d4cb9d083ba9c83fcb294c9a0f6d047b" + }, + { + "path": "assets/fonts/Figtree-BlackItalic.otf", + "sha1": "cf1e0fae27e6e5fac99ade89606c2e1beaee9591" + }, + { + "path": "assets/fonts/Figtree-Bold.otf", + "sha1": "ae0e42549ac7e9c3eef3c1d30559c4c1cd12c956" + }, + { + "path": "assets/fonts/Figtree-BoldItalic.otf", + "sha1": "4eaafcb1bc116ef2ba27563abcf7ef14950168b6" + }, + { + "path": "assets/fonts/Figtree-ExtraBold.otf", + "sha1": "fd27451fd8d4345bf10fb2df7709ce5d227bd0e0" + }, + { + "path": "assets/fonts/Figtree-ExtraBoldItalic.otf", + "sha1": "a95dbce0e64237016368ed9b4ebd59d6fa511df1" + }, + { + "path": "assets/fonts/Figtree-Italic.otf", + "sha1": "dd8e424f080055ab68c1443c2dbaf23036a0b8e9" + }, + { + "path": "assets/fonts/Figtree-Light.otf", + "sha1": "a5970daf4ba6f327add523fcfb9a7e8b18eab236" + }, + { + "path": "assets/fonts/Figtree-LightItalic.otf", + "sha1": "23d693a3ea682078ba5680ed36bbb561f5f9b22c" + }, + { + "path": "assets/fonts/Figtree-Medium.otf", + "sha1": "88cfdca20a37949ef1ef22d3787e85e6fc1f3fda" + }, + { + "path": "assets/fonts/Figtree-MediumItalic.otf", + "sha1": "2df859b3f99c65473e2131881fd03ee086b20f27" + }, + { + "path": "assets/fonts/Figtree-Regular.otf", + "sha1": "d250271defee0620eecd53ffbe262aa6db0b1612" + }, + { + "path": "assets/fonts/Figtree-SemiBold.otf", + "sha1": "752c72cd807768824ee845f2844149c232e71d1f" + }, + { + "path": "assets/fonts/Figtree-SemiBoldItalic.otf", + "sha1": "229451957167354dece0680b901d3bfacd333589" + } + ] } diff --git a/jest.config.js b/jest.config.js index eda08f01..6052b9fb 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,15 +1,18 @@ // https://docs.swmansion.com/react-native-gesture-handler/docs/guides/testing module.exports = { preset: 'react-native', + testTimeout: 10000, setupFiles: ['./node_modules/react-native-gesture-handler/jestSetup.js'], setupFilesAfterEnv: [ './jest/setup.ts', + './jest/setup-blur.ts', './jest/setup-carplay.ts', './jest/setup-device-info.js', // JS to prevent Typescript implicit any warning './jest/setup-reanimated.ts', './jest/setup-rnfs.ts', './jest/setup-rntp.ts', './jest/setup-sentry.ts', + './jest/setup-nitro-image.ts', './tamagui.config.ts', './jest/setup-native-modules.ts', ], diff --git a/jest/QueueProvider.test.tsx b/jest/QueueProvider.test.tsx index 7689784f..98a5eb3a 100644 --- a/jest/QueueProvider.test.tsx +++ b/jest/QueueProvider.test.tsx @@ -1,18 +1,39 @@ import 'react-native' import React from 'react' -import { act, render, screen, waitFor } from '@testing-library/react-native' +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react-native' import { Event } from 'react-native-track-player' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { Button, Text } from 'react-native' import { QueueProvider, useQueueContext } from '../src/providers/Player/queue' import { eventHandler } from './setup-rntp' +import JellifyTrack from '../src/types/JellifyTrack' const queryClient = new QueryClient() const QueueConsumer = () => { - const { currentIndex, useSkip, usePrevious } = useQueueContext() + const { currentIndex, useSkip, usePrevious, playQueue, setPlayQueue } = useQueueContext() + const tracklist: JellifyTrack[] = [ + { + url: 'https://example.com/1', + item: { + Id: '1', + }, + }, + { + url: 'https://example.com/2', + item: { + Id: '2', + }, + }, + { + url: 'https://example.com/3', + item: { + Id: '3', + }, + }, + ] return ( <> {currentIndex} @@ -20,6 +41,12 @@ const QueueConsumer = () => { + + {showCancelButton && ( + + )} + + + + + ) +} diff --git a/src/components/Global/components/track.tsx b/src/components/Global/components/track.tsx index a1438d7a..3641a4a7 100644 --- a/src/components/Global/components/track.tsx +++ b/src/components/Global/components/track.tsx @@ -1,12 +1,12 @@ import { usePlayerContext } from '../../../providers/Player' import React from 'react' -import { getToken, getTokens, Theme, useTheme, XStack, YStack } from 'tamagui' +import { getToken, Theme, useTheme, XStack, YStack } from 'tamagui' import { Text } from '../helpers/text' import { RunTimeTicks } from '../helpers/time-codes' import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models' import Icon from './icon' import { NativeStackNavigationProp } from '@react-navigation/native-stack' -import { StackParamList } from '../../../components/types' +import { StackParamList } from '../../types' import { QueuingType } from '../../../enums/queuing-type' import { Queue } from '../../../player/types/queue-item' import FavoriteIcon from './favorite-icon' @@ -75,8 +75,10 @@ export default function Track({ // Fetch album so it's available in the Details screen const { data: album } = useQuery({ - queryKey: [QueryKeys.MediaSources, track.Id!], + queryKey: [QueryKeys.Item, track.Id!], // Different key queryFn: () => fetchItem(api, track.Id!), + staleTime: 60 * 60 * 1000 * 24, // 24 hours + enabled: !!track.Id, // Add proper enabled condition }) return ( @@ -115,15 +117,16 @@ export default function Track({ } } paddingVertical={'$2'} + justifyContent='center' > {showArtwork ? ( ) : ( - + {track.IndexNumber?.toString() ?? ''} )} @@ -144,14 +152,15 @@ export default function Track({ 1)) && ( {track.Artists?.join(', ') ?? ''} @@ -174,21 +183,22 @@ export default function Track({ {track.RunTimeTicks} diff --git a/src/components/Global/helpers/icon-button.tsx b/src/components/Global/helpers/icon-button.tsx index e776c82f..9707dac1 100644 --- a/src/components/Global/helpers/icon-button.tsx +++ b/src/components/Global/helpers/icon-button.tsx @@ -24,27 +24,36 @@ export default function IconButton({ disabled, }: IconButtonProps): React.JSX.Element { return ( - - - - + + - {title && {title}} - - - + {title && ( + + {title} + + )} + ) } diff --git a/src/components/Global/helpers/slider.tsx b/src/components/Global/helpers/slider.tsx index 45744d05..fdeffabd 100644 --- a/src/components/Global/helpers/slider.tsx +++ b/src/components/Global/helpers/slider.tsx @@ -17,12 +17,12 @@ interface SliderProps { } const JellifyActiveSliderTrack = styled(Slider.TrackActive, { - backgroundColor: '$telemagenta', + backgroundColor: '$primary', }) const JellifySliderThumb = styled(Slider.Thumb, { - backgroundColor: '$purpleDark', - borderColor: '$borderColor', + backgroundColor: '$primary', + borderColor: '$primary', shadowColor: '$purpleDark', shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.25, @@ -37,7 +37,7 @@ const JellifySliderThumb = styled(Slider.Thumb, { }) const JellifySliderTrack = styled(Slider.Track, { - backgroundColor: getToken('$color.amethyst'), + backgroundColor: '#77748E', }) export function HorizontalSlider({ value, max, width, props }: SliderProps): React.JSX.Element { @@ -48,22 +48,21 @@ export function HorizontalSlider({ value, max, width, props }: SliderProps): Rea max={max} step={1} orientation='horizontal' - marginHorizontal={10} {...props} > - - + + diff --git a/src/components/Global/helpers/text.tsx b/src/components/Global/helpers/text.tsx index ce5a0267..2b920885 100644 --- a/src/components/Global/helpers/text.tsx +++ b/src/components/Global/helpers/text.tsx @@ -27,7 +27,7 @@ export function Label(props: LabelProps): React.JSX.Element { export function H1({ children }: { children: string }): React.JSX.Element { return ( - + {children} ) @@ -35,7 +35,7 @@ export function H1({ children }: { children: string }): React.JSX.Element { export function H2(props: TamaguiTextProps): React.JSX.Element { return ( - + {props.children} ) @@ -43,7 +43,7 @@ export function H2(props: TamaguiTextProps): React.JSX.Element { export function H3(props: TamaguiTextProps): React.JSX.Element { return ( - + {props.children} ) @@ -51,7 +51,7 @@ export function H3(props: TamaguiTextProps): React.JSX.Element { export function H4(props: TamaguiTextProps): React.JSX.Element { return ( - + {props.children} ) @@ -59,7 +59,7 @@ export function H4(props: TamaguiTextProps): React.JSX.Element { export function H5(props: TamaguiTextProps): React.JSX.Element { return ( - + {props.children} ) @@ -73,8 +73,9 @@ interface TextProps extends TamaguiTextProps { export function Text(props: TextProps): React.JSX.Element { return ( {calculateRunTimeFromSeconds(children)} +export function RunTimeSeconds({ + children, + color, + alignment = 'center', +}: { + children: number + color?: string + alignment?: 'center' | 'left' | 'right' +}): React.JSX.Element { + return ( + + {calculateRunTimeFromSeconds(children)} + + ) } export function RunTimeTicks({ @@ -19,7 +31,7 @@ export function RunTimeTicks({ const time = calculateRunTimeFromTicks(children) return ( - + {time} ) diff --git a/src/components/Home/helpers/frequent-artists.tsx b/src/components/Home/helpers/frequent-artists.tsx index 79b8205d..93267709 100644 --- a/src/components/Home/helpers/frequent-artists.tsx +++ b/src/components/Home/helpers/frequent-artists.tsx @@ -1,5 +1,5 @@ import HorizontalCardList from '../../../components/Global/components/horizontal-list' -import { StackParamList } from '../../../components/types' +import { StackParamList } from '../../types' import { NativeStackNavigationProp } from '@react-navigation/native-stack' import React, { useEffect } from 'react' import { ItemCard } from '../../../components/Global/components/item-card' diff --git a/src/components/Home/helpers/frequent-tracks.tsx b/src/components/Home/helpers/frequent-tracks.tsx index b6422262..8c9e204e 100644 --- a/src/components/Home/helpers/frequent-tracks.tsx +++ b/src/components/Home/helpers/frequent-tracks.tsx @@ -1,4 +1,4 @@ -import { StackParamList } from '../../../components/types' +import { StackParamList } from '../../types' import { NativeStackNavigationProp } from '@react-navigation/native-stack' import { useHomeContext } from '../../../providers/Home' import { View, XStack } from 'tamagui' diff --git a/src/components/Home/helpers/recently-played.tsx b/src/components/Home/helpers/recently-played.tsx index 852171d5..e6826568 100644 --- a/src/components/Home/helpers/recently-played.tsx +++ b/src/components/Home/helpers/recently-played.tsx @@ -4,7 +4,7 @@ import { useHomeContext } from '../../../providers/Home' import { H4 } from '../../Global/helpers/text' import { ItemCard } from '../../Global/components/item-card' import { usePlayerContext } from '../../../providers/Player' -import { StackParamList } from '../../../components/types' +import { StackParamList } from '../../types' import { NativeStackNavigationProp } from '@react-navigation/native-stack' import { trigger } from 'react-native-haptic-feedback' import { QueuingType } from '../../../enums/queuing-type' diff --git a/src/components/Home/index.tsx b/src/components/Home/index.tsx index 6d6274d0..6ec750ad 100644 --- a/src/components/Home/index.tsx +++ b/src/components/Home/index.tsx @@ -10,12 +10,14 @@ import FrequentArtists from './helpers/frequent-artists' import FrequentlyPlayedTracks from './helpers/frequent-tracks' import { useSafeAreaInsets } from 'react-native-safe-area-context' import { useJellifyContext } from '../../providers' +import { usePreventRemove } from '@react-navigation/native' export function ProvidedHome({ navigation, }: { navigation: NativeStackNavigationProp }): React.JSX.Element { + usePreventRemove(true, () => {}) const { user } = useJellifyContext() const { refreshing: refetching, onRefresh } = useHomeContext() const insets = useSafeAreaInsets() diff --git a/src/components/Library/component.tsx b/src/components/Library/component.tsx index 42b102c1..63874cdb 100644 --- a/src/components/Library/component.tsx +++ b/src/components/Library/component.tsx @@ -1,15 +1,15 @@ -import { StackParamList } from '../../components/types' +import { StackParamList } from '../types' import { RouteProp } from '@react-navigation/native' -import { NativeStackNavigationProp } from '@react-navigation/native-stack' import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs' -import PlaylistsScreen from './components/playlists-tab' -import { useTheme } from 'tamagui' +import PlaylistsTab from './components/playlists-tab' +import { getToken, useTheme } from 'tamagui' import { useColorScheme } from 'react-native' import Icon from '../Global/components/icon' import TracksTab from './components/tracks-tab' import ArtistsTab from './components/artists-tab' import AlbumsTab from './components/albums-tab' import LibraryTabBar from './tab-bar' +import { NativeStackNavigationProp } from '@react-navigation/native-stack' const LibraryTabsNavigator = createMaterialTopTabNavigator() @@ -17,7 +17,7 @@ export default function Library({ route, navigation, }: { - route: RouteProp + route: RouteProp navigation: NativeStackNavigationProp }): React.JSX.Element { const isDarkMode = useColorScheme() === 'dark' @@ -27,12 +27,14 @@ export default function Library({ } screenOptions={{ - lazy: true, tabBarShowIcon: true, + tabBarItemStyle: { + height: getToken('$12') + getToken('$6'), + }, tabBarActiveTintColor: theme.primary.val, - tabBarInactiveTintColor: theme.borderColor.val, + tabBarInactiveTintColor: theme.neutral.val, tabBarLabelStyle: { - fontFamily: 'Aileron-Bold', + fontFamily: 'Figtree-Bold', }, }} > @@ -43,7 +45,7 @@ export default function Library({ tabBarIcon: ({ focused, color }) => ( ), @@ -57,7 +59,7 @@ export default function Library({ tabBarIcon: ({ focused, color }) => ( ), @@ -72,7 +74,7 @@ export default function Library({ tabBarIcon: ({ focused, color }) => ( ), @@ -81,12 +83,12 @@ export default function Library({ ( ), diff --git a/src/components/Library/components/playlists-tab.tsx b/src/components/Library/components/playlists-tab.tsx index d3022f51..70ae6820 100644 --- a/src/components/Library/components/playlists-tab.tsx +++ b/src/components/Library/components/playlists-tab.tsx @@ -1,10 +1,11 @@ -import { NativeStackScreenProps } from '@react-navigation/native-stack' +import { NativeStackNavigationProp } from '@react-navigation/native-stack' import { StackParamList } from '../../types' import Playlists from '../../Playlists/component' import React from 'react' +import { useNavigation } from '@react-navigation/native' + +export default function PlaylistsTab(): React.JSX.Element { + const navigation = useNavigation>() -export default function PlaylistsScreen({ - navigation, -}: NativeStackScreenProps): React.JSX.Element { return } diff --git a/src/components/Library/tab-bar.tsx b/src/components/Library/tab-bar.tsx index fdb932dd..7678b041 100644 --- a/src/components/Library/tab-bar.tsx +++ b/src/components/Library/tab-bar.tsx @@ -1,12 +1,11 @@ import { MaterialTopTabBar, MaterialTopTabBarProps } from '@react-navigation/material-top-tabs' -import React, { useEffect } from 'react' -import { Separator, Spacer, XStack, YStack } from 'tamagui' +import React from 'react' +import { XStack, YStack } from 'tamagui' import Icon from '../Global/components/icon' import { useLibrarySortAndFilterContext } from '../../providers/Library/sorting-filtering' import { Text } from '../Global/helpers/text' -import { FadeIn, FadeOut } from 'react-native-reanimated' -import Animated from 'react-native-reanimated' import { isUndefined } from 'lodash' +import { useSafeAreaInsets } from 'react-native-safe-area-context' export default function LibraryTabBar(props: MaterialTopTabBarProps) { const { @@ -18,14 +17,15 @@ export default function LibraryTabBar(props: MaterialTopTabBarProps) { setIsDownloaded, } = useLibrarySortAndFilterContext() + const insets = useSafeAreaInsets() + return ( - + {[''].includes(props.state.routes[props.state.index].name) ? null : ( - + {isFavorites ? 'Favorites' : 'All'} diff --git a/src/components/Login/screens/server-address.tsx b/src/components/Login/screens/server-address.tsx index 97632215..9f0e3062 100644 --- a/src/components/Login/screens/server-address.tsx +++ b/src/components/Login/screens/server-address.tsx @@ -9,7 +9,7 @@ import Button from '../../Global/helpers/button' import { http, https } from '../utils/constants' import { SafeAreaView } from 'react-native-safe-area-context' import { NativeStackNavigationProp } from '@react-navigation/native-stack' -import { StackParamList } from '../../../components/types' +import { StackParamList } from '../../types' import Toast from 'react-native-toast-message' import { useJellifyContext } from '../../../providers' import { useSettingsContext } from '../../../providers/Settings' diff --git a/src/components/Login/screens/server-authentication.tsx b/src/components/Login/screens/server-authentication.tsx index 7e161cb7..61904991 100644 --- a/src/components/Login/screens/server-authentication.tsx +++ b/src/components/Login/screens/server-authentication.tsx @@ -7,7 +7,7 @@ import { H2, H5, Text } from '../../Global/helpers/text' import Button from '../../Global/helpers/button' import { SafeAreaView } from 'react-native-safe-area-context' import { JellifyUser } from '../../../types/JellifyUser' -import { StackParamList } from '../../../components/types' +import { StackParamList } from '../../types' import Input from '../../../components/Global/helpers/input' import Icon from '../../Global/components/icon' import { useJellifyContext } from '../../../providers' diff --git a/src/components/Login/screens/server-library.tsx b/src/components/Login/screens/server-library.tsx index 70579b71..c8fdd16c 100644 --- a/src/components/Login/screens/server-library.tsx +++ b/src/components/Login/screens/server-library.tsx @@ -1,126 +1,51 @@ -import React, { useEffect, useState } from 'react' -import { getToken, Spinner, ToggleGroup, YStack } from 'tamagui' -import { H2, Text } from '../../Global/helpers/text' -import Button from '../../Global/helpers/button' -import _ from 'lodash' -import { SafeAreaView } from 'react-native-safe-area-context' -import { useJellifyContext } from '../../../providers' -import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models' -import { QueryKeys } from '../../../enums/query-keys' -import { fetchUserViews } from '../../../api/queries/libraries' -import { useQuery } from '@tanstack/react-query' +import React from 'react' import { NativeStackNavigationProp } from '@react-navigation/native-stack' import { StackParamList } from '../../../components/types' -import Icon from '../../Global/components/icon' +import { useJellifyContext } from '../../../providers' +import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models' +import LibrarySelector from '../../Global/components/library-selector' export default function ServerLibrary({ navigation, }: { navigation: NativeStackNavigationProp }): React.JSX.Element { - const { api, user, setUser, setLibrary } = useJellifyContext() + const { setUser, setLibrary } = useJellifyContext() - const [libraryId, setLibraryId] = useState(undefined) - const [playlistLibrary, setPlaylistLibrary] = useState(undefined) + const handleLibrarySelected = ( + libraryId: string, + selectedLibrary: BaseItemDto, + playlistLibrary?: BaseItemDto, + ) => { + setLibrary({ + musicLibraryId: libraryId, + musicLibraryName: selectedLibrary.Name ?? 'No library name', + musicLibraryPrimaryImageId: selectedLibrary.ImageTags?.Primary, + playlistLibraryId: playlistLibrary?.Id, + playlistLibraryPrimaryImageId: playlistLibrary?.ImageTags?.Primary, + }) + navigation.navigate('Tabs', { + screen: 'Home', + params: {}, + }) + } - const { - data: libraries, - isError, - isPending, - isSuccess, - refetch, - } = useQuery({ - queryKey: [QueryKeys.UserViews], - queryFn: () => fetchUserViews(api, user), - }) - - useEffect(() => { - if (!isPending && isSuccess) - setPlaylistLibrary( - libraries?.filter((library) => library.CollectionType === 'playlists')[0], - ) - }, [isPending, isSuccess]) + const handleCancel = () => { + setUser(undefined) + navigation.navigate('ServerAuthentication', undefined, { + pop: true, + }) + } return ( - - -

- Select Music Library -

-
- - {isPending ? ( - - ) : ( - - {libraries! - .filter((library) => library.CollectionType === 'music') - .map((library) => { - console.log(library.Id, 'Library ID') - return ( - - {library.Name ?? 'Unnamed Library'} - - ) - })} - - )} - - {isError && Unable to load libraries} - - - - - -
+ ) } diff --git a/src/components/Network/internetConnectionWatcher.tsx b/src/components/Network/internetConnectionWatcher.tsx index 2caf73c3..7c0d43a0 100644 --- a/src/components/Network/internetConnectionWatcher.tsx +++ b/src/components/Network/internetConnectionWatcher.tsx @@ -1,6 +1,5 @@ import NetInfo from '@react-native-community/netinfo' -import { useQueryClient } from '@tanstack/react-query' -import { useEffect, useRef, useState } from 'react' +import { useEffect, useRef } from 'react' import { Platform } from 'react-native' import { getTokenValue, YStack } from 'tamagui' import Animated, { @@ -11,7 +10,6 @@ import Animated, { runOnJS, } from 'react-native-reanimated' -import { QueryKeys } from '../../enums/query-keys' import { Text } from '../Global/helpers/text' import { useNetworkContext } from '../../providers/Network' diff --git a/src/components/Network/offlineModeUtils.ts b/src/components/Network/offlineModeUtils.ts index 5153ea9e..0df3ce9e 100644 --- a/src/components/Network/offlineModeUtils.ts +++ b/src/components/Network/offlineModeUtils.ts @@ -1,15 +1,13 @@ import { MMKV } from 'react-native-mmkv' import RNFS from 'react-native-fs' -import { JellifyTrack } from '../../types/JellifyTrack' +import JellifyTrack from '../../types/JellifyTrack' import axios from 'axios' -import { QueryClient } from '@tanstack/react-query' import { JellifyDownload, JellifyDownloadProgress, JellifyDownloadProgressState, } from '../../types/JellifyDownload' -import DownloadProgress from '../../types/DownloadProgress' import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models' export async function downloadJellyfinFile( diff --git a/src/components/Player/component.config.ts b/src/components/Player/component.config.ts index b9fc7f64..2b5072f6 100644 --- a/src/components/Player/component.config.ts +++ b/src/components/Player/component.config.ts @@ -1,4 +1,5 @@ import { TextTickerProps } from 'react-native-text-ticker' +import { getToken } from 'tamagui' export const TextTickerConfig: TextTickerProps = { duration: 5000, diff --git a/src/components/Player/components/blurred-background.tsx b/src/components/Player/components/blurred-background.tsx new file mode 100644 index 00000000..020b340e --- /dev/null +++ b/src/components/Player/components/blurred-background.tsx @@ -0,0 +1,76 @@ +import React from 'react' +import { usePlayerContext } from '../../../providers/Player' +import { BlurView } from 'blur-react-native' +import ItemImage from '../../Global/components/image' +import { getToken, useTheme, View, YStack, ZStack } from 'tamagui' +import { useColorScheme } from 'react-native' +import LinearGradient from 'react-native-linear-gradient' + +export default function BlurredBackground({ + width, + height, +}: { + width: number + height: number +}): React.JSX.Element { + const { nowPlaying } = usePlayerContext() + const theme = useTheme() + const isDarkMode = useColorScheme() === 'dark' + + return ( + + + + + + {isDarkMode ? ( + + + + + + ) : ( + + )} + + ) +} diff --git a/src/components/Player/helpers/buttons.tsx b/src/components/Player/components/buttons.tsx similarity index 71% rename from src/components/Player/helpers/buttons.tsx rename to src/components/Player/components/buttons.tsx index ff70df3b..d20b5abd 100644 --- a/src/components/Player/helpers/buttons.tsx +++ b/src/components/Player/components/buttons.tsx @@ -2,11 +2,14 @@ import { State } from 'react-native-track-player' import { Circle, Spinner, View } from 'tamagui' import { usePlayerContext } from '../../../providers/Player' import IconButton from '../../../components/Global/helpers/icon-button' +import { isUndefined } from 'lodash' export default function PlayPauseButton({ size, + flex, }: { size?: number | undefined + flex?: number | undefined }): React.JSX.Element { const { useTogglePlayback, playbackState } = usePlayerContext() @@ -17,7 +20,7 @@ export default function PlayPauseButton({ button = ( = 20} size={size} name='pause' onPress={() => useTogglePlayback.mutate(undefined)} @@ -29,8 +32,8 @@ export default function PlayPauseButton({ case State.Buffering: case State.Loading: { button = ( - - + + ) break @@ -40,7 +43,7 @@ export default function PlayPauseButton({ button = ( = 20} size={size} name='play' onPress={() => useTogglePlayback.mutate(undefined)} @@ -51,7 +54,7 @@ export default function PlayPauseButton({ } return ( - + {button} ) diff --git a/src/components/Player/components/controls.tsx b/src/components/Player/components/controls.tsx new file mode 100644 index 00000000..6249a707 --- /dev/null +++ b/src/components/Player/components/controls.tsx @@ -0,0 +1,72 @@ +import React from 'react' +import { Spacer, XStack, getToken } from 'tamagui' +import PlayPauseButton from './buttons' +import Icon from '../../Global/components/icon' +import { usePlayerContext } from '../../../providers/Player' +import { useSafeAreaFrame } from 'react-native-safe-area-context' +import { useQueueContext } from '../../../providers/Player/queue' +import { RepeatMode } from 'react-native-track-player' + +export default function Controls(): React.JSX.Element { + const { width } = useSafeAreaFrame() + + const { useSeekBy } = usePlayerContext() + + const { usePrevious, useSkip } = useQueueContext() + const { nowPlaying, useToggleShuffle, useToggleRepeatMode, repeatMode } = usePlayerContext() + + const { + playQueue, + setPlayQueue, + currentIndex, + setCurrentIndex, + shuffled, + setShuffled, + unshuffledQueue, + } = useQueueContext() + + return ( + + useToggleShuffle.mutate()} + /> + + + + usePrevious.mutate()} + large + /> + + {/* I really wanted a big clunky play button */} + + + useSkip.mutate(undefined)} + large + /> + + + + useToggleRepeatMode.mutate()} + /> + + ) +} diff --git a/src/components/Player/helpers/error-handlers.ts b/src/components/Player/components/error-handlers.ts similarity index 100% rename from src/components/Player/helpers/error-handlers.ts rename to src/components/Player/components/error-handlers.ts diff --git a/src/components/Player/components/footer.tsx b/src/components/Player/components/footer.tsx new file mode 100644 index 00000000..61f3d359 --- /dev/null +++ b/src/components/Player/components/footer.tsx @@ -0,0 +1,36 @@ +import { XStack } from 'tamagui' + +import Icon from '../../Global/components/icon' + +import { NativeStackNavigationProp } from '@react-navigation/native-stack' +import { StackParamList } from '../../types' + +export default function Footer({ + navigation, +}: { + navigation: NativeStackNavigationProp +}): React.JSX.Element { + return ( + + + + + + + { + navigation.navigate('Queue') + }} + /> + + + ) +} diff --git a/src/components/Player/components/header.tsx b/src/components/Player/components/header.tsx new file mode 100644 index 00000000..a35f2cdd --- /dev/null +++ b/src/components/Player/components/header.tsx @@ -0,0 +1,79 @@ +import { useJellifyContext } from '../../../providers' +import { usePlayerContext } from '../../../providers/Player' +import { useQueueContext } from '../../../providers/Player/queue' +import { getToken, useWindowDimensions, XStack, YStack, Spacer, useTheme, View } from 'tamagui' +import { getImageApi } from '@jellyfin/sdk/lib/utils/api' +import FastImage from 'react-native-fast-image' +import { Text } from '../../Global/helpers/text' +import { NativeStackNavigationProp } from '@react-navigation/native-stack' +import Icon from '../../Global/components/icon' +import { StackParamList } from '../../types' +import React from 'react' +import { State } from 'react-native-track-player' +import { Platform } from 'react-native' +import ItemImage from '../../Global/components/image' + +export default function PlayerHeader({ + navigation, +}: { + navigation: NativeStackNavigationProp +}): React.JSX.Element { + const { api } = useJellifyContext() + + const { nowPlaying, playbackState } = usePlayerContext() + + const isPlaying = playbackState === State.Playing + + const { queueRef } = useQueueContext() + + const { width } = useWindowDimensions() + + const theme = useTheme() + + return ( + + + + { + navigation.goBack() + }} + small + /> + + + + Playing from + + { + // If the Queue is a BaseItemDto, display the name of it + typeof queueRef === 'object' ? (queueRef.Name ?? 'Untitled') : queueRef + } + + + + + { + navigation.navigate('Details', { + item: nowPlaying!.item, + isNested: true, + }) + }} + /> + + + + + + + + ) +} diff --git a/src/components/Player/components/scrubber.tsx b/src/components/Player/components/scrubber.tsx new file mode 100644 index 00000000..2e41fe25 --- /dev/null +++ b/src/components/Player/components/scrubber.tsx @@ -0,0 +1,159 @@ +import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react' +import { useProgress } from 'react-native-track-player' +import { HorizontalSlider } from '../../../components/Global/helpers/slider' +import { Gesture, GestureDetector } from 'react-native-gesture-handler' +import { trigger } from 'react-native-haptic-feedback' +import { getToken, XStack, YStack } from 'tamagui' +import { useSafeAreaFrame } from 'react-native-safe-area-context' +import { usePlayerContext } from '../../../providers/Player' +import { RunTimeSeconds } from '../../../components/Global/helpers/time-codes' +import { UPDATE_INTERVAL } from '../../../player/config' +import { ProgressMultiplier } from '../component.config' +import { useQueueContext } from '../../../providers/Player/queue' +import { Platform } from 'react-native' + +// Create a simple pan gesture +const scrubGesture = Gesture.Pan().runOnJS(true) + +export default function Scrubber(): React.JSX.Element { + const { useSeekTo, nowPlaying } = usePlayerContext() + const { useSkip, usePrevious } = useQueueContext() + const { width } = useSafeAreaFrame() + + // Get progress from the track player with the specified update interval + const progress = useProgress(UPDATE_INTERVAL, false) + + // Single source of truth for the current position + const [displayPosition, setDisplayPosition] = useState(0) + + // Track user interaction state + const isUserInteractingRef = useRef(false) + const lastSeekTimeRef = useRef(0) + const currentTrackIdRef = useRef(null) + + // Calculate maximum track duration in slider units + const maxDuration = useMemo(() => { + return progress?.duration + ? Math.round(progress.duration * ProgressMultiplier) + : ProgressMultiplier + }, [progress?.duration]) + + // Calculate current position in slider units + const calculatedPosition = useMemo(() => { + if (!progress?.position) return 0 + return Math.round(progress.position * ProgressMultiplier) + }, [progress?.position]) + + // Update display position from playback progress + useEffect(() => { + // Only update if user is not interacting and enough time has passed since last seek + if ( + !isUserInteractingRef.current && + Date.now() - lastSeekTimeRef.current > 200 && // 200ms debounce after seeking + !useSeekTo.isPending && + !useSkip.isPending && + !usePrevious.isPending + ) { + setDisplayPosition(calculatedPosition) + } + }, [calculatedPosition, useSeekTo.isPending, useSkip.isPending, usePrevious.isPending]) + + // Handle track changes + useEffect(() => { + const currentTrackId = nowPlaying?.id || null + if (currentTrackId !== currentTrackIdRef.current) { + // Track changed - reset position immediately + setDisplayPosition(0) + isUserInteractingRef.current = false + lastSeekTimeRef.current = 0 + currentTrackIdRef.current = currentTrackId + } + }, [nowPlaying?.id]) + + // Optimized seek handler with debouncing + const handleSeek = useCallback( + (position: number) => { + const seekTime = Math.max(0, position / ProgressMultiplier) + lastSeekTimeRef.current = Date.now() + + return useSeekTo.mutateAsync(seekTime).finally(() => { + // Small delay to let the seek settle before allowing updates + setTimeout(() => { + isUserInteractingRef.current = false + }, 100) + }) + }, + [useSeekTo], + ) + + // Convert display position to seconds for UI display + const currentSeconds = useMemo(() => { + return Math.max(0, Math.round(displayPosition / ProgressMultiplier)) + }, [displayPosition]) + + // Get total duration in seconds + const totalSeconds = useMemo(() => { + return progress?.duration ? Math.round(progress.duration) : 0 + }, [progress?.duration]) + + return ( + + + { + isUserInteractingRef.current = true + trigger('impactLight') + + // Immediately update position for responsive UI + const clampedValue = Math.max(0, Math.min(value, maxDuration)) + setDisplayPosition(clampedValue) + }, + onSlideMove: (event, value) => { + // Throttled haptic feedback for better performance + if (Platform.OS === 'ios' && Math.random() > 0.7) { + trigger('clockTick') + } + + // Update position with proper clamping + const clampedValue = Math.max(0, Math.min(value, maxDuration)) + setDisplayPosition(clampedValue) + }, + onSlideEnd: (event, value) => { + trigger('notificationSuccess') + + // Clamp final value and update display + const clampedValue = Math.max(0, Math.min(value, maxDuration)) + setDisplayPosition(clampedValue) + + // Perform the seek operation + handleSeek(clampedValue).catch(() => { + // On error, revert to calculated position + isUserInteractingRef.current = false + setDisplayPosition(calculatedPosition) + }) + }, + }} + /> + + + + {currentSeconds} + + + + {/** Track metadata can go here */} + + + + {totalSeconds} + + + + + ) +} diff --git a/src/components/Player/components/song-info.tsx b/src/components/Player/components/song-info.tsx new file mode 100644 index 00000000..b2c30928 --- /dev/null +++ b/src/components/Player/components/song-info.tsx @@ -0,0 +1,91 @@ +import TextTicker from 'react-native-text-ticker' +import { getToken, getTokens, Spacer, XStack, YStack } from 'tamagui' +import { TextTickerConfig } from '../component.config' +import { usePlayerContext } from '../../../providers/Player' +import { Text } from '../../Global/helpers/text' +import { useNavigation } from '@react-navigation/native' +import { NativeStackNavigationProp } from '@react-navigation/native-stack' +import { StackParamList } from '../../types' +import React, { useMemo } from 'react' +import ItemImage from '../../Global/components/image' +import { useQuery } from '@tanstack/react-query' +import { fetchItem } from '../../../api/queries/item' +import { useJellifyContext } from '../../../providers' +import FavoriteButton from '../../Global/components/favorite-button' +import Icon from '../../Global/components/icon' + +export default function SongInfo({ + navigation, +}: { + navigation: NativeStackNavigationProp +}): React.JSX.Element { + const { api } = useJellifyContext() + const { nowPlaying } = usePlayerContext() + + const { data: album } = useQuery({ + queryKey: ['album', nowPlaying!.item.AlbumId], + queryFn: () => fetchItem(api, nowPlaying!.item.AlbumId!), + }) + + return useMemo(() => { + return ( + + { + if (album) { + navigation.goBack() // Dismiss player modal + navigation.navigate('Tabs', { + screen: 'Library', + params: { + screen: 'Album', + params: { + album, + }, + }, + }) + } + }} + justifyContent='center' + > + + + + + + + {nowPlaying!.title ?? 'Untitled Track'} + + + + + { + if (nowPlaying!.item.ArtistItems) { + navigation.goBack() // Dismiss player modal + navigation.navigate('Tabs', { + screen: 'Library', + params: { + screen: 'Artist', + params: { + artist: nowPlaying!.item.ArtistItems![0], + }, + }, + }) + } + }} + > + {nowPlaying?.artist ?? 'Unknown Artist'} + + + + + + + + + ) + }, [nowPlaying]) +} diff --git a/src/components/Player/helpers/controls.tsx b/src/components/Player/helpers/controls.tsx deleted file mode 100644 index d5941314..00000000 --- a/src/components/Player/helpers/controls.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react' -import { XStack, getToken } from 'tamagui' -import PlayPauseButton from './buttons' -import Icon from '../../Global/components/icon' -import { usePlayerContext } from '../../../providers/Player' -import { useSafeAreaFrame } from 'react-native-safe-area-context' -import { useQueueContext } from '../../../providers/Player/queue' - -export default function Controls(): React.JSX.Element { - const { width } = useSafeAreaFrame() - - const { useSeekBy } = usePlayerContext() - - const { usePrevious, useSkip } = useQueueContext() - - return ( - - useSeekBy.mutate(-15)} /> - - usePrevious.mutate()} - large - /> - - {/* I really wanted a big clunky play button */} - - - useSkip.mutate(undefined)} - large - /> - - useSeekBy.mutate(15)} - /> - - ) -} diff --git a/src/components/Player/helpers/footer.tsx b/src/components/Player/helpers/footer.tsx deleted file mode 100644 index 0b2b2c47..00000000 --- a/src/components/Player/helpers/footer.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { YStack } from 'tamagui' - -import { XStack, Spacer } from 'tamagui' - -import Icon from '../../Global/components/icon' - -import { NativeStackNavigationProp } from '@react-navigation/native-stack' -import { StackParamList } from '../../../components/types' - -export default function Footer({ - navigation, -}: { - navigation: NativeStackNavigationProp -}): React.JSX.Element { - return ( - - - - - - - - - - - { - navigation.navigate('Queue') - }} - /> - - - ) -} diff --git a/src/components/Player/helpers/scrubber.tsx b/src/components/Player/helpers/scrubber.tsx deleted file mode 100644 index 62539625..00000000 --- a/src/components/Player/helpers/scrubber.tsx +++ /dev/null @@ -1,180 +0,0 @@ -import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react' -import { useProgress } from 'react-native-track-player' -import { HorizontalSlider } from '../../../components/Global/helpers/slider' -import { Gesture, GestureDetector } from 'react-native-gesture-handler' -import { trigger } from 'react-native-haptic-feedback' -import { getToken, XStack, YStack } from 'tamagui' -import { useSafeAreaFrame } from 'react-native-safe-area-context' -import { usePlayerContext } from '../../../providers/Player' -import { RunTimeSeconds } from '../../../components/Global/helpers/time-codes' -import { UPDATE_INTERVAL } from '../../../player/config' -import { ProgressMultiplier } from '../component.config' -import { useQueueContext } from '../../../providers/Player/queue' -import { Platform } from 'react-native' - -// Create a simple pan gesture -const scrubGesture = Gesture.Pan() - -export default function Scrubber(): React.JSX.Element { - const { useSeekTo, nowPlaying } = usePlayerContext() - const { useSkip, usePrevious } = useQueueContext() - const { width } = useSafeAreaFrame() - - // Track if user is currently seeking - const [seeking, setSeeking] = useState(false) - - // Store the active track ID to detect track changes - const previousTrackIdRef = useRef(null) - - // Get progress from the track player with the specified update interval - const progress = useProgress(UPDATE_INTERVAL, false) - - // Keep track of position in component state for display - const [position, setPosition] = useState( - progress && progress.position ? Math.floor(progress.position * ProgressMultiplier) : 0, - ) - - // Track whether we're in the middle of a slide operation to prevent position jumping - const isSlidingRef = useRef(false) - - // Calculate maximum track duration - ensure it's never below 1 to prevent slider issues - const maxDuration = useMemo(() => { - return progress && progress.duration > 0 - ? Math.floor(progress.duration * ProgressMultiplier) - : 1 - }, [progress.duration]) - - const safelyUpdatePosition = useCallback((newPos: number) => { - // Ensure position is never negative - const safePosition = Math.max(0, newPos) - setPosition(safePosition) - }, []) - - // Update position only if not seeking and no pending operations - useEffect(() => { - if ( - !isSlidingRef.current && - !useSkip.isPending && - !usePrevious.isPending && - !useSeekTo.isPending && - progress.position !== undefined - ) { - // Ensure position is never negative - const newPosition = Math.max(0, Math.floor(progress.position * ProgressMultiplier)) - safelyUpdatePosition(newPosition) - } - }, [ - progress.position, - seeking, - useSkip.isPending, - usePrevious.isPending, - useSeekTo.isPending, - safelyUpdatePosition, - ]) - - // Reset position when track changes - useEffect(() => { - if (nowPlaying && nowPlaying.id !== previousTrackIdRef.current) { - // Track has changed, reset position to 0 - safelyUpdatePosition(0) - previousTrackIdRef.current = nowPlaying.id || null - } - }, [nowPlaying, safelyUpdatePosition]) - - // Reset seeking state when seek operation completes - useEffect(() => { - if (!useSeekTo.isPending) { - // Give a small delay before allowing automatic position updates again - setTimeout(() => { - setSeeking(false) - isSlidingRef.current = false - }, 250) - } - }, [useSeekTo.isPending]) - - return ( - - - { - if (seeking) { - trigger('notificationSuccess') - // Ensure position is not negative before seeking - const seekPosition = Math.max( - 0, - Math.floor(position / ProgressMultiplier), - ) - - useSeekTo.mutate(seekPosition) - } - }, - onSlideStart: (event, value) => { - setSeeking(true) - isSlidingRef.current = true - trigger('impactLight') - // Immediately update position, ensuring it's not negative - safelyUpdatePosition(Math.floor(value)) - }, - onSlideMove: (event, value) => { - // Reduce haptic feedback frequency on slower devices - if (Platform.OS === 'ios' || Math.random() > 0.8) { - trigger('clockTick') - } - - // Ensure position is within valid range (not negative and not beyond duration) - if ( - Math.floor(value / ProgressMultiplier) >= 0 && - Math.floor(value / ProgressMultiplier) < progress.duration - ) { - safelyUpdatePosition(Math.floor(value)) - } - }, - onSlideEnd: (event, value) => { - trigger('notificationSuccess') - - // Ensure position is not negative - const safeValue = Math.max(0, Math.floor(value)) - safelyUpdatePosition(safeValue) - - // Ensure we don't seek to a negative position - const seekPosition = Math.max( - 0, - Math.floor(safeValue / ProgressMultiplier), - ) - useSeekTo.mutate(seekPosition) - - // Delay resetting the sliding state to prevent position jumping - setTimeout(() => { - isSlidingRef.current = false - }, 300) - }, - }} - /> - - - - - - {Math.max(0, Math.floor(position / ProgressMultiplier))} - - - - - {/** Track metadata can go here */} - - - - - {progress && progress.duration ? progress.duration : 0} - - - - - ) -} diff --git a/src/components/Player/index.tsx b/src/components/Player/index.tsx index f9d600be..e7f5d03c 100644 --- a/src/components/Player/index.tsx +++ b/src/components/Player/index.tsx @@ -2,23 +2,35 @@ import { StackParamList } from '../types' import { usePlayerContext } from '../../providers/Player' import { NativeStackNavigationProp } from '@react-navigation/native-stack' import React, { useCallback, useMemo, useState } from 'react' -import { SafeAreaView, useSafeAreaFrame } from 'react-native-safe-area-context' -import { YStack, XStack, Spacer, getTokens, getToken, useTheme } from 'tamagui' +import { SafeAreaView, useSafeAreaFrame, useSafeAreaInsets } from 'react-native-safe-area-context' +import { + YStack, + XStack, + Spacer, + getTokens, + getToken, + useTheme, + ZStack, + useWindowDimensions, + View, +} from 'tamagui' import { Text } from '../Global/helpers/text' import Icon from '../Global/components/icon' import FavoriteButton from '../Global/components/favorite-button' import TextTicker from 'react-native-text-ticker' import { TextTickerConfig } from './component.config' -import Scrubber from './helpers/scrubber' -import Controls from './helpers/controls' -import FastImage from 'react-native-fast-image' -import { getImageApi } from '@jellyfin/sdk/lib/utils/api' +import Scrubber from './components/scrubber' +import Controls from './components/controls' import { useQueueContext } from '../../providers/Player/queue' import Toast from 'react-native-toast-message' import JellifyToastConfig from '../../constants/toast.config' import { useFocusEffect } from '@react-navigation/native' import { useJellifyContext } from '../../providers' -import Footer from './helpers/footer' +import Footer from './components/footer' +import BlurredBackground from './components/blurred-background' +import PlayerHeader from './components/header' +import SongInfo from './components/song-info' + export default function PlayerScreen({ navigation, }: { @@ -32,8 +44,6 @@ export default function PlayerScreen({ const { queueRef } = useQueueContext() - const { width, height } = useSafeAreaFrame() - const theme = useTheme() useFocusEffect( @@ -44,156 +54,37 @@ export default function PlayerScreen({ }, []), ) + const { width, height } = useWindowDimensions() + + const { bottom } = useSafeAreaInsets() + return ( - + {nowPlaying && ( - <> - - {useMemo(() => { - return ( - <> - - - { - navigation.goBack() - }} - small - /> - + + - - Playing from - - { - // If the Queue is a BaseItemDto, display the name of it - typeof queueRef === 'object' - ? (queueRef.Name ?? 'Untitled') - : queueRef - } - - - - - - - - - - - ) - }, [nowPlaying, queueRef])} + + - {/** Memoize TextTickers otherwise they won't animate due to the progress being updated in the PlayerContext */} - {useMemo(() => { - return ( - - - - {nowPlaying!.title ?? 'Untitled Track'} - - - - - { - if (nowPlaying!.item.ArtistItems) { - navigation.goBack() // Dismiss player modal - navigation.navigate('Tabs', { - screen: 'Home', - params: { - screen: 'Artist', - params: { - artist: nowPlaying!.item - .ArtistItems![0], - }, - }, - }) - } - }} - > - {nowPlaying.artist ?? 'Unknown Artist'} - - - - - - {nowPlaying!.album ?? ''} - - - - ) - }, [nowPlaying])} - - - {/* Buttons for favorites, song menu go here */} - - { - navigation.navigate('Details', { - item: nowPlaying!.item, - isNested: true, - }) - }} - /> - - - - - + - + {/* playback progress goes here */} @@ -202,9 +93,9 @@ export default function PlayerScreen({